]> Dogcows Code - chaz/openbox/blobdiff - openbox/menuframe.c
changes to the client menu, which entries are there, and reorganizing, and renaming.
[chaz/openbox] / openbox / menuframe.c
index cf9bfcbf5c7cd41c4c72e2d954626f7cca4a7ea0..f87c3c0bb6da15404faa6dcf705207437d09218e 100644 (file)
@@ -140,8 +140,10 @@ static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry,
     XMapWindow(ob_display, self->text);
 
     self->a_normal = RrAppearanceCopy(ob_rr_theme->a_menu_normal);
-    self->a_disabled = RrAppearanceCopy(ob_rr_theme->a_menu_disabled);
     self->a_selected = RrAppearanceCopy(ob_rr_theme->a_menu_selected);
+    self->a_disabled = RrAppearanceCopy(ob_rr_theme->a_menu_disabled);
+    self->a_disabled_selected =
+        RrAppearanceCopy(ob_rr_theme->a_menu_disabled_selected);
 
     if (entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR) {
         self->a_separator = RrAppearanceCopy(ob_rr_theme->a_clear_tex);
@@ -159,10 +161,12 @@ static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry,
 
     self->a_text_normal =
         RrAppearanceCopy(ob_rr_theme->a_menu_text_normal);
-    self->a_text_disabled =
-        RrAppearanceCopy(ob_rr_theme->a_menu_text_disabled);
     self->a_text_selected =
         RrAppearanceCopy(ob_rr_theme->a_menu_text_selected);
+    self->a_text_disabled =
+        RrAppearanceCopy(ob_rr_theme->a_menu_text_disabled);
+    self->a_text_disabled_selected =
+        RrAppearanceCopy(ob_rr_theme->a_menu_text_disabled_selected);
     self->a_text_title =
         RrAppearanceCopy(ob_rr_theme->a_menu_text_title);
 
@@ -186,15 +190,17 @@ static void menu_entry_frame_free(ObMenuEntryFrame *self)
         }
 
         RrAppearanceFree(self->a_normal);
-        RrAppearanceFree(self->a_disabled);
         RrAppearanceFree(self->a_selected);
+        RrAppearanceFree(self->a_disabled);
+        RrAppearanceFree(self->a_disabled_selected);
 
         RrAppearanceFree(self->a_separator);
         RrAppearanceFree(self->a_icon);
         RrAppearanceFree(self->a_mask);
         RrAppearanceFree(self->a_text_normal);
-        RrAppearanceFree(self->a_text_disabled);
         RrAppearanceFree(self->a_text_selected);
+        RrAppearanceFree(self->a_text_disabled);
+        RrAppearanceFree(self->a_text_disabled_selected);
         RrAppearanceFree(self->a_text_title);
         RrAppearanceFree(self->a_bullet_normal);
         RrAppearanceFree(self->a_bullet_selected);
@@ -221,15 +227,18 @@ static void menu_frame_place_topmenu(ObMenuFrame *self, gint *x, gint *y)
 
         /* try to the right of the cursor */
         menu_frame_move_on_screen(self, myx, *y, &dx, &dy);
+        self->direction_right = TRUE;
         if (dx != 0) {
             /* try to the left of the cursor */
             myx = *x - self->area.width;
             menu_frame_move_on_screen(self, myx, *y, &dx, &dy);
+            self->direction_right = FALSE;
         }
         if (dx != 0) {
             /* if didnt fit on either side so just use what it says */
             myx = *x;
             menu_frame_move_on_screen(self, myx, *y, &dx, &dy);
+            self->direction_right = TRUE;
         }
         *x = myx + dx;
         *y += dy;
@@ -241,29 +250,34 @@ static void menu_frame_place_topmenu(ObMenuFrame *self, gint *x, gint *y)
 
         /* try to the bottom right of the cursor */
         menu_frame_move_on_screen(self, myx, myy, &dx, &dy);
