Menuitem option 'submenu'. Draw bullet '>' on the right.

This commit is contained in:
OldMan 2010-04-10 18:51:43 +06:00
parent 8a45d219bd
commit 4138894db1
5 changed files with 52 additions and 10 deletions

View File

@ -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);
}

View File

@ -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();

View File

@ -276,6 +276,7 @@ typedef struct
void (*func)(uicb_t);
uicb_t cmd;
Bool (*check)(uicb_t);
char *submenu;
} MenuItem;
/* Menu Struct */

View File

@ -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);

View File

@ -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"