all repos — openbox @ 4a07868e794c5e0974d15e89579b53d598273426

openbox fork - make it a bit more like ryudo

more old bb shit to go
Dana Jansens danakj@orodu.net
commit

4a07868e794c5e0974d15e89579b53d598273426

parent

f8ea576460470ecc2e395cf43e31a67752adbbb5

2 files changed, 0 insertions(+), 1443 deletions(-)

jump to
D src/blackbox.cc

@@ -1,1219 +0,0 @@

-// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- - -#ifdef HAVE_CONFIG_H -# include "../config.h" -#endif // HAVE_CONFIG_H - -extern "C" { -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/Xatom.h> -#include <X11/cursorfont.h> -#include <X11/keysym.h> - -#ifdef SHAPE -#include <X11/extensions/shape.h> -#endif // SHAPE - -#ifdef HAVE_STDIO_H -# include <stdio.h> -#endif // HAVE_STDIO_H - -#ifdef HAVE_STDLIB_H -# include <stdlib.h> -#endif // HAVE_STDLIB_H - -#ifdef HAVE_STRING_H -# include <string.h> -#endif // HAVE_STRING_H - -#ifdef HAVE_UNISTD_H -# include <sys/types.h> -# include <unistd.h> -#endif // HAVE_UNISTD_H - -#ifdef HAVE_SYS_PARAM_H -# include <sys/param.h> -#endif // HAVE_SYS_PARAM_H - -#ifdef HAVE_SYS_SELECT_H -# include <sys/select.h> -#endif // HAVE_SYS_SELECT_H - -#ifdef HAVE_SIGNAL_H -# include <signal.h> -#endif // HAVE_SIGNAL_H - -#ifdef HAVE_SYS_SIGNAL_H -# include <sys/signal.h> -#endif // HAVE_SYS_SIGNAL_H - -#ifdef HAVE_SYS_STAT_H -# include <sys/types.h> -# include <sys/stat.h> -#endif // HAVE_SYS_STAT_H - -#ifdef TIME_WITH_SYS_TIME -# include <sys/time.h> -# include <time.h> -#else // !TIME_WITH_SYS_TIME -# ifdef HAVE_SYS_TIME_H -# include <sys/time.h> -# else // !HAVE_SYS_TIME_H -# include <time.h> -# endif // HAVE_SYS_TIME_H -#endif // TIME_WITH_SYS_TIME - -#ifdef HAVE_LIBGEN_H -# include <libgen.h> -#endif // HAVE_LIBGEN_H -} - -#include <assert.h> - -#include <algorithm> -#include <string> -using std::string; - -#include "blackbox.hh" -#include "otk/gccache.hh" -#include "otk/image.hh" -#include "otk/assassin.hh" -#include "bbscreen.hh" -#include "otk/util.hh" -#include "bbwindow.hh" -#include "workspace.hh" - -namespace ob { - -Blackbox *blackbox; - - -Blackbox::Blackbox(int argc, char **m_argv, char *rc) - : Openbox(argc, m_argv) { - - if (! XSupportsLocale()) - fprintf(stderr, "X server does not support locale\n"); - - if (XSetLocaleModifiers("") == NULL) - fprintf(stderr, "cannot set locale modifiers\n"); - - ob::blackbox = this; - argv = m_argv; - - // try to make sure the ~/.openbox directory exists - mkdir(otk::expandTilde("~/.openbox").c_str(), S_IREAD | S_IWRITE | S_IEXEC | - S_IRGRP | S_IWGRP | S_IXGRP | - S_IROTH | S_IWOTH | S_IXOTH); - - if (! rc) rc = "~/.openbox/rc3"; - rc_file = otk::expandTilde(rc); - config.setFile(rc_file); - - no_focus = False; - - resource.auto_raise_delay.tv_sec = resource.auto_raise_delay.tv_usec = 0; - - active_screen = 0; - focused_window = changing_window = (BlackboxWindow *) 0; - - load_rc(); - - xatom = new otk::OBProperty(); - - cursor.session = XCreateFontCursor(otk::OBDisplay::display, XC_left_ptr); - cursor.move = XCreateFontCursor(otk::OBDisplay::display, XC_fleur); - cursor.ll_angle = XCreateFontCursor(otk::OBDisplay::display, XC_ll_angle); - cursor.lr_angle = XCreateFontCursor(otk::OBDisplay::display, XC_lr_angle); - cursor.ul_angle = XCreateFontCursor(otk::OBDisplay::display, XC_ul_angle); - cursor.ur_angle = XCreateFontCursor(otk::OBDisplay::display, XC_ur_angle); - - for (int i = 0; i < ScreenCount(otk::OBDisplay::display); i++) { - BScreen *screen = new BScreen(this, i); - - if (! screen->isScreenManaged()) { - delete screen; - continue; - } - - screenList.push_back(screen); - } - - if (screenList.empty()) { - fprintf(stderr, - "Blackbox::Blackbox: no managable screens found, aborting.\n"); - ::exit(3); - } - - // save current settings and default values - save_rc(); - - // set the screen with mouse to the first managed screen - active_screen = screenList.front(); - setFocusedWindow(0); - - XSynchronize(otk::OBDisplay::display, False); - XSync(otk::OBDisplay::display, False); - - reconfigure_wait = False; - - timer = new otk::OBTimer(Openbox::instance->timerManager(), - (otk::OBTimeoutHandler)timeout, - this); - timer->setTimeout(0l); -} - - -Blackbox::~Blackbox(void) { - std::for_each(screenList.begin(), screenList.end(), otk::PointerAssassin()); - - delete xatom; - - delete timer; -} - - -void Blackbox::process_event(XEvent *e) { - switch (e->type) { - case ButtonPress: { - // strip the lock key modifiers - //e->xbutton.state &= ~(NumLockMask | ScrollLockMask | LockMask); - - last_time = e->xbutton.time; - - BlackboxWindow *win = (BlackboxWindow *) 0; - BScreen *scrn = (BScreen *) 0; - - if ((win = searchWindow(e->xbutton.window))) { - win->buttonPressEvent(&e->xbutton); - - /* XXX: is this sane on low colour desktops? */ - if (e->xbutton.button == 1) - win->installColormap(True); - } else if ((scrn = searchScreen(e->xbutton.window))) { - scrn->buttonPressEvent(&e->xbutton); - if (active_screen != scrn) { - active_screen = scrn; - // first, set no focus window on the old screen - setFocusedWindow(0); - // and move focus to this screen - setFocusedWindow(0); - } - } - break; - } - - case ButtonRelease: { - // strip the lock key modifiers - //e->xbutton.state &= ~(NumLockMask | ScrollLockMask | LockMask); - - last_time = e->xbutton.time; - - BlackboxWindow *win = (BlackboxWindow *) 0; - - if ((win = searchWindow(e->xbutton.window))) - win->buttonReleaseEvent(&e->xbutton); - - break; - } - - case ConfigureRequest: { - BlackboxWindow *win = (BlackboxWindow *) 0; - - if ((win = searchWindow(e->xconfigurerequest.window))) { - win->configureRequestEvent(&e->xconfigurerequest); - } else { - if (validateWindow(e->xconfigurerequest.window)) { - XWindowChanges xwc; - - xwc.x = e->xconfigurerequest.x; - xwc.y = e->xconfigurerequest.y; - xwc.width = e->xconfigurerequest.width; - xwc.height = e->xconfigurerequest.height; - xwc.border_width = e->xconfigurerequest.border_width; - xwc.sibling = e->xconfigurerequest.above; - xwc.stack_mode = e->xconfigurerequest.detail; - - XConfigureWindow(otk::OBDisplay::display, e->xconfigurerequest.window, - e->xconfigurerequest.value_mask, &xwc); - } - } - - break; - } - - case MapRequest: { -#ifdef DEBUG - fprintf(stderr, "Blackbox::process_event(): MapRequest for 0x%lx\n", - e->xmaprequest.window); -#endif // DEBUG - - BlackboxWindow *win = searchWindow(e->xmaprequest.window); - - if (win) { - bool focus = False; - if (win->isIconic()) { - win->deiconify(); - focus = True; - } - if (win->isShaded()) { - win->shade(); - focus = True; - } - - if (focus && (win->isTransient() || win->getScreen()->doFocusNew()) && - win->isVisible()) - win->setInputFocus(); - } else { - BScreen *screen = searchScreen(e->xmaprequest.parent); - - if (! screen) { - /* - we got a map request for a window who's parent isn't root. this - can happen in only one circumstance: - - a client window unmapped a managed window, and then remapped it - somewhere between unmapping the client window and reparenting it - to root. - - regardless of how it happens, we need to find the screen that - the window is on - */ - XWindowAttributes wattrib; - if (! XGetWindowAttributes(otk::OBDisplay::display, e->xmaprequest.window, - &wattrib)) { - // failed to get the window attributes, perhaps the window has - // now been destroyed? - break; - } - - screen = searchScreen(wattrib.root); - assert(screen != 0); // this should never happen - } - - screen->manageWindow(e->xmaprequest.window); - } - - break; - } - - case UnmapNotify: { - 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); - } - - break; - } - - case DestroyNotify: { - 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); - } - - break; - } - - case ReparentNotify: { - /* - 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. - */ - BlackboxWindow *win = searchWindow(e->xreparent.window); - if (win) - win->reparentNotifyEvent(&e->xreparent); - break; - } - - case MotionNotify: { - // motion notify compression... - XEvent realevent; - unsigned int i = 0; - while (XCheckTypedWindowEvent(otk::OBDisplay::display, e->xmotion.window, - MotionNotify, &realevent)) { - i++; - } - - // if we have compressed some motion events, use the last one - if ( i > 0 ) - e = &realevent; - - // the pointer is on the wrong screen - if (! e->xmotion.same_screen) - break; - - // strip the lock key modifiers - //e->xmotion.state &= ~(NumLockMask | ScrollLockMask | LockMask); - - last_time = e->xmotion.time; - - BlackboxWindow *win = (BlackboxWindow *) 0; - - if ((win = searchWindow(e->xmotion.window))) - win->motionNotifyEvent(&e->xmotion); - - break; - } - - case PropertyNotify: { - last_time = e->xproperty.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); - break; - } - - case EnterNotify: { - last_time = e->xcrossing.time; - - BScreen *screen = (BScreen *) 0; - BlackboxWindow *win = (BlackboxWindow *) 0; - - if (e->xcrossing.mode == NotifyGrab) break; - - if ((e->xcrossing.window == e->xcrossing.root) && - (screen = searchScreen(e->xcrossing.window))) { - screen->getImageControl()->installRootColormap(); - } else if ((win = searchWindow(e->xcrossing.window))) { - if (! no_focus) - win->enterNotifyEvent(&e->xcrossing); - } - break; - } - - case LeaveNotify: { - last_time = e->xcrossing.time; - - BlackboxWindow *win = (BlackboxWindow *) 0; - - if ((win = searchWindow(e->xcrossing.window))) - win->leaveNotifyEvent(&e->xcrossing); - break; - } - - case Expose: { - // compress expose events - XEvent realevent; - unsigned int i = 0; - int ex1, ey1, ex2, ey2; - ex1 = e->xexpose.x; - ey1 = e->xexpose.y; - ex2 = ex1 + e->xexpose.width - 1; - ey2 = ey1 + e->xexpose.height - 1; - while (XCheckTypedWindowEvent(otk::OBDisplay::display, e->xexpose.window, - Expose, &realevent)) { - i++; - - // merge expose area - ex1 = std::min(realevent.xexpose.x, ex1); - ey1 = std::min(realevent.xexpose.y, ey1); - ex2 = std::max(realevent.xexpose.x + realevent.xexpose.width - 1, ex2); - ey2 = std::max(realevent.xexpose.y + realevent.xexpose.height - 1, ey2); - } - if ( i > 0 ) - e = &realevent; - - // use the merged area - e->xexpose.x = ex1; - e->xexpose.y = ey1; - e->xexpose.width = ex2 - ex1 + 1; - e->xexpose.height = ey2 - ey1 + 1; - - BlackboxWindow *win = (BlackboxWindow *) 0; - - if ((win = searchWindow(e->xexpose.window))) - win->exposeEvent(&e->xexpose); - - break; - } - - case KeyPress: { - break; - } - - case ColormapNotify: { - BScreen *screen = searchScreen(e->xcolormap.window); - - if (screen) - screen->setRootColormapInstalled((e->xcolormap.state == - ColormapInstalled) ? True : False); - - break; - } - - case FocusIn: { - if (e->xfocus.detail != NotifyNonlinear && - e->xfocus.detail != NotifyAncestor) { - /* - don't process FocusIns when: - 1. the new focus window isn't an ancestor or inferior of the old - focus window (NotifyNonlinear) - make sure to allow the FocusIn when the old focus window was an - ancestor but didn't have a parent, such as root (NotifyAncestor) - */ - break; - } - - BlackboxWindow *win = searchWindow(e->xfocus.window); - if (win) { - if (! win->isFocused()) - win->setFocusFlag(True); - - /* - set the event window to None. when the FocusOut event handler calls - this function recursively, it uses this as an indication that focus - has moved to a known window. - */ - e->xfocus.window = None; - - no_focus = False; // focusing is back on - } - - break; - } - - case FocusOut: { - if (e->xfocus.detail != NotifyNonlinear) { - /* - don't process FocusOuts when: - 2. the new focus window isn't an ancestor or inferior of the old - focus window (NotifyNonlinear) - */ - break; - } - - BlackboxWindow *win = searchWindow(e->xfocus.window); - if (win && win->isFocused()) { - /* - before we mark "win" as unfocused, we need to verify that focus is - going to a known location, is in a known location, or set focus - to a known location. - */ - - XEvent event; - // don't check the current focus if FocusOut was generated during a grab - bool check_focus = (e->xfocus.mode == NotifyNormal); - - /* - First, check if there is a pending FocusIn event waiting. if there - is, process it and determine if focus has moved to another window - (the FocusIn event handler sets the window in the event - structure to None to indicate this). - */ - if (XCheckTypedEvent(otk::OBDisplay::display, FocusIn, &event)) { - - process_event(&event); - if (event.xfocus.window == None) { - // focus has moved - check_focus = False; - } - } - - if (check_focus) { - /* - Second, we query the X server for the current input focus. - to make sure that we keep a consistent state. - */ - BlackboxWindow *focus; - Window w; - int revert; - XGetInputFocus(otk::OBDisplay::display, &w, &revert); - focus = searchWindow(w); - if (focus) { - /* - focus got from "win" to "focus" under some very strange - circumstances, and we need to make sure that the focus indication - is correct. - */ - setFocusedWindow(focus); - } else { - // we have no idea where focus went... so we set it to somewhere - setFocusedWindow(0); - } - } - } - - break; - } - - case ClientMessage: { - if (e->xclient.format == 32) { - if (e->xclient.message_type == xatom->atom(otk::OBProperty::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->atom(otk::OBProperty::blackbox_change_workspace) || - e->xclient.message_type == - xatom->atom(otk::OBProperty::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->atom(otk::OBProperty::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->atom(otk::OBProperty::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->atom(otk::OBProperty::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->atom(otk::OBProperty::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->atom(otk::OBProperty::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->atom(otk::OBProperty::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->atom(otk::OBProperty::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->atom(otk::OBProperty::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->atom(otk::OBProperty::net_wm_moveresize_move)) { - win->beginMove(x_root, y_root); - } else { - if ((Atom) e->xclient.data.l[2] == - xatom->atom(otk::OBProperty::net_wm_moveresize_size_topleft)) - win->beginResize(x_root, y_root, BlackboxWindow::TopLeft); - else if ((Atom) e->xclient.data.l[2] == - xatom->atom(otk::OBProperty::net_wm_moveresize_size_topright)) - win->beginResize(x_root, y_root, BlackboxWindow::TopRight); - else if ((Atom) e->xclient.data.l[2] == - xatom->atom(otk::OBProperty::net_wm_moveresize_size_bottomleft)) - win->beginResize(x_root, y_root, BlackboxWindow::BottomLeft); - else if ((Atom) e->xclient.data.l[2] == - xatom->atom(otk::OBProperty::net_wm_moveresize_size_bottomright)) - win->beginResize(x_root, y_root, BlackboxWindow::BottomRight); - } - } - } else if (e->xclient.message_type == - xatom->atom(otk::OBProperty::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->atom(otk::OBProperty::net_wm_state_modal)) { - win->setModal(True); - } else if (state[i] == - xatom->atom(otk::OBProperty::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->atom(otk::OBProperty::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->atom(otk::OBProperty::net_wm_state_shaded)) { - if (! win->isShaded()) - win->shade(); - } else if (state[i] == - xatom->atom(otk::OBProperty::net_wm_state_skip_taskbar)) { - win->setSkipTaskbar(True); - } else if (state[i] == - xatom->atom(otk::OBProperty::net_wm_state_skip_pager)) { - win->setSkipPager(True); - } else if (state[i] == - xatom->atom(otk::OBProperty::net_wm_state_fullscreen)) { - win->setFullscreen(True); - } - } else if (action == 0) { - // REMOVE - if (state[i] == xatom->atom(otk::OBProperty::net_wm_state_modal)) { - win->setModal(False); - } else if (state[i] == - xatom->atom(otk::OBProperty::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->atom(otk::OBProperty::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->atom(otk::OBProperty::net_wm_state_shaded)) { - if (win->isShaded()) - win->shade(); - } else if (state[i] == - xatom->atom(otk::OBProperty::net_wm_state_skip_taskbar)) { - win->setSkipTaskbar(False); - } else if (state[i] == - xatom->atom(otk::OBProperty::net_wm_state_skip_pager)) { - win->setSkipPager(False); - } else if (state[i] == - xatom->atom(otk::OBProperty::net_wm_state_fullscreen)) { - win->setFullscreen(False); - } - } else if (action == 2) { - // TOGGLE - if (state[i] == xatom->atom(otk::OBProperty::net_wm_state_modal)) { - win->setModal(! win->isModal()); - } else if (state[i] == - xatom->atom(otk::OBProperty::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->atom(otk::OBProperty::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->atom(otk::OBProperty::net_wm_state_shaded)) { - win->shade(); - } else if (state[i] == - xatom->atom(otk::OBProperty::net_wm_state_skip_taskbar)) { - win->setSkipTaskbar(! win->skipTaskbar()); - } else if (state[i] == - xatom->atom(otk::OBProperty::net_wm_state_skip_pager)) { - win->setSkipPager(! win->skipPager()); - } else if (state[i] == - xatom->atom(otk::OBProperty::net_wm_state_fullscreen)) { - win->setFullscreen(! win->isFullscreen()); - } - } - } - } - } - } - - break; - } - - case NoExpose: - case ConfigureNotify: - case MapNotify: - break; // not handled, just ignore - - default: { -#ifdef SHAPE - if (e->type == otk::OBDisplay::shapeEventBase()) { - XShapeEvent *shape_event = (XShapeEvent *) e; - BlackboxWindow *win = searchWindow(e->xany.window); - - if (win && shape_event->kind == ShapeBounding) - win->shapeEvent(shape_event); - } -#endif // SHAPE - } - } // switch -} - - -bool Blackbox::handleSignal(int sig) { - switch (sig) { - case SIGHUP: - reconfigure(); - break; - - case SIGUSR1: - restart(); - break; - - case SIGUSR2: - break; - - case SIGPIPE: - case SIGSEGV: - case SIGFPE: - case SIGINT: - case SIGTERM: - shutdown(); - - default: - return False; - } - - return True; -} - - -bool Blackbox::validateWindow(Window window) { - XEvent event; - if (XCheckTypedWindowEvent(otk::OBDisplay::display, window, DestroyNotify, &event)) { - XPutBackEvent(otk::OBDisplay::display, &event); - - return False; - } - - return True; -} - - -BScreen *Blackbox::searchScreen(Window window) { - ScreenList::iterator it = screenList.begin(); - - for (; it != screenList.end(); ++it) { - BScreen *s = *it; - if (s->getRootWindow() == window) - return s; - } - - return (BScreen *) 0; -} - - -BScreen *Blackbox::searchSystrayWindow(Window window) { - WindowScreenLookup::iterator it = systraySearchList.find(window); - if (it != systraySearchList.end()) - return it->second; - - return (BScreen*) 0; -} - - -BlackboxWindow *Blackbox::searchWindow(Window window) { - WindowLookup::iterator it = windowSearchList.find(window); - if (it != windowSearchList.end()) - return it->second; - - return (BlackboxWindow*) 0; -} - - -BWindowGroup *Blackbox::searchGroup(Window window) { - GroupLookup::iterator it = groupSearchList.find(window); - if (it != groupSearchList.end()) - return it->second; - - return (BWindowGroup *) 0; -} - - -void Blackbox::saveSystrayWindowSearch(Window window, BScreen *screen) { - systraySearchList.insert(WindowScreenLookupPair(window, screen)); -} - - -void Blackbox::saveWindowSearch(Window window, BlackboxWindow *data) { - windowSearchList.insert(WindowLookupPair(window, data)); -} - - -void Blackbox::saveGroupSearch(Window window, BWindowGroup *data) { - groupSearchList.insert(GroupLookupPair(window, data)); -} - - -void Blackbox::removeSystrayWindowSearch(Window window) { - systraySearchList.erase(window); -} - - -void Blackbox::removeWindowSearch(Window window) { - windowSearchList.erase(window); -} - - -void Blackbox::removeGroupSearch(Window window) { - groupSearchList.erase(window); -} - - -void Blackbox::restart(const char *prog) { - shutdown(); - - if (prog) { - putenv(const_cast<char *>(screenList.front()->displayString().c_str())); - execlp(prog, prog, NULL); - perror(prog); - } - - // fall back in case the above execlp doesn't work - execvp(argv[0], argv); - string name = ::basename(argv[0]); - execvp(name.c_str(), argv); -} - - -void Blackbox::shutdown(void) { - Openbox::shutdown(); - - XSetInputFocus(otk::OBDisplay::display, PointerRoot, None, CurrentTime); - - std::for_each(screenList.begin(), screenList.end(), - std::mem_fun(&BScreen::shutdown)); - - XSync(otk::OBDisplay::display, False); -} - - -#ifdef XINERAMA -void Blackbox::saveXineramaPlacement(bool x) { - resource.xinerama_placement = x; - config.setValue("session.xineramaSupport.windowPlacement", - resource.xinerama_placement); - reconfigure(); // make sure all screens get this - -void Blackbox::saveXineramaMaximizing(bool x) { - resource.xinerama_maximize = x; - config.setValue("session.xineramaSupport.windowMaximizing", - resource.xinerama_maximize); - reconfigure(); // make sure all screens get this change -} - - -void Blackbox::saveXineramaSnapping(bool x) { - resource.xinerama_snap = x; - config.setValue("session.xineramaSupport.windowSnapping", - resource.xinerama_snap); - reconfigure(); // make sure all screens get this change -} -#endif // XINERAMA - - -/* - * Save all values as they are so that the defaults will be written to the rc - * file - */ -void Blackbox::save_rc(void) { - config.setAutoSave(false); - - config.setValue("session.colorsPerChannel", resource.colors_per_channel); - config.setValue("session.doubleClickInterval", - resource.double_click_interval); - config.setValue("session.autoRaiseDelay", - ((resource.auto_raise_delay.tv_sec * 1000) + - (resource.auto_raise_delay.tv_usec / 1000))); - config.setValue("session.cacheLife", resource.cache_life / 60000); - config.setValue("session.cacheMax", resource.cache_max); - config.setValue("session.styleFile", resource.style_file); - config.setValue("session.titlebarLayout", resource.titlebar_layout); - - string s; - if (resource.mod_mask & Mod1Mask) s += "Mod1-"; - if (resource.mod_mask & Mod2Mask) s += "Mod2-"; - if (resource.mod_mask & Mod3Mask) s += "Mod3-"; - if (resource.mod_mask & Mod4Mask) s += "Mod4-"; - if (resource.mod_mask & Mod5Mask) s += "Mod5-"; - if (resource.mod_mask & ShiftMask) s += "Shift-"; - if (resource.mod_mask & ControlMask) s += "Control-"; - s.resize(s.size() - 1); // drop the last '-' - config.setValue("session.modifierMask", s); - -#ifdef XINERAMA - saveXineramaPlacement(resource.xinerama_placement); - saveXineramaMaximizing(resource.xinerama_maximize); - saveXineramaSnapping(resource.xinerama_snap); -#endif // XINERAMA - - std::for_each(screenList.begin(), screenList.end(), - std::mem_fun(&BScreen::save_rc)); - - config.setAutoSave(true); - config.save(); -} - - -void Blackbox::load_rc(void) { - if (! config.load()) - config.create(); - - string s; - - if (! config.getValue("session.colorsPerChannel", - resource.colors_per_channel)) - resource.colors_per_channel = 4; - if (resource.colors_per_channel < 2) resource.colors_per_channel = 2; - else if (resource.colors_per_channel > 6) resource.colors_per_channel = 6; - - if (config.getValue("session.styleFile", s)) - resource.style_file = otk::expandTilde(s); - else - resource.style_file = DEFAULTSTYLE; - - if (! config.getValue("session.doubleClickInterval", - resource.double_click_interval)); - resource.double_click_interval = 250; - - if (! config.getValue("session.autoRaiseDelay", - resource.auto_raise_delay.tv_usec)) - resource.auto_raise_delay.tv_usec = 400; - resource.auto_raise_delay.tv_sec = resource.auto_raise_delay.tv_usec / 1000; - resource.auto_raise_delay.tv_usec -= - (resource.auto_raise_delay.tv_sec * 1000); - resource.auto_raise_delay.tv_usec *= 1000; - - if (! config.getValue("session.cacheLife", resource.cache_life)) - resource.cache_life = 5; - resource.cache_life *= 60000; - - if (! config.getValue("session.cacheMax", resource.cache_max)) - resource.cache_max = 200; - - if (! config.getValue("session.titlebarLayout", resource.titlebar_layout)) - resource.titlebar_layout = "ILMC"; - -#ifdef XINERAMA - if (! config.getValue("session.xineramaSupport.windowPlacement", - resource.xinerama_placement)) - resource.xinerama_placement = false; - - if (! config.getValue("session.xineramaSupport.windowMaximizing", - resource.xinerama_maximize)) - resource.xinerama_maximize = false; - - if (! config.getValue("session.xineramaSupport.windowSnapping", - resource.xinerama_snap)) - resource.xinerama_snap = false; -#endif // XINERAMA - - resource.mod_mask = 0; - if (config.getValue("session.modifierMask", s)) { - if (s.find("Mod1") != string::npos) - resource.mod_mask |= Mod1Mask; - if (s.find("Mod2") != string::npos) - resource.mod_mask |= Mod2Mask; - if (s.find("Mod3") != string::npos) - resource.mod_mask |= Mod3Mask; - if (s.find("Mod4") != string::npos) - resource.mod_mask |= Mod4Mask; - if (s.find("Mod5") != string::npos) - resource.mod_mask |= Mod5Mask; - if (s.find("Shift") != string::npos) - resource.mod_mask |= ShiftMask; - if (s.find("Control") != string::npos) - resource.mod_mask |= ControlMask; - } - if (! resource.mod_mask) - resource.mod_mask = Mod1Mask; -} - - -void Blackbox::reconfigure(void) { - // don't reconfigure while saving the initial rc file, it's a waste and it - // breaks somethings (workspace names) - if (state() == Openbox::State_Starting) return; - - reconfigure_wait = True; - - if (! timer->timing()) timer->start(); -} - - -void Blackbox::real_reconfigure(void) { - load_rc(); - - otk::OBDisplay::gcCache()->purge(); - - std::for_each(screenList.begin(), screenList.end(), - std::mem_fun(&BScreen::reconfigure)); -} - - -void Blackbox::saveStyleFilename(const string& filename) { - assert(! filename.empty()); - resource.style_file = filename; - config.setValue("session.styleFile", resource.style_file); -} - - -void Blackbox::timeout(Blackbox *t) { - if (t->reconfigure_wait) - t->real_reconfigure(); - - t->reconfigure_wait = False; -} - - -void Blackbox::setChangingWindow(BlackboxWindow *win) { - // make sure one of the two is null and the other isn't - assert((! changing_window && win) || (! win && changing_window)); - changing_window = win; -} - - -void Blackbox::setFocusedWindow(BlackboxWindow *win) { - if (focused_window && focused_window == win) // nothing to do - return; - - BScreen *old_screen = 0; - - if (focused_window) { - focused_window->setFocusFlag(False); - old_screen = focused_window->getScreen(); - } - - if (win && ! win->isIconic()) { - // the active screen is the one with the last focused window... - // this will keep focus on this screen no matter where the mouse goes, - // so multihead keybindings will continue to work on that screen until the - // user focuses a window on a different screen. - active_screen = win->getScreen(); - focused_window = win; - } else { - focused_window = 0; - if (! old_screen) { - if (active_screen) { - // set input focus to the toolbar of the screen with mouse - XSetInputFocus(otk::OBDisplay::display, - active_screen->getRootWindow(), - RevertToPointerRoot, CurrentTime); - } else { - // set input focus to the toolbar of the first managed screen - XSetInputFocus(otk::OBDisplay::display, - screenList.front()->getRootWindow(), - RevertToPointerRoot, CurrentTime); - } - } else { - // set input focus to the toolbar of the last screen - XSetInputFocus(otk::OBDisplay::display, old_screen->getRootWindow(), - RevertToPointerRoot, CurrentTime); - } - } - - if (active_screen && active_screen->isScreenManaged()) { - active_screen->updateNetizenWindowFocus(); - } - - if (old_screen && old_screen != active_screen) { - old_screen->updateNetizenWindowFocus(); - } -} - - -}
D src/blackbox.hh

