From d363f720a6b0d1c361bc2022d0e5fcd5a75fd04d Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 6 Nov 2002 08:06:54 +0000 Subject: [PATCH] fix compiling with the new strut (new namespace) and fix general errors that broke compiling. make xeventhandler find the OBClient for most events.. --- src/bbwindow.hh | 6 ++- src/client.cc | 5 +- src/client.hh | 5 +- src/openbox.cc | 17 ++++++ src/openbox.hh | 17 ++++++ src/screen.cc | 9 ++-- src/screen.hh | 9 ++-- src/xeventhandler.cc | 124 +++++++++++++++++++++++-------------------- 8 files changed, 115 insertions(+), 77 deletions(-) diff --git a/src/bbwindow.hh b/src/bbwindow.hh index ff92d5cc..1da5dc94 100644 --- a/src/bbwindow.hh +++ b/src/bbwindow.hh @@ -14,6 +14,8 @@ extern "C" { #include "otk/timer.hh" #include "otk/property.hh" +#include "otk/rect.hh" +#include "otk/strut.hh" #include "blackbox.hh" #include "util.hh" @@ -148,7 +150,7 @@ private: std::string title, icon_title; otk::Rect rect; - Strut strut; + otk::Strut strut; int old_bw; // client's borderwidth @@ -219,7 +221,7 @@ private: otk::Rect changing; otk::Rect rect; // frame geometry - Strut margin; // margins between the frame and client + otk::Strut margin; // margins between the frame and client int grab_x, grab_y; // where was the window when it was grabbed? diff --git a/src/client.cc b/src/client.cc index 7a3754a6..253fd235 100644 --- a/src/client.cc +++ b/src/client.cc @@ -18,10 +18,9 @@ extern "C" { namespace ob { -OBClient::OBClient(BScreen *screen, Window window) - : _screen(screen), _window(window) +OBClient::OBClient(Window window) + : _window(window) { - assert(_screen); assert(window); // initialize vars to false/invalid values diff --git a/src/client.hh b/src/client.hh index fa441b6d..94f12ba3 100644 --- a/src/client.hh +++ b/src/client.hh @@ -13,8 +13,6 @@ extern "C" { namespace ob { -class BScreen; - class OBClient { public: enum Max { Max_None, @@ -64,7 +62,6 @@ public: }; private: - BScreen *_screen; Window _window; //! The id of the group the window belongs to @@ -143,7 +140,7 @@ private: void updateClass(); public: - OBClient(BScreen *screen, Window window); + OBClient(Window window); virtual ~OBClient(); inline Window window() const { return _window; } diff --git a/src/openbox.cc b/src/openbox.cc index f10db5bc..c5a93eeb 100644 --- a/src/openbox.cc +++ b/src/openbox.cc @@ -210,5 +210,22 @@ void Openbox::eventLoop() } +void Openbox::addClient(Window window, OBClient *client) +{ + _clients[window] = client; +} + + +void Openbox::removeClient(Window window) +{ + _clients[window] = (OBClient *) 0; +} + + +OBClient *Openbox::findClient(Window window) +{ + return _clients[window]; +} + } diff --git a/src/openbox.hh b/src/openbox.hh index baf9edeb..bb05fae8 100644 --- a/src/openbox.hh +++ b/src/openbox.hh @@ -12,11 +12,13 @@ extern "C" { #include #include +#include #include "otk/screeninfo.hh" #include "otk/timerqueuemanager.hh" #include "otk/property.hh" #include "xeventhandler.hh" +#include "client.hh" namespace ob { @@ -46,6 +48,9 @@ public: State_Normal, //!< The window manager is running in its normal state State_Exiting //!< The window manager is exiting (being destroyed) }; + + //! A map for looking up a specific client class from the window id + typedef std::map ClientMap; private: // stuff that can be passed on the command line @@ -64,6 +69,9 @@ private: //! The value of argv[0], i.e. how this application was executed char *_argv0; + //! A list of all managed clients + ClientMap _clients; + //! Manages all timers for the application /*! Use of the otk::OBTimerQueueManager::fire funtion in this object ensures @@ -128,6 +136,15 @@ public: */ void eventLoop(); + //! Adds an OBClient to the client list for lookups + void addClient(Window window, OBClient *client); + + //! Removes an OBClient from the client list for lookups + void removeClient(Window window); + + //! Finds an OBClient based on its window id + OBClient *findClient(Window window); + //! Requests that the window manager exit /*! Causes the Openbox::eventLoop function to stop looping, so that the window diff --git a/src/screen.cc b/src/screen.cc index 0d5810d7..20a6169a 100644 --- a/src/screen.cc +++ b/src/screen.cc @@ -113,7 +113,8 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(scrn) { // xatom->setSupported(this); // set-up netwm support #ifdef HAVE_GETPID - xatom->setValue(getRootWindow(), otk::OBProperty::blackbox_pid, otk::OBProperty::cardinal, + xatom->setValue(getRootWindow(), otk::OBProperty::blackbox_pid, + otk::OBProperty::Atom_Cardinal, (unsigned long) getpid()); #endif // HAVE_GETPID unsigned long geometry[] = { getWidth(), @@ -1519,12 +1520,12 @@ void BScreen::hideGeometry(void) { } -void BScreen::addStrut(Strut *strut) { +void BScreen::addStrut(otk::Strut *strut) { strutList.push_back(strut); } -void BScreen::removeStrut(Strut *strut) { +void BScreen::removeStrut(otk::Strut *strut) { strutList.remove(strut); } @@ -1569,7 +1570,7 @@ void BScreen::updateAvailableArea(void) { StrutList::const_iterator it = strutList.begin(), end = strutList.end(); for(; it != end; ++it) { - Strut *strut = *it; + otk::Strut *strut = *it; if (strut->left > current_left) current_left = strut->left; if (strut->top > current_top) diff --git a/src/screen.hh b/src/screen.hh index 1c09c633..34963508 100644 --- a/src/screen.hh +++ b/src/screen.hh @@ -24,6 +24,7 @@ extern "C" { #include "otk/font.hh" #include "otk/texture.hh" #include "otk/image.hh" +#include "otk/strut.hh" #include "otk/property.hh" #include "timer.hh" #include "workspace.hh" @@ -31,8 +32,6 @@ extern "C" { namespace ob { -struct Strut; - enum TextJustify { LeftJustify = 1, RightJustify, CenterJustify }; struct PixmapMask { @@ -83,7 +82,7 @@ private: RectList xineramaUsableArea; #endif // XINERAMA - typedef std::list StrutList; + typedef std::list StrutList; StrutList strutList; typedef std::vector WorkspaceList; WorkspaceList workspacesList; @@ -270,8 +269,8 @@ public: const RectList& allAvailableAreas(void) const; #endif // XINERAMA void updateAvailableArea(void); - void addStrut(Strut *strut); - void removeStrut(Strut *strut); + void addStrut(otk::Strut *strut); + void removeStrut(otk::Strut *strut); unsigned int addWorkspace(void); unsigned int removeLastWorkspace(void); diff --git a/src/xeventhandler.cc b/src/xeventhandler.cc index ba60edf7..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! } -- 2.39.2