Container and pager menus should be destroyed on close.

SVN revision: 44127
This commit is contained in:
Kim Woelders 2009-12-02 19:20:27 +00:00
parent d985e531f4
commit b65b4371bb
4 changed files with 55 additions and 40 deletions

View File

@ -1169,32 +1169,33 @@ ContainerScroll(Container * ct, int dir)
}
static void
ContainerShowMenu(Container * ct, int x __UNUSED__, int y __UNUSED__)
ContainerShowMenu(Container * ct)
{
static Menu *p_menu = NULL;
Menu *m;
MenuItem *mi;
char s[1024];
if (p_menu)
MenuDestroy(p_menu);
m = MenuCreate("__ct", ct->menu_title, NULL, NULL);
if (!m)
return;
p_menu = MenuCreate("__CT_MENU", ct->menu_title, NULL, NULL);
MenuSetTransient(m); /* Destroy when hidden */
Esnprintf(s, sizeof(s), "ibox cfg %s", ct->name);
mi = MenuItemCreate(_("Settings..."), NULL, s, NULL);
MenuAddItem(p_menu, mi);
MenuAddItem(m, mi);
Esnprintf(s, sizeof(s), "wop %#lx cl", WinGetXwin(ct->win));
mi = MenuItemCreate(_("Close"), NULL, s, NULL);
MenuAddItem(p_menu, mi);
MenuAddItem(m, mi);
if (ct->type == IB_TYPE_ICONBOX)
{
mi = MenuItemCreate(_("Create New Iconbox"), NULL, "ibox new", NULL);
MenuAddItem(p_menu, mi);
MenuAddItem(m, mi);
}
EFunc(NULL, "menus show __CT_MENU");
EFunc(NULL, "menus show __ct");
}
static void
@ -1234,7 +1235,7 @@ ContainerEventScrollWin(Win win __UNUSED__, XEvent * ev, void *prm)
if (ev->xbutton.button == 1)
ct->scrollbox_clicked = 1;
else if (ev->xbutton.button == 3)
ContainerShowMenu(ct, ev->xbutton.x, ev->xbutton.y);
ContainerShowMenu(ct);
break;
case ButtonRelease:
@ -1280,7 +1281,7 @@ ContainerEventScrollbarWin(Win win __UNUSED__, XEvent * ev, void *prm)
ct->scrollbar_state |= WS_CLICK;
}
else if (ev->xbutton.button == 3)
ContainerShowMenu(ct, ev->xbutton.x, ev->xbutton.y);
ContainerShowMenu(ct);
goto draw_scoll;
case ButtonRelease:
@ -1340,7 +1341,7 @@ ContainerEventCoverWin(Win win __UNUSED__, XEvent * ev, void *prm)
switch (ev->type)
{
case ButtonPress:
ContainerShowMenu(ct, ev->xbutton.x, ev->xbutton.y);
ContainerShowMenu(ct);
break;
case ButtonRelease:
break;
@ -1358,7 +1359,7 @@ ContainerEventArrow1Win(Win win __UNUSED__, XEvent * ev, void *prm)
if (ev->xbutton.button == 1)
ct->arrow1_state |= WS_CLICK;
else if (ev->xbutton.button == 3)
ContainerShowMenu(ct, ev->xbutton.x, ev->xbutton.y);
ContainerShowMenu(ct);
goto draw_scoll;
case ButtonRelease:
@ -1394,7 +1395,7 @@ ContainerEventArrow2Win(Win win __UNUSED__, XEvent * ev, void *prm)
if (ev->xbutton.button == 1)
ct->arrow2_state |= WS_CLICK;
else if (ev->xbutton.button == 3)
ContainerShowMenu(ct, ev->xbutton.x, ev->xbutton.y);
ContainerShowMenu(ct);
goto draw_scoll;
case ButtonRelease:
@ -1429,7 +1430,7 @@ ContainerEventIconWin(Win win __UNUSED__, XEvent * ev, void *prm)
case ButtonPress:
if (ev->xbutton.button != 3)
break;
ContainerShowMenu(ct, ev->xbutton.x, ev->xbutton.y);
ContainerShowMenu(ct);
return;
}

View File