@@ -1,224 +0,0 @@

-// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- -#ifndef __blackbox_hh -#define __blackbox_hh - -extern "C" { -#include <X11/Xlib.h> - -#ifdef HAVE_STDIO_H -# include <stdio.h> -#endif // HAVE_STDIO_H - -#ifdef TIME_WITH_SYS_TIME -# include <sys/time.h> -# include <time.h> -#else // !TIME_WITH_SYS_TIME -# ifdef HAVE_SYS_TIME_H -# include <sys/time.h> -# else // !HAVE_SYS_TIME_H -# include <time.h> -# endif // HAVE_SYS_TIME_H -#endif // TIME_WITH_SYS_TIME -} - -#include <list> -#include <map> -#include <string> - -#include "otk/timer.hh" -#include "otk/property.hh" -#include "openbox.hh" -#include "otk/configuration.hh" -#include "timer.hh" - -#define AttribShaded (1l << 0) -#define AttribMaxHoriz (1l << 1) -#define AttribMaxVert (1l << 2) -#define AttribOmnipresent (1l << 3) -#define AttribWorkspace (1l << 4) -#define AttribStack (1l << 5) -#define AttribDecoration (1l << 6) - -#define StackTop (0) -#define StackNormal (1) -#define StackBottom (2) - -#define DecorNone (0) -#define DecorNormal (1) -#define DecorTiny (2) -#define DecorTool (3) - -namespace ob { - -struct BlackboxHints { - unsigned long flags, attrib, workspace, stack, decoration; -}; - -struct BlackboxAttributes { - unsigned long flags, attrib, workspace, stack, decoration; - int premax_x, premax_y; - unsigned int premax_w, premax_h; -}; - -#define PropBlackboxHintsElements (5) -#define PropBlackboxAttributesElements (9) - - -//forward declaration -class BScreen; -class Blackbox; -class BlackboxWindow; -class BWindowGroup; - -class Blackbox : public Openbox { -private: - struct BCursor { - Cursor session, move, ll_angle, lr_angle, ul_angle, ur_angle; - }; - BCursor cursor; - - struct BResource { - Time double_click_interval; - - std::string style_file; - int colors_per_channel; - timeval auto_raise_delay; - unsigned long cache_life, cache_max; - std::string titlebar_layout; - unsigned int mod_mask; // modifier mask used for window-mouse interaction - - -#ifdef XINERAMA - bool xinerama_placement, xinerama_maximize, xinerama_snap; -#endif // XINERAMA - } resource; - - typedef std::map<Window, BlackboxWindow*> WindowLookup; - typedef WindowLookup::value_type WindowLookupPair; - WindowLookup windowSearchList; - - typedef std::map<Window, BScreen*> WindowScreenLookup; - typedef WindowScreenLookup::value_type WindowScreenLookupPair; - WindowScreenLookup systraySearchList; - - typedef std::map<Window, BWindowGroup*> GroupLookup; - typedef GroupLookup::value_type GroupLookupPair; - GroupLookup groupSearchList; - - typedef std::list<BScreen*> ScreenList; - ScreenList screenList; - - BScreen *active_screen; - BlackboxWindow *focused_window, *changing_window; - otk::OBTimer *timer; - otk::Configuration config; - otk::OBProperty *xatom; - - bool no_focus, reconfigure_wait; - Time last_time; - char **argv; - std::string rc_file; - - Blackbox(const Blackbox&); - Blackbox& operator=(const Blackbox&); - - void load_rc(void); - void save_rc(void); - void real_reconfigure(void); - - virtual void process_event(XEvent *); - - -public: - Blackbox(int argc, char **m_argv, char *rc = 0); - virtual ~Blackbox(void); - - BWindowGroup *searchGroup(Window window); - BScreen *searchSystrayWindow(Window window); - BlackboxWindow *searchWindow(Window window); - BScreen *searchScreen(Window window); - -#ifdef XINERAMA - inline bool doXineramaPlacement(void) const - { return resource.xinerama_placement; } - inline bool doXineramaMaximizing(void) const - { return resource.xinerama_maximize; } - inline bool doXineramaSnapping(void) const - { return resource.xinerama_snap; } - - void saveXineramaPlacement(bool x); - void saveXineramaMaximizing(bool x); - void saveXineramaSnapping(bool x); -#endif // XINERAMA - - void saveSystrayWindowSearch(Window window, BScreen *screen); - void saveWindowSearch(Window window, BlackboxWindow *data); - void saveGroupSearch(Window window, BWindowGroup *data); - void removeSystrayWindowSearch(Window window); - void removeWindowSearch(Window window); - void removeGroupSearch(Window window); - - inline otk::OBProperty *getXAtom(void) { return xatom; } - - inline BlackboxWindow *getFocusedWindow(void) { return focused_window; } - inline BlackboxWindow *getChangingWindow(void) { return changing_window; } - - inline otk::Configuration *getConfig() { return &config; } - inline const Time &getDoubleClickInterval(void) const - { return resource.double_click_interval; } - inline const Time &getLastTime(void) const { return last_time; } - - inline const char *getStyleFilename(void) const - { return resource.style_file.c_str(); } - - inline int getColorsPerChannel(void) const - { return resource.colors_per_channel; } - - inline std::string getTitlebarLayout(void) const - { return resource.titlebar_layout; } - - inline const timeval &getAutoRaiseDelay(void) const - { return resource.auto_raise_delay; } - - inline unsigned long getCacheLife(void) const - { return resource.cache_life; } - inline unsigned long getCacheMax(void) const - { return resource.cache_max; } - - inline void setNoFocus(bool f) { no_focus = f; } - - inline Cursor getSessionCursor(void) const - { return cursor.session; } - inline Cursor getMoveCursor(void) const - { return cursor.move; } - inline Cursor getLowerLeftAngleCursor(void) const - { return cursor.ll_angle; } - inline Cursor getLowerRightAngleCursor(void) const - { return cursor.lr_angle; } - inline Cursor getUpperLeftAngleCursor(void) const - { return cursor.ul_angle; } - inline Cursor getUpperRightAngleCursor(void) const - { return cursor.ur_angle; } - - inline unsigned int getMouseModMask(void) const - { return resource.mod_mask; } - - void setFocusedWindow(BlackboxWindow *win); - void setChangingWindow(BlackboxWindow *win); - void shutdown(void); - void saveStyleFilename(const std::string& filename); - void restart(const char *prog = 0); - void reconfigure(void); - - bool validateWindow(Window window); - - virtual bool handleSignal(int sig); - - static void timeout(Blackbox *t); - - enum { B_AmericanDate = 1, B_EuropeanDate }; -}; - -} - -#endif // __blackbox_hh