1 /*--------------------------------------------------------------
11 * Added Color, RootWindow Capability and Quit Ability:
12 * Dan Checkoway, 7-12-94
14 * Converted to use ANSI C and XCB by:
17 *--------------------------------------------------------------*/
21 #include <X11/Xutil.h>
22 #include <X11/keysym.h>
24 #define X_H /* make sure we aren't using symbols from X.h */
25 #include <X11/XCB/xcb.h>
26 /*#include <X11/XCB/xcb_image.h>*/
27 #include <X11/XCB/xcb_aux.h> /* XCBAuxGetScreen */
28 #include <X11/XCB/xcb_icccm.h>
29 #include <X11/XCB/xcb_atom.h> /* STRING atom */
30 #include <X11/XCB/xcb_keysyms.h>
32 typedef enum { False, True } Bool;
40 #include <unistd.h> /* pause() */
45 #include "bitmaps/icon.xbm"
46 #include "bitmaps/cursor.xbm"
47 #include "bitmaps/cursor_mask.xbm"
49 #include "bitmaps/space.xbm"
51 #include "bitmaps/mati2.xbm"
52 #include "bitmaps/jare2.xbm"
53 #include "bitmaps/kaki1.xbm"
54 #include "bitmaps/kaki2.xbm"
55 #include "bitmaps/mati3.xbm"
56 #include "bitmaps/sleep1.xbm"
57 #include "bitmaps/sleep2.xbm"
59 #include "bitmaps/awake.xbm"
61 #include "bitmaps/up1.xbm"
62 #include "bitmaps/up2.xbm"
63 #include "bitmaps/down1.xbm"
64 #include "bitmaps/down2.xbm"
65 #include "bitmaps/left1.xbm"
66 #include "bitmaps/left2.xbm"
67 #include "bitmaps/right1.xbm"
68 #include "bitmaps/right2.xbm"
69 #include "bitmaps/upright1.xbm"
70 #include "bitmaps/upright2.xbm"
71 #include "bitmaps/upleft1.xbm"
72 #include "bitmaps/upleft2.xbm"
73 #include "bitmaps/dwleft1.xbm"
74 #include "bitmaps/dwleft2.xbm"
75 #include "bitmaps/dwright1.xbm"
76 #include "bitmaps/dwright2.xbm"
78 #include "bitmaps/utogi1.xbm"
79 #include "bitmaps/utogi2.xbm"
80 #include "bitmaps/dtogi1.xbm"
81 #include "bitmaps/dtogi2.xbm"
82 #include "bitmaps/ltogi1.xbm"
83 #include "bitmaps/ltogi2.xbm"
84 #include "bitmaps/rtogi1.xbm"
85 #include "bitmaps/rtogi2.xbm"
87 #define BITMAP_WIDTH 32
88 #define BITMAP_HEIGHT 32
89 #define WINDOW_WIDTH 320
90 #define WINDOW_HEIGHT 256
91 #define DEFAULT_BORDER 2
92 #define DEFAULT_WIN_X 1
93 #define DEFAULT_WIN_Y 1
94 #define AVAIL_KEYBUF 255
96 #define EVENT_MASK ( XCBEventMaskKeyPress | XCBEventMaskButtonPress | \
97 XCBEventMaskExposure | XCBEventMaskStructureNotify )
99 #define EVENT_MASK_ROOT ( XCBEventMaskKeyPress | XCBEventMaskExposure )
101 #define MAX_TICK 9999 /* Odd Only! */
102 #define INTERVAL 125000L
103 #define NEKO_SPEED 16
105 #define NORMAL_STATE 1
115 #define NEKO_U_MOVE 6
116 #define NEKO_D_MOVE 7
117 #define NEKO_L_MOVE 8
118 #define NEKO_R_MOVE 9
119 #define NEKO_UL_MOVE 10
120 #define NEKO_UR_MOVE 11
121 #define NEKO_DL_MOVE 12
122 #define NEKO_DR_MOVE 13
123 #define NEKO_U_TOGI 14
124 #define NEKO_D_TOGI 15
125 #define NEKO_L_TOGI 16
126 #define NEKO_R_TOGI 17
128 #define NEKO_STOP_TIME 4
129 #define NEKO_JARE_TIME 10
130 #define NEKO_KAKI_TIME 4
131 #define NEKO_AKUBI_TIME 3
132 #define NEKO_AWAKE_TIME 3
133 #define NEKO_TOGI_TIME 10
135 #define PI_PER8 ((double)3.1415926535/(double)8)
137 #define DIRNAMELEN 255
140 char *fgColor, *bgColor;
142 static char *ProgramName;
145 XCBSCREEN *theScreen; /* instead of macro(theDisplay, int theScreen) */
146 unsigned long theFgPixel;
147 unsigned long theBgPixel;
150 XCBKeySymbols *theKeySyms;
151 XCBATOM deleteWindowAtom;
153 static unsigned int WindowWidth;
154 static unsigned int WindowHeight;
155 static int WindowPointX;
156 static int WindowPointY;
158 static unsigned int BorderWidth = DEFAULT_BORDER;
160 long IntervalTime = INTERVAL;
182 XCBGCONTEXT NekoLastGC;
184 double NekoSpeed = (double)NEKO_SPEED;
186 double SinPiPer8Times3;
209 XCBPIXMAP UpLeft1Xbm;
210 XCBPIXMAP UpLeft2Xbm;
211 XCBPIXMAP UpRight1Xbm;
212 XCBPIXMAP UpRight2Xbm;
213 XCBPIXMAP DownLeft1Xbm;
214 XCBPIXMAP DownLeft2Xbm;
215 XCBPIXMAP DownRight1Xbm;
216 XCBPIXMAP DownRight2Xbm;
218 XCBPIXMAP UpTogi1Xbm;
219 XCBPIXMAP UpTogi2Xbm;
220 XCBPIXMAP DownTogi1Xbm;
221 XCBPIXMAP DownTogi2Xbm;
222 XCBPIXMAP LeftTogi1Xbm;
223 XCBPIXMAP LeftTogi2Xbm;
224 XCBPIXMAP RightTogi1Xbm;
225 XCBPIXMAP RightTogi2Xbm;
234 XCBGCONTEXT Sleep1GC;
235 XCBGCONTEXT Sleep2GC;
245 XCBGCONTEXT Right1GC;
246 XCBGCONTEXT Right2GC;
247 XCBGCONTEXT UpLeft1GC;
248 XCBGCONTEXT UpLeft2GC;
249 XCBGCONTEXT UpRight1GC;
250 XCBGCONTEXT UpRight2GC;
251 XCBGCONTEXT DownLeft1GC;
252 XCBGCONTEXT DownLeft2GC;
253 XCBGCONTEXT DownRight1GC;
254 XCBGCONTEXT DownRight2GC;
256 XCBGCONTEXT UpTogi1GC;
257 XCBGCONTEXT UpTogi2GC;
258 XCBGCONTEXT DownTogi1GC;
259 XCBGCONTEXT DownTogi2GC;
260 XCBGCONTEXT LeftTogi1GC;
261 XCBGCONTEXT LeftTogi2GC;
262 XCBGCONTEXT RightTogi1GC;
263 XCBGCONTEXT RightTogi2GC;
266 XCBGCONTEXT *GCCreatePtr;
267 XCBPIXMAP *BitmapCreatePtr;
269 unsigned int PixelWidth;
270 unsigned int PixelHeight;
273 BitmapGCData BitmapGCDataTable[] = {
274 { &SpaceGC, &SpaceXbm, space_bits, space_width, space_height },
275 { &Mati2GC, &Mati2Xbm, mati2_bits, mati2_width, mati2_height },
276 { &Jare2GC, &Jare2Xbm, jare2_bits, jare2_width, jare2_height },
277 { &Kaki1GC, &Kaki1Xbm, kaki1_bits, kaki1_width, kaki1_height },
278 { &Kaki2GC, &Kaki2Xbm, kaki2_bits, kaki2_width, kaki2_height },
279 { &Mati3GC, &Mati3Xbm, mati3_bits, mati3_width, mati3_height },
280 { &Sleep1GC, &Sleep1Xbm, sleep1_bits, sleep1_width, sleep1_height },
281 { &Sleep2GC, &Sleep2Xbm, sleep2_bits, sleep2_width, sleep2_height },
282 { &AwakeGC, &AwakeXbm, awake_bits, awake_width, awake_height },
283 { &Up1GC, &Up1Xbm, up1_bits, up1_width, up1_height },
284 { &Up2GC, &Up2Xbm, up2_bits, up2_width, up2_height },
285 { &Down1GC, &Down1Xbm, down1_bits, down1_width, down1_height },
286 { &Down2GC, &Down2Xbm, down2_bits, down2_width, down2_height },
287 { &Left1GC, &Left1Xbm, left1_bits, left1_width, left1_height },
288 { &Left2GC, &Left2Xbm, left2_bits, left2_width, left2_height },
289 { &Right1GC, &Right1Xbm, right1_bits, right1_width, right1_height },
290 { &Right2GC, &Right2Xbm, right2_bits, right2_width, right2_height },
291 { &UpLeft1GC, &UpLeft1Xbm, upleft1_bits, upleft1_width, upleft1_height },
292 { &UpLeft2GC, &UpLeft2Xbm, upleft2_bits, upleft2_width, upleft2_height },
294 &UpRight1Xbm, upright1_bits, upright1_width, upright1_height },
296 &UpRight2Xbm, upright2_bits, upright2_width, upright2_height },
297 { &DownLeft1GC, &DownLeft1Xbm, dwleft1_bits, dwleft1_width, dwleft1_height },
298 { &DownLeft2GC, &DownLeft2Xbm, dwleft2_bits, dwleft2_width, dwleft2_height },
300 &DownRight1Xbm, dwright1_bits, dwright1_width, dwright1_height },
302 &DownRight2Xbm, dwright2_bits, dwright2_width, dwright2_height },
303 { &UpTogi1GC, &UpTogi1Xbm, utogi1_bits, utogi1_width, utogi1_height },
304 { &UpTogi2GC, &UpTogi2Xbm, utogi2_bits, utogi2_width, utogi2_height },
305 { &DownTogi1GC, &DownTogi1Xbm, dtogi1_bits, dtogi1_width, dtogi1_height },
306 { &DownTogi2GC, &DownTogi2Xbm, dtogi2_bits, dtogi2_width, dtogi2_height },
307 { &LeftTogi1GC, &LeftTogi1Xbm, ltogi1_bits, ltogi1_width, ltogi1_height },
308 { &LeftTogi2GC, &LeftTogi2Xbm, ltogi2_bits, ltogi2_width, ltogi2_height },
310 &RightTogi1Xbm, rtogi1_bits, rtogi1_width, rtogi1_height },
312 &RightTogi2Xbm, rtogi2_bits, rtogi2_width, rtogi2_height },
313 { NULL, NULL, NULL, 0, 0 }
317 XCBGCONTEXT *TickEvenGCPtr;
318 XCBGCONTEXT *TickOddGCPtr;
321 Animation AnimationPattern[] = {
322 { &Mati2GC, &Mati2GC }, /* NekoState == NEKO_STOP */
323 { &Jare2GC, &Mati2GC }, /* NekoState == NEKO_JARE */
324 { &Kaki1GC, &Kaki2GC }, /* NekoState == NEKO_KAKI */
325 { &Mati3GC, &Mati3GC }, /* NekoState == NEKO_AKUBI */
326 { &Sleep1GC, &Sleep2GC }, /* NekoState == NEKO_SLEEP */
327 { &AwakeGC, &AwakeGC }, /* NekoState == NEKO_AWAKE */
328 { &Up1GC, &Up2GC } , /* NekoState == NEKO_U_MOVE */
329 { &Down1GC, &Down2GC }, /* NekoState == NEKO_D_MOVE */
330 { &Left1GC, &Left2GC }, /* NekoState == NEKO_L_MOVE */
331 { &Right1GC, &Right2GC }, /* NekoState == NEKO_R_MOVE */
332 { &UpLeft1GC, &UpLeft2GC }, /* NekoState == NEKO_UL_MOVE */
333 { &UpRight1GC, &UpRight2GC }, /* NekoState == NEKO_UR_MOVE */
334 { &DownLeft1GC, &DownLeft2GC }, /* NekoState == NEKO_DL_MOVE */
335 { &DownRight1GC, &DownRight2GC }, /* NekoState == NEKO_DR_MOVE */
336 { &UpTogi1GC, &UpTogi2GC }, /* NekoState == NEKO_U_TOGI */
337 { &DownTogi1GC, &DownTogi2GC }, /* NekoState == NEKO_D_TOGI */
338 { &LeftTogi1GC, &LeftTogi2GC }, /* NekoState == NEKO_L_TOGI */
339 { &RightTogi1GC, &RightTogi2GC }, /* NekoState == NEKO_R_TOGI */
343 /* PutImage.c: format/unit/order conversion should move out to a library */
344 static unsigned char const _reverse_byte[0x100] = {
345 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
346 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
347 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
348 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
349 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
350 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
351 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
352 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
353 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
354 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
355 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
356 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
357 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
358 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
359 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
360 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
361 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
362 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
363 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
364 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
365 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
366 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
367 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
368 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
369 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
370 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
371 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
372 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
373 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
374 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
375 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
376 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
379 /* convert 1Ll <--> 4Mm */
382 register unsigned char *src,
383 register unsigned char *dest,
384 long srclen, long srcinc, long destinc,
388 register const unsigned char *rev = _reverse_byte;
392 for (h = height; --h >= 0; src += srcinc, dest += destinc)
393 for (n = srclen; --n >= 0; )
394 *dest++ = rev[*src++];
397 /* assumes pad is a power of 2 */
398 #define ROUNDUP(nbytes, pad) (((nbytes) + ((pad) - 1)) & ~(long)((pad) - 1))
400 /* CrPFBData.c and CrBFData.c (very similar) */
401 /* if depth==1, behaves like CreateBitmapFromData */
402 XCBPIXMAP CreatePixmapFromBitmapData( XCBConnection *c,
403 XCBWINDOW window, char *data, CARD16 w, CARD16 h,
404 CARD32 fg, CARD32 bg, CARD32 depth)
406 XCBDRAWABLE drawable;
407 XCBPIXMAP bitmap = XCBPIXMAPNew( c );
409 drawable.window = window;
410 XCBCreatePixmap( c, depth, bitmap, drawable, w, h );
412 XCBGCONTEXT gc = XCBGCONTEXTNew( c );
414 CARD32 mask = (depth==1 ? 0 : XCBGCForeground | XCBGCBackground);
415 CARD32 values[] = { fg, bg };
417 drawable.pixmap = bitmap;
418 XCBCreateGC( c, gc, drawable, mask, values );
420 /* XImage attributes: bpp=1, xoffset=0,
421 byte_order=bit_order=LSB, unit=8, pad=8, bpl=(w+7/8) */
423 /* must swap and pad the data if bit/byte_order isn't LSB (Mac) */
425 /* Mac X Server: byte_order=bit_order=MSB, unit=32, padding=32 */
427 long pad = XCBGetSetup(c)->bitmap_format_scanline_pad;
428 long bpd = ROUNDUP(w, pad)>>3;
429 long bufLen = bpd * h;
431 if (XCBGetSetup(c)->bitmap_format_scanline_unit == 32 &&
432 XCBGetSetup(c)->bitmap_format_bit_order == XCBImageOrderMSBFirst &&
433 XCBGetSetup(c)->image_byte_order == XCBImageOrderMSBFirst)
435 SwapBits((unsigned char *)data, buf, bpl, bpl, bpd, h);
440 BYTE *src = (BYTE *)data, *dest = buf;
441 for (i=0; i<h; i++, dest += bpd, src += bpl)
442 memcpy(dest, src, bpl);
445 memcpy(buf, data, bufLen);
447 /* note: CBfD uses XYPixmap, but CPfBD uses XYBitmap
448 there shouldn't be a difference when depth==1,
449 but the neko images are corrupt if using XYPixmap */
450 CARD8 format = (depth==1 ? XCBImageFormatXYPixmap : XCBImageFormatXYBitmap);
452 /* PutImage.c: left_pad = (image->xoffset + req->xoffset) & (dpy->bitmap_unit-1)
453 screen->bitmap_format_scanline_unit
454 left_pad = (0 + 0) & (32 - 1) = 0 */
456 XCBPutImage( c, format, drawable, gc,
458 0, 1, /* left_pad, depth */
462 XCBGenericError *error = NULL;
463 XCBSync( c, &error );
465 printf("error code %d", (int)error->error_code);
472 /* later: XCBFreePixmap( c, bitmap ); */
476 XCBPIXMAP CreateBitmapFromData(XCBConnection *c, XCBWINDOW window,
477 char *data, CARD16 w, CARD16 h)
480 return CreatePixmapFromBitmapData(c, window, data, w, h, 0, 0, depth);
483 void InitBitmapAndGCs(void) {
484 BitmapGCData *BitmapGCDataTablePtr;
485 CARD32 theGCValues[5];
486 XCBDRAWABLE drawable; drawable.window = theWindow;
488 theGCValues[0] = XCBGXcopy;
490 theGCValues[1] = theFgPixel;
491 theGCValues[2] = theBgPixel;
493 theGCValues[3] = XCBFillStyleTiled;
495 /* TODO: latency: make all the bitmaps, then all the contexts? */
497 for ( BitmapGCDataTablePtr = BitmapGCDataTable;
498 BitmapGCDataTablePtr->GCCreatePtr != NULL;
499 BitmapGCDataTablePtr++ ) {
501 *(BitmapGCDataTablePtr->BitmapCreatePtr)
502 = CreatePixmapFromBitmapData( xc, theScreen->root,
503 BitmapGCDataTablePtr->PixelPattern,
504 BitmapGCDataTablePtr->PixelWidth,
505 BitmapGCDataTablePtr->PixelHeight,
506 theFgPixel, theBgPixel, theScreen->root_depth);
508 theGCValues[4] = BitmapGCDataTablePtr->BitmapCreatePtr->xid; /* tile */
510 *(BitmapGCDataTablePtr->GCCreatePtr) = XCBGCONTEXTNew( xc );
511 XCBCreateGC( xc, *(BitmapGCDataTablePtr->GCCreatePtr), drawable,
512 XCBGCFunction | XCBGCForeground | XCBGCBackground |
513 XCBGCFillStyle | XCBGCTile,
517 /* later: XCBFreePixmap( c, bitmap ); */
518 /* later: XCBFreeGC( c, gc ); */
522 GetAtom(XCBConnection *c, const char *atomName)
524 XCBATOM atom = { XCBNone };
525 XCBInternAtomRep *r = XCBInternAtomReply(c,
526 XCBInternAtom(c, 0, strlen(atomName), atomName), NULL);
535 InitScreen( char *DisplayName, char *theGeometry, char *theTitle, Bool iconicState )
537 XCBPIXMAP theCursorSource;
538 XCBPIXMAP theCursorMask;
539 unsigned int theDepth;
540 XCBCOLORMAP theColormap;
543 if ( ( xc = XCBConnect( DisplayName, &screen ) ) == NULL ) {
544 fprintf( stderr, "%s: Can't open connection", ProgramName );
545 if ( DisplayName != NULL )
546 fprintf( stderr, " %s.\n", DisplayName );
548 fprintf( stderr, ".\n" );
552 theScreen = XCBAuxGetScreen(xc, screen);
553 if (theScreen == NULL) {
554 fprintf( stderr, "%s: Can't get default screen", ProgramName );
558 theDepth = theScreen->root_depth; /* DefaultDepth */
559 theColormap = theScreen->default_colormap;
561 WindowPointX = DEFAULT_WIN_X;
562 WindowPointY = DEFAULT_WIN_Y;
563 WindowWidth = WINDOW_WIDTH;
564 WindowHeight = WINDOW_HEIGHT;
568 GeometryStatus = XParseGeometry( theGeometry,
569 &WindowPointX, &WindowPointY,
570 &WindowWidth, &WindowHeight );
573 theCursorSource = CreateBitmapFromData( xc,
579 theCursorMask = CreateBitmapFromData( xc,
583 cursor_mask_height );
586 if ( bgColor == NULL) bgColor = "white";
587 if ( fgColor == NULL) fgColor = "black";
589 XCBAllocNamedColorCookie bgCookie = XCBAllocNamedColor ( xc,
590 theColormap, strlen(bgColor), bgColor );
592 XCBAllocNamedColorCookie fgCookie = XCBAllocNamedColor ( xc,
593 theColormap, strlen(fgColor), fgColor );
595 /* mouse cursor is always black and white */
596 XCBAllocNamedColorCookie blackCookie = XCBAllocNamedColor ( xc,
597 theColormap, strlen("black"), "black" );
598 XCBAllocNamedColorCookie whiteCookie = XCBAllocNamedColor ( xc,
599 theColormap, strlen("white"), "white" );
601 XCBAllocNamedColorRep *bgRep = XCBAllocNamedColorReply( xc, bgCookie, 0 );
604 "%s: Can't allocate the background color %s.\n", ProgramName, bgColor );
607 theBgPixel = bgRep->pixel;
609 XCBAllocNamedColorRep *fgRep = XCBAllocNamedColorReply( xc, fgCookie, 0 );
612 "%s: Can't allocate the foreground color %s.\n", ProgramName, fgColor );
615 theFgPixel = fgRep->pixel;
617 XCBAllocNamedColorRep *blackRep = XCBAllocNamedColorReply( xc, blackCookie, 0 );
620 "%s: Can't allocate the black color.\n", ProgramName );
623 XCBAllocNamedColorRep *whiteRep = XCBAllocNamedColorReply( xc, whiteCookie, 0 );
626 "%s: Can't allocate the white color.\n", ProgramName );
630 theCursor = XCBCURSORNew( xc );
631 XCBCreateCursor ( xc, theCursor, theCursorSource, theCursorMask,
632 blackRep->visual_red, blackRep->visual_green, blackRep->visual_blue,
633 whiteRep->visual_red, whiteRep->visual_green, whiteRep->visual_blue,
634 cursor_x_hot, cursor_y_hot );
642 CARD32 rootAttributes[] = { theBgPixel, EVENT_MASK_ROOT, theCursor.xid };
643 theWindow = theScreen->root;
644 XCBChangeWindowAttributes(xc, theWindow,
645 XCBCWBackPixel | XCBCWEventMask | XCBCWCursor, rootAttributes );
647 /* XClearWindow: clear area with all dimensions 0 */
648 XCBClearArea( xc, False, theWindow, 0, 0, 0, 0 );
650 XCBDRAWABLE d = { theWindow };
651 XCBGetGeometryRep *geometry = XCBGetGeometryReply( xc,
652 XCBGetGeometry( xc, d ), NULL);
654 /* only width & height are used by the program */
655 WindowWidth = geometry->width;
656 WindowHeight = geometry->height;
660 /* TODO: grab key Alt-Q to quit gracefully? */
663 XCBPIXMAP theIconPixmap;
665 CARD32 theWindowAttributes[] = {
666 theBgPixel, /* background */
667 theFgPixel, /* border */
668 False, /* override_redirect */
672 unsigned long theWindowMask = XCBCWBackPixel | XCBCWBorderPixel |
673 XCBCWOverrideRedirect | XCBCWEventMask | XCBCWCursor;
675 theWindow = XCBWINDOWNew( xc );
680 WindowPointX, WindowPointY,
681 WindowWidth, WindowHeight,
683 XCBWindowClassInputOutput,
684 theScreen->root_visual, /* CopyFromParent */
685 theWindowMask, theWindowAttributes );
687 /* new: obey the window-delete protocol, look for XCBClientMessage */
688 deleteWindowAtom = GetAtom(xc, "WM_DELETE_WINDOW");
689 SetWMProtocols( xc, theWindow, 1, &deleteWindowAtom );
691 theIconPixmap = CreateBitmapFromData( xc, theWindow,
692 icon_bits, icon_width, icon_height );
694 theWMHints.icon_pixmap = theIconPixmap;
697 theWMHints.initial_state = IconicState;
699 theWMHints.initial_state = NormalState;
701 theWMHints.flags = IconPixmapHint | StateHint;
703 XSetWMHints( theDisplay, theWindow, &theWMHints );
705 /* Um... there is no function to send the hints...
707 WMHintsSetIconPixmap( &theHints, theIconPixmap );
710 WMHintsSetIconic( &theHints );
712 WMHintsSetNormal( &theHints );
718 /* why hide the structure? */
719 SizeHints *theSizeHints = AllocSizeHints();
721 /* need enum for second param (user specified) */
722 SizeHintsSetPosition(theSizeHints, 0, WindowPointX, WindowPointY);
723 SizeHintsSetSize(theSizeHints, 0, WindowWidth, WindowHeight);
725 SetWMNormalHints(xc, theWindow, theSizeHints);
727 FreeSizeHints(theSizeHints);
729 /* Um, why do I have to specify the encoding in this API? */
730 SetWMName( xc, theWindow, STRING, strlen(theTitle), theTitle );
731 SetWMIconName( xc, theWindow, STRING, strlen(theTitle), theTitle );
733 XCBMapWindow( xc, theWindow );
741 /* latency: ask for keysyms now, and receive them later */
742 theKeySyms = XCBKeySymbolsAlloc( xc );
744 /* later: XCBKeySymbolsFree( keysyms ); */
745 /* later: XCBRefreshKeyboardMapping ( keysyms, mappingEvent ); */
749 void Interval(void) {
754 void TickCount(void) {
755 if ( ++NekoTickCount >= MAX_TICK )
758 if ( NekoTickCount % 2 == 0 )
759 if ( NekoStateCount < MAX_TICK )
765 SetNekoState( int SetValue )
770 NekoState = SetValue;
773 switch ( NekoState ) {
783 NekoMoveDx = NekoMoveDy = 0;
792 /* Xlib does merging of requests, but the Flush and frequent DrawGC changes
793 defeat this mechanism */
796 DrawNeko( int x, int y, XCBGCONTEXT DrawGC )
798 XCBDRAWABLE drawable; drawable.window = theWindow;
799 XCBRECTANGLE rect = { NekoLastX, NekoLastY, BITMAP_WIDTH, BITMAP_HEIGHT };
801 if ( (x != NekoLastX || y != NekoLastY) && (EventState != DEBUG_LIST) )
803 XCBPolyFillRectangle( xc, drawable, SpaceGC, 1, &rect );
804 rect.x = x; rect.y = y;
808 CARD32 originMask = XCBGCTileStippleOriginX | XCBGCTileStippleOriginY;
809 CARD32 origin[2] = { x, y };
810 XCBChangeGC( xc, DrawGC, originMask, origin );
811 /* XSetTSOrigin( theDisplay, DrawGC, x, y ); */
813 XCBPolyFillRectangle( xc, drawable, DrawGC, 1, &rect );
824 void RedrawNeko(void) {
825 XCBDRAWABLE drawable; drawable.window = theWindow;
826 XCBRECTANGLE rect = { NekoLastX, NekoLastY, BITMAP_WIDTH, BITMAP_HEIGHT };
828 XCBPolyFillRectangle( xc, drawable, NekoLastGC, 1, &rect );
835 void NekoDirection(void) {
837 double LargeX, LargeY;
841 if ( NekoMoveDx == 0 && NekoMoveDy == 0 ) {
842 NewState = NEKO_STOP;
844 LargeX = (double)NekoMoveDx;
845 LargeY = (double)(-NekoMoveDy);
846 Length = sqrt( LargeX * LargeX + LargeY * LargeY );
847 SinTheta = LargeY / Length;
849 if ( NekoMoveDx > 0 ) {
850 if ( SinTheta > SinPiPer8Times3 ) {
851 NewState = NEKO_U_MOVE;
852 } else if ( ( SinTheta <= SinPiPer8Times3 )
853 && ( SinTheta > SinPiPer8 ) ) {
854 NewState = NEKO_UR_MOVE;
855 } else if ( ( SinTheta <= SinPiPer8 )
856 && ( SinTheta > -( SinPiPer8 ) ) ) {
857 NewState = NEKO_R_MOVE;
858 } else if ( ( SinTheta <= -( SinPiPer8 ) )
859 && ( SinTheta > -( SinPiPer8Times3 ) ) ) {
860 NewState = NEKO_DR_MOVE;
862 NewState = NEKO_D_MOVE;
865 if ( SinTheta > SinPiPer8Times3 ) {
866 NewState = NEKO_U_MOVE;
867 } else if ( ( SinTheta <= SinPiPer8Times3 )
868 && ( SinTheta > SinPiPer8 ) ) {
869 NewState = NEKO_UL_MOVE;
870 } else if ( ( SinTheta <= SinPiPer8 )
871 && ( SinTheta > -( SinPiPer8 ) ) ) {
872 NewState = NEKO_L_MOVE;
873 } else if ( ( SinTheta <= -( SinPiPer8 ) )
874 && ( SinTheta > -( SinPiPer8Times3 ) ) ) {
875 NewState = NEKO_DL_MOVE;
877 NewState = NEKO_D_MOVE;
882 if ( NekoState != NewState ) {
883 SetNekoState( NewState );
888 Bool IsWindowOver(void) {
889 Bool ReturnValue = False;
894 } else if ( NekoY >= WindowHeight - BITMAP_HEIGHT ) {
895 NekoY = WindowHeight - BITMAP_HEIGHT;
901 } else if ( NekoX >= WindowWidth - BITMAP_WIDTH ) {
902 NekoX = WindowWidth - BITMAP_WIDTH;
906 return( ReturnValue );
910 Bool IsNekoDontMove(void) {
911 return( NekoX == NekoLastX && NekoY == NekoLastY );
915 Bool IsNekoMoveStart(void) {
917 if ( (PrevMouseX >= MouseX - IDLE_SPACE
918 && PrevMouseX <= MouseX + IDLE_SPACE) &&
919 (PrevMouseY >= MouseY - IDLE_SPACE
920 && PrevMouseY <= MouseY + IDLE_SPACE) )
925 if ( NekoMoveDx == 0 && NekoMoveDy == 0 )
933 void CalcDxDy(void) {
934 int RelativeX, RelativeY;
935 double LargeX, LargeY;
936 double DoubleLength, Length;
938 /* TODO: replace query with pointer motion notification? */
940 XCBQueryPointerRep *reply = XCBQueryPointerReply( xc,
941 XCBQueryPointer( xc, theWindow ), NULL);
943 RelativeX = reply->win_x;
944 RelativeY = reply->win_y;
954 LargeX = (double)( MouseX - NekoX - BITMAP_WIDTH / 2 );
955 LargeY = (double)( MouseY - NekoY - BITMAP_HEIGHT );
957 DoubleLength = LargeX * LargeX + LargeY * LargeY;
959 if ( DoubleLength != (double)0 ) {
960 Length = sqrt( DoubleLength );
961 if ( Length <= NekoSpeed ) {
962 NekoMoveDx = (int)LargeX;
963 NekoMoveDy = (int)LargeY;
965 NekoMoveDx = (int)( ( NekoSpeed * LargeX ) / Length );
966 NekoMoveDy = (int)( ( NekoSpeed * LargeY ) / Length );
969 NekoMoveDx = NekoMoveDy = 0;
974 void NekoThinkDraw(void) {
979 if ( NekoState != NEKO_SLEEP ) {
980 DrawNeko( NekoX, NekoY,
981 NekoTickCount % 2 == 0 ?
982 *(AnimationPattern[ NekoState ].TickEvenGCPtr) :
983 *(AnimationPattern[ NekoState ].TickOddGCPtr) );
985 DrawNeko( NekoX, NekoY,
986 NekoTickCount % 8 <= 3 ?
987 *(AnimationPattern[ NekoState ].TickEvenGCPtr) :
988 *(AnimationPattern[ NekoState ].TickOddGCPtr) );
993 switch ( NekoState ) {
995 if ( IsNekoMoveStart() ) {
996 SetNekoState( NEKO_AWAKE );
999 if ( NekoStateCount < NEKO_STOP_TIME ) {
1002 if ( NekoMoveDx < 0 && NekoX <= 0 ) {
1003 SetNekoState( NEKO_L_TOGI );
1004 } else if ( NekoMoveDx > 0 && NekoX >= WindowWidth - BITMAP_WIDTH ) {
1005 SetNekoState( NEKO_R_TOGI );
1006 } else if ( NekoMoveDy < 0 && NekoY <= 0 ) {
1007 SetNekoState( NEKO_U_TOGI );
1008 } else if ( NekoMoveDy > 0 && NekoY >= WindowHeight - BITMAP_HEIGHT ) {
1009 SetNekoState( NEKO_D_TOGI );
1011 SetNekoState( NEKO_JARE );
1015 if ( IsNekoMoveStart() ) {
1016 SetNekoState( NEKO_AWAKE );
1019 if ( NekoStateCount < NEKO_JARE_TIME ) {
1022 SetNekoState( NEKO_KAKI );
1025 if ( IsNekoMoveStart() ) {
1026 SetNekoState( NEKO_AWAKE );
1029 if ( NekoStateCount < NEKO_KAKI_TIME ) {
1032 SetNekoState( NEKO_AKUBI );
1035 if ( IsNekoMoveStart() ) {
1036 SetNekoState( NEKO_AWAKE );
1039 if ( NekoStateCount < NEKO_AKUBI_TIME ) {
1042 SetNekoState( NEKO_SLEEP );
1045 if ( IsNekoMoveStart() ) {
1046 SetNekoState( NEKO_AWAKE );
1051 if ( NekoStateCount < NEKO_AWAKE_TIME ) {
1064 NekoX += NekoMoveDx;
1065 NekoY += NekoMoveDy;
1067 if ( IsWindowOver() ) {
1068 if ( IsNekoDontMove() ) {
1069 SetNekoState( NEKO_STOP );
1077 if ( IsNekoMoveStart() ) {
1078 SetNekoState( NEKO_AWAKE );
1081 if ( NekoStateCount < NEKO_TOGI_TIME ) {
1084 SetNekoState( NEKO_KAKI );
1087 /* Internal Error */
1088 SetNekoState( NEKO_STOP );
1097 void DisplayCharacters() {
1101 for ( Index = 0, x = 0, y = 0;
1102 BitmapGCDataTable[ Index ].GCCreatePtr != NULL; Index++ ) {
1104 DrawNeko( x, y, *(BitmapGCDataTable[ Index ].GCCreatePtr) );
1105 XFlush( theDisplay );
1109 if ( x > WindowWidth - BITMAP_WIDTH ) {
1112 if ( y > WindowHeight - BITMAP_HEIGHT) {
1122 ProcessKeyPress( XCBKeyPressEvent *theKeyEvent )
1124 Bool ReturnState = True;
1126 /* quit on Meta-Q (Alt-Q) */
1127 XCBKEYSYM theKeySym;
1129 /* last param is "int col". What? add enumeration to xcb_keysyms.h */
1130 theKeySym = XCBKeyPressLookupKeysym( theKeySyms, theKeyEvent, 1 );
1132 /* KeySym XK_Q == 'Q' */
1133 if (theKeySym.id == 'Q' && (theKeyEvent->state & XCBModMask1))
1134 ReturnState = False;
1137 if ( EventState == DEBUG_MOVE ) {
1138 switch ( theKeySym ) {
1140 NekoMoveDx = -(int)( NekoSpeed / sqrt( (double)2 ) );
1141 NekoMoveDy = -NekoMoveDx;
1145 NekoMoveDy = (int)NekoSpeed;
1148 NekoMoveDx = (int)( NekoSpeed / sqrt( (double)2 ) );
1149 NekoMoveDy = NekoMoveDx;
1152 NekoMoveDx = -(int)NekoSpeed;
1160 NekoMoveDx = (int)NekoSpeed;
1164 NekoMoveDx = -(int)( NekoSpeed / sqrt( (double)2 ) );
1165 NekoMoveDy = NekoMoveDx;
1169 NekoMoveDy = -(int)NekoSpeed;
1172 NekoMoveDx = (int)( NekoSpeed / sqrt( (double)2 ) );
1173 NekoMoveDy = -NekoMoveDx;
1179 return( ReturnState );
1183 void NekoAdjust(void) {
1186 else if ( NekoX > WindowWidth - BITMAP_WIDTH )
1187 NekoX = WindowWidth - BITMAP_WIDTH;
1191 else if ( NekoY > WindowHeight - BITMAP_HEIGHT )
1192 NekoY = WindowHeight - BITMAP_HEIGHT;
1195 int IsDeleteMessage(XCBClientMessageEvent *msg)
1197 return msg->data.data32[0] == deleteWindowAtom.xid;
1200 Bool ProcessEvent(void) {
1201 XCBGenericEvent *theEvent;
1202 XCBConfigureNotifyEvent *theConfigureNotification;
1203 XCBExposeEvent *theExposure;
1204 XCBButtonPressEvent *theButtonPress;
1205 Bool ContinueState = True;
1208 switch ( EventState ) {
1210 while ( ContinueState &&
1211 NULL != (theEvent = XCBPollForEvent( xc, &error )) ) { /*while ( XCheckMaskEvent( theDisplay, EVENT_MASK, &theEvent ) ) {*/
1212 switch ( theEvent->response_type & 0x7f ) {
1213 case XCBConfigureNotify:
1214 theConfigureNotification = (XCBConfigureNotifyEvent *)theEvent;
1215 WindowWidth = theConfigureNotification->width;
1216 WindowHeight = theConfigureNotification->height;
1217 WindowPointX = theConfigureNotification->x;
1218 WindowPointY = theConfigureNotification->y;
1219 BorderWidth = theConfigureNotification->border_width;
1223 theExposure = (XCBExposeEvent *)theEvent;
1224 if ( theExposure->count == 0 )
1231 ContinueState = ProcessKeyPress( (XCBKeyPressEvent *)theEvent );
1233 case XCBButtonPress:
1234 theButtonPress = (XCBButtonPressEvent *)theEvent;
1235 ContinueState = ( theButtonPress->detail.id != 3 ); /* xbutton.button */
1237 /* new: handle ClientMessage */
1238 case XCBClientMessage:
1239 ContinueState = !IsDeleteMessage((XCBClientMessageEvent *)theEvent);
1243 /*printf("event type:%x\n", (int)theEvent->response_type);*/
1253 XNextEvent( theDisplay, &theEvent );
1254 switch ( theEvent.type ) {
1255 case ConfigureNotify:
1256 WindowWidth = theEvent.xconfigure.width;
1257 WindowHeight = theEvent.xconfigure.height;
1258 WindowPointX = theEvent.xconfigure.x;
1259 WindowPointY = theEvent.xconfigure.y;
1260 BorderWidth = theEvent.xconfigure.border_width;
1263 if ( theEvent.xexpose.count == 0 )
1264 DisplayCharacters();
1267 DisplayCharacters();
1270 ContinueState = ProcessKeyPress( &theEvent );
1273 if ( theEvent.xbutton.button == 3 )
1282 while ( XCheckMaskEvent( theDisplay, EVENT_MASK, &theEvent ) ) {
1283 switch ( theEvent.type ) {
1284 case ConfigureNotify:
1285 WindowWidth = theEvent.xconfigure.width;
1286 WindowHeight = theEvent.xconfigure.height;
1287 WindowPointX = theEvent.xconfigure.x;
1288 WindowPointY = theEvent.xconfigure.y;
1289 BorderWidth = theEvent.xconfigure.border_width;
1293 if ( theEvent.xexpose.count == 0 )
1300 ContinueState = ProcessKeyPress( &theEvent );
1301 if ( !ContinueState ) {
1302 return( ContinueState );
1306 if ( theEvent.xbutton.button == 3 )
1317 /* Internal Error */
1321 return( ContinueState );
1325 void ProcessNeko(void) {
1326 struct itimerval Value;
1328 EventState = NORMAL_STATE;
1330 NekoX = ( WindowWidth - BITMAP_WIDTH / 2 ) / 2;
1331 NekoY = ( WindowHeight - BITMAP_HEIGHT / 2 ) / 2;
1336 SetNekoState( NEKO_STOP );
1338 timerclear( &Value.it_interval );
1339 timerclear( &Value.it_value );
1341 Value.it_interval.tv_usec = IntervalTime;
1342 Value.it_value.tv_usec = IntervalTime;
1344 setitimer( ITIMER_REAL, &Value, 0 );
1348 } while ( ProcessEvent() );
1354 EventState = DEBUG_LIST;
1356 fprintf( stderr, "\n" );
1357 fprintf( stderr, "G-0lMw$rI=<($7$^$9!#(Quit !D Alt-Q)\n" );
1358 fprintf( stderr, "\n" );
1360 XSelectInput( theDisplay, theWindow, EVENT_MASK );
1362 while ( ProcessEvent() );
1366 void NekoMoveTest() {
1367 struct itimerval Value;
1369 EventState = DEBUG_MOVE;
1371 NekoX = ( WindowWidth - BITMAP_WIDTH / 2 ) / 2;
1372 NekoY = ( WindowHeight - BITMAP_HEIGHT / 2 ) / 2;
1377 SetNekoState( NEKO_STOP );
1379 timerclear( &Value.it_interval );
1380 timerclear( &Value.it_value );
1382 Value.it_interval.tv_usec = IntervalTime;
1383 Value.it_value.tv_usec = IntervalTime;
1385 setitimer( ITIMER_REAL, &Value, 0 );
1387 fprintf( stderr, "\n" );
1388 fprintf( stderr, "G-$N0\F0%F%9%H$r9T$$$^$9!#(Quit !D Alt-Q)\n" );
1389 fprintf( stderr, "\n" );
1390 fprintf( stderr, "\t%-!<%Q%C%I>e$N%F%s%-!<$GG-$r0\F0$5$;$F2<$5$$!#\n" );
1391 fprintf( stderr, "\t(M-8z$J%-!<$O#1!A#9$G$9!#)\n" );
1392 fprintf( stderr, "\n" );
1396 } while ( ProcessEvent() );
1400 void ProcessDebugMenu() {
1401 int UserSelectNo = 0;
1402 char UserAnswer[ BUFSIZ ];
1404 fprintf( stderr, "\n" );
1405 fprintf( stderr, "!Zxneko %G%P%C%0%a%K%e!<![\n" );
1407 while ( !( UserSelectNo >= 1 && UserSelectNo <= 2 ) ) {
1408 fprintf( stderr, "\n" );
1409 fprintf( stderr, "\t1)!!G-%-%c%i%/%?!<0lMwI=<(\n" );
1410 fprintf( stderr, "\t2)!!G-0\F0%F%9%H\n" );
1411 fprintf( stderr, "\n" );
1412 fprintf( stderr, "Select: " );
1414 fgets( UserAnswer, sizeof( UserAnswer ), stdin );
1416 UserSelectNo = atoi( UserAnswer );
1418 if ( !( UserSelectNo >= 1 && UserSelectNo <= 2 ) ) {
1419 fprintf( stderr, "\n" );
1420 fprintf( stderr, "@5$7$$HV9f$rA*Br$7$F2<$5$$!#\n" );
1424 switch ( UserSelectNo ) {
1432 /* Internal Error */
1436 fprintf( stderr, "%F%9%H=*N;!#\n" );
1437 fprintf( stderr, "\n" );
1442 void NullFunction(int ignored)
1444 /* signal( SIGALRM, NullFunction ); */
1450 "Usage: %s [-display <display>] [-geometry <geometry>] \\\n",
1452 fprintf( stderr, "\t[-bg <background>] [-fg <foreground>] \\\n" );
1453 fprintf( stderr, "\t[-title <title>] [-name <title>] [-iconic] \\\n" );
1454 fprintf( stderr, "\t[-speed <speed>] [-time <time>] [-root] [-help]\n" );
1459 GetArguments( int argc, char *argv[],
1460 char *theDisplayName, char *theGeometry, char **theTitle,
1461 double *NekoSpeed, long *IntervalTime )
1466 theDisplayName[ 0 ] = '\0';
1467 theGeometry[ 0 ] = '\0';
1469 iconicState = False;
1471 for ( ArgCounter = 0; ArgCounter < argc; ArgCounter++ ) {
1472 if ( strncmp( argv[ ArgCounter ], "-h", 2 ) == 0 ) {
1475 } else if ( strcmp( argv[ ArgCounter ], "-display" ) == 0 ) {
1477 if ( ArgCounter < argc ) {
1478 strcpy( theDisplayName, argv[ ArgCounter ] );
1480 fprintf( stderr, "%s: -display option error.\n", ProgramName );
1483 } else if ( strncmp( argv[ ArgCounter ], "-geom", 5 ) == 0 ) {
1485 if ( ArgCounter < argc ) {
1486 strcpy( theGeometry, argv[ ArgCounter ] );
1489 "%s: -geometry option error.\n", ProgramName );
1492 } else if ( ( strcmp( argv[ ArgCounter ], "-title" ) == 0 )
1493 || ( strcmp( argv[ ArgCounter ], "-name" ) == 0 ) ) {
1495 if ( ArgCounter < argc ) {
1496 *theTitle = argv[ ArgCounter ];
1498 fprintf( stderr, "%s: -title option error.\n", ProgramName );
1501 } else if ( strcmp( argv[ ArgCounter ], "-iconic" ) == 0 ) {
1503 } else if ( strcmp( argv[ ArgCounter ], "-speed" ) == 0 ) {
1505 if ( ArgCounter < argc ) {
1506 *NekoSpeed = atof( argv[ ArgCounter ] );
1508 fprintf( stderr, "%s: -speed option error.\n", ProgramName );
1511 } else if ( strcmp( argv[ ArgCounter ], "-fg" ) == 0 ) {
1513 if ( ArgCounter < argc ) {
1514 fgColor = argv[ArgCounter];
1516 fprintf( stderr, "%s: -fg option error.\n", ProgramName );
1519 } else if ( strcmp( argv[ ArgCounter ], "-bg" ) == 0 ) {
1521 if ( ArgCounter < argc ) {
1522 bgColor = argv[ArgCounter];
1524 fprintf( stderr, "%s: -bg option error.\n", ProgramName );
1527 } else if ( strcmp( argv[ ArgCounter ], "-time" ) == 0 ) {
1529 if ( ArgCounter < argc ) {
1530 *IntervalTime = atol( argv[ ArgCounter ] );
1532 fprintf( stderr, "%s: -time option error.\n", ProgramName );
1535 } else if ( strcmp( argv[ ArgCounter ], "-root" ) == 0 ) {
1539 "%s: Unknown option \"%s\".\n", ProgramName,
1540 argv[ ArgCounter ] );
1546 return( iconicState );
1549 void UndefineCursor( XCBConnection *c, XCBWINDOW w)
1551 CARD32 none[] = { XCBNone };
1552 XCBChangeWindowAttributes( c, w, XCBCWCursor, none );
1556 main( int argc, char *argv[] )
1559 char theDisplayName[ DIRNAMELEN ];
1560 char theGeometry[ DIRNAMELEN ];
1561 char *theTitle = "";
1563 ProgramName = argv[ 0 ];
1569 fgColor = bgColor = (char *) NULL;
1571 iconicState = GetArguments( argc, argv, theDisplayName, theGeometry,
1572 &theTitle, &NekoSpeed, &IntervalTime );
1574 if (theTitle[0] == 0) theTitle = ProgramName;
1575 InitScreen( theDisplayName, theGeometry, theTitle, iconicState );
1577 signal( SIGALRM, NullFunction );
1579 SinPiPer8Times3 = sin( PI_PER8 * (double)3 );
1580 SinPiPer8 = sin( PI_PER8 );
1588 UndefineCursor( xc, theWindow );
1589 XCBDisconnect( xc );