]> Dogcows Code - chaz/openbox/blobdiff - src/client.cc
separate off execute, since its not a callback function
[chaz/openbox] / src / client.cc
index b5bec898b77cfe4d8578a5d9f6a3690c179ec4b3..d150cf8b4b54f391333432c5d6ff6af684e4378f 100644 (file)
@@ -98,9 +98,11 @@ OBClient::~OBClient()
 {
   const otk::OBProperty *property = Openbox::instance->property();
 
-  // these values should not be persisted across a window unmapping/mapping
-  property->erase(_window, otk::OBProperty::net_wm_desktop);
-  property->erase(_window, otk::OBProperty::net_wm_state);
+  if (Openbox::instance->state() != Openbox::State_Exiting) {
+    // these values should not be persisted across a window unmapping/mapping
+    property->erase(_window, otk::OBProperty::net_wm_desktop);
+    property->erase(_window, otk::OBProperty::net_wm_state);
+  }
 }
 
 
@@ -249,7 +251,7 @@ void OBClient::getState()
   const otk::OBProperty *property = Openbox::instance->property();
 
   _modal = _shaded = _max_horz = _max_vert = _fullscreen = _above = _below =
-    false;
+    _skip_taskbar = _skip_pager = false;
   
   unsigned long *state;
   unsigned long num = (unsigned) -1;
@@ -262,6 +264,12 @@ void OBClient::getState()
       else if (state[i] ==
                property->atom(otk::OBProperty::net_wm_state_shaded))
         _shaded = true;
+      else if (state[i] ==
+               property->atom(otk::OBProperty::net_wm_state_skip_taskbar))
+        _skip_taskbar = true;
+      else if (state[i] ==
+               property->atom(otk::OBProperty::net_wm_state_skip_pager))
+        _skip_pager = true;
       else if (state[i] ==
                property->atom(otk::OBProperty::net_wm_state_fullscreen))
         _fullscreen = true;
@@ -531,10 +539,11 @@ void OBClient::setWMState(long state)
 
 void OBClient::setDesktop(long target)
 {
-  assert(target >= 0);
+  printf("Setting desktop %ld\n", target);
+  assert(target >= 0 || target == (signed)0xffffffff);
   //assert(target == 0xffffffff || target < MAX);
-  
-  // XXX: move the window to the new desktop
+
+  // XXX: move the window to the new desktop (and set root property)
   _desktop = target;
 }
 
@@ -564,6 +573,12 @@ void OBClient::setState(StateAction action, long data1, long data2)
         action = _max_horz ? State_Remove : State_Add;
       else if (state == property->atom(otk::OBProperty::net_wm_state_shaded))
         action = _shaded ? State_Remove : State_Add;
+      else if (state ==
+               property->atom(otk::OBProperty::net_wm_state_skip_taskbar))
+        action = _skip_taskbar ? State_Remove : State_Add;
+      else if (state ==
+               property->atom(otk::OBProperty::net_wm_state_skip_pager))
+        action = _skip_pager ? State_Remove : State_Add;
       else if (state ==
                property->atom(otk::OBProperty::net_wm_state_fullscreen))
         action = _fullscreen ? State_Remove : State_Add;
@@ -593,6 +608,12 @@ void OBClient::setState(StateAction action, long data1, long data2)
         if (_shaded) continue;
         _shaded = true;
         // XXX: hide the client window
+      } else if (state ==
+                 property->atom(otk::OBProperty::net_wm_state_skip_taskbar)) {
+        _skip_taskbar = true;
+      } else if (state ==
+                 property->atom(otk::OBProperty::net_wm_state_skip_pager)) {
+        _skip_pager = true;
       } else if (state ==
                  property->atom(otk::OBProperty::net_wm_state_fullscreen)) {
         if (_fullscreen) continue;
@@ -629,6 +650,12 @@ void OBClient::setState(StateAction action, long data1, long data2)
         if (!_shaded) continue;
         _shaded = false;
         // XXX: show the client window
+      } else if (state ==
+                 property->atom(otk::OBProperty::net_wm_state_skip_taskbar)) {
+        _skip_taskbar = false;
+      } else if (state ==
+                 property->atom(otk::OBProperty::net_wm_state_skip_pager)) {
+        _skip_pager = false;
       } else if (state ==
                  property->atom(otk::OBProperty::net_wm_state_fullscreen)) {
         if (!_fullscreen) continue;
@@ -742,10 +769,16 @@ void OBClient::clientMessageHandler(const XClientMessageEvent &e)
       setDesktop(e.data.l[0]); // use the found event
     else
       setDesktop(e.data.l[0]); // use the original event
-  }
-  else if (e.message_type == property->atom(otk::OBProperty::net_wm_state))
+  } else if (e.message_type == property->atom(otk::OBProperty::net_wm_state)) {
     // can't compress these
     setState((StateAction)e.data.l[0], e.data.l[1], e.data.l[2]);
+  } else if (e.message_type ==
+             property->atom(otk::OBProperty::net_close_window)) {
+    close();
+  } else if (e.message_type ==
+             property->atom(otk::OBProperty::net_active_window)) {
+    focus();
+  }
 }
 
 
