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 <[email protected]>
Signed-off-by: Alexey I. Froloff <[email protected]>
---
 src/funcs.h   |    2 ++
 src/menu.c    |   18 +++++++++++++++++-
 src/winmenu.c |   48 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 67 insertions(+), 1 deletions(-)

diff --git a/src/funcs.h b/src/funcs.h
index 8dfcc5c..3f14849 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 0890382..c8e668f 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -1779,6 +1779,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;
@@ -1859,7 +1860,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 4ad0fa8..bc02618 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;
-- 
1.7.2.3


-- 
To unsubscribe, send mail to [email protected].

Reply via email to