PKGBUILDs/community/openmotif/openmotif-etched-in-menus.diff

223 lines
6.3 KiB
Diff
Raw Normal View History

2009-10-10 02:15:33 +00:00
---
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 */