X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fxeventhandler.cc;h=c31aaf9793a96093167b079c2888cbe96269cc99;hb=116c95b887f0dfcdaa0670565979143ec33ced47;hp=f09a32b873e57aea38e896dc2ceb469cd5abd73e;hpb=45c2589ef6e6576604543229dfa1582d471e6a94;p=chaz%2Fopenbox diff --git a/src/xeventhandler.cc b/src/xeventhandler.cc index f09a32b8..c31aaf97 100644 --- a/src/xeventhandler.cc +++ b/src/xeventhandler.cc @@ -1,6 +1,8 @@ // -*- mode: C++; indent-tabs-mode: nil; -*- #include "xeventhandler.hh" +#include "client.hh" +#include "openbox.hh" #include "otk/display.hh" #include "otk/rect.hh" @@ -45,6 +47,10 @@ void OBXEventHandler::motion(const XMotionEvent &e) void OBXEventHandler::enterNotify(const XCrossingEvent &e) { _lasttime = e.time; + + OBClient *client = Openbox::instance->findClient(e.window); + if (!client) return; + /* BScreen *screen = (BScreen *) 0; BlackboxWindow *win = (BlackboxWindow *) 0; @@ -65,6 +71,10 @@ void OBXEventHandler::enterNotify(const XCrossingEvent &e) void OBXEventHandler::leaveNotify(const XCrossingEvent &e) { _lasttime = e.time; + + OBClient *client = Openbox::instance->findClient(e.window); + if (!client) return; + /* BlackboxWindow *win = (BlackboxWindow *) 0; @@ -76,7 +86,9 @@ void OBXEventHandler::leaveNotify(const XCrossingEvent &e) void OBXEventHandler::configureRequest(const XConfigureRequestEvent &e) { - (void)e; + OBClient *client = Openbox::instance->findClient(e.window); + if (!client) return; + /* BlackboxWindow *win = (BlackboxWindow *) 0; if ((win = searchWindow(e->xconfigurerequest.window))) { @@ -106,6 +118,16 @@ void OBXEventHandler::mapRequest(const XMapRequestEvent &e) #ifdef DEBUG printf("MapRequest for 0x%lx\n", e.window); #endif // DEBUG + + OBClient *client = Openbox::instance->findClient(e.window); + + if (client) { + // XXX: uniconify and/or unshade the window + } else { + // XXX: manage the window, i.e. grab events n shit + Openbox::instance->addClient(e.window, new OBClient(e.window)); + } + /* BlackboxWindow *win = searchWindow(e->xmaprequest.window); @@ -160,48 +182,37 @@ void OBXEventHandler::mapRequest(const XMapRequestEvent &e) void OBXEventHandler::unmapNotify(const XUnmapEvent &e) { - (void)e; -/* - BlackboxWindow *win = (BlackboxWindow *) 0; - BScreen *screen = (BScreen *) 0; - - if ((win = searchWindow(e->xunmap.window))) { - win->unmapNotifyEvent(&e->xunmap); - } else if ((screen = searchSystrayWindow(e->xunmap.window))) { - screen->removeSystrayWindow(e->xunmap.window); - } -*/ + OBClient *client = Openbox::instance->findClient(e.window); + if (!client) return; + + // XXX: unmanage the window, i.e. ungrab events n reparent n shit + Openbox::instance->removeClient(e.window); } void OBXEventHandler::destroyNotify(const XDestroyWindowEvent &e) { - (void)e; -/* - BlackboxWindow *win = (BlackboxWindow *) 0; - BScreen *screen = (BScreen *) 0; - BWindowGroup *group = (BWindowGroup *) 0; - - if ((win = searchWindow(e->xdestroywindow.window))) { - win->destroyNotifyEvent(&e->xdestroywindow); - } else if ((group = searchGroup(e->xdestroywindow.window))) { - delete group; - } else if ((screen = searchSystrayWindow(e->xunmap.window))) { - screen->removeSystrayWindow(e->xunmap.window); - } -*/ + // XXX: window group leaders can come through here too! + + OBClient *client = Openbox::instance->findClient(e.window); + if (!client) return; + + // XXX: unmanage the window, i.e. ungrab events n reparent n shit + Openbox::instance->removeClient(e.window); } void OBXEventHandler::reparentNotify(const XReparentEvent &e) { - (void)e; /* this event is quite rare and is usually handled in unmapNotify however, if the window is unmapped when the reparent event occurs the window manager never sees it because an unmap event is not sent to an already unmapped window. */ + OBClient *client = Openbox::instance->findClient(e.window); + if (!client) return; + /* BlackboxWindow *win = searchWindow(e->xreparent.window); if (win) @@ -213,45 +224,40 @@ void OBXEventHandler::reparentNotify(const XReparentEvent &e) void OBXEventHandler::propertyNotify(const XPropertyEvent &e) { _lasttime = e.time; -/* - BlackboxWindow *win = (BlackboxWindow *) 0; - BScreen *screen = (BScreen *) 0; - if ((win = searchWindow(e->xproperty.window))) - win->propertyNotifyEvent(&e->xproperty); - else if ((screen = searchScreen(e->xproperty.window))) - screen->propertyNotifyEvent(&e->xproperty); -*/ + OBClient *client = Openbox::instance->findClient(e.window); + if (!client) return; + + client->update(e); } void OBXEventHandler::expose(const XExposeEvent &first) { - // compress expose events - XEvent e; e.xexpose = first; - unsigned int i = 0; - otk::Rect area(e.xexpose.x, e.xexpose.y, e.xexpose.width, - e.xexpose.height); - while (XCheckTypedWindowEvent(otk::OBDisplay::display, - e.xexpose.window, Expose, &e)) { - i++; - // merge expose area - area |= otk::Rect(e.xexpose.x, e.xexpose.y, e.xexpose.width, - e.xexpose.height); - } - if ( i > 0 ) { - // use the merged area - e.xexpose.x = area.x(); - e.xexpose.y = area.y(); - e.xexpose.width = area.width(); - e.xexpose.height = area.height(); - } -/* - BlackboxWindow *win = (BlackboxWindow *) 0; + OBClient *client = Openbox::instance->findClient(first.window); + if (!client) return; + + // compress expose events + XEvent e; e.xexpose = first; + unsigned int i = 0; + otk::Rect area(e.xexpose.x, e.xexpose.y, e.xexpose.width, + e.xexpose.height); + while (XCheckTypedWindowEvent(otk::OBDisplay::display, + e.xexpose.window, Expose, &e)) { + i++; + // merge expose area + area |= otk::Rect(e.xexpose.x, e.xexpose.y, e.xexpose.width, + e.xexpose.height); + } + if ( i > 0 ) { + // use the merged area + e.xexpose.x = area.x(); + e.xexpose.y = area.y(); + e.xexpose.width = area.width(); + e.xexpose.height = area.height(); + } - if ((win = searchWindow(e->xexpose.window))) - win->exposeEvent(&e->xexpose); -*/ + // XXX: make the decorations redraw! } @@ -384,6 +390,85 @@ void OBXEventHandler::shapeEvent(const XShapeEvent &e) #endif // SHAPE +void OBXEventHandler::clientMessage(const XClientMessageEvent &e) +{ + if (e.format != 32) + return; +/* + } else if (e->xclient.message_type == + xatom->getAtom(XAtom::blackbox_change_workspace) || + e->xclient.message_type == + xatom->getAtom(XAtom::net_current_desktop)) { + // NET_CURRENT_DESKTOP message + BScreen *screen = searchScreen(e->xclient.window); + + unsigned int workspace = e->xclient.data.l[0]; + if (screen && workspace < screen->getWorkspaceCount()) + screen->changeWorkspaceID(workspace); + } else if (e->xclient.message_type == + xatom->getAtom(XAtom::net_active_window)) { + // NET_ACTIVE_WINDOW + BlackboxWindow *win = searchWindow(e->xclient.window); + + if (win) { + BScreen *screen = win->getScreen(); + + if (win->isIconic()) + win->deiconify(False, False); + if (! win->isStuck() && + (win->getWorkspaceNumber() != screen->getCurrentWorkspaceID())) { + no_focus = True; + screen->changeWorkspaceID(win->getWorkspaceNumber()); + } + if (win->isVisible() && win->setInputFocus()) { + win->getScreen()->getWorkspace(win->getWorkspaceNumber())-> + raiseWindow(win); + win->installColormap(True); + } + } + } else if (e->xclient.message_type == + xatom->getAtom(XAtom::net_number_of_desktops)) { + // NET_NUMBER_OF_DESKTOPS + BScreen *screen = searchScreen(e->xclient.window); + + if (e->xclient.data.l[0] > 0) + screen->changeWorkspaceCount((unsigned) e->xclient.data.l[0]); + } else if (e->xclient.message_type == + xatom->getAtom(XAtom::net_close_window)) { + // NET_CLOSE_WINDOW + BlackboxWindow *win = searchWindow(e->xclient.window); + if (win && win->validateClient()) + win->close(); // could this be smarter? + } else if (e->xclient.message_type == + xatom->getAtom(XAtom::net_wm_moveresize)) { + // NET_WM_MOVERESIZE + BlackboxWindow *win = searchWindow(e->xclient.window); + if (win && win->validateClient()) { + int x_root = e->xclient.data.l[0], + y_root = e->xclient.data.l[1]; + if ((Atom) e->xclient.data.l[2] == + xatom->getAtom(XAtom::net_wm_moveresize_move)) { + win->beginMove(x_root, y_root); + } else { + if ((Atom) e->xclient.data.l[2] == + xatom->getAtom(XAtom::net_wm_moveresize_size_topleft)) + win->beginResize(x_root, y_root, BlackboxWindow::TopLeft); + else if ((Atom) e->xclient.data.l[2] == + xatom->getAtom(XAtom::net_wm_moveresize_size_topright)) + win->beginResize(x_root, y_root, BlackboxWindow::TopRight); + else if ((Atom) e->xclient.data.l[2] == + xatom->getAtom(XAtom::net_wm_moveresize_size_bottomleft)) + win->beginResize(x_root, y_root, BlackboxWindow::BottomLeft); + else if ((Atom) e->xclient.data.l[2] == + xatom->getAtom(XAtom::net_wm_moveresize_size_bottomright)) + win->beginResize(x_root, y_root, BlackboxWindow::BottomRight); + } + } + } +*/ +} + + void OBXEventHandler::handle(const XEvent &e) { /* mouse button events can get translated into: @@ -463,6 +548,9 @@ void OBXEventHandler::handle(const XEvent &e) focusOut(e.xfocus); break; + case ClientMessage: + clientMessage(e.xclient); + default: #ifdef SHAPE if (e.type == otk::OBDisplay::shapeEventBase()) @@ -472,278 +560,9 @@ void OBXEventHandler::handle(const XEvent &e) /* case ClientMessage: { - if (e->xclient.format == 32) { - if (e->xclient.message_type == xatom->getAtom(XAtom::wm_change_state)) { - // WM_CHANGE_STATE message - BlackboxWindow *win = searchWindow(e->xclient.window); - if (! win || ! win->validateClient()) return; - - if (e->xclient.data.l[0] == IconicState) - win->iconify(); - if (e->xclient.data.l[0] == NormalState) - win->deiconify(); - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::blackbox_change_workspace) || - e->xclient.message_type == - xatom->getAtom(XAtom::net_current_desktop)) { - // NET_CURRENT_DESKTOP message - BScreen *screen = searchScreen(e->xclient.window); - - unsigned int workspace = e->xclient.data.l[0]; - if (screen && workspace < screen->getWorkspaceCount()) - screen->changeWorkspaceID(workspace); - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::blackbox_change_window_focus)) { - // TEMP HACK TO KEEP BBKEYS WORKING - BlackboxWindow *win = searchWindow(e->xclient.window); - - if (win && win->isVisible() && win->setInputFocus()) - win->installColormap(True); - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::net_active_window)) { - // NET_ACTIVE_WINDOW - BlackboxWindow *win = searchWindow(e->xclient.window); - - if (win) { - BScreen *screen = win->getScreen(); - - if (win->isIconic()) - win->deiconify(False, False); - if (! win->isStuck() && - (win->getWorkspaceNumber() != screen->getCurrentWorkspaceID())) { - no_focus = True; - screen->changeWorkspaceID(win->getWorkspaceNumber()); - } - if (win->isVisible() && win->setInputFocus()) { - win->getScreen()->getWorkspace(win->getWorkspaceNumber())-> - raiseWindow(win); - win->installColormap(True); - } - } - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::blackbox_cycle_window_focus)) { - // BLACKBOX_CYCLE_WINDOW_FOCUS - BScreen *screen = searchScreen(e->xclient.window); - - if (screen) { - if (! e->xclient.data.l[0]) - screen->prevFocus(); - else - screen->nextFocus(); - } - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::net_wm_desktop)) { - // NET_WM_DESKTOP - BlackboxWindow *win = searchWindow(e->xclient.window); - - if (win) { - BScreen *screen = win->getScreen(); - unsigned long wksp = (unsigned) e->xclient.data.l[0]; - if (wksp < screen->getWorkspaceCount()) { - if (win->isIconic()) win->deiconify(False, True); - if (win->isStuck()) win->stick(); - if (wksp != screen->getCurrentWorkspaceID()) - win->withdraw(); - else - win->show(); - screen->reassociateWindow(win, wksp, True); - } else if (wksp == 0xfffffffe || // XXX: BUG, BUT DOING THIS SO KDE WORKS FOR NOW!! - wksp == 0xffffffff) { - if (win->isIconic()) win->deiconify(False, True); - if (! win->isStuck()) win->stick(); - if (! win->isVisible()) win->show(); - } - } - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::blackbox_change_attributes)) { - // BLACKBOX_CHANGE_ATTRIBUTES - BlackboxWindow *win = searchWindow(e->xclient.window); - - if (win && win->validateClient()) { - BlackboxHints net; - net.flags = e->xclient.data.l[0]; - net.attrib = e->xclient.data.l[1]; - net.workspace = e->xclient.data.l[2]; - net.stack = e->xclient.data.l[3]; - net.decoration = e->xclient.data.l[4]; - - win->changeBlackboxHints(&net); - } - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::net_number_of_desktops)) { - // NET_NUMBER_OF_DESKTOPS - BScreen *screen = searchScreen(e->xclient.window); - - if (e->xclient.data.l[0] > 0) - screen->changeWorkspaceCount((unsigned) e->xclient.data.l[0]); - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::net_close_window)) { - // NET_CLOSE_WINDOW - BlackboxWindow *win = searchWindow(e->xclient.window); - if (win && win->validateClient()) - win->close(); // could this be smarter? - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::net_wm_moveresize)) { - // NET_WM_MOVERESIZE - BlackboxWindow *win = searchWindow(e->xclient.window); - if (win && win->validateClient()) { - int x_root = e->xclient.data.l[0], - y_root = e->xclient.data.l[1]; - if ((Atom) e->xclient.data.l[2] == - xatom->getAtom(XAtom::net_wm_moveresize_move)) { - win->beginMove(x_root, y_root); - } else { - if ((Atom) e->xclient.data.l[2] == - xatom->getAtom(XAtom::net_wm_moveresize_size_topleft)) - win->beginResize(x_root, y_root, BlackboxWindow::TopLeft); - else if ((Atom) e->xclient.data.l[2] == - xatom->getAtom(XAtom::net_wm_moveresize_size_topright)) - win->beginResize(x_root, y_root, BlackboxWindow::TopRight); - else if ((Atom) e->xclient.data.l[2] == - xatom->getAtom(XAtom::net_wm_moveresize_size_bottomleft)) - win->beginResize(x_root, y_root, BlackboxWindow::BottomLeft); - else if ((Atom) e->xclient.data.l[2] == - xatom->getAtom(XAtom::net_wm_moveresize_size_bottomright)) - win->beginResize(x_root, y_root, BlackboxWindow::BottomRight); - } - } - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::net_wm_state)) { - // NET_WM_STATE - BlackboxWindow *win = searchWindow(e->xclient.window); - if (win && win->validateClient()) { - const Atom action = (Atom) e->xclient.data.l[0]; - const Atom state[] = { (Atom) e->xclient.data.l[1], - (Atom) e->xclient.data.l[2] }; - - for (int i = 0; i < 2; ++i) { - if (! state[i]) - continue; - - if ((Atom) e->xclient.data.l[0] == 1) { - // ADD - if (state[i] == xatom->getAtom(XAtom::net_wm_state_modal)) { - win->setModal(True); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_vert)) { - if (win->isMaximizedHoriz()) { - win->maximize(0); // unmaximize - win->maximize(1); // full - } else if (! win->isMaximized()) { - win->maximize(2); // vert - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_horz)) { - if (win->isMaximizedVert()) { - win->maximize(0); // unmaximize - win->maximize(1); // full - } else if (! win->isMaximized()) { - win->maximize(3); // horiz - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_shaded)) { - if (! win->isShaded()) - win->shade(); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_taskbar)) { - win->setSkipTaskbar(True); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_pager)) { - win->setSkipPager(True); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_fullscreen)) { - win->setFullscreen(True); - } - } else if (action == 0) { - // REMOVE - if (state[i] == xatom->getAtom(XAtom::net_wm_state_modal)) { - win->setModal(False); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_vert)) { - if (win->isMaximizedFull()) { - win->maximize(0); // unmaximize - win->maximize(3); // horiz - } else if (win->isMaximizedVert()) { - win->maximize(0); // unmaximize - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_horz)) { - if (win->isMaximizedFull()) { - win->maximize(0); // unmaximize - win->maximize(2); // vert - } else if (win->isMaximizedHoriz()) { - win->maximize(0); // unmaximize - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_shaded)) { - if (win->isShaded()) - win->shade(); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_taskbar)) { - win->setSkipTaskbar(False); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_pager)) { - win->setSkipPager(False); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_fullscreen)) { - win->setFullscreen(False); - } - } else if (action == 2) { - // TOGGLE - if (state[i] == xatom->getAtom(XAtom::net_wm_state_modal)) { - win->setModal(! win->isModal()); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_vert)) { - if (win->isMaximizedFull()) { - win->maximize(0); // unmaximize - win->maximize(3); // horiz - } else if (win->isMaximizedVert()) { - win->maximize(0); // unmaximize - } else if (win->isMaximizedHoriz()) { - win->maximize(0); // unmaximize - win->maximize(1); // full - } else { - win->maximize(2); // vert - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_horz)) { - if (win->isMaximizedFull()) { - win->maximize(0); // unmaximize - win->maximize(2); // vert - } else if (win->isMaximizedHoriz()) { - win->maximize(0); // unmaximize - } else if (win->isMaximizedVert()) { - win->maximize(0); // unmaximize - win->maximize(1); // full - } else { - win->maximize(3); // horiz - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_shaded)) { - win->shade(); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_taskbar)) { - win->setSkipTaskbar(! win->skipTaskbar()); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_pager)) { - win->setSkipPager(! win->skipPager()); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_fullscreen)) { - win->setFullscreen(! win->isFullscreen()); - } - } - } - } - } - } - break; } - case NoExpose: - case ConfigureNotify: - case MapNotify: - break; // not handled, just ignore */ } // switch }