support for showing the root and workspace menu with epist
Dana Jansens danakj@orodu.net
6 files changed,
87 insertions(+),
36 deletions(-)
M
src/Screen.cc
→
src/Screen.cc
@@ -2308,43 +2308,9 @@
if (rootmenu->isVisible()) rootmenu->hide(); } else if (xbutton->button == 2) { - int mx = xbutton->x_root - (workspacemenu->getWidth() / 2); - int my = xbutton->y_root - (workspacemenu->getTitleHeight() / 2); - - if (mx < 0) mx = 0; - if (my < 0) my = 0; - - if (mx + workspacemenu->getWidth() > getWidth()) - mx = getWidth() - workspacemenu->getWidth() - getBorderWidth(); - - if (my + workspacemenu->getHeight() > getHeight()) - my = getHeight() - workspacemenu->getHeight() - getBorderWidth(); - - workspacemenu->move(mx, my); - - if (! workspacemenu->isVisible()) { - workspacemenu->removeParent(); - workspacemenu->show(); - } + showWorkspaceMenu(xbutton->x_root, xbutton->y_root); } else if (xbutton->button == 3) { - int mx = xbutton->x_root - (rootmenu->getWidth() / 2); - int my = xbutton->y_root - (rootmenu->getTitleHeight() / 2); - - if (mx < 0) mx = 0; - if (my < 0) my = 0; - - if (mx + rootmenu->getWidth() > getWidth()) - mx = getWidth() - rootmenu->getWidth() - getBorderWidth(); - - if (my + rootmenu->getHeight() > getHeight()) - my = getHeight() - rootmenu->getHeight() - getBorderWidth(); - - rootmenu->move(mx, my); - - if (! rootmenu->isVisible()) { - blackbox->checkMenu(); - rootmenu->show(); - } + showRootMenu(xbutton->x_root, xbutton->y_root); // mouse wheel up } else if ((xbutton->button == 4 && resource.root_scroll == NormalScroll) || (xbutton->button == 5 && resource.root_scroll == ReverseScroll)) {@@ -2359,6 +2325,50 @@ if (getCurrentWorkspaceID() == 0)
changeWorkspaceID(getWorkspaceCount() - 1); else changeWorkspaceID(getCurrentWorkspaceID() - 1); + } +} + + +void BScreen::showWorkspaceMenu(int x, int y) { + int mx = x - (workspacemenu->getWidth() / 2); + int my = y - (workspacemenu->getTitleHeight() / 2); + + if (mx < 0) mx = 0; + if (my < 0) my = 0; + + if (mx + workspacemenu->getWidth() > getWidth()) + mx = getWidth() - workspacemenu->getWidth() - getBorderWidth(); + + if (my + workspacemenu->getHeight() > getHeight()) + my = getHeight() - workspacemenu->getHeight() - getBorderWidth(); + + workspacemenu->move(mx, my); + + if (! workspacemenu->isVisible()) { + workspacemenu->removeParent(); + workspacemenu->show(); + } +} + + +void BScreen::showRootMenu(int x, int y) { + int mx = x - (rootmenu->getWidth() / 2); + int my = y - (rootmenu->getTitleHeight() / 2); + + if (mx < 0) mx = 0; + if (my < 0) my = 0; + + if (mx + rootmenu->getWidth() > getWidth()) + mx = getWidth() - rootmenu->getWidth() - getBorderWidth(); + + if (my + rootmenu->getHeight() > getHeight()) + my = getHeight() - rootmenu->getHeight() - getBorderWidth(); + + rootmenu->move(mx, my); + + if (! rootmenu->isVisible()) { + blackbox->checkMenu(); + rootmenu->show(); } }
M
src/Screen.hh
→
src/Screen.hh
@@ -376,6 +376,9 @@ void showPosition(int x, int y);
void showGeometry(unsigned int gx, unsigned int gy); void hideGeometry(void); + void showWorkspaceMenu(int x, int y); + void showRootMenu(int x, int y); + void buttonPressEvent(const XButtonEvent *xbutton); void propertyNotifyEvent(const XPropertyEvent *pe);
M
src/XAtom.cc
→
src/XAtom.cc
@@ -77,6 +77,9 @@ _atoms[blackbox_change_window_focus] =
create("_BLACKBOX_CHANGE_WINDOW_FOCUS"); _atoms[blackbox_cycle_window_focus] = create("_BLACKBOX_CYCLE_WINDOW_FOCUS"); + _atoms[openbox_show_root_menu] = create("_OPENBOX_SHOW_ROOT_MENU"); + _atoms[openbox_show_workspace_menu] = create("_OPENBOX_SHOW_WORKSPACE_MENU"); + _atoms[net_supported] = create("_NET_SUPPORTED"); _atoms[net_client_list] = create("_NET_CLIENT_LIST"); _atoms[net_client_list_stacking] = create("_NET_CLIENT_LIST_STACKING");
M
src/XAtom.hh
→
src/XAtom.hh
@@ -78,6 +78,9 @@ blackbox_change_workspace,
blackbox_change_window_focus, blackbox_cycle_window_focus, + openbox_show_root_menu, + openbox_show_workspace_menu, + // NETWM atoms // root window properties net_supported,
M
src/blackbox.cc
→
src/blackbox.cc
@@ -908,6 +908,28 @@ }
} } } + } else if (e->xclient.message_type == + xatom->getAtom(XAtom::openbox_show_root_menu) || + e->xclient.message_type == + xatom->getAtom(XAtom::openbox_show_workspace_menu)) { + // find the screen the mouse is on + int x, y; + ScreenList::iterator it, end = screenList.end(); + for (it = screenList.begin(); it != end; ++it) { + Window w; + int i; + unsigned int m; + if (XQueryPointer(getXDisplay(), (*it)->getRootWindow(), + &w, &w, &x, &y, &i, &i, &m)) + break; + } + if (it != end) { + if (e->xclient.message_type == + xatom->getAtom(XAtom::openbox_show_root_menu)) + (*it)->showRootMenu(x, y); + else + (*it)->showWorkspaceMenu(x, y); + } } }
M
util/epist/screen.cc
→
util/epist/screen.cc
@@ -242,6 +242,16 @@ case Action::execute:
execCommand(it->string()); return; + case Action::showRootMenu: + _xatom->sendClientMessage(rootWindow(), XAtom::openbox_show_root_menu, + None); + return; + + case Action::showWorkspaceMenu: + _xatom->sendClientMessage(rootWindow(), XAtom::openbox_show_workspace_menu, + None); + return; + default: break; }