--- lib/Xm/CascadeB.c | 21 ++++++++++++++++++++- lib/Xm/CascadeBG.c | 20 ++++++++++++++++++++ lib/Xm/ToggleB.c | 44 ++++++++++++++++++++++++++++++++++---------- lib/Xm/ToggleBG.c | 30 ++++++++++++++++++++++++++++++ lib/Xm/XmI.h | 2 ++ 5 files changed, 106 insertions(+), 11 deletions(-) --- a/lib/Xm/CascadeB.c +++ b/lib/Xm/CascadeB.c @@ -641,11 +641,30 @@ Redisplay( ((XmCascadeButtonWidget)cb)->label.normal_GC = CB_BackgroundGC(cb); } +#if FIX_1395 + /* 1395: + By default (if not etched and not armed) window (widget) have + background color that used to draw widget bg. When widget is + etched, background selected correctly (as selected color), + but label exposr method will use default background color + to fill area bellow lable text. Result is ugly menus. + We should replace colors before expose from label + and change it back after repainting. + */ + Pixel tmpc = cb->core.background_pixel; + XSetWindowBackground(XtDisplay(cb), XtWindow(cb), select_pix); +#endif _XmProcessLock(); expose = xmLabelClassRec.core_class.expose; _XmProcessUnlock(); - (*expose)(cb, event, region); + (*expose)((Widget) cb, event, region); +#if FIX_1395 + /* + Set correct window background (label is repainted, role back) + */ + XSetWindowBackground(XtDisplay(cb), XtWindow(cb), tmpc); +#endif if (replaceGC) ((XmCascadeButtonWidget)cb)->label.normal_GC = tmpGC; --- a/lib/Xm/CascadeBG.c +++ b/lib/Xm/CascadeBG.c @@ -1069,6 +1069,10 @@ Redisplay( Pixel junk, select_pix; XmManagerWidget mw = (XmManagerWidget) XtParent(cb); Boolean replaceGC = False; +#ifdef FIX_1395 + XGCValues values; + GC tmp_bgc = NULL; +#endif XmGetColors(XtScreen(mw), mw->core.colormap, mw->core.background_pixel, @@ -1080,6 +1084,17 @@ Redisplay( tmpGC = LabG_NormalGC(cb); LabG_NormalGC(cb) = CBG_BackgroundGC(cb); } +#ifdef FIX_1395 + /* Fetch the select_color GetGC() actually used. */ + XGetGCValues(XtDisplay(cb), LabG_BackgroundGC(cb), GCBackground, &values); + if (values.background != select_pix) + { + values.background = select_pix; + XChangeGC(XtDisplay((Widget)cb), LabG_BackgroundGC(cb), GCBackground, &values); + } + tmp_bgc = LabG_BackgroundGC(cb); + LabG_BackgroundGC(cb) = CBG_ArmGC(cb); +#endif _XmProcessLock(); @@ -1087,6 +1102,11 @@ Redisplay( _XmProcessUnlock(); (* expose)((Widget)cb, event, region); +#ifdef FIX_1395 + /* Restore default bg GC*/ + LabG_BackgroundGC(cb) = tmp_bgc; +#endif + if (replaceGC) LabG_NormalGC(cb) = tmpGC; } --- a/lib/Xm/ToggleB.c +++ b/lib/Xm/ToggleB.c @@ -3579,11 +3579,24 @@ DrawToggleLabel( } { - XtExposeProc expose; - _XmProcessLock(); - expose = xmLabelClassRec.core_class.expose; - _XmProcessUnlock(); - (* expose) ((Widget) tb, NULL, NULL); + + XtExposeProc expose; +#if FIX_1395 + Pixel tmpc = tb->core.background_pixel; /* Save bg color */ + + /* Changing label background color if button toggled */ + if (tb->toggle.visual_set == XmSET && !Lab_IsMenupane(tb)) + XSetWindowBackground(XtDisplay(tb), XtWindow(tb), tb->toggle.select_color); +#endif + _XmProcessLock(); + expose = xmLabelClassRec.core_class.expose; + _XmProcessUnlock(); + (* expose) ((Widget) tb, NULL, NULL); +#if FIX_1395 + /* restore default bg color */ + if (tb->toggle.visual_set == XmSET && !Lab_IsMenupane(tb) ) + XSetWindowBackground(XtDisplay(tb), XtWindow(tb), tmpc); +#endif } if (restore_gc) @@ -3615,6 +3628,7 @@ DrawEtchedInMenu( GC tmp_gc = None; XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(tb)); Boolean etched_in = dpy->display.enable_etched_in_menu; + Pixel select_pix, tmpc; if (tb->primitive.top_shadow_color == tb->toggle.select_color || tb->primitive.bottom_shadow_color == tb->toggle.select_color) @@ -3635,7 +3649,7 @@ DrawEtchedInMenu( if (tb->toggle.Armed) { - Pixel select_pix; + tmpc = tb->core.background_pixel; XmGetColors(XtScreen(tb), tb->core.colormap, tb->core.background_pixel, @@ -3651,10 +3665,20 @@ DrawEtchedInMenu( { XtExposeProc expose; - _XmProcessLock(); - expose = xmLabelClassRec.core_class.expose; - _XmProcessUnlock(); - (* expose) ((Widget) tb, NULL, NULL); +#if FIX_1395 + if (tb->toggle.Armed) + { + XSetWindowBackground(XtDisplay(tb), XtWindow(tb), select_pix); + } + else + { + XSetWindowBackground(XtDisplay(tb), XtWindow(tb), tb->core.background_pixel); + } +#endif + _XmProcessLock(); + expose = xmLabelClassRec.core_class.expose; + _XmProcessUnlock(); + (* expose) ((Widget) tb, NULL, NULL); } if (restore_gc) --- a/lib/Xm/ToggleBG.c +++ b/lib/Xm/ToggleBG.c @@ -4295,6 +4295,10 @@ DrawEtchedInMenu( int fh = tb->rectangle.height - 2 * margin; Boolean restore_gc = False; GC tmp_gc = NULL; +#ifdef FIX_1395 + Boolean restore_bgc = False; + GC tmp_bgc = NULL; +#endif XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay((Widget) tb)); Boolean etched_in = dpy->display.enable_etched_in_menu; @@ -4329,6 +4333,25 @@ DrawEtchedInMenu( LabG_NormalGC(tb) = TBG_BackgroundGC(tb); restore_gc = True; } + +#ifdef FIX_1395 + { + XGCValues values; + /* Fetch the select_color GetGC() actually used. */ + XGetGCValues(XtDisplay(tb), TBG_SelectGC(tb), GCBackground, &values); + /* Before label expose call we should change bgc + to correct color and then restore it. + */ + if (values.background != select_pix) + { + XChangeGC(XtDisplay((Widget)tb), TBG_SelectGC(tb), + GCBackground, &values); + tmp_bgc = LabG_BackgroundGC(tb); + LabG_BackgroundGC(tb) = TBG_SelectGC(tb); + restore_bgc = True; + } + } +#endif } { @@ -4345,6 +4368,13 @@ DrawEtchedInMenu( XSetClipMask(XtDisplay(tb), TBG_BackgroundGC(tb), None); LabG_NormalGC(tb) = tmp_gc; } + +#ifdef FIX_1395 + if (restore_bgc) + { + LabG_BackgroundGC(tb) = tmp_bgc; + } +#endif } /* --- a/lib/Xm/XmI.h +++ b/lib/Xm/XmI.h @@ -284,5 +284,7 @@ extern void (*_XtProcessLock)(); extern Pixel _XmAssignInsensitiveColor(Widget w); #endif +#define FIX_1395 1 + #endif /* _XmI_h */ /* DON'T ADD ANYTHING AFTER THIS #endif */