@ -102,7 +102,8 @@ struct _menu {
MenuItem **items;
int icon_size;
char internal; /* Don't destroy when reloading */
char dynamic; /* May be emptied on close */
char dynamic; /* Empty when closed */
char transient; /* Destroy when closed */
char shown;
char redraw;
char filled; /* Has been filled */
@ -153,7 +154,7 @@ MenuFindItemByChild(Menu * m, Menu * mc)
return NULL;
}
void
static void
MenuHide(Menu * m)
{
EWin *ewin;
@ -465,6 +466,12 @@ MenuSetDynamic(Menu * m)
m->dynamic = 1;
}
void
MenuSetTransient(Menu * m)
{
m->transient = 1;
}
void
MenuSetName(Menu * m, const char *name)
{
@ -565,7 +572,7 @@ MenuCreate(const char *name, const char *title, Menu * parent, MenuStyle * ms)
return m;
}
void
static void
MenuDestroy(Menu * m)
{
if (!m)
@ -1163,9 +1170,15 @@ MenusActive(void)
static void
MenusHide(void)
{
Menu *m;
TIMER_DEL(menu_timer_submenu);
MenuHide(Mode_menus.first);
m = Mode_menus.first;
if (m && m->transient)
MenuDestroy(m);
else
MenuHide(m);
Mode_menus.first = NULL;
MenuHideMasker();
TooltipsEnable(1);

View File

@ -39,8 +39,6 @@ MenuStyle *MenuStyleFind(const char *name);
int MenuConfigLoad(FILE * fs);
Menu *MenuCreate(const char *name, const char *title,
Menu * parent, MenuStyle * ms);
void MenuDestroy(Menu * m);
void MenuHide(Menu * m);
void MenuEmpty(Menu * m, int destroying);
int MenuLoad(Menu * m);
Menu *MenuFind(const char *name, const char *param);
@ -48,6 +46,7 @@ MenuItem *MenuItemCreate(const char *text, ImageClass * ic,
const char *action_params, Menu * child);
void MenuSetInternal(Menu * m);
void MenuSetDynamic(Menu * m);
void MenuSetTransient(Menu * m);
void MenuSetName(Menu * m, const char *name);
void MenuSetAlias(Menu * m, const char *alias);
void MenuSetStyle(Menu * m, MenuStyle * ms);

View File

@ -985,7 +985,7 @@ EwinInPagerAt(Pager * p, int px, int py)
static void
PagerMenuShow(Pager * p, int x, int y)
{
static Menu *p_menu = NULL, *pw_menu = NULL;
Menu *m;
MenuItem *mi;
EWin *ewin;
char s[1024];
@ -996,62 +996,64 @@ PagerMenuShow(Pager * p, int x, int y)
ewin = EwinInPagerAt(p, x, y);
if (ewin)
{
if (pw_menu)
MenuDestroy(pw_menu);
m = MenuCreate("__pg_win", _("Window Options"), NULL, NULL);
if (!m)
return;
pw_menu =
MenuCreate("__DESK_WIN_MENU", _("Window Options"), NULL, NULL);
MenuSetTransient(m); /* Destroy when hidden */
Esnprintf(s, sizeof(s), "wop %#lx ic", EwinGetClientXwin(ewin));
mi = MenuItemCreate(_("Iconify"), NULL, s, NULL);
MenuAddItem(pw_menu, mi);
MenuAddItem(m, mi);
Esnprintf(s, sizeof(s), "wop %#lx close", EwinGetClientXwin(ewin));
mi = MenuItemCreate(_("Close"), NULL, s, NULL);
MenuAddItem(pw_menu, mi);
MenuAddItem(m, mi);
Esnprintf(s, sizeof(s), "wop %#lx kill", EwinGetClientXwin(ewin));
mi = MenuItemCreate(_("Annihilate"), NULL, s, NULL);
MenuAddItem(pw_menu, mi);
MenuAddItem(m, mi);
Esnprintf(s, sizeof(s), "wop %#lx st", EwinGetClientXwin(ewin));
mi = MenuItemCreate(_("Stick / Unstick"), NULL, s, NULL);
MenuAddItem(pw_menu, mi);
MenuAddItem(m, mi);
EFunc(NULL, "menus show __DESK_WIN_MENU");
EFunc(NULL, "menus show __pg_win");
return;
}
if (p_menu)
MenuDestroy(p_menu);
p_menu = MenuCreate("__DESK_MENU", _("Desktop Options"), NULL, NULL);
m = MenuCreate("__pg", _("Desktop Options"), NULL, NULL);
if (!m)
return;
MenuSetTransient(m); /* Destroy when hidden */
mi = MenuItemCreate(_("Pager Settings..."), NULL, "cfg pagers", NULL);
MenuAddItem(p_menu, mi);
MenuAddItem(m, mi);
if (PagersGetMode() != PAGER_MODE_SIMPLE)
{
mi = MenuItemCreate(_("Snapshotting Off"), NULL, "pg mode simp", NULL);
MenuAddItem(p_menu, mi);
MenuAddItem(m, mi);
if (Conf_pagers.hiq)
mi = MenuItemCreate(_("High Quality Off"), NULL, "pg hiq off", NULL);
else
mi = MenuItemCreate(_("High Quality On"), NULL, "pg hiq on", NULL);
MenuAddItem(p_menu, mi);
MenuAddItem(m, mi);
}
else
{
mi = MenuItemCreate(_("Snapshotting On"), NULL, "pg mode live", NULL);
MenuAddItem(p_menu, mi);
MenuAddItem(m, mi);
}
if (Conf_pagers.zoom)
mi = MenuItemCreate(_("Zoom Off"), NULL, "pg zoom off", NULL);
else
mi = MenuItemCreate(_("Zoom On"), NULL, "pg zoom on", NULL);
MenuAddItem(p_menu, mi);
MenuAddItem(m, mi);
EFunc(NULL, "menus show __DESK_MENU");
EFunc(NULL, "menus show __pg");
}
static void