From 9f93fbbe81140d02e65b23ee58a22399f7de6894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Fri, 22 Nov 2013 21:22:55 +0100 Subject: [PATCH] 2013-11-22 21:22 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/rtl/gtxwc/gtxwc.c * removed some old unused code ! restored window oriented message processing ! check window position on each HB_GTI_SETPOS_XY request - some WMs sends ConfigureNotify with 0,0 cords when window is resized overwriting correct values. * switched HB_GTI_SETPOS_XY coordinates to NorthWestGravity (upper left corner of window with frame and title bar) from StaticGravity (upper left corner of client area). Many thanks to Rolf for the hint which allows to translate coordinates from StaticGravity and NorthWestGravity ; updated note about StaticGravity/NorthWestGravity ; Warning: sometime WMs report wrong size in _NET_FRAME_EXTENTS and then HB_GTI_SETPOS_XY returns wrong position two. I observed this behavior in different situations and different WMs, f.e. in KWIN from Ubuntu, after: MAXIMIZE, FULLSCREEN-ON, FULLSCREEN-OFF wrong left and top offsets (3,3) are set which are later inherited also by NORMALSIZE window for which HB_GTI_SETPOS_XY returns wrong position. _NET_FRAME_EXTENTS begins to report correct size after next FULLSCREEN-ON.FULLSCREEN-OFF --- ChangeLog.txt | 22 +++++ src/rtl/gtxwc/gtxwc.c | 183 +++++++++++++++++++++++++++++++++--------- src/rtl/gtxwc/gtxwc.h | 14 +--- 3 files changed, 167 insertions(+), 52 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index d3bf567047..2f4e5ea1d8 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,28 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2013-11-22 21:22 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * src/rtl/gtxwc/gtxwc.c + * removed some old unused code + ! restored window oriented message processing + ! check window position on each HB_GTI_SETPOS_XY request - some + WMs sends ConfigureNotify with 0,0 cords when window is resized + overwriting correct values. + * switched HB_GTI_SETPOS_XY coordinates to NorthWestGravity (upper left + corner of window with frame and title bar) from StaticGravity (upper + left corner of client area). Many thanks to Rolf for the hint which + allows to translate coordinates from StaticGravity and NorthWestGravity + ; updated note about StaticGravity/NorthWestGravity + ; Warning: sometime WMs report wrong size in _NET_FRAME_EXTENTS + and then HB_GTI_SETPOS_XY returns wrong position two. + I observed this behavior in different situations and + different WMs, f.e. in KWIN from Ubuntu, after: + MAXIMIZE, FULLSCREEN-ON, FULLSCREEN-OFF + wrong left and top offsets (3,3) are set which are later + inherited also by NORMALSIZE window for which HB_GTI_SETPOS_XY + returns wrong position. _NET_FRAME_EXTENTS begins to report + correct size after next FULLSCREEN-ON.FULLSCREEN-OFF + 2013-11-21 13:16 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/common/expropt2.c ! fixed setting number of decimal places in optimized multiple diff --git a/src/rtl/gtxwc/gtxwc.c b/src/rtl/gtxwc/gtxwc.c index 004c819c63..0a6ad6008f 100644 --- a/src/rtl/gtxwc/gtxwc.c +++ b/src/rtl/gtxwc/gtxwc.c @@ -118,6 +118,8 @@ static Atom s_atomCompoundText; static Atom s_atomFullScreen; static Atom s_atomState; static Atom s_atomMotifHints; +static Atom s_atomFrameExtends; +static Atom s_atomCardinal; typedef struct @@ -176,6 +178,10 @@ typedef struct int iNewPosX; int iNewPosY; + int iCordLeft; + int iCordTop; + HB_BOOL fCordsInited; + /* Set to true when Windows is resized */ HB_BOOL fWinResize; HB_USHORT newWidth; @@ -2603,6 +2609,44 @@ static void hb_gt_xwc_MotifWmHints( PXWND_DEF wnd ) /* *********************************************************************** */ +/* update returned cords for NorthWestGravity */ +static void hb_gt_xwc_UpdateWindowCords( PXWND_DEF wnd, int * pX, int * pY ) +{ + if( ! wnd->fCordsInited ) + { + Atom actual_type_return = 0; + int actual_format_return = 0; + unsigned long nitems_return = 0, bytes_after_return = 0; + unsigned char * prop_return = NULL; + + if( XGetWindowProperty( wnd->dpy, wnd->window, s_atomFrameExtends, + 0, 4, False, s_atomCardinal, &actual_type_return, + &actual_format_return, &nitems_return, + &bytes_after_return, &prop_return ) == Success ) + { + if( prop_return ) + { + if( actual_type_return == s_atomCardinal && nitems_return == 4 && + actual_format_return == 32 ) + { + /* _NET_FRAME_EXTENTS: left, right, top, bottom, CARDINAL[4]/32 */ + long * fe = ( long * ) prop_return; + + wnd->iCordLeft = fe[ 0 ]; + wnd->iCordTop = fe[ 2 ]; + } + XFree( prop_return ); + } + } + wnd->fCordsInited = HB_TRUE; + } + + *pX -= wnd->iCordLeft; + *pY -= wnd->iCordTop; +} + +/* *********************************************************************** */ + static void hb_gt_xwc_ProcessKey( PXWND_DEF wnd, XKeyEvent * evt ) { char buf[ 32 ]; @@ -3123,7 +3167,10 @@ static void hb_gt_xwc_WndProc( PXWND_DEF wnd, XEvent * evt ) case ConfigureNotify: #ifdef XWC_DEBUG - printf( "Event: ConfigureNotify (%d,%d)\n", evt->xconfigure.width, evt->xconfigure.height ); fflush( stdout ); + printf( "Event: ConfigureNotify (x=%d, y=%d, w=%d, h=%d, or=%d)\n", + evt->xconfigure.x, evt->xconfigure.y, + evt->xconfigure.width, evt->xconfigure.height, + evt->xconfigure.override_redirect ); fflush( stdout ); #endif wnd->iNewPosX = evt->xconfigure.x; wnd->iNewPosY = evt->xconfigure.y; @@ -3328,7 +3375,81 @@ static void hb_gt_xwc_WndProc( PXWND_DEF wnd, XEvent * evt ) wnd->lastEventTime = evt->xproperty.time; break; + case VisibilityNotify: #ifdef XWC_DEBUG + printf( "Event: VisibilityNotify\n" ); fflush( stdout ); +#endif + wnd->fCordsInited = HB_FALSE; + break; + + case GraphicsExpose: +#ifdef XWC_DEBUG + printf( "Event: GraphicsExpose\n" ); fflush( stdout ); +#endif + wnd->fCordsInited = HB_FALSE; + break; + +#ifdef XWC_DEBUG + case GravityNotify: + printf( "Event: GravityNotify (%d, %d)\n", evt->xgravity.x, evt->xgravity.y ); fflush( stdout ); + break; + + case ResizeRequest: + printf( "Event: ResizeRequest\n" ); fflush( stdout ); + break; + + case KeymapNotify: + printf( "Event: KeymapNotify\n" ); fflush( stdout ); + break; + + case EnterNotify: + printf( "Event: EnterNotify\n" ); fflush( stdout ); + break; + + case LeaveNotify: + printf( "Event: LeaveNotify\n" ); fflush( stdout ); + break; + + case DestroyNotify: + printf( "Event: DestroyNotify\n" ); fflush( stdout ); + break; + + case UnmapNotify: + printf( "Event: UnmapNotify\n" ); fflush( stdout ); + break; + + case MapNotify: + printf( "Event: MapNotify\n" ); fflush( stdout ); + break; + + case MapRequest: + printf( "Event: MapRequest\n" ); fflush( stdout ); + break; + + case ReparentNotify: + printf( "Event: ReparentNotify\n" ); fflush( stdout ); + break; + + case ConfigureRequest: + printf( "Event: ConfigureRequest\n" ); fflush( stdout ); + break; + + case CirculateNotify: + printf( "Event: CirculateNotify\n" ); fflush( stdout ); + break; + + case CirculateRequest: + printf( "Event: CirculateRequest\n" ); fflush( stdout ); + break; + + case ColormapNotify: + printf( "Event: ColormapNotify\n" ); fflush( stdout ); + break; + + case GenericEvent: + printf( "Event: GenericEvent\n" ); fflush( stdout ); + break; + default: printf( "Event: #%d\n", evt->type ); fflush( stdout ); break; @@ -4002,6 +4123,7 @@ static void hb_gt_xwc_UpdateSize( PXWND_DEF wnd ) ( wnd->oldWidth != wnd->newWidth || wnd->oldHeight != wnd->newHeight ) && ! wnd->fFullScreen ) { + wnd->fCordsInited = HB_FALSE; wnd->oldWidth = wnd->newWidth; wnd->oldHeight = wnd->newHeight; XResizeWindow( wnd->dpy, wnd->window, wnd->width, wnd->height ); @@ -4072,47 +4194,27 @@ static void hb_gt_xwc_ProcessMessages( PXWND_DEF wnd, HB_BOOL fSync ) hb_gt_xwc_SetTitle( wnd, wnd->szTitle ); } -#if 1 - if( fSync ) - XSync( wnd->dpy, False ); - do + for( ;; ) { - while( XEventsQueued( wnd->dpy, QueuedAfterFlush ) ) - { - XEvent evt; - XNextEvent( wnd->dpy, &evt ); - hb_gt_xwc_WndProc( wnd, &evt ); - } - hb_gt_xwc_UpdateSize( wnd ); - hb_gt_xwc_UpdatePts( wnd ); - hb_gt_xwc_UpdateCursor( wnd ); + HB_BOOL fRepeat = HB_FALSE; + XEvent evt; + if( fSync ) XSync( wnd->dpy, False ); - } - while( XEventsQueued( wnd->dpy, QueuedAfterFlush ) ); -#else -{ - HB_BOOL fRepeat; - XEvent evt; - while( XCheckWindowEvent( wnd->dpy, wnd->window, XWC_STD_MASK, &evt ) ) - hb_gt_xwc_WndProc( wnd, &evt ); - - do - { - hb_gt_xwc_UpdateSize( wnd ); - hb_gt_xwc_UpdatePts( wnd ); - hb_gt_xwc_UpdateCursor( wnd ); - fRepeat = HB_FALSE; while( XCheckWindowEvent( wnd->dpy, wnd->window, XWC_STD_MASK, &evt ) ) { hb_gt_xwc_WndProc( wnd, &evt ); fRepeat = HB_TRUE; } + + if( !fRepeat ) + break; + + hb_gt_xwc_UpdateSize( wnd ); + hb_gt_xwc_UpdatePts( wnd ); + hb_gt_xwc_UpdateCursor( wnd ); } - while( fRepeat ); -} -#endif HB_XWC_XLIB_UNLOCK(); @@ -4410,6 +4512,8 @@ static HB_BOOL hb_gt_xwc_ConnectX( PXWND_DEF wnd, HB_BOOL fExit ) s_atomFullScreen = XInternAtom( wnd->dpy, "_NET_WM_STATE_FULLSCREEN", False ); s_atomState = XInternAtom( wnd->dpy, "_NET_WM_STATE", False ); s_atomMotifHints = XInternAtom( wnd->dpy, "_MOTIF_WM_HINTS", False ); + s_atomFrameExtends = XInternAtom( wnd->dpy, "_NET_FRAME_EXTENTS", False ); + s_atomCardinal = XInternAtom( wnd->dpy, "CARDINAL", False ); HB_XWC_XLIB_UNLOCK(); @@ -4509,11 +4613,11 @@ static void hb_gt_xwc_SetResizing( PXWND_DEF wnd ) /* with StaticGravity XMoveWindow expects upper left corner of client area * and with NorthWestGravity it expect upper left corner of window with - * title bar. Anyhow in WM I tested it ConfigureNotify give us client area - * possition so if we want to use compatible coordiantes in HB_GTI_SETPOS_XY - * we should use StaticGravity. + * frame and title bar. ConfigureNotify always returns client area possition + * so working with NorthWestGravity it's necessary to update cords returned + * to user in hb_gt_xwc_UpdateWindowCords() */ - xsize.win_gravity = StaticGravity; + xsize.win_gravity = NorthWestGravity; if( wnd->fResizable ) { @@ -5274,7 +5378,6 @@ static HB_BOOL hb_gt_xwc_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) { int x = wnd->iNewPosX, y = wnd->iNewPosY; -#if 0 if( wnd->window ) { XWindowAttributes wndAttr; @@ -5290,12 +5393,14 @@ static HB_BOOL hb_gt_xwc_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) } } } -#endif if( ! pInfo->pResult ) pInfo->pResult = hb_itemNew( NULL ); hb_arrayNew( pInfo->pResult, 2 ); + if( wnd->fInit ) + hb_gt_xwc_UpdateWindowCords( wnd, &x, &y ); + if( iType == HB_GTI_SETPOS_ROWCOL ) { iVal = x; @@ -5326,7 +5431,7 @@ static HB_BOOL hb_gt_xwc_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) x = y * wnd->fontWidth; y = iVal * wnd->fontHeight; } - if( wnd->window ) + if( wnd->fInit ) { XMoveWindow( wnd->dpy, wnd->window, x, y ); } diff --git a/src/rtl/gtxwc/gtxwc.h b/src/rtl/gtxwc/gtxwc.h index 1c14adce9f..f5901f24a6 100644 --- a/src/rtl/gtxwc/gtxwc.h +++ b/src/rtl/gtxwc/gtxwc.h @@ -103,18 +103,6 @@ typedef HB_USHORT HB_GT_CELLTYPE; #define XWC_DEFAULT_FONT_NAME "fixed" #define XWC_DEFAULT_FONT_ENCODING "iso10646-1" -#if 0 -#define XWC_DEFAULT_FONT_WEIGHT "*" -#define XWC_DEFAULT_FONT_ENCODING "iso8859-1" -#define XWC_DEFAULT_FONT_NAME "Lucida Console" - -#define XWC_DEFAULT_FONT_HEIGHT 20 -#define XWC_DEFAULT_FONT_WIDTH 9 -#define XWC_DEFAULT_FONT_WEIGHT "medium" -#define XWC_DEFAULT_FONT_NAME "rcsoft" -#define XWC_DEFAULT_FONT_ENCODING "iso10646-1" -#endif - #define XWC_DEFAULT_FONT_FIXMETRIC HB_FALSE #define XWC_DEFAULT_FONT_CLRBKG HB_FALSE #define XWC_DEFAULT_FONT_DRAWBOX HB_TRUE @@ -125,7 +113,7 @@ typedef HB_USHORT HB_GT_CELLTYPE; #define XWC_STD_MASK ( ExposureMask | StructureNotifyMask | FocusChangeMask | \ ButtonPressMask | ButtonReleaseMask | PointerMotionMask | \ - KeyPressMask | KeyReleaseMask ) + KeyPressMask | KeyReleaseMask | VisibilityChangeMask ) /* Box char unicode values */ #define HB_BOXCH_ARROW_R 0x0010 /* ARROW RIGHT */