@@ -849,11 +882,81 @@ void OBClient::close()
 }
 
 
+void OBClient::changeState()
+{
+  const otk::OBProperty *property = Openbox::instance->property();
+
+  unsigned long state[2];
+  state[0] = _wmstate;
+  state[1] = None;
+  property->set(_window, otk::OBProperty::wm_state, otk::OBProperty::wm_state,
+                state, 2);
+  
+  Atom netstate[10];
+  int num = 0;
+  if (_modal)
+    netstate[num++] = property->atom(otk::OBProperty::net_wm_state_modal);
+  if (_shaded)
+    netstate[num++] = property->atom(otk::OBProperty::net_wm_state_shaded);
+  if (_iconic)
+    netstate[num++] = property->atom(otk::OBProperty::net_wm_state_hidden);
+  if (_skip_taskbar)
+    netstate[num++] =
+      property->atom(otk::OBProperty::net_wm_state_skip_taskbar);
+  if (_skip_pager)
+    netstate[num++] = property->atom(otk::OBProperty::net_wm_state_skip_pager);
+  if (_fullscreen)
+    netstate[num++] = property->atom(otk::OBProperty::net_wm_state_fullscreen);
+  if (_max_vert)
+    netstate[num++] =
+      property->atom(otk::OBProperty::net_wm_state_maximized_vert);
+  if (_max_horz)
+    netstate[num++] =
+      property->atom(otk::OBProperty::net_wm_state_maximized_horz);
+  if (_above)
+    netstate[num++] = property->atom(otk::OBProperty::net_wm_state_above);
+  if (_below)
+    netstate[num++] = property->atom(otk::OBProperty::net_wm_state_below);
+  property->set(_window, otk::OBProperty::net_wm_state,
+                otk::OBProperty::Atom_Atom, netstate, num);
+  
+}
+
+void OBClient::shade(bool shade)
+{
+  if (shade == _shaded) return; // already done
+
+  _wmstate = shade ? IconicState : NormalState;
+  _shaded = shade;
+  changeState();
+  frame->adjustSize();
+}
+
+
 bool OBClient::focus()
 {
-  if (!_can_focus || _focused) return false;
+  if (!(_can_focus || _focus_notify) || _focused) return false;
+
+  if (_can_focus)
+    XSetInputFocus(otk::OBDisplay::display, _window, RevertToNone, CurrentTime);
+
+  if (_focus_notify) {
+    XEvent ce;
+    const otk::OBProperty *property = Openbox::instance->property();
+    
+    ce.xclient.type = ClientMessage;
+    ce.xclient.message_type =  property->atom(otk::OBProperty::wm_protocols);
+    ce.xclient.display = otk::OBDisplay::display;
+    ce.xclient.window = _window;
+    ce.xclient.format = 32;
+    ce.xclient.data.l[0] = property->atom(otk::OBProperty::wm_take_focus);
+    ce.xclient.data.l[1] = Openbox::instance->lastTime();
+    ce.xclient.data.l[2] = 0l;
+    ce.xclient.data.l[3] = 0l;
+    ce.xclient.data.l[4] = 0l;
+    XSendEvent(otk::OBDisplay::display, _window, False, NoEventMask, &ce);
+  }
 
-  XSetInputFocus(otk::OBDisplay::display, _window, RevertToNone, CurrentTime);
   return true;
 }
 
This page took 0.029061 seconds and 4 git commands to generate.