diff -wurN -X openbox/.gitignore /mnt/i/linux/dana_old/openbox.git/obrender/theme.c openbox/obrender/theme.c --- /mnt/i/linux/dana_old/openbox.git/obrender/theme.c 2010-11-08 20:07:02.000000000 +0200 +++ openbox/obrender/theme.c 2010-11-08 14:38:49.000000000 +0200 @@ -140,6 +140,8 @@ theme->a_menu_text_disabled_selected = RrAppearanceNew(inst, 1); theme->a_menu_bullet_normal = RrAppearanceNew(inst, 1); theme->a_menu_bullet_selected = RrAppearanceNew(inst, 1); + theme->a_menu_bullet_def_normal = RrAppearanceNew(inst, 1); + theme->a_menu_bullet_def_selected = RrAppearanceNew(inst, 1); theme->a_clear = RrAppearanceNew(inst, 0); theme->a_clear_tex = RrAppearanceNew(inst, 1); theme->osd_bg = RrAppearanceNew(inst, 0); @@ -572,6 +574,13 @@ theme->menu_bullet_mask = RrPixmapMaskNew(inst, 4, 7, (gchar*)data); } + /* submenu with default bullet mask */ + if (!read_mask(inst, path, theme, "bullet_def.xbm", &theme->menu_bullet_def_mask)) + { + guchar data[] = { 0xFF, 0x85, 0x8D, 0x9D, 0xBD, 0x9D, 0x8D, 0x85, 0xFF }; + theme->menu_bullet_def_mask = RrPixmapMaskNew(inst, 8, 9, (gchar*)data); + } + /* up and down arrows */ { guchar data[] = { 0xfe, 0x00, 0x7c, 0x00, 0x38, 0x00, 0x10, 0x00 }; @@ -886,6 +895,8 @@ theme->a_menu_text_disabled_selected->surface.grad = theme->a_menu_bullet_normal->surface.grad = theme->a_menu_bullet_selected->surface.grad = RR_SURFACE_PARENTREL; + theme->a_menu_bullet_def_normal->surface.grad = + theme->a_menu_bullet_def_selected->surface.grad = RR_SURFACE_PARENTREL; /* set up the textures */ theme->a_focused_label->texture[0].type = RR_TEXTURE_TEXT; @@ -1261,6 +1272,8 @@ theme->a_unfocused_pressed_iconify->texture[0].type = theme->a_menu_bullet_normal->texture[0].type = theme->a_menu_bullet_selected->texture[0].type = RR_TEXTURE_MASK; + theme->a_menu_bullet_def_normal->texture[0].type = + theme->a_menu_bullet_def_selected->texture[0].type = RR_TEXTURE_MASK; theme->a_disabled_focused_max->texture[0].data.mask.mask = theme->a_disabled_unfocused_max->texture[0].data.mask.mask = @@ -1352,6 +1365,9 @@ theme->a_menu_bullet_normal->texture[0].data.mask.mask = theme->a_menu_bullet_selected->texture[0].data.mask.mask = theme->menu_bullet_mask; + theme->a_menu_bullet_def_normal->texture[0].data.mask.mask = + theme->a_menu_bullet_def_selected->texture[0].data.mask.mask = + theme->menu_bullet_def_mask; theme->a_disabled_focused_max->texture[0].data.mask.color = theme->a_disabled_focused_close->texture[0].data.mask.color = theme->a_disabled_focused_desk->texture[0].data.mask.color = @@ -1428,6 +1444,10 @@ theme->menu_color; theme->a_menu_bullet_selected->texture[0].data.mask.color = theme->menu_selected_color; + theme->a_menu_bullet_def_normal->texture[0].data.mask.color = + theme->menu_color; + theme->a_menu_bullet_def_selected->texture[0].data.mask.color = + theme->menu_selected_color; g_free(path); XrmDestroyDatabase(db); @@ -1650,6 +1670,8 @@ RrAppearanceFree(theme->a_menu_text_disabled_selected); RrAppearanceFree(theme->a_menu_bullet_normal); RrAppearanceFree(theme->a_menu_bullet_selected); + RrAppearanceFree(theme->a_menu_bullet_def_normal); + RrAppearanceFree(theme->a_menu_bullet_def_selected); RrAppearanceFree(theme->a_clear); RrAppearanceFree(theme->a_clear_tex); RrAppearanceFree(theme->osd_bg); diff -wurN -X openbox/.gitignore /mnt/i/linux/dana_old/openbox.git/obrender/theme.h openbox/obrender/theme.h --- /mnt/i/linux/dana_old/openbox.git/obrender/theme.h 2010-11-08 20:07:02.000000000 +0200 +++ openbox/obrender/theme.h 2010-11-08 14:36:15.000000000 +0200 @@ -151,6 +151,7 @@ RrPixmapMask *close_pressed_mask; RrPixmapMask *menu_bullet_mask; /* submenu pointer */ + RrPixmapMask *menu_bullet_def_mask; /* submenu with default pointer */ #if 0 RrPixmapMask *menu_toggle_mask; /* menu boolean */ #endif @@ -240,6 +241,8 @@ RrAppearance *a_menu_text_selected; RrAppearance *a_menu_bullet_normal; RrAppearance *a_menu_bullet_selected; + RrAppearance *a_menu_bullet_def_normal; + RrAppearance *a_menu_bullet_def_selected; RrAppearance *a_clear; /* clear with no texture */ RrAppearance *a_clear_tex; /* clear with a texture */ diff -wurN -X openbox/.gitignore /mnt/i/linux/dana_old/openbox.git/openbox/event.c openbox/openbox/event.c --- /mnt/i/linux/dana_old/openbox.git/openbox/event.c 2010-11-09 03:20:36.000000000 +0200 +++ openbox/openbox/event.c 2010-11-09 12:45:50.000000000 +0200 @@ -1812,6 +1812,16 @@ if (ev->type == ButtonPress && e->frame->child) menu_frame_select(e->frame->child, NULL, TRUE); menu_frame_select(e->frame, e, TRUE); + if (ev->xbutton.button==1 && e->frame->child + && (x_in_bullet(e->frame, ev->xbutton.x))) + { + ObMenuEntryFrame *def_entry = + e->frame->child->default_entry; + if (def_entry){ + /* default entry of the child menu will be executed */ + e = def_entry; + } + } if (ev->type == ButtonRelease) menu_entry_frame_execute(e, ev->xbutton.state); } @@ -1859,24 +1869,15 @@ ret = TRUE; } - else if (sym == XK_Right || sym == XK_Return || sym == XK_KP_Enter) + else if (sym == XK_Right) { + /* Right goes to the selected submenu */ + if (frame->selected && + frame->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) { - /* Right and enter goes to the selected submenu. - Enter executes instead if it's not on a submenu. */ - - if (frame->selected) { - const ObMenuEntryType t = frame->selected->entry->type; - - if (t == OB_MENU_ENTRY_TYPE_SUBMENU) { /* make sure it is visible */ menu_frame_select(frame, frame->selected, TRUE); - /* move focus to the child menu */ menu_frame_select_next(frame->child); } - else if (sym != XK_Right) { - frame->press_doexec = TRUE; - } - } ret = TRUE; } @@ -1900,6 +1901,14 @@ ret = TRUE; } + else if (sym == XK_Return || sym == XK_KP_Enter) { + if (frame->selected && + frame->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) + menu_frame_select(frame, frame->selected, TRUE); + frame->press_doexec = TRUE; + ret = TRUE; + } + /* keyboard accelerator shortcuts. (if it was a valid key) */ else if (frame->entries && (unikey = @@ -1945,15 +1954,8 @@ if (found) { menu_frame_select(frame, found, TRUE); - if (num_found == 1) { - if (found->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) { - /* move focus to the child menu */ - menu_frame_select_next(frame->child); - } - else { + if (num_found == 1) frame->press_doexec = TRUE; - } - } ret = TRUE; } } @@ -1968,11 +1970,24 @@ frame->got_press && frame->press_doexec) { - if (frame->selected) + if (frame->child){ + if (frame->child->default_entry){ + /* execute the default entry of the child menu */ + menu_entry_frame_execute(frame->child->default_entry, + ev->xkey.state); + } + else{ + /* select the child menu */ + menu_frame_select_next(frame->child); + } + } + else if (frame->selected){ + /* execute selected entry */ menu_entry_frame_execute(frame->selected, ev->xkey.state); } } } + } return ret; } diff -wurN -X openbox/.gitignore /mnt/i/linux/dana_old/openbox.git/openbox/menu.c openbox/openbox/menu.c --- /mnt/i/linux/dana_old/openbox.git/openbox/menu.c 2010-11-09 03:20:36.000000000 +0200 +++ openbox/openbox/menu.c 2010-11-08 12:44:56.000000000 +0200 @@ -585,6 +585,8 @@ self->entries = g_list_append(self->entries, e); self->more_menu->entries = self->entries; /* keep it in sync */ + if (*label == '*') + self->default_entry = e; return e; } diff -wurN -X openbox/.gitignore /mnt/i/linux/dana_old/openbox.git/openbox/menuframe.c openbox/openbox/menuframe.c --- /mnt/i/linux/dana_old/openbox.git/openbox/menuframe.c 2010-11-09 03:20:36.000000000 +0200 +++ openbox/openbox/menuframe.c 2010-11-09 11:54:04.000000000 +0200 @@ -593,7 +593,12 @@ ITEM_HEIGHT + PADDING, PADDING, ITEM_HEIGHT - 2*PADDING, ITEM_HEIGHT - 2*PADDING); - bullet_a = (self == self->frame->selected ? + if (self->entry->data.submenu.submenu->default_entry) + bullet_a = ((self == self->frame->selected) ? + ob_rr_theme->a_menu_bullet_def_selected : + ob_rr_theme->a_menu_bullet_def_normal); + else + bullet_a = ((self == self->frame->selected) ? ob_rr_theme->a_menu_bullet_selected : ob_rr_theme->a_menu_bullet_normal); bullet_a->surface.parent = item_a; @@ -834,6 +839,7 @@ { GList *mit, *fit; const Rect *a; + ObMenuEntry *menu_default_entry; gint h; menu_pipe_execute(self->menu); @@ -853,10 +859,13 @@ f->entry = mit->data; } + menu_default_entry = self->menu->default_entry; /* if there are more menu entries than in the frame, add them */ while (mit) { ObMenuEntryFrame *e = menu_entry_frame_new(mit->data, self); self->entries = g_list_append(self->entries, e); + if (menu_default_entry == e->entry) + self->default_entry = e; mit = g_list_next(mit); } @@ -1154,6 +1163,12 @@ return ret; } +gboolean x_in_bullet(ObMenuFrame* frame, gint x /* local */) +{ + return(x < (frame->text_w - ITEM_HEIGHT + PADDING)); +} + + static gboolean submenu_show_timeout(gpointer data) { g_assert(menu_frame_visible); diff -wurN -X openbox/.gitignore /mnt/i/linux/dana_old/openbox.git/openbox/menuframe.h openbox/openbox/menuframe.h --- /mnt/i/linux/dana_old/openbox.git/openbox/menuframe.h 2010-11-09 03:20:36.000000000 +0200 +++ openbox/openbox/menuframe.h 2010-11-09 11:54:14.000000000 +0200 @@ -55,6 +55,8 @@ GList *entries; ObMenuEntryFrame *selected; + /* default entry */ + ObMenuEntryFrame *default_entry; /* show entries from the menu starting at this index */ guint show_from; @@ -139,6 +141,7 @@ ObMenuFrame* menu_frame_under(gint x, gint y); ObMenuEntryFrame* menu_entry_frame_under(gint x, gint y); +gboolean x_in_bullet(ObMenuFrame* frame, gint x /* local */); void menu_entry_frame_show_submenu(ObMenuEntryFrame *self); diff -wurN -X openbox/.gitignore /mnt/i/linux/dana_old/openbox.git/openbox/menu.h openbox/openbox/menu.h --- /mnt/i/linux/dana_old/openbox.git/openbox/menu.h 2010-11-09 03:20:36.000000000 +0200 +++ openbox/openbox/menu.h 2010-11-08 12:44:56.000000000 +0200 @@ -77,6 +77,9 @@ /* ObMenuEntry list */ GList *entries; + /* default entry */ + ObMenuEntry *default_entry; + /* plugin data */ gpointer data;