]> Dogcows Code - chaz/openbox/blobdiff - src/client.cc
notify the frame when the desktop changes
[chaz/openbox] / src / client.cc
index 787be429ee793d2419ac30812d575c73b19d397f..3175b3ba75658ebdfab932ff42cc5e66556fac34 100644 (file)
@@ -83,7 +83,6 @@ Client::Client(int screen, Window window)
   // any changes we've made here
   otk::Property::set(_window, otk::Property::atoms.net_wm_desktop,
                      otk::Property::atoms.cardinal, (unsigned)_desktop);
-  
   changeState();
 }
 
@@ -750,26 +749,29 @@ void Client::setDesktop(unsigned int target)
     return;
 
   _desktop = target;
-
   // set the desktop hint
   otk::Property::set(_window, otk::Property::atoms.net_wm_desktop,
                      otk::Property::atoms.cardinal, _desktop);
-  
+  frame->adjustState(); // the frame can display the current desktop state
   // 'move' the window to the new desktop
   showhide();
-
   openbox->screen(_screen)->updateStruts();
 }
 
 
 void Client::showhide()
 {
-  if (!_iconic &&
-      (_desktop == openbox->screen(_screen)->desktop() ||
-       _desktop == 0xffffffff))
-    frame->show();
-  else
-    frame->hide();
+  bool show;
+  Screen *s = openbox->screen(_screen);
+
+  if (_iconic) show = false;
+  else if (!(_desktop == s->desktop() ||
+             _desktop == 0xffffffff)) show = false;
+  else if (normal() && s->showingDesktop()) show = false;
+  else show = true;
+
+  if (show) frame->show();
+  else      frame->hide();
 }
 
 
@@ -1012,15 +1014,23 @@ void Client::clientMessageHandler(const XClientMessageEvent &e)
 #ifdef DEBUG
     printf("net_active_window for 0x%lx\n", _window);
 #endif
+    if (openbox->screen(_screen)->showingDesktop())
+      openbox->screen(_screen)->showDesktop(false);
     if (_iconic)
       iconify(false);
+    else if (!frame->visible()) // if its not visible for other reasons, then
+      return;                   // don't mess with it
     if (_shaded)
       shade(false);
     focus();
     openbox->screen(_screen)->raiseWindow(this);
   } else if (e.message_type == otk::Property::atoms.openbox_active_window) {
+    if (openbox->screen(_screen)->showingDesktop())
+      openbox->screen(_screen)->showDesktop(false);
     if (_iconic)
       iconify(false);
+    else if (!frame->visible()) // if its not visible for other reasons, then
+      return;                   // don't mess with it
     if (e.data.l[0] && _shaded)
       shade(false);
     focus();
@@ -1288,7 +1298,6 @@ void Client::changeAllowedActions(void)
 
 void Client::remaximize()
 {
-  printf("REMAXIMIZE!!!!!!!!!!!!!!!!!!!\n");
   int dir;
   if (_max_horz && _max_vert)
     dir = 0;
@@ -1549,6 +1558,10 @@ void Client::iconify(bool iconic, bool curdesk)
 {
   if (_iconic == iconic) return; // nothing to do
 
+#ifdef DEBUG
+    printf("%sconifying window: 0x%lx\n", (iconic ? "I" : "Uni"), _window);
+#endif
+
   _iconic = iconic;
 
   if (_iconic) {
@@ -1564,9 +1577,7 @@ void Client::iconify(bool iconic, bool curdesk)
     XMapWindow(**otk::display, _window);
   }
   changeState();
-
   showhide();
-  
   openbox->screen(_screen)->updateStruts();
 }
 
This page took 0.021387 seconds and 4 git commands to generate.