]> Dogcows Code - chaz/openbox/blobdiff - src/blackbox.cc
change to match blackbox
[chaz/openbox] / src / blackbox.cc
index dd4c278ea6c6242ba8c7048b911bf7104cf19e31..56782248dddd5b9a3ef6802df26ef17e8f20cd0c 100644 (file)
@@ -90,6 +90,8 @@ extern "C" {
 #endif // HAVE_LIBGEN_H
 }
 
+#include <assert.h>
+
 #include <algorithm>
 #include <string>
 using std::string;
@@ -108,7 +110,7 @@ using std::string;
 #include "Window.hh"
 #include "Workspace.hh"
 #include "Workspacemenu.hh"
-
+#include "XAtom.hh"
 
 // X event scanner for enter/leave notifies - adapted from twm
 struct scanargs {
@@ -159,7 +161,7 @@ Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu)
   XrmInitialize();
   load_rc();
 
-  init_icccm();
+  xatom = new XAtom(this);
 
   cursor.session = XCreateFontCursor(getXDisplay(), XC_left_ptr);
   cursor.move = XCreateFontCursor(getXDisplay(), XC_fleur);
@@ -207,6 +209,8 @@ Blackbox::~Blackbox(void) {
   std::for_each(menuTimestamps.begin(), menuTimestamps.end(),
                 PointerAssassin());
 
+  delete xatom;
+
   delete timer;
 }
 
@@ -557,11 +561,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;
     }
@@ -648,7 +655,7 @@ 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->getAtom(XAtom::wm_change_state)) {
         BlackboxWindow *win = searchWindow(e->xclient.window);
         if (! win || ! win->validateClient()) return;
 
@@ -659,10 +666,9 @@ void Blackbox::process_event(XEvent *e) {
       } else if(e->xclient.message_type == getBlackboxChangeWorkspaceAtom()) {
         BScreen *screen = searchScreen(e->xclient.window);
 
-        if (screen && e->xclient.data.l[0] >= 0 &&
-            e->xclient.data.l[0] <
-            static_cast<signed>(screen->getWorkspaceCount()))
-          screen->changeWorkspaceID(e->xclient.data.l[0]);
+        unsigned int workspace = e->xclient.data.l[0];
+        if (screen && workspace < screen->getWorkspaceCount())
+          screen->changeWorkspaceID(workspace);
       } else if (e->xclient.message_type == getBlackboxChangeWindowFocusAtom()) {
         BlackboxWindow *win = searchWindow(e->xclient.window);
 
@@ -742,89 +748,6 @@ 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)) {
@@ -1161,17 +1084,17 @@ void Blackbox::setFocusedWindow(BlackboxWindow *win) {
       if (active_screen) {
         // set input focus to the toolbar of the screen with mouse
         XSetInputFocus(getXDisplay(),
-                       active_screen->getToolbar()->getWindowID(),
+                       active_screen->getRootWindow(),
                        RevertToPointerRoot, CurrentTime);
       } else {
         // set input focus to the toolbar of the first managed screen
         XSetInputFocus(getXDisplay(),
-                       screenList.front()->getToolbar()->getWindowID(),
+                       screenList.front()->getRootWindow(),
                        RevertToPointerRoot, CurrentTime);
       }
     } else {
       // set input focus to the toolbar of the last screen
-      XSetInputFocus(getXDisplay(), old_screen->getToolbar()->getWindowID(),
+      XSetInputFocus(getXDisplay(), old_screen->getRootWindow(),
                      RevertToPointerRoot, CurrentTime);
     }
   }
This page took 0.024468 seconds and 4 git commands to generate.