diff --git a/src/config.c b/src/config.c index 82e0a19..a126079 100644 --- a/src/config.c +++ b/src/config.c @@ -564,6 +564,7 @@ conf_menu_section(char *src) conf.menu[i].item[j].func = name_to_func(get_opt(tmp2, "", "func").str, func_list); conf.menu[i].item[j].cmd = (!get_opt(tmp2, "", "cmd").str) ? NULL : get_opt(tmp2, "", "cmd").str; conf.menu[i].item[j].check = name_to_func(get_opt(tmp2, "", "check").str, func_list); + conf.menu[i].item[j].submenu = get_opt(tmp2, "", "submenu").str; cfg_set_sauv(tmp); } diff --git a/src/menu.c b/src/menu.c index 3e572c1..fe3abd5 100644 --- a/src/menu.c +++ b/src/menu.c @@ -135,12 +135,7 @@ menu_manage_event(XEvent *ev, Menu *menu, BarWindow *winitem[]) { if(ev->xbutton.window == winitem[i]->win && (ev->xbutton.button == Button1 || ev->xbutton.button == Button2)) - { - if(menu->item[i].func) - menu->item[i].func(menu->item[i].cmd); - - quit = True; - } + quit = menu_activate_item(menu, i); else if(ev->xbutton.window != winitem[i]->win) ++c; else if(ev->xbutton.button == Button4) @@ -169,9 +164,7 @@ menu_manage_event(XEvent *ev, Menu *menu, BarWindow *winitem[]) break; case XK_Return: - if(menu->item[menu->focus_item].func) - menu->item[menu->focus_item].func(menu->item[menu->focus_item].cmd); - quit = True; + quit = menu_activate_item(menu, menu->focus_item); break; case XK_Escape: @@ -198,6 +191,33 @@ menu_manage_event(XEvent *ev, Menu *menu, BarWindow *winitem[]) return quit; } +Bool +menu_activate_item(Menu *menu, int i) +{ + int j, d, u, x, y; + Window w; + + if(menu->item[i].submenu) + { + for(j = 0; j < conf.nmenu; ++j) + if(!strcmp(menu->item[i].submenu, conf.menu[j].name)) + { + XQueryPointer(dpy, ROOT, &w, &w, &x, &y, &d, &d, (uint *)&u); + + x = menu->x; + x += menu_get_longer_string(menu->item, menu->nitem) + PAD * 3; + + menu_draw(conf.menu[i], x, y); + return True; + } + } + else if(menu->item[i].func) + { + menu->item[i].func(menu->item[i].cmd); + return True; + } + return False; +} void menu_focus_item(Menu *menu, int item, BarWindow *winitem[]) @@ -228,7 +248,7 @@ void menu_draw_item_name(Menu *menu, int item, BarWindow *winitem[]) { int x; - int width = menu_get_longer_string(menu->item, menu->nitem) + PAD; + int width = menu_get_longer_string(menu->item, menu->nitem); switch(menu->align) { @@ -249,6 +269,9 @@ menu_draw_item_name(Menu *menu, int item, BarWindow *winitem[]) if(menu->item[item].check(menu->item[item].cmd)) barwin_draw_text(winitem[item], PAD / 3, FHINFOBAR, "*"); + if(menu->item[item].submenu) + barwin_draw_text(winitem[item], width + PAD * 2, FHINFOBAR, ">"); + return; } @@ -277,7 +300,11 @@ uicb_menu(uicb_t cmd) if(!strcmp(cmd, conf.menu[i].name)) { if(conf.menu[i].place_at_mouse) + { XQueryPointer(dpy, ROOT, &w, &w, &x, &y, &d, &d, (uint *)&u); + conf.menu[i].x = x; + conf.menu[i].y = y; + } else { screen_get_sel(); diff --git a/src/structs.h b/src/structs.h index 7006e4d..93cec8b 100644 --- a/src/structs.h +++ b/src/structs.h @@ -276,6 +276,7 @@ typedef struct void (*func)(uicb_t); uicb_t cmd; Bool (*check)(uicb_t); + char *submenu; } MenuItem; /* Menu Struct */ diff --git a/src/wmfs.h b/src/wmfs.h index dba4f61..ad9fe28 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -235,6 +235,7 @@ void menu_init(Menu *menu, char *name, int nitem, uint bg_f, char *fg_f, uint bg void menu_new_item(MenuItem *mi, char *name, void *func, char *cmd); void menu_draw(Menu menu, int x, int y); Bool menu_manage_event(XEvent *ev, Menu *menu, BarWindow *winitem[]); +Bool menu_activate_item(Menu *menu, int i); void menu_focus_item(Menu *menu, int item, BarWindow *winitem[]); void menu_draw_item_name(Menu *menu, int item, BarWindow *winitem[]); int menu_get_longer_string(MenuItem *mi, int nitem); diff --git a/wmfsrc.in b/wmfsrc.in index 89d6185..b18fd93 100644 --- a/wmfsrc.in +++ b/wmfsrc.in @@ -149,6 +149,7 @@ fg_normal = "#9F9AB3" bg_normal = "#191919" [item] name = "Terminal" func = "spawn" cmd = "@WMFS_TERM@" [/item] + [item] name = "Applications" submenu = "appmenu" [/item] [item] name = "Next tag" func = "tag_next" [/item] [item] name = "Previous tag" func = "tag_prev" [/item] [item] name = "Next layout" func = "layout_next" [/item] @@ -157,6 +158,17 @@ [item] name = "Quit WMFS" func = "quit" [/item] [/set_menu] + [set_menu] + name = "appmenu" + align = "left" + + fg_focus = "#191919" bg_focus = "#7E89A2" + fg_normal = "#9F9AB3" bg_normal = "#191919" + + [item] name = "Browser" func = "spawn" cmd = "firefox" [/item] + [item] name = "Calculator" func = "spawn" cmd = "xcalc" [/item] + [/set_menu] + [set_menu] name = "clientmenu"