summaryrefslogtreecommitdiff
path: root/src/client.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/client.cc')
-rw-r--r--src/client.cc77
1 files changed, 76 insertions, 1 deletions
diff --git a/src/client.cc b/src/client.cc
index b5bec898..88e218a4 100644
--- a/src/client.cc
+++ b/src/client.cc
@@ -249,7 +249,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;
@@ -263,6 +263,12 @@ void OBClient::getState()
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;
else if (state[i] ==
@@ -565,6 +571,12 @@ void OBClient::setState(StateAction action, long data1, long data2)
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;
else if (state == property->atom(otk::OBProperty::net_wm_state_above))
@@ -594,6 +606,12 @@ void OBClient::setState(StateAction action, long data1, long data2)
_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;
_fullscreen = true;
@@ -630,6 +648,12 @@ void OBClient::setState(StateAction action, long data1, long data2)
_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;
_fullscreen = false;
@@ -849,6 +873,57 @@ 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;