+        self->direction_right = TRUE;
         if (dx != 0 || dy != 0) {
             /* try to the bottom left of the cursor */
             myx = *x - self->area.width;
             myy = *y;
             menu_frame_move_on_screen(self, myx, myy, &dx, &dy);
+            self->direction_right = FALSE;
         }
         if (dx != 0 || dy != 0) {
             /* try to the top right of the cursor */
             myx = *x;
             myy = *y - self->area.height;
             menu_frame_move_on_screen(self, myx, myy, &dx, &dy);
+            self->direction_right = TRUE;
         }
         if (dx != 0 || dy != 0) {
             /* try to the top left of the cursor */
             myx = *x - self->area.width;
             myy = *y - self->area.height;
             menu_frame_move_on_screen(self, myx, myy, &dx, &dy);
+            self->direction_right = FALSE;
         }
         if (dx != 0 || dy != 0) {
             /* if didnt fit on either side so just use what it says */
             myx = *x;
             myy = *y;
             menu_frame_move_on_screen(self, myx, myy, &dx, &dy);
+            self->direction_right = TRUE;
         }
         *x = myx + dx;
         *y = myy + dy;
@@ -330,12 +344,14 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self)
     switch (self->entry->type) {
     case OB_MENU_ENTRY_TYPE_NORMAL:
     case OB_MENU_ENTRY_TYPE_SUBMENU:
-        item_a = ((self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
-                   !self->entry->data.normal.enabled) ?
-                  self->a_disabled :
+        item_a = (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
+                  !self->entry->data.normal.enabled ?
+                  /* disabled */
                   (self == self->frame->selected ?
-                   self->a_selected :
-                   self->a_normal));
+                   self->a_disabled_selected : self->a_disabled) :
+                  /* enabled */
+                  (self == self->frame->selected ?
+                   self->a_selected : self->a_normal));
         th = self->frame->item_h;
         break;
     case OB_MENU_ENTRY_TYPE_SEPARATOR:
@@ -360,11 +376,14 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self)
 
     switch (self->entry->type) {
     case OB_MENU_ENTRY_TYPE_NORMAL:
-        text_a = (!self->entry->data.normal.enabled ?
-                  self->a_text_disabled :
+        text_a = (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
+                  !self->entry->data.normal.enabled ?
+                  /* disabled */
+                  (self == self->frame->selected ?
+                   self->a_text_disabled_selected : self->a_text_disabled) :
+                  /* enabled */
                   (self == self->frame->selected ?
-                   self->a_text_selected :
-                   self->a_text_normal));
+                   self->a_text_selected : self->a_text_normal));
         text_a->texture[0].data.text.string = self->entry->data.normal.label;
         if (self->entry->data.normal.shortcut &&
             (self->frame->menu->show_all_shortcuts ||
@@ -494,9 +513,13 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self)
         self->a_mask->texture[0].data.mask.mask =
             self->entry->data.normal.mask;
 
-        c = ((self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
-              !self->entry->data.normal.enabled) ?
-             self->entry->data.normal.mask_disabled_color :
+        c = (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
+             !self->entry->data.normal.enabled ?
+             /* disabled */
+             (self == self->frame->selected ?
+              self->entry->data.normal.mask_disabled_selected_color :
+              self->entry->data.normal.mask_disabled_color) :
+             /* enabled */
              (self == self->frame->selected ?
               self->entry->data.normal.mask_selected_color :
               self->entry->data.normal.mask_normal_color));
@@ -561,7 +584,7 @@ static void menu_frame_render(ObMenuFrame *self)
         gint l, t, r, b;
 
         e->a_text_normal->texture[0].data.text.string = "";
-        RrMinsize(e->a_text_normal, &tw, &th);
+        RrMinSize(e->a_text_normal, &tw, &th);
         tw += 2*PADDING;
         th += 2*PADDING;
         self->item_h = th;
@@ -584,6 +607,12 @@ static void menu_frame_render(ObMenuFrame *self)
                   MAX(self->item_margin.top, t),
                   MAX(self->item_margin.right, r),
                   MAX(self->item_margin.bottom, b));
+        RrMargins(e->a_disabled_selected, &l, &t, &r, &b);
+        STRUT_SET(self->item_margin,
+                  MAX(self->item_margin.left, l),
+                  MAX(self->item_margin.top, t),
+                  MAX(self->item_margin.right, r),
+                  MAX(self->item_margin.bottom, b));
     } else
         self->item_h = 0;
 
@@ -614,16 +643,19 @@ static void menu_frame_render(ObMenuFrame *self)
         XSetWindowBorder(ob_display, e->window,
                          RrColorPixel(ob_rr_theme->menu_b_color));
 
-        text_a = ((e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
-                   !e->entry->data.normal.enabled) ?
-                  e->a_text_disabled :
+
+        text_a = (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
+                  !e->entry->data.normal.enabled ?
+                  /* disabled */
+                  (e == self->selected ?
+                   e->a_text_disabled_selected : e->a_text_disabled) :
+                  /* enabled */
                   (e == self->selected ?
-                   e->a_text_selected :
-                   e->a_text_normal));
+                   e->a_text_selected : e->a_text_normal));
         switch (e->entry->type) {
         case OB_MENU_ENTRY_TYPE_NORMAL:
             text_a->texture[0].data.text.string = e->entry->data.normal.label;
-            RrMinsize(text_a, &tw, &th);
+            RrMinSize(text_a, &tw, &th);
             tw = MIN(tw, MAX_MENU_WIDTH);
 
             if (e->entry->data.normal.icon_data ||
@@ -633,7 +665,7 @@ static void menu_frame_render(ObMenuFrame *self)
         case OB_MENU_ENTRY_TYPE_SUBMENU:
             sub = e->entry->data.submenu.submenu;
             text_a->texture[0].data.text.string = sub ? sub->title : "";
-            RrMinsize(text_a, &tw, &th);
+            RrMinSize(text_a, &tw, &th);
             tw = MIN(tw, MAX_MENU_WIDTH);
 
             if (e->entry->data.normal.icon_data ||
@@ -646,7 +678,7 @@ static void menu_frame_render(ObMenuFrame *self)
             if (e->entry->data.separator.label != NULL) {
                 e->a_text_title->texture[0].data.text.string =
                     e->entry->data.separator.label;
-                RrMinsize(e->a_text_title, &tw, &th);
+                RrMinSize(e->a_text_title, &tw, &th);
                 tw = MIN(tw, MAX_MENU_WIDTH);
                 th = ob_rr_theme->menu_title_height +
                     (ob_rr_theme->mbwidth - PADDING) *2;
@@ -743,16 +775,6 @@ static gboolean menu_frame_show(ObMenuFrame *self)
 {
     GList *it;
 
-    if (menu_frame_visible == NULL) {
-        /* no menus shown yet */
-        if (!grab_pointer(TRUE, TRUE, OB_CURSOR_POINTER))
-            return FALSE;
-        if (!grab_keyboard(TRUE)) {
-            grab_pointer(FALSE, TRUE, OB_CURSOR_POINTER);
-            return FALSE;
-        }
-    }
-
     /* determine if the underlying menu is already visible */
     for (it = menu_frame_visible; it; it = g_list_next(it)) {
         ObMenuFrame *f = it->data;
@@ -761,7 +783,18 @@ static gboolean menu_frame_show(ObMenuFrame *self)
     }
     if (!it) {
         if (self->menu->update_func)
-            self->menu->update_func(self, self->menu->data);
+            if (!self->menu->update_func(self, self->menu->data))
+                return FALSE;
+    }
+
+    if (menu_frame_visible == NULL) {
+        /* no menus shown yet */
+        if (!grab_pointer(TRUE, TRUE, OB_CURSOR_POINTER))
+            return FALSE;
+        if (!grab_keyboard(TRUE)) {
+            grab_pointer(FALSE, TRUE, OB_CURSOR_POINTER);
+            return FALSE;
+        }
     }
 
     menu_frame_update(self);
@@ -1036,8 +1069,7 @@ void menu_frame_select_previous(ObMenuFrame *self)
                 e = it->data;
                 if (e->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
                     break;
-                if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
-                    e->entry->data.normal.enabled)
+                if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL)
                     break;
             }
         }
@@ -1062,8 +1094,7 @@ void menu_frame_select_next(ObMenuFrame *self)
                 e = it->data;
                 if (e->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
                     break;
-                if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
-                    e->entry->data.normal.enabled)
+                if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL)
                     break;
             }
         }
This page took 0.027268 seconds and 4 git commands to generate.