summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
Diffstat (limited to 'openbox')
-rw-r--r--openbox/client_menu.c82
-rw-r--r--openbox/event.c6
-rw-r--r--openbox/menu.c6
-rw-r--r--openbox/menu.h3
-rw-r--r--openbox/menuframe.c74
-rw-r--r--openbox/menuframe.h6
6 files changed, 111 insertions, 66 deletions
diff --git a/openbox/client_menu.c b/openbox/client_menu.c
index 011e3ec1..da6ac2d9 100644
--- a/openbox/client_menu.c
+++ b/openbox/client_menu.c
@@ -41,9 +41,8 @@ enum {
CLIENT_SEND_TO,
CLIENT_LAYER,
CLIENT_ICONIFY,
+ CLIENT_RESTORE,
CLIENT_MAXIMIZE,
- CLIENT_RAISE,
- CLIENT_LOWER,
CLIENT_SHADE,
CLIENT_DECORATE,
CLIENT_MOVE,
@@ -69,15 +68,15 @@ static gboolean client_update(ObMenuFrame *frame, gpointer data)
e = menu_find_entry_id(menu, CLIENT_ICONIFY);
e->data.normal.enabled = frame->client->functions & OB_CLIENT_FUNC_ICONIFY;
+ e = menu_find_entry_id(menu, CLIENT_RESTORE);
+ e->data.normal.enabled =frame->client->max_horz || frame->client->max_vert;
+
e = menu_find_entry_id(menu, CLIENT_MAXIMIZE);
- menu_entry_set_label(e,
- (frame->client->max_vert || frame->client->max_horz ?
- _("Restor&e") : _("Maximiz&e")), TRUE);
- e->data.normal.enabled =frame->client->functions & OB_CLIENT_FUNC_MAXIMIZE;
+ e->data.normal.enabled =
+ (frame->client->functions & OB_CLIENT_FUNC_MAXIMIZE) &&
+ !frame->client->max_horz && !frame->client->max_vert;
e = menu_find_entry_id(menu, CLIENT_SHADE);
- menu_entry_set_label(e, (frame->client->shaded ?
- _("&Roll down") : _("&Roll up")), TRUE);
e->data.normal.enabled = frame->client->functions & OB_CLIENT_FUNC_SHADE;
e = menu_find_entry_id(menu, CLIENT_MOVE);
@@ -153,6 +152,16 @@ static gboolean send_to_update(ObMenuFrame *frame, gpointer data)
act->data.sendto.follow = FALSE;
acts = g_slist_prepend(NULL, act);
e = menu_add_normal(menu, desk, name, acts, FALSE);
+ if (desk == DESKTOP_ALL) {
+ e->data.normal.mask = ob_rr_theme->desk_mask;
+ e->data.normal.mask_normal_color = ob_rr_theme->menu_color;
+ e->data.normal.mask_selected_color =
+ ob_rr_theme->menu_selected_color;
+ e->data.normal.mask_disabled_color =
+ ob_rr_theme->menu_disabled_color;
+ e->data.normal.mask_disabled_selected_color =
+ ob_rr_theme->menu_disabled_selected_color;
+ }
if (frame->client->desktop == desk)
e->data.normal.enabled = FALSE;
@@ -257,57 +266,66 @@ void client_menu_startup()
menu_set_update_func(menu, client_update);
menu_set_place_func(menu, client_menu_place);
- menu_add_submenu(menu, CLIENT_SEND_TO, SEND_TO_MENU_NAME);
+ acts = g_slist_prepend(NULL, action_from_string
+ ("ToggleMaximizeFull",
+ OB_USER_ACTION_MENU_SELECTION));
+ e = menu_add_normal(menu, CLIENT_RESTORE, _("R&estore"), acts, TRUE);
+ e->data.normal.mask = ob_rr_theme->max_toggled_mask;
+ e->data.normal.mask_normal_color = ob_rr_theme->menu_color;
+ e->data.normal.mask_selected_color = ob_rr_theme->menu_selected_color;
+ e->data.normal.mask_disabled_color = ob_rr_theme->menu_disabled_color;
+ e->data.normal.mask_disabled_selected_color =
+ ob_rr_theme->menu_disabled_selected_color;
- menu_add_submenu(menu, CLIENT_LAYER, LAYER_MENU_NAME);
+ acts = g_slist_prepend(NULL, action_from_string
+ ("Move", OB_USER_ACTION_MENU_SELECTION));
+ menu_add_normal(menu, CLIENT_MOVE, _("&Move"), acts, TRUE);
+
+ acts = g_slist_prepend(NULL, action_from_string
+ ("Resize", OB_USER_ACTION_MENU_SELECTION));
+ menu_add_normal(menu, CLIENT_RESIZE, _("Resi&ze"), acts, TRUE);
acts = g_slist_prepend(NULL, action_from_string
("Iconify", OB_USER_ACTION_MENU_SELECTION));
e = menu_add_normal(menu, CLIENT_ICONIFY, _("Ico&nify"), acts, TRUE);
e->data.normal.mask = ob_rr_theme->iconify_mask;
e->data.normal.mask_normal_color = ob_rr_theme->menu_color;
- e->data.normal.mask_disabled_color = ob_rr_theme->menu_disabled_color;
e->data.normal.mask_selected_color = ob_rr_theme->menu_selected_color;
+ e->data.normal.mask_disabled_color = ob_rr_theme->menu_disabled_color;
+ e->data.normal.mask_disabled_selected_color =
+ ob_rr_theme->menu_disabled_selected_color;
acts = g_slist_prepend(NULL, action_from_string
("ToggleMaximizeFull",
OB_USER_ACTION_MENU_SELECTION));
- e = menu_add_normal(menu, CLIENT_MAXIMIZE, _("Maximiz&e"), acts, TRUE);
+ e = menu_add_normal(menu, CLIENT_MAXIMIZE, _("Ma&ximize"), acts, TRUE);
e->data.normal.mask = ob_rr_theme->max_mask;
e->data.normal.mask_normal_color = ob_rr_theme->menu_color;
- e->data.normal.mask_disabled_color = ob_rr_theme->menu_disabled_color;
e->data.normal.mask_selected_color = ob_rr_theme->menu_selected_color;
-
- acts = g_slist_prepend(NULL, action_from_string
- ("Raise", OB_USER_ACTION_MENU_SELECTION));
- menu_add_normal(menu, CLIENT_RAISE, _("Raise to &top"), acts, TRUE);
-
- acts = g_slist_prepend(NULL, action_from_string
- ("Lower", OB_USER_ACTION_MENU_SELECTION));
- menu_add_normal(menu, CLIENT_LOWER, _("Lower to &bottom"),acts, TRUE);
+ e->data.normal.mask_disabled_color = ob_rr_theme->menu_disabled_color;
+ e->data.normal.mask_disabled_selected_color =
+ ob_rr_theme->menu_disabled_selected_color;
acts = g_slist_prepend(NULL, action_from_string
("ToggleShade", OB_USER_ACTION_MENU_SELECTION));
- e = menu_add_normal(menu, CLIENT_SHADE, _("&Roll up"), acts, TRUE);
+ e = menu_add_normal(menu, CLIENT_SHADE, _("&Roll up/down"), acts, TRUE);
e->data.normal.mask = ob_rr_theme->shade_mask;
e->data.normal.mask_normal_color = ob_rr_theme->menu_color;
- e->data.normal.mask_disabled_color = ob_rr_theme->menu_disabled_color;
e->data.normal.mask_selected_color = ob_rr_theme->menu_selected_color;
+ e->data.normal.mask_disabled_color = ob_rr_theme->menu_disabled_color;
+ e->data.normal.mask_disabled_selected_color =
+ ob_rr_theme->menu_disabled_selected_color;
acts = g_slist_prepend(NULL, action_from_string
("ToggleDecorations",
OB_USER_ACTION_MENU_SELECTION));
- menu_add_normal(menu, CLIENT_DECORATE, _("&Decorate"), acts, TRUE);
+ menu_add_normal(menu, CLIENT_DECORATE, _("Un/&Decorate"), acts, TRUE);
menu_add_separator(menu, -1, NULL);
- acts = g_slist_prepend(NULL, action_from_string
- ("Move", OB_USER_ACTION_MENU_SELECTION));
- menu_add_normal(menu, CLIENT_MOVE, _("&Move"), acts, TRUE);
+ menu_add_submenu(menu, CLIENT_SEND_TO, SEND_TO_MENU_NAME);
- acts = g_slist_prepend(NULL, action_from_string
- ("Resize", OB_USER_ACTION_MENU_SELECTION));
- menu_add_normal(menu, CLIENT_RESIZE, _("Resi&ze"), acts, TRUE);
+ menu_add_submenu(menu, CLIENT_LAYER, LAYER_MENU_NAME);
menu_add_separator(menu, -1, NULL);
@@ -316,6 +334,8 @@ void client_menu_startup()
e = menu_add_normal(menu, CLIENT_CLOSE, _("&Close"), acts, TRUE);
e->data.normal.mask = ob_rr_theme->close_mask;
e->data.normal.mask_normal_color = ob_rr_theme->menu_color;
- e->data.normal.mask_disabled_color = ob_rr_theme->menu_disabled_color;
e->data.normal.mask_selected_color = ob_rr_theme->menu_selected_color;
+ e->data.normal.mask_disabled_color = ob_rr_theme->menu_disabled_color;
+ e->data.normal.mask_disabled_selected_color =
+ ob_rr_theme->menu_disabled_selected_color;
}
diff --git a/openbox/event.c b/openbox/event.c
index 61aea441..25460a71 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -1288,8 +1288,7 @@ static gboolean event_handle_menu_keyboard(XEvent *ev)
ObMenuEntryFrame *e = it->data;
gunichar entrykey = 0;
- if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
- e->entry->data.normal.enabled)
+ if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL)
entrykey = e->entry->data.normal.shortcut;
else if (e->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
entrykey = e->entry->data.submenu.submenu->shortcut;
@@ -1309,7 +1308,8 @@ static gboolean event_handle_menu_keyboard(XEvent *ev)
num_found == 1)
{
menu_frame_select(frame, found, TRUE);
- usleep(50000);
+ usleep(50000); /* highlight the item for a short bit so the
+ user can see what happened */
menu_entry_frame_execute(found, state, ev->xkey.time);
} else {
menu_frame_select(frame, found, TRUE);
diff --git a/openbox/menu.c b/openbox/menu.c
index 9aed40aa..741e27c1 100644
--- a/openbox/menu.c
+++ b/openbox/menu.c
@@ -382,10 +382,10 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
if (!menu_frame_show_topmenu(frame, x, y, button))
menu_frame_free(frame);
else if (frame->entries) {
+ /* select the first entry if it's not a submenu */
ObMenuEntryFrame *e = frame->entries->data;
- if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
- e->entry->data.normal.enabled)
- menu_frame_select(frame, e, FALSE);
+ if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL)
+ menu_frame_select(frame, e, FALSE);
}
}
diff --git a/openbox/menu.h b/openbox/menu.h
index b08f7c95..64cbbd6a 100644
--- a/openbox/menu.h
+++ b/openbox/menu.h
@@ -112,8 +112,9 @@ struct _ObNormalMenuEntry {
/* Mask icon */
RrPixmapMask *mask;
RrColor *mask_normal_color;
- RrColor *mask_disabled_color;
RrColor *mask_selected_color;
+ RrColor *mask_disabled_color;
+ RrColor *mask_disabled_selected_color;
};
struct _ObSubmenuMenuEntry {
diff --git a/openbox/menuframe.c b/openbox/menuframe.c
index a95e46fc..f87c3c0b 100644
--- a/openbox/menuframe.c
+++ b/openbox/menuframe.c
@@ -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);
@@ -338,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:
@@ -368,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 ||
@@ -502,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));
@@ -592,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;
@@ -622,12 +643,15 @@ 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;
@@ -1045,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;
}
}
@@ -1071,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;
}
}
diff --git a/openbox/menuframe.h b/openbox/menuframe.h
index 5c876832..15bae667 100644
--- a/openbox/menuframe.h
+++ b/openbox/menuframe.h
@@ -88,8 +88,9 @@ struct _ObMenuEntryFrame
Window bullet;
RrAppearance *a_normal;
- RrAppearance *a_disabled;
RrAppearance *a_selected;
+ RrAppearance *a_disabled;
+ RrAppearance *a_disabled_selected;
RrAppearance *a_icon;
RrAppearance *a_mask;
@@ -97,8 +98,9 @@ struct _ObMenuEntryFrame
RrAppearance *a_bullet_selected;
RrAppearance *a_separator;
RrAppearance *a_text_normal;
- RrAppearance *a_text_disabled;
RrAppearance *a_text_selected;
+ RrAppearance *a_text_disabled;
+ RrAppearance *a_text_disabled_selected;
RrAppearance *a_text_title;
};