more support
This commit is contained in:
parent
92700a312b
commit
dfaed0ceca
1 changed files with 128 additions and 18 deletions
146
src/Ewmh.cc
146
src/Ewmh.cc
|
@ -19,12 +19,13 @@
|
||||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
// DEALINGS IN THE SOFTWARE.
|
// DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
// $Id: Ewmh.cc,v 1.2 2002/10/11 10:20:33 fluxgen Exp $
|
// $Id: Ewmh.cc,v 1.3 2002/10/16 19:03:57 fluxgen Exp $
|
||||||
|
|
||||||
#include "Ewmh.hh"
|
#include "Ewmh.hh"
|
||||||
|
|
||||||
#include "Screen.hh"
|
#include "Screen.hh"
|
||||||
#include "Window.hh"
|
#include "Window.hh"
|
||||||
|
#include "fluxbox.hh"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -62,14 +63,21 @@ void Ewmh::initForScreen(const BScreen &screen) {
|
||||||
|
|
||||||
//set supported atoms
|
//set supported atoms
|
||||||
Atom atomsupported[] = {
|
Atom atomsupported[] = {
|
||||||
|
// window properties
|
||||||
m_net_wm_state,
|
m_net_wm_state,
|
||||||
// states that we support:
|
// states that we support:
|
||||||
m_net_wm_state_sticky,
|
m_net_wm_state_sticky,
|
||||||
m_net_wm_state_shaded,
|
m_net_wm_state_shaded,
|
||||||
|
|
||||||
|
m_net_wm_desktop,
|
||||||
|
|
||||||
|
// root properties
|
||||||
m_net_client_list,
|
m_net_client_list,
|
||||||
m_net_number_of_desktops,
|
m_net_number_of_desktops,
|
||||||
m_net_current_desktop,
|
m_net_current_desktop,
|
||||||
|
m_net_active_window,
|
||||||
|
m_net_close_window,
|
||||||
|
m_net_moveresize_window,
|
||||||
m_net_desktop_names,
|
m_net_desktop_names,
|
||||||
m_net_supporting_wm_check
|
m_net_supporting_wm_check
|
||||||
};
|
};
|
||||||
|
@ -80,23 +88,36 @@ void Ewmh::initForScreen(const BScreen &screen) {
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ewmh::setupWindow(FluxboxWindow &win) {
|
void Ewmh::setupWindow(FluxboxWindow &win) {
|
||||||
/*
|
|
||||||
Display *disp = BaseDisplay::getXDisplay();
|
Display *disp = BaseDisplay::getXDisplay();
|
||||||
Atom ret_type;
|
Atom ret_type;
|
||||||
int fmt;
|
int fmt;
|
||||||
unsigned long nitems, bytes_after;
|
unsigned long nitems, bytes_after;
|
||||||
long flags, *data = 0;
|
long *data = 0;
|
||||||
|
/*
|
||||||
if (XGetWindowProperty(disp, win.getClientWindow(),
|
if (XGetWindowProperty(disp, win.getClientWindow(),
|
||||||
m_net_wm_state, 0, 1, False, XA_CARDINAL,
|
m_net_wm_state, 0, 1, False, XA_CARDINAL,
|
||||||
&ret_type, &fmt, &nitems, &bytes_after,
|
&ret_type, &fmt, &nitems, &bytes_after,
|
||||||
(unsigned char **) &data) == Success && data) {
|
(unsigned char **) &data) == Success && data) {
|
||||||
flags = *data;
|
flags = *data;
|
||||||
setState(win, flags);
|
setState(win, flags);
|
||||||
XFree (data);
|
XFree(data);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
if (XGetWindowProperty(disp, win.getClientWindow(),
|
||||||
|
m_net_wm_desktop, 0, 1, False, XA_CARDINAL,
|
||||||
|
&ret_type, &fmt, &nitems, &bytes_after,
|
||||||
|
(unsigned char **) &data) == Success && data) {
|
||||||
|
unsigned int desktop = static_cast<unsigned int>(*data);
|
||||||
|
if (desktop == 0xFFFFFFFF && !win.isStuck())
|
||||||
|
win.stick();
|
||||||
|
else if (win.getScreen())
|
||||||
|
win.getScreen()->sendToWorkspace(desktop, &win, false);
|
||||||
|
|
||||||
|
XFree(data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ewmh::updateClientList(const BScreen &screen) {
|
void Ewmh::updateClientList(const BScreen &screen) {
|
||||||
|
@ -134,7 +155,7 @@ void Ewmh::updateClientList(const BScreen &screen) {
|
||||||
XA_CARDINAL, 32,
|
XA_CARDINAL, 32,
|
||||||
PropModeReplace, (unsigned char *)wl, num);
|
PropModeReplace, (unsigned char *)wl, num);
|
||||||
|
|
||||||
delete wl;
|
delete [] wl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ewmh::updateWorkspaceNames(const BScreen &screen) {
|
void Ewmh::updateWorkspaceNames(const BScreen &screen) {
|
||||||
|
@ -183,24 +204,113 @@ void Ewmh::updateHints(FluxboxWindow &win) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ewmh::updateWorkspace(FluxboxWindow &win) {
|
void Ewmh::updateWorkspace(FluxboxWindow &win) {
|
||||||
|
int workspace = win.getWorkspaceNumber();
|
||||||
|
if (win.isStuck())
|
||||||
|
workspace = 0xFFFFFFFF; // appear on all desktops/workspaces
|
||||||
|
|
||||||
|
XChangeProperty(BaseDisplay::getXDisplay(), win.getClientWindow(),
|
||||||
|
m_net_wm_desktop, XA_CARDINAL, 32, PropModeReplace,
|
||||||
|
(unsigned char *)&workspace, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Ewmh::checkClientMessage(const XClientMessageEvent &ce, BScreen *screen, FluxboxWindow *win) {
|
// return true if we did handle the atom here
|
||||||
if (win != 0) {
|
bool Ewmh::checkClientMessage(const XClientMessageEvent &ce, BScreen * const screen, FluxboxWindow * const win) {
|
||||||
if (ce.message_type == m_net_wm_state) {
|
|
||||||
if (ce.data.l[0] == STATE_REMOVE) {
|
if (ce.message_type == m_net_wm_desktop) {
|
||||||
setState(*win, ce.data.l[1], false);
|
if (screen == 0)
|
||||||
setState(*win, ce.data.l[2], false);
|
return true;
|
||||||
} else if (ce.data.l[0] == STATE_ADD) {
|
// ce.data.l[0] = workspace number
|
||||||
setState(*win, ce.data.l[1], true);
|
// valid window and workspace number?
|
||||||
setState(*win, ce.data.l[2], true);
|
if (win == 0 || static_cast<unsigned int>(ce.data.l[0]) >= screen->getCount())
|
||||||
} else if (ce.data.l[0] == STATE_TOGGLE) {
|
return true;
|
||||||
toggleState(*win, ce.data.l[1]);
|
|
||||||
toggleState(*win, ce.data.l[2]);
|
screen->sendToWorkspace(ce.data.l[0], win, false);
|
||||||
|
return true;
|
||||||
|
} else if (ce.message_type == m_net_wm_state) {
|
||||||
|
if (win == 0)
|
||||||
|
return true;
|
||||||
|
// ce.data.l[0] = the action (remove, add or toggle)
|
||||||
|
// ce.data.l[1] = the first property to alter
|
||||||
|
// ce.data.l[2] = second property to alter (can be zero)
|
||||||
|
if (ce.data.l[0] == STATE_REMOVE) {
|
||||||
|
setState(*win, ce.data.l[1], false);
|
||||||
|
setState(*win, ce.data.l[2], false);
|
||||||
|
} else if (ce.data.l[0] == STATE_ADD) {
|
||||||
|
setState(*win, ce.data.l[1], true);
|
||||||
|
setState(*win, ce.data.l[2], true);
|
||||||
|
} else if (ce.data.l[0] == STATE_TOGGLE) {
|
||||||
|
toggleState(*win, ce.data.l[1]);
|
||||||
|
toggleState(*win, ce.data.l[2]);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else if (ce.message_type == m_net_number_of_desktops) {
|
||||||
|
if (screen == 0)
|
||||||
|
return true;
|
||||||
|
// ce.data.l[0] = number of workspaces
|
||||||
|
|
||||||
|
// no need to alter number of desktops if they are the same
|
||||||
|
// or if requested number of workspace is less than zero
|
||||||
|
if (screen->getCount() == static_cast<unsigned int>(ce.data.l[0]) ||
|
||||||
|
ce.data.l[0] < 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (screen->getCount() > static_cast<unsigned int>(ce.data.l[0])) {
|
||||||
|
// remove last workspace until we have
|
||||||
|
// the same number of workspaces
|
||||||
|
while (screen->getCount() != static_cast<unsigned int>(ce.data.l[0])) {
|
||||||
|
screen->removeLastWorkspace();
|
||||||
|
if (screen->getCount() == 1) // must have at least one workspace
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else { // add workspaces to screen until workspace count match the requested size
|
||||||
|
while (screen->getCount() != static_cast<unsigned int>(ce.data.l[0])) {
|
||||||
|
screen->addWorkspace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if (ce.message_type == m_net_current_desktop) {
|
||||||
|
if (screen == 0)
|
||||||
|
return true;
|
||||||
|
// ce.data.l[0] = workspace number
|
||||||
|
|
||||||
|
// prevent out of range value
|
||||||
|
if (static_cast<unsigned int>(ce.data.l[0]) >= screen->getCount())
|
||||||
|
return true;
|
||||||
|
screen->changeWorkspaceID(ce.data.l[0]);
|
||||||
|
return true;
|
||||||
|
} else if (ce.message_type == m_net_active_window) {
|
||||||
|
|
||||||
|
// make sure we have a valid window
|
||||||
|
if (win == 0)
|
||||||
|
return true;
|
||||||
|
// ce.window = window to focus
|
||||||
|
|
||||||
|
// should move set focus somewhere else
|
||||||
|
// so we don't need fluxbox depedencies here
|
||||||
|
Fluxbox::instance()->setFocusedWindow(win);
|
||||||
|
return true;
|
||||||
|
} else if (ce.message_type == m_net_close_window) {
|
||||||
|
if (win == 0)
|
||||||
|
return true;
|
||||||
|
// ce.window = window to close (which in this case is the win argument)
|
||||||
|
win->close();
|
||||||
|
return true;
|
||||||
|
} else if (ce.message_type == m_net_moveresize_window) {
|
||||||
|
if (win == 0)
|
||||||
|
return true;
|
||||||
|
// ce.data.l[0] = gravity and flags
|
||||||
|
// ce.data.l[1] = x
|
||||||
|
// ce.data.l[2] = y
|
||||||
|
// ce.data.l[3] = width
|
||||||
|
// ce.data.l[4] = height
|
||||||
|
// TODO: gravity and flags
|
||||||
|
win->configure(ce.data.l[1], ce.data.l[2],
|
||||||
|
ce.data.l[3], ce.data.l[4]);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// we didn't handle the ce.message_type here
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue