X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=neko%2Fxcbneko.c;h=f254e2bef92f0742bfa94e079442b75ad1be62c6;hb=8bbb0940943cfa40716c931a199f3134fae32852;hp=bd7b7068aeeda2295c09dd3a07077a1998984e0e;hpb=6db1b7e5de1abfc6315038aadc763ecfbb4213d0;p=free-sw%2Fxcb%2Fdemo diff --git a/neko/xcbneko.c b/neko/xcbneko.c index bd7b706..f254e2b 100644 --- a/neko/xcbneko.c +++ b/neko/xcbneko.c @@ -141,15 +141,14 @@ char *fgColor, *bgColor; static char *ProgramName; -/*Display *theDisplay;*/ XCBConnection *xc; XCBSCREEN *theScreen; /* instead of macro(theDisplay, int theScreen) */ -unsigned int theDepth; unsigned long theBlackPixel; unsigned long theWhitePixel; XCBWINDOW theWindow; XCBCURSOR theCursor; XCBKeySymbols *theKeySyms; +XCBATOM deleteWindowAtom; static unsigned int WindowWidth; static unsigned int WindowHeight; @@ -424,17 +423,23 @@ XCBPIXMAP CreatePixmapFromBitmapData( XCBConnection *c, /* must swap and pad the data if bit/byte_order isn't LSB (Mac) */ /* Mac X Server: byte_order=bit_order=MSB, unit=32, padding=32 */ - long bufLen = (w+7)/8*h; + long bpl = (w+7)/8; + long pad = XCBGetSetup(c)->bitmap_format_scanline_pad; + long bpd = ROUNDUP(w, pad)>>3; + long bufLen = bpd * h; BYTE buf[1024]; if (XCBGetSetup(c)->bitmap_format_scanline_unit == 32 && XCBGetSetup(c)->bitmap_format_bit_order == XCBImageOrderMSBFirst && XCBGetSetup(c)->image_byte_order == XCBImageOrderMSBFirst) { - long bpl = (w+7)/8; - long pad = XCBGetSetup(c)->bitmap_format_scanline_pad; - long bpd = ROUNDUP(w, pad)>>3; - SwapBits((unsigned char *)data, (unsigned char *)buf, bpl, bpl, bpd, h); - bufLen = bpd * h; + SwapBits((unsigned char *)data, buf, bpl, bpl, bpd, h); + } + else if (bpl != bpd) + { + int i; + BYTE *src = (BYTE *)data, *dest = buf; + for (i=0; iatom; + free(r); + } + return atom; +} + void InitScreen( char *DisplayName, char *theGeometry, char *theTitle, Bool iconicState ) { XCBPIXMAP theCursorSource; XCBPIXMAP theCursorMask; + unsigned int theDepth; XCBCOLORMAP theColormap; int screen; @@ -629,19 +648,13 @@ InitScreen( char *DisplayName, char *theGeometry, char *theTitle, Bool iconicSta theScreen->root_visual, /* CopyFromParent */ theWindowMask, theWindowAttributes ); + /* new: obey the window-delete protocol, look for XCBClientMessage */ + deleteWindowAtom = GetAtom(xc, "WM_DELETE_WINDOW"); + SetWMProtocols( xc, theWindow, 1, &deleteWindowAtom ); + theIconPixmap = CreateBitmapFromData( xc, theWindow, icon_bits, icon_width, icon_height ); - #ifdef TODO_ICCCM - /* Um... there is no function to send the hints... - WMHints theWMHints; - WMHintsSetIconPixmap( &theHints, theIconPixmap ); - - if ( iconicState ) - WMHintsSetIconic( &theHints ); - else - WMHintsSetNormal( &theHints ); - */ theWMHints.icon_pixmap = theIconPixmap; if ( iconicState ) @@ -652,36 +665,37 @@ InitScreen( char *DisplayName, char *theGeometry, char *theTitle, Bool iconicSta theWMHints.flags = IconPixmapHint | StateHint; XSetWMHints( theDisplay, theWindow, &theWMHints ); -#endif +#else + /* Um... there is no function to send the hints... + WMHints theWMHints; + WMHintsSetIconPixmap( &theHints, theIconPixmap ); -#ifdef TODO_ICCCM - /* - SizeHints *hints = AllocSizeHints(); - SizeHintsSetPosition(hints, WindowPointX, WindowPointY); - SizeHintsSetSize(hints, WindowWidth, WindowHeight); - SetWMNormalHints(xc, theWindow, hints); - FreeSizeHints(hints); - */ - XSizeHints theSizeHints; - - theSizeHints.flags = PPosition | PSize; - theSizeHints.x = WindowPointX; - theSizeHints.y = WindowPointY; - theSizeHints.width = WindowWidth; - theSizeHints.height = WindowHeight; - - XSetNormalHints( theDisplay, theWindow, &theSizeHints ); + if ( iconicState ) + WMHintsSetIconic( &theHints ); + else + WMHintsSetNormal( &theHints ); + + Now what? + */ #endif + /* why hide the structure? */ + SizeHints *theSizeHints = AllocSizeHints(); + + /* need enum for second param (user specified) */ + SizeHintsSetPosition(theSizeHints, 0, WindowPointX, WindowPointY); + SizeHintsSetSize(theSizeHints, 0, WindowWidth, WindowHeight); + + SetWMNormalHints(xc, theWindow, theSizeHints); + + FreeSizeHints(theSizeHints); + /* Um, why do I have to specify the encoding in this API? */ SetWMName( xc, theWindow, STRING, strlen(theTitle), theTitle ); SetWMIconName( xc, theWindow, STRING, strlen(theTitle), theTitle ); XCBMapWindow( xc, theWindow ); - /* moved to the CreateWindow attribute list */ - /* XSelectInput( theDisplay, theWindow, EVENT_MASK ); */ - } #ifdef TODO @@ -1154,6 +1168,11 @@ void NekoAdjust(void) { NekoY = WindowHeight - BITMAP_HEIGHT; } +int IsDeleteMessage(XCBClientMessageEvent *msg) +{ + return msg->data.data32[0] == deleteWindowAtom.xid; +} + Bool ProcessEvent(void) { XCBGenericEvent *theEvent; XCBConfigureNotifyEvent *theConfigureNotification; @@ -1164,8 +1183,9 @@ Bool ProcessEvent(void) { switch ( EventState ) { case NORMAL_STATE: - while ( NULL != (theEvent = XCBPollForEvent( xc, &error )) ) { /*while ( XCheckMaskEvent( theDisplay, EVENT_MASK, &theEvent ) ) {*/ - switch ( theEvent->response_type ) { + while ( ContinueState && + NULL != (theEvent = XCBPollForEvent( xc, &error )) ) { /*while ( XCheckMaskEvent( theDisplay, EVENT_MASK, &theEvent ) ) {*/ + switch ( theEvent->response_type & 0x7f ) { case XCBConfigureNotify: theConfigureNotification = (XCBConfigureNotifyEvent *)theEvent; WindowWidth = theConfigureNotification->width; @@ -1185,26 +1205,24 @@ Bool ProcessEvent(void) { break; case XCBKeyPress: ContinueState = ProcessKeyPress( (XCBKeyPressEvent *)theEvent ); - if ( !ContinueState ) { - free(theEvent); - return( ContinueState ); - } break; case XCBButtonPress: theButtonPress = (XCBButtonPressEvent *)theEvent; - if ( theButtonPress->detail.id == 3 ) { /* xbutton.button */ - free(theEvent); - return( False ); - } + ContinueState = ( theButtonPress->detail.id != 3 ); /* xbutton.button */ break; + /* new: handle ClientMessage */ + case XCBClientMessage: + ContinueState = !IsDeleteMessage((XCBClientMessageEvent *)theEvent); + break; default: /* Unknown Event */ + /*printf("event type:%x\n", (int)theEvent->response_type);*/ break; } free(theEvent); if (error != 0) return False; - } + } /* end while */ break; #ifdef DEBUG case DEBUG_LIST: