// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
-// blackbox.cc for Blackbox - an X11 Window manager
-// Copyright (c) 2001 - 2002 Sean 'Shaleh' Perry <shaleh@debian.org>
-// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the "Software"),
-// to deal in the Software without restriction, including without limitation
-// the rights to use, copy, modify, merge, publish, distribute, sublicense,
-// and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
#ifdef HAVE_CONFIG_H
# include "../config.h"
#include <string>
using std::string;
-#include "i18n.hh"
#include "blackbox.hh"
-#include "Basemenu.hh"
-#include "Clientmenu.hh"
-#include "GCCache.hh"
-#include "Image.hh"
-#include "Rootmenu.hh"
-#include "Screen.hh"
-#include "Slit.hh"
-#include "Toolbar.hh"
-#include "Util.hh"
-#include "Window.hh"
-#include "Workspace.hh"
-#include "Workspacemenu.hh"
-#include "XAtom.hh"
+#include "gccache.hh"
+#include "image.hh"
+#include "screen.hh"
+#include "util.hh"
+#include "window.hh"
+#include "workspace.hh"
+#include "xatom.hh"
Blackbox *blackbox;
-Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu)
+Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc)
: BaseDisplay(m_argv[0], dpy_name) {
if (! XSupportsLocale())
fprintf(stderr, "X server does not support locale\n");
rc_file = expandTilde(rc);
config.setFile(rc_file);
- string rcmenu;
- if (! menu) {
- //have to come up with something better than this
- config.load();
- if (! config.getValue("session.menuFile", rcmenu))
- rcmenu = "~/.openbox/menu";
- } else {
- rcmenu = menu;
- }
- menu_file = expandTilde(rcmenu.c_str());
-
no_focus = False;
resource.auto_raise_delay.tv_sec = resource.auto_raise_delay.tv_usec = 0;
if (screenList.empty()) {
fprintf(stderr,
- i18n(blackboxSet, blackboxNoManagableScreens,
- "Blackbox::Blackbox: no managable screens found, aborting.\n"));
+ "Blackbox::Blackbox: no managable screens found, aborting.\n");
::exit(3);
}
XSynchronize(getXDisplay(), False);
XSync(getXDisplay(), False);
- reconfigure_wait = reread_menu_wait = False;
+ reconfigure_wait = False;
timer = new BTimer(this, this);
timer->setTimeout(0l);
Blackbox::~Blackbox(void) {
std::for_each(screenList.begin(), screenList.end(), PointerAssassin());
- std::for_each(menuTimestamps.begin(), menuTimestamps.end(),
- PointerAssassin());
-
delete xatom;
delete timer;
last_time = e->xbutton.time;
BlackboxWindow *win = (BlackboxWindow *) 0;
- Basemenu *menu = (Basemenu *) 0;
- Slit *slit = (Slit *) 0;
- Toolbar *tbar = (Toolbar *) 0;
BScreen *scrn = (BScreen *) 0;
if ((win = searchWindow(e->xbutton.window))) {
/* XXX: is this sane on low colour desktops? */
if (e->xbutton.button == 1)
win->installColormap(True);
- } else if ((menu = searchMenu(e->xbutton.window))) {
- menu->buttonPressEvent(&e->xbutton);
- } else if ((slit = searchSlit(e->xbutton.window))) {
- slit->buttonPressEvent(&e->xbutton);
- } else if ((tbar = searchToolbar(e->xbutton.window))) {
- tbar->buttonPressEvent(&e->xbutton);
} else if ((scrn = searchScreen(e->xbutton.window))) {
scrn->buttonPressEvent(&e->xbutton);
if (active_screen != scrn) {
last_time = e->xbutton.time;
BlackboxWindow *win = (BlackboxWindow *) 0;
- Basemenu *menu = (Basemenu *) 0;
- Toolbar *tbar = (Toolbar *) 0;
if ((win = searchWindow(e->xbutton.window)))
win->buttonReleaseEvent(&e->xbutton);
- else if ((menu = searchMenu(e->xbutton.window)))
- menu->buttonReleaseEvent(&e->xbutton);
- else if ((tbar = searchToolbar(e->xbutton.window)))
- tbar->buttonReleaseEvent(&e->xbutton);
break;
}
case ConfigureRequest: {
BlackboxWindow *win = (BlackboxWindow *) 0;
- Slit *slit = (Slit *) 0;
if ((win = searchWindow(e->xconfigurerequest.window))) {
win->configureRequestEvent(&e->xconfigurerequest);
- } else if ((slit = searchSlit(e->xconfigurerequest.window))) {
- slit->configureRequestEvent(&e->xconfigurerequest);
} else {
if (validateWindow(e->xconfigurerequest.window)) {
XWindowChanges xwc;
case UnmapNotify: {
BlackboxWindow *win = (BlackboxWindow *) 0;
- Slit *slit = (Slit *) 0;
BScreen *screen = (BScreen *) 0;
if ((win = searchWindow(e->xunmap.window))) {
win->unmapNotifyEvent(&e->xunmap);
- } else if ((slit = searchSlit(e->xunmap.window))) {
- slit->unmapNotifyEvent(&e->xunmap);
} else if ((screen = searchSystrayWindow(e->xunmap.window))) {
screen->removeSystrayWindow(e->xunmap.window);
}
case DestroyNotify: {
BlackboxWindow *win = (BlackboxWindow *) 0;
- Slit *slit = (Slit *) 0;
BScreen *screen = (BScreen *) 0;
BWindowGroup *group = (BWindowGroup *) 0;
if ((win = searchWindow(e->xdestroywindow.window))) {
win->destroyNotifyEvent(&e->xdestroywindow);
- } else if ((slit = searchSlit(e->xdestroywindow.window))) {
- slit->removeClient(e->xdestroywindow.window, False);
} else if ((group = searchGroup(e->xdestroywindow.window))) {
delete group;
} else if ((screen = searchSystrayWindow(e->xunmap.window))) {
to an already unmapped window.
*/
BlackboxWindow *win = searchWindow(e->xreparent.window);
- if (win) {
+ if (win)
win->reparentNotifyEvent(&e->xreparent);
- } else {
- Slit *slit = searchSlit(e->xreparent.window);
- if (slit && slit->getWindowID() != e->xreparent.parent)
- slit->removeClient(e->xreparent.window, True);
- }
break;
}
last_time = e->xmotion.time;
BlackboxWindow *win = (BlackboxWindow *) 0;
- Basemenu *menu = (Basemenu *) 0;
if ((win = searchWindow(e->xmotion.window)))
win->motionNotifyEvent(&e->xmotion);
- else if ((menu = searchMenu(e->xmotion.window)))
- menu->motionNotifyEvent(&e->xmotion);
break;
}
BScreen *screen = (BScreen *) 0;
BlackboxWindow *win = (BlackboxWindow *) 0;
- Basemenu *menu = (Basemenu *) 0;
- Toolbar *tbar = (Toolbar *) 0;
- Slit *slit = (Slit *) 0;
if (e->xcrossing.mode == NotifyGrab) break;
} else if ((win = searchWindow(e->xcrossing.window))) {
if (! no_focus)
win->enterNotifyEvent(&e->xcrossing);
- } else if ((menu = searchMenu(e->xcrossing.window))) {
- menu->enterNotifyEvent(&e->xcrossing);
- } else if ((tbar = searchToolbar(e->xcrossing.window))) {
- tbar->enterNotifyEvent(&e->xcrossing);
- } else if ((slit = searchSlit(e->xcrossing.window))) {
- slit->enterNotifyEvent(&e->xcrossing);
}
break;
}
last_time = e->xcrossing.time;
BlackboxWindow *win = (BlackboxWindow *) 0;
- Basemenu *menu = (Basemenu *) 0;
- Toolbar *tbar = (Toolbar *) 0;
- Slit *slit = (Slit *) 0;
- if ((menu = searchMenu(e->xcrossing.window)))
- menu->leaveNotifyEvent(&e->xcrossing);
- else if ((win = searchWindow(e->xcrossing.window)))
+ if ((win = searchWindow(e->xcrossing.window)))
win->leaveNotifyEvent(&e->xcrossing);
- else if ((tbar = searchToolbar(e->xcrossing.window)))
- tbar->leaveNotifyEvent(&e->xcrossing);
- else if ((slit = searchSlit(e->xcrossing.window)))
- slit->leaveNotifyEvent(&e->xcrossing);
break;
}
e->xexpose.height = ey2 - ey1 + 1;
BlackboxWindow *win = (BlackboxWindow *) 0;
- Basemenu *menu = (Basemenu *) 0;
- Toolbar *tbar = (Toolbar *) 0;
if ((win = searchWindow(e->xexpose.window)))
win->exposeEvent(&e->xexpose);
- else if ((menu = searchMenu(e->xexpose.window)))
- menu->exposeEvent(&e->xexpose);
- else if ((tbar = searchToolbar(e->xexpose.window)))
- tbar->exposeEvent(&e->xexpose);
break;
}
case KeyPress: {
- Toolbar *tbar = searchToolbar(e->xkey.window);
-
- if (tbar && tbar->isEditing())
- tbar->keyPressEvent(&e->xkey);
-
break;
}
}
}
}
- } 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);
- }
}
}
break;
case SIGUSR2:
- rereadMenu();
break;
case SIGPIPE:
}
-Basemenu *Blackbox::searchMenu(Window window) {
- MenuLookup::iterator it = menuSearchList.find(window);
- if (it != menuSearchList.end())
- return it->second;
-
- return (Basemenu*) 0;
-}
-
-
-Toolbar *Blackbox::searchToolbar(Window window) {
- ToolbarLookup::iterator it = toolbarSearchList.find(window);
- if (it != toolbarSearchList.end())
- return it->second;
-
- return (Toolbar*) 0;
-}
-
-
-Slit *Blackbox::searchSlit(Window window) {
- SlitLookup::iterator it = slitSearchList.find(window);
- if (it != slitSearchList.end())
- return it->second;
-
- return (Slit*) 0;
-}
-
-
void Blackbox::saveSystrayWindowSearch(Window window, BScreen *screen) {
systraySearchList.insert(WindowScreenLookupPair(window, screen));
}
}
-void Blackbox::saveMenuSearch(Window window, Basemenu *data) {
- menuSearchList.insert(MenuLookupPair(window, data));
-}
-
-
-void Blackbox::saveToolbarSearch(Window window, Toolbar *data) {
- toolbarSearchList.insert(ToolbarLookupPair(window, data));
-}
-
-
-void Blackbox::saveSlitSearch(Window window, Slit *data) {
- slitSearchList.insert(SlitLookupPair(window, data));
-}
-
-
void Blackbox::removeSystrayWindowSearch(Window window) {
systraySearchList.erase(window);
}
}
-void Blackbox::removeMenuSearch(Window window) {
- menuSearchList.erase(window);
-}
-
-
-void Blackbox::removeToolbarSearch(Window window) {
- toolbarSearchList.erase(window);
-}
-
-
-void Blackbox::removeSlitSearch(Window window) {
- slitSearchList.erase(window);
-}
-
-
void Blackbox::restart(const char *prog) {
shutdown();
void Blackbox::real_reconfigure(void) {
load_rc();
- std::for_each(menuTimestamps.begin(), menuTimestamps.end(),
- PointerAssassin());
- menuTimestamps.clear();
-
gcCache()->purge();
std::for_each(screenList.begin(), screenList.end(),
}
-void Blackbox::checkMenu(void) {
- bool reread = False;
- MenuTimestampList::iterator it = menuTimestamps.begin();
- for(; it != menuTimestamps.end(); ++it) {
- MenuTimestamp *tmp = *it;
- struct stat buf;
-
- if (! stat(tmp->filename.c_str(), &buf)) {
- if (tmp->timestamp != buf.st_ctime)
- reread = True;
- } else {
- reread = True;
- }
- }
-
- if (reread) rereadMenu();
-}
-
-
-void Blackbox::rereadMenu(void) {
- reread_menu_wait = True;
-
- if (! timer->isTiming()) timer->start();
-}
-
-
-void Blackbox::real_rereadMenu(void) {
- std::for_each(menuTimestamps.begin(), menuTimestamps.end(),
- PointerAssassin());
- menuTimestamps.clear();
-
- std::for_each(screenList.begin(), screenList.end(),
- std::mem_fun(&BScreen::rereadMenu));
-}
-
-
void Blackbox::saveStyleFilename(const string& filename) {
assert(! filename.empty());
resource.style_file = filename;
}
-void Blackbox::addMenuTimestamp(const string& filename) {
- assert(! filename.empty());
- bool found = False;
-
- MenuTimestampList::iterator it = menuTimestamps.begin();
- for (; it != menuTimestamps.end() && ! found; ++it) {
- if ((*it)->filename == filename) found = True;
- }
- if (! found) {
- struct stat buf;
-
- if (! stat(filename.c_str(), &buf)) {
- MenuTimestamp *ts = new MenuTimestamp;
-
- ts->filename = filename;
- ts->timestamp = buf.st_ctime;
-
- menuTimestamps.push_back(ts);
- }
- }
-}
-
-
void Blackbox::timeout(void) {
if (reconfigure_wait)
real_reconfigure();
- if (reread_menu_wait)
- real_rereadMenu();
-
- reconfigure_wait = reread_menu_wait = False;
+ reconfigure_wait = False;
}
}
if (active_screen && active_screen->isScreenManaged()) {
- active_screen->getToolbar()->redrawWindowLabel(True);
active_screen->updateNetizenWindowFocus();
}
if (old_screen && old_screen != active_screen) {
- old_screen->getToolbar()->redrawWindowLabel(True);
old_screen->updateNetizenWindowFocus();
}
}