X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fblackbox.cc;h=ce0e550cef1920cf6661e662409b034b42629de0;hb=410a8264586671256f4a2d1b3095fa6ecffc01bd;hp=63a5055b8d8b143d41aa4565bec43db9afdc7dc7;hpb=0305cbdc3ae8525c74b2bb9b23884035549e3407;p=chaz%2Fopenbox diff --git a/src/blackbox.cc b/src/blackbox.cc index 63a5055b..ce0e550c 100644 --- a/src/blackbox.cc +++ b/src/blackbox.cc @@ -1,25 +1,4 @@ // -*- 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 -// 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" @@ -90,83 +69,66 @@ extern "C" { #endif // HAVE_LIBGEN_H } +#include + #include #include 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" - - -// X event scanner for enter/leave notifies - adapted from twm -struct scanargs { - Window w; - bool leave, inferior, enter; -}; - -static Bool queueScanner(Display *, XEvent *e, char *args) { - scanargs *scan = (scanargs *) args; - if ((e->type == LeaveNotify) && - (e->xcrossing.window == scan->w) && - (e->xcrossing.mode == NotifyNormal)) { - scan->leave = True; - scan->inferior = (e->xcrossing.detail == NotifyInferior); - } else if ((e->type == EnterNotify) && (e->xcrossing.mode == NotifyUngrab)) { - scan->enter = True; - } +#include "otk/gccache.hh" +#include "otk/image.hh" +#include "otk/assassin.hh" +#include "screen.hh" +#include "otk/util.hh" +#include "bbwindow.hh" +#include "workspace.hh" - return False; -} +namespace ob { Blackbox *blackbox; -Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu) - : BaseDisplay(m_argv[0], dpy_name) { +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"); - ::blackbox = this; + ob::blackbox = this; argv = m_argv; - if (! rc) rc = "~/.openbox/rc"; - rc_file = expandTilde(rc); + + // 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); - if (! menu) menu = "~/.openbox/menu"; - menu_file = expandTilde(menu); no_focus = False; resource.auto_raise_delay.tv_sec = resource.auto_raise_delay.tv_usec = 0; active_screen = 0; - focused_window = (BlackboxWindow *) 0; + focused_window = changing_window = (BlackboxWindow *) 0; - XrmInitialize(); load_rc(); - init_icccm(); + xatom = new otk::OBProperty(); - cursor.session = XCreateFontCursor(getXDisplay(), XC_left_ptr); - cursor.move = XCreateFontCursor(getXDisplay(), XC_fleur); - cursor.ll_angle = XCreateFontCursor(getXDisplay(), XC_ll_angle); - cursor.lr_angle = XCreateFontCursor(getXDisplay(), XC_lr_angle); + 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 (unsigned int i = 0; i < getNumberOfScreens(); i++) { + for (int i = 0; i < ScreenCount(otk::OBDisplay::display); i++) { BScreen *screen = new BScreen(this, i); if (! screen->isScreenManaged()) { @@ -179,8 +141,7 @@ Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu) 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); } @@ -191,21 +152,22 @@ Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu) active_screen = screenList.front(); setFocusedWindow(0); - XSynchronize(getXDisplay(), False); - XSync(getXDisplay(), False); + XSynchronize(otk::OBDisplay::display, False); + XSync(otk::OBDisplay::display, False); - reconfigure_wait = reread_menu_wait = False; + reconfigure_wait = False; - timer = new BTimer(this, this); + timer = new otk::OBTimer(Openbox::instance->timerManager(), + (otk::OBTimeoutHandler)timeout, + this); timer->setTimeout(0l); } Blackbox::~Blackbox(void) { - std::for_each(screenList.begin(), screenList.end(), PointerAssassin()); + std::for_each(screenList.begin(), screenList.end(), otk::PointerAssassin()); - std::for_each(menuTimestamps.begin(), menuTimestamps.end(), - PointerAssassin()); + delete xatom; delete timer; } @@ -215,14 +177,11 @@ void Blackbox::process_event(XEvent *e) { switch (e->type) { case ButtonPress: { // strip the lock key modifiers - e->xbutton.state &= ~(NumLockMask | ScrollLockMask | LockMask); + //e->xbutton.state &= ~(NumLockMask | ScrollLockMask | LockMask); 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))) { @@ -231,12 +190,6 @@ void Blackbox::process_event(XEvent *e) { /* 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) { @@ -252,42 +205,23 @@ void Blackbox::process_event(XEvent *e) { case ButtonRelease: { // strip the lock key modifiers - e->xbutton.state &= ~(NumLockMask | ScrollLockMask | LockMask); + //e->xbutton.state &= ~(NumLockMask | ScrollLockMask | LockMask); 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: { - // compress configure requests... - XEvent realevent; - unsigned int i = 0; - while(XCheckTypedWindowEvent(getXDisplay(), e->xconfigurerequest.window, - ConfigureRequest, &realevent)) { - i++; - } - if ( i > 0 ) - e = &realevent; - 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; @@ -300,7 +234,7 @@ void Blackbox::process_event(XEvent *e) { xwc.sibling = e->xconfigurerequest.above; xwc.stack_mode = e->xconfigurerequest.detail; - XConfigureWindow(getXDisplay(), e->xconfigurerequest.window, + XConfigureWindow(otk::OBDisplay::display, e->xconfigurerequest.window, e->xconfigurerequest.value_mask, &xwc); } } @@ -316,7 +250,21 @@ void Blackbox::process_event(XEvent *e) { BlackboxWindow *win = searchWindow(e->xmaprequest.window); - if (! win) { + 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) { @@ -332,7 +280,7 @@ void Blackbox::process_event(XEvent *e) { the window is on */ XWindowAttributes wattrib; - if (! XGetWindowAttributes(getXDisplay(), e->xmaprequest.window, + if (! XGetWindowAttributes(otk::OBDisplay::display, e->xmaprequest.window, &wattrib)) { // failed to get the window attributes, perhaps the window has // now been destroyed? @@ -351,12 +299,12 @@ void Blackbox::process_event(XEvent *e) { 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); } break; @@ -364,15 +312,15 @@ void Blackbox::process_event(XEvent *e) { 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))) { + screen->removeSystrayWindow(e->xunmap.window); } break; @@ -386,13 +334,8 @@ void Blackbox::process_event(XEvent *e) { 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; } @@ -400,7 +343,7 @@ void Blackbox::process_event(XEvent *e) { // motion notify compression... XEvent realevent; unsigned int i = 0; - while (XCheckTypedWindowEvent(getXDisplay(), e->xmotion.window, + while (XCheckTypedWindowEvent(otk::OBDisplay::display, e->xmotion.window, MotionNotify, &realevent)) { i++; } @@ -409,18 +352,19 @@ void Blackbox::process_event(XEvent *e) { if ( i > 0 ) e = &realevent; + // the pointer is on the wrong screen + if (! e->xmotion.same_screen) + break; + // strip the lock key modifiers - e->xbutton.state &= ~(NumLockMask | ScrollLockMask | LockMask); + //e->xmotion.state &= ~(NumLockMask | ScrollLockMask | LockMask); 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; } @@ -428,13 +372,13 @@ void Blackbox::process_event(XEvent *e) { case PropertyNotify: { last_time = e->xproperty.time; - if (e->xproperty.state != PropertyDelete) { - BlackboxWindow *win = searchWindow(e->xproperty.window); - - if (win) - win->propertyNotifyEvent(e->xproperty.atom); - } + 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; } @@ -443,35 +387,15 @@ void Blackbox::process_event(XEvent *e) { 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; - XEvent dummy; - scanargs sa; - sa.w = e->xcrossing.window; - sa.enter = sa.leave = False; - XCheckIfEvent(getXDisplay(), &dummy, queueScanner, (char *) &sa); - if ((e->xcrossing.window == e->xcrossing.root) && (screen = searchScreen(e->xcrossing.window))) { screen->getImageControl()->installRootColormap(); } else if ((win = searchWindow(e->xcrossing.window))) { - if (win->getScreen()->isSloppyFocus() && - (! win->isFocused()) && (! no_focus)) { - if (((! sa.leave) || sa.inferior) && win->isVisible()) { - if (win->setInputFocus()) - win->installColormap(True); // XXX: shouldnt we honour no install? - } - } - } 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); + if (! no_focus) + win->enterNotifyEvent(&e->xcrossing); } break; } @@ -480,18 +404,9 @@ void Blackbox::process_event(XEvent *e) { 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))) - win->installColormap(False); - else if ((tbar = searchToolbar(e->xcrossing.window))) - tbar->leaveNotifyEvent(&e->xcrossing); - else if ((slit = searchSlit(e->xcrossing.window))) - slit->leaveNotifyEvent(&e->xcrossing); + + if ((win = searchWindow(e->xcrossing.window))) + win->leaveNotifyEvent(&e->xcrossing); break; } @@ -504,7 +419,7 @@ void Blackbox::process_event(XEvent *e) { ey1 = e->xexpose.y; ex2 = ex1 + e->xexpose.width - 1; ey2 = ey1 + e->xexpose.height - 1; - while (XCheckTypedWindowEvent(getXDisplay(), e->xexpose.window, + while (XCheckTypedWindowEvent(otk::OBDisplay::display, e->xexpose.window, Expose, &realevent)) { i++; @@ -524,25 +439,14 @@ void Blackbox::process_event(XEvent *e) { 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; } @@ -557,11 +461,14 @@ void Blackbox::process_event(XEvent *e) { } case FocusIn: { - if (e->xfocus.detail != NotifyNonlinear) { + 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; } @@ -577,6 +484,8 @@ void Blackbox::process_event(XEvent *e) { has moved to a known window. */ e->xfocus.window = None; + + no_focus = False; // focusing is back on } break; @@ -610,7 +519,7 @@ void Blackbox::process_event(XEvent *e) { (the FocusIn event handler sets the window in the event structure to None to indicate this). */ - if (XCheckTypedEvent(getXDisplay(), FocusIn, &event)) { + if (XCheckTypedEvent(otk::OBDisplay::display, FocusIn, &event)) { process_event(&event); if (event.xfocus.window == None) { @@ -627,7 +536,7 @@ void Blackbox::process_event(XEvent *e) { BlackboxWindow *focus; Window w; int revert; - XGetInputFocus(getXDisplay(), &w, &revert); + XGetInputFocus(otk::OBDisplay::display, &w, &revert); focus = searchWindow(w); if (focus) { /* @@ -648,7 +557,8 @@ void Blackbox::process_event(XEvent *e) { case ClientMessage: { if (e->xclient.format == 32) { - if (e->xclient.message_type == getWMChangeStateAtom()) { + 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; @@ -656,19 +566,47 @@ void Blackbox::process_event(XEvent *e) { win->iconify(); if (e->xclient.data.l[0] == NormalState) win->deiconify(); - } else if(e->xclient.message_type == getBlackboxChangeWorkspaceAtom()) { + } 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); - if (screen && e->xclient.data.l[0] >= 0 && - e->xclient.data.l[0] < - static_cast(screen->getWorkspaceCount())) - screen->changeWorkspaceID(e->xclient.data.l[0]); - } else if (e->xclient.message_type == getBlackboxChangeWindowFocusAtom()) { + 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 == getBlackboxCycleWindowFocusAtom()) { + } 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) { @@ -677,7 +615,32 @@ void Blackbox::process_event(XEvent *e) { else screen->nextFocus(); } - } else if (e->xclient.message_type == getBlackboxChangeAttributesAtom()) { + } 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()) { @@ -690,6 +653,171 @@ void Blackbox::process_event(XEvent *e) { 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()); + } + } + } + } } } @@ -703,11 +831,11 @@ void Blackbox::process_event(XEvent *e) { default: { #ifdef SHAPE - if (e->type == getShapeEventBase()) { + if (e->type == otk::OBDisplay::shapeEventBase()) { XShapeEvent *shape_event = (XShapeEvent *) e; BlackboxWindow *win = searchWindow(e->xany.window); - if (win) + if (win && shape_event->kind == ShapeBounding) win->shapeEvent(shape_event); } #endif // SHAPE @@ -719,12 +847,14 @@ void Blackbox::process_event(XEvent *e) { bool Blackbox::handleSignal(int sig) { switch (sig) { case SIGHUP: - case SIGUSR1: reconfigure(); break; + case SIGUSR1: + restart(); + break; + case SIGUSR2: - rereadMenu(); break; case SIGPIPE: @@ -742,93 +872,10 @@ bool Blackbox::handleSignal(int sig) { } -void Blackbox::init_icccm(void) { - xa_wm_colormap_windows = - XInternAtom(getXDisplay(), "WM_COLORMAP_WINDOWS", False); - xa_wm_protocols = XInternAtom(getXDisplay(), "WM_PROTOCOLS", False); - xa_wm_state = XInternAtom(getXDisplay(), "WM_STATE", False); - xa_wm_change_state = XInternAtom(getXDisplay(), "WM_CHANGE_STATE", False); - xa_wm_delete_window = XInternAtom(getXDisplay(), "WM_DELETE_WINDOW", False); - xa_wm_take_focus = XInternAtom(getXDisplay(), "WM_TAKE_FOCUS", False); - motif_wm_hints = XInternAtom(getXDisplay(), "_MOTIF_WM_HINTS", False); - - blackbox_hints = XInternAtom(getXDisplay(), "_BLACKBOX_HINTS", False); - blackbox_attributes = - XInternAtom(getXDisplay(), "_BLACKBOX_ATTRIBUTES", False); - blackbox_change_attributes = - XInternAtom(getXDisplay(), "_BLACKBOX_CHANGE_ATTRIBUTES", False); - blackbox_structure_messages = - XInternAtom(getXDisplay(), "_BLACKBOX_STRUCTURE_MESSAGES", False); - blackbox_notify_startup = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_STARTUP", False); - blackbox_notify_window_add = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WINDOW_ADD", False); - blackbox_notify_window_del = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WINDOW_DEL", False); - blackbox_notify_current_workspace = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_CURRENT_WORKSPACE", False); - blackbox_notify_workspace_count = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WORKSPACE_COUNT", False); - blackbox_notify_window_focus = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WINDOW_FOCUS", False); - blackbox_notify_window_raise = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WINDOW_RAISE", False); - blackbox_notify_window_lower = - XInternAtom(getXDisplay(), "_BLACKBOX_NOTIFY_WINDOW_LOWER", False); - blackbox_change_workspace = - XInternAtom(getXDisplay(), "_BLACKBOX_CHANGE_WORKSPACE", False); - blackbox_change_window_focus = - XInternAtom(getXDisplay(), "_BLACKBOX_CHANGE_WINDOW_FOCUS", False); - blackbox_cycle_window_focus = - XInternAtom(getXDisplay(), "_BLACKBOX_CYCLE_WINDOW_FOCUS", False); - -#ifdef NEWWMSPEC - net_supported = XInternAtom(getXDisplay(), "_NET_SUPPORTED", False); - net_client_list = XInternAtom(getXDisplay(), "_NET_CLIENT_LIST", False); - net_client_list_stacking = - XInternAtom(getXDisplay(), "_NET_CLIENT_LIST_STACKING", False); - net_number_of_desktops = - XInternAtom(getXDisplay(), "_NET_NUMBER_OF_DESKTOPS", False); - net_desktop_geometry = - XInternAtom(getXDisplay(), "_NET_DESKTOP_GEOMETRY", False); - net_desktop_viewport = - XInternAtom(getXDisplay(), "_NET_DESKTOP_VIEWPORT", False); - net_current_desktop = - XInternAtom(getXDisplay(), "_NET_CURRENT_DESKTOP", False); - net_desktop_names = XInternAtom(getXDisplay(), "_NET_DESKTOP_NAMES", False); - net_active_window = XInternAtom(getXDisplay(), "_NET_ACTIVE_WINDOW", False); - net_workarea = XInternAtom(getXDisplay(), "_NET_WORKAREA", False); - net_supporting_wm_check = - XInternAtom(getXDisplay(), "_NET_SUPPORTING_WM_CHECK", False); - net_virtual_roots = XInternAtom(getXDisplay(), "_NET_VIRTUAL_ROOTS", False); - net_close_window = XInternAtom(getXDisplay(), "_NET_CLOSE_WINDOW", False); - net_wm_moveresize = XInternAtom(getXDisplay(), "_NET_WM_MOVERESIZE", False); - net_properties = XInternAtom(getXDisplay(), "_NET_PROPERTIES", False); - net_wm_name = XInternAtom(getXDisplay(), "_NET_WM_NAME", False); - net_wm_desktop = XInternAtom(getXDisplay(), "_NET_WM_DESKTOP", False); - net_wm_window_type = - XInternAtom(getXDisplay(), "_NET_WM_WINDOW_TYPE", False); - net_wm_state = XInternAtom(getXDisplay(), "_NET_WM_STATE", False); - net_wm_strut = XInternAtom(getXDisplay(), "_NET_WM_STRUT", False); - net_wm_icon_geometry = - XInternAtom(getXDisplay(), "_NET_WM_ICON_GEOMETRY", False); - net_wm_icon = XInternAtom(getXDisplay(), "_NET_WM_ICON", False); - net_wm_pid = XInternAtom(getXDisplay(), "_NET_WM_PID", False); - net_wm_handled_icons = - XInternAtom(getXDisplay(), "_NET_WM_HANDLED_ICONS", False); - net_wm_ping = XInternAtom(getXDisplay(), "_NET_WM_PING", False); -#endif // NEWWMSPEC - -#ifdef HAVE_GETPID - blackbox_pid = XInternAtom(getXDisplay(), "_BLACKBOX_PID", False); -#endif // HAVE_GETPID -} - - bool Blackbox::validateWindow(Window window) { XEvent event; - if (XCheckTypedWindowEvent(getXDisplay(), window, DestroyNotify, &event)) { - XPutBackEvent(getXDisplay(), &event); + if (XCheckTypedWindowEvent(otk::OBDisplay::display, window, DestroyNotify, &event)) { + XPutBackEvent(otk::OBDisplay::display, &event); return False; } @@ -850,6 +897,15 @@ BScreen *Blackbox::searchScreen(Window window) { } +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()) @@ -868,30 +924,8 @@ BWindowGroup *Blackbox::searchGroup(Window window) { } -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)); } @@ -905,18 +939,8 @@ void Blackbox::saveGroupSearch(Window window, BWindowGroup *data) { } -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); } @@ -930,48 +954,58 @@ void Blackbox::removeGroupSearch(Window 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(); if (prog) { + putenv(const_cast(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]); + string name = ::basename(argv[0]); execvp(name.c_str(), argv); } void Blackbox::shutdown(void) { - BaseDisplay::shutdown(); + Openbox::shutdown(); - XSetInputFocus(getXDisplay(), PointerRoot, None, CurrentTime); + XSetInputFocus(otk::OBDisplay::display, PointerRoot, None, CurrentTime); std::for_each(screenList.begin(), screenList.end(), std::mem_fun(&BScreen::shutdown)); - XSync(getXDisplay(), False); + 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 @@ -988,7 +1022,25 @@ void Blackbox::save_rc(void) { 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)); @@ -999,7 +1051,7 @@ void Blackbox::save_rc(void) { void Blackbox::load_rc(void) { if (! config.load()) - config.create(); + config.create(); string s; @@ -1010,7 +1062,7 @@ void Blackbox::load_rc(void) { else if (resource.colors_per_channel > 6) resource.colors_per_channel = 6; if (config.getValue("session.styleFile", s)) - resource.style_file = expandTilde(s); + resource.style_file = otk::expandTilde(s); else resource.style_file = DEFAULTSTYLE; @@ -1032,66 +1084,67 @@ void Blackbox::load_rc(void) { 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->isTiming()) timer->start(); + if (! timer->timing()) timer->start(); } void Blackbox::real_reconfigure(void) { load_rc(); - std::for_each(menuTimestamps.begin(), menuTimestamps.end(), - PointerAssassin()); - menuTimestamps.clear(); - - gcCache()->purge(); + otk::OBDisplay::gcCache()->purge(); std::for_each(screenList.begin(), screenList.end(), std::mem_fun(&BScreen::reconfigure)); } -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; @@ -1099,37 +1152,18 @@ void Blackbox::saveStyleFilename(const string& 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; +void Blackbox::timeout(Blackbox *t) { + if (t->reconfigure_wait) + t->real_reconfigure(); - menuTimestamps.push_back(ts); - } - } + t->reconfigure_wait = False; } -void Blackbox::timeout(void) { - if (reconfigure_wait) - real_reconfigure(); - - if (reread_menu_wait) - real_rereadMenu(); - - reconfigure_wait = reread_menu_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; } @@ -1156,29 +1190,30 @@ void Blackbox::setFocusedWindow(BlackboxWindow *win) { if (! old_screen) { if (active_screen) { // set input focus to the toolbar of the screen with mouse - XSetInputFocus(getXDisplay(), - active_screen->getToolbar()->getWindowID(), + XSetInputFocus(otk::OBDisplay::display, + active_screen->getRootWindow(), RevertToPointerRoot, CurrentTime); } else { // set input focus to the toolbar of the first managed screen - XSetInputFocus(getXDisplay(), - screenList.front()->getToolbar()->getWindowID(), + XSetInputFocus(otk::OBDisplay::display, + screenList.front()->getRootWindow(), RevertToPointerRoot, CurrentTime); } } else { // set input focus to the toolbar of the last screen - XSetInputFocus(getXDisplay(), old_screen->getToolbar()->getWindowID(), + XSetInputFocus(otk::OBDisplay::display, old_screen->getRootWindow(), RevertToPointerRoot, CurrentTime); } } 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(); } } + + +}