changeset 45147:e10cf8f440ae

(xlwMenuResources): New resource. (find_next_selectable): Return current item when the menu is not poped up. Rename `inactive_gc' to `disabled_gc'. Use lighter/darker color for disabled menu items instead of using stipple. Use stipple only when better color can not be determined automatically.
author Pavel Janík <Pavel@Janik.cz>
date Mon, 06 May 2002 18:55:30 +0000
parents 174fe450ad23
children af3fa518b224
files lwlib/xlwmenu.c
diffstat 1 files changed, 49 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/lwlib/xlwmenu.c	Mon May 06 18:54:56 2002 +0000
+++ b/lwlib/xlwmenu.c	Mon May 06 18:55:30 2002 +0000
@@ -139,6 +139,8 @@
      offset(menu.font),XtRString, "XtDefaultFont"},
   {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
      offset(menu.foreground), XtRString, "XtDefaultForeground"},
+  {XtNdisabledForeground, XtCDisabledForeground, XtRPixel, sizeof(Pixel),
+   offset(menu.disabled_foreground), XtRString, (XtPointer)NULL},
   {XtNbuttonForeground, XtCButtonForeground, XtRPixel, sizeof(Pixel),
      offset(menu.button_foreground), XtRString, "XtDefaultForeground"},
   {XtNmargin, XtCMargin, XtRDimension,  sizeof(Dimension),
@@ -997,7 +999,7 @@
       if (val->enabled)
 	text_gc = mw->menu.foreground_gc;
       else
-	text_gc = mw->menu.inactive_gc;
+	text_gc = mw->menu.disabled_gc;
       deco_gc = mw->menu.foreground_gc;
 
       if (separator_p)
@@ -1453,6 +1455,8 @@
      XlwMenuWidget mw;
 {
   XGCValues xgcv;
+  XColor temp;
+  int delta;
 
   xgcv.font = mw->menu.font->fid;
   xgcv.foreground = mw->menu.foreground;
@@ -1469,13 +1473,47 @@
 				&xgcv);
 
   xgcv.font = mw->menu.font->fid;
-  xgcv.foreground = mw->menu.foreground;
   xgcv.background = mw->core.background_pixel;
-  xgcv.fill_style = FillStippled;
-  xgcv.stipple = mw->menu.gray_pixmap;
-  mw->menu.inactive_gc = XtGetGC ((Widget)mw,
-				  (GCFont | GCForeground | GCBackground
-				   | GCFillStyle | GCStipple), &xgcv);
+
+#define BRIGHTNESS(color) (((color) & 0xff) + (((color) >> 8) & 0xff) + (((color) >> 16) & 0xff))
+
+  /* Allocate color for disabled menu-items.  */
+  if (BRIGHTNESS(mw->menu.foreground) < BRIGHTNESS(mw->core.background_pixel))
+    {
+      delta = 2.3;
+      temp.pixel = mw->menu.foreground;
+    }
+  else
+    {
+      delta = 1.2;
+      temp.pixel = mw->core.background_pixel;
+    }
+
+  x_alloc_lighter_color_for_widget ((Widget) mw, XtDisplay ((Widget) mw),
+				    mw->core.colormap,
+				    &temp.pixel,
+				    delta,
+				    0x8000);
+  mw->menu.disabled_foreground = temp.pixel;
+
+  if (mw->menu.foreground == mw->menu.disabled_foreground
+      || mw->core.background_pixel == mw->menu.disabled_foreground)
+    {
+      /* Too few colors, use stipple.  */
+      xgcv.foreground = mw->menu.foreground;
+      xgcv.fill_style = FillStippled;
+      xgcv.stipple = mw->menu.gray_pixmap;
+      mw->menu.disabled_gc = XtGetGC ((Widget)mw,
+				      (GCFont | GCForeground | GCBackground
+				       | GCFillStyle | GCStipple), &xgcv);
+    }
+  else
+    {
+      /* Many colors available, use disabled pixel.  */
+      xgcv.foreground = mw->menu.disabled_foreground;
+      mw->menu.disabled_gc = XtGetGC ((Widget)mw,
+				      (GCFont | GCForeground | GCBackground), &xgcv);
+    }
 
   xgcv.font = mw->menu.font->fid;
   xgcv.foreground = mw->menu.button_foreground;
@@ -1500,13 +1538,13 @@
 {
   XtReleaseGC ((Widget) mw, mw->menu.foreground_gc);
   XtReleaseGC ((Widget) mw, mw->menu.button_gc);
-  XtReleaseGC ((Widget) mw, mw->menu.inactive_gc);
+  XtReleaseGC ((Widget) mw, mw->menu.disabled_gc);
   XtReleaseGC ((Widget) mw, mw->menu.inactive_button_gc);
   XtReleaseGC ((Widget) mw, mw->menu.background_gc);
   /* let's get some segvs if we try to use these... */
   mw->menu.foreground_gc = (GC) -1;
   mw->menu.button_gc = (GC) -1;
-  mw->menu.inactive_gc = (GC) -1;
+  mw->menu.disabled_gc = (GC) -1;
   mw->menu.inactive_button_gc = (GC) -1;
   mw->menu.background_gc = (GC) -1;
 }
@@ -2050,6 +2088,8 @@
 
   if (current == item)
     {
+      if (mw->menu.old_depth < 2)
+	return current;
       current = mw->menu.old_stack [mw->menu.old_depth - 2]->contents;
 
       while (lw_separator_p (current->name, &separator, 0) || !current->enabled)