From cc629f342c8f20340ea89353500f68a567d18e0d Mon Sep 17 00:00:00 2001 From: "Alexey I. Froloff" Date: Fri, 10 Sep 2010 20:51:06 +0400 Subject: [PATCH] Open window menu on right-click in window list menu When doing right-click in a window list menu open window menu. Can be useful for sending here window from another workspace. Original-patch-by: Pavel S. Khmelinsky Signed-off-by: Alexey I. Froloff --- src/funcs.h | 2 ++ src/menu.c | 18 +++++++++++++++++- src/winmenu.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/funcs.h b/src/funcs.h index 8dfcc5c9..3f14849e 100644 --- a/src/funcs.h +++ b/src/funcs.h @@ -58,6 +58,8 @@ void InitializeSwitchMenu(void); void OpenWindowMenu(WWindow *wwin, int x, int y, int keyboard); +void OpenWindowMenu2(WWindow *wwin, int x, int y, int keyboard); + void OpenMiniwindowMenu(WWindow *wwin, int x, int y); void OpenWorkspaceMenu(WScreen *scr, int x, int y); diff --git a/src/menu.c b/src/menu.c index e6eff2ab..34721db0 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1776,6 +1776,7 @@ static void delaySelection(void *data) static void menuMouseDown(WObjDescriptor * desc, XEvent * event) { + WWindow *wwin; XButtonEvent *bev = &event->xbutton; WMenu *menu = desc->parent; WMenu *smenu; @@ -1856,7 +1857,22 @@ static void menuMouseDown(WObjDescriptor * desc, XEvent * event) } } else if (!delayed_select) { - selectEntry(menu, entry_no); + if (menu == scr->switch_menu && event->xbutton.button == Button3) { + selectEntry(menu, entry_no); + OpenWindowMenu2((WWindow *)entry->clientdata, + event->xbutton.x_root, + event->xbutton.y_root, False); + wwin = (WWindow *)entry->clientdata; + desc = &wwin->screen_ptr->window_menu->menu->descriptor; + event->xany.send_event = True; + (*desc->handle_mousedown)(desc, event); + + XUngrabPointer(dpy, CurrentTime); + selectEntry(menu, -1); + return; + } else { + selectEntry(menu, entry_no); + } } if (!wPreferences.wrap_menus && !wPreferences.scrollable_menus) { diff --git a/src/winmenu.c b/src/winmenu.c index 4ad0fa8b..75365d61 100644 --- a/src/winmenu.c +++ b/src/winmenu.c @@ -632,6 +632,54 @@ void OpenWindowMenu(WWindow * wwin, int x, int y, int keyboard) wMenuMapAt(menu, x, y, keyboard); } +void OpenWindowMenu2(WWindow *wwin, int x, int y, int keyboard) +{ + int i; + WMenu *menu; + WScreen *scr = wwin->screen_ptr; + WMRect rect; + + wwin->flags.menu_open_for_me = 1; + + if (!scr->window_menu) { + scr->window_menu = createWindowMenu(scr); + + /* hack to save some memory allocation/deallocation */ + wfree(scr->window_menu->entries[MC_MINIATURIZE]->text); + wfree(scr->window_menu->entries[MC_MAXIMIZE]->text); + wfree(scr->window_menu->entries[MC_SHADE]->text); + } else { + updateWorkspaceMenu(scr->workspace_submenu); + } + + menu = scr->window_menu; + if (menu->flags.mapped) { + wMenuUnmap(menu); + if (menu->entries[0]->clientdata == wwin) { + return; + } + } + + updateMenuForWindow(menu, wwin); + + for (i = 0; i < scr->workspace_submenu->entry_no; i++) { + scr->workspace_submenu->entries[i]->clientdata = wwin; + wMenuSetEnabled(scr->workspace_submenu, i, True); + } + + x -= menu->frame->core->width / 2; + + rect = wGetRectForHead(menu->frame->screen_ptr, + wGetHeadForPointerLocation(menu->frame->screen_ptr)); + if (x < rect.pos.x - menu->frame->core->width / 2) + x = rect.pos.x - menu->frame->core->width / 2; + if (y < rect.pos.y) + y = rect.pos.y; + + if (!wwin->flags.internal_window) + wMenuMapAt(menu, x, y, keyboard); +} + void OpenMiniwindowMenu(WWindow * wwin, int x, int y) { WMenu *menu;