added support for _NET_WM_WINDOW_TYPE_DIALOG and _NET_FRAME_EXTENTS
This commit is contained in:
parent
7d5f6e382b
commit
85f45be727
6 changed files with 63 additions and 5 deletions
|
@ -53,7 +53,7 @@ public:
|
|||
virtual void updateState(FluxboxWindow &win) = 0;
|
||||
virtual void updateHints(FluxboxWindow &win) = 0;
|
||||
virtual void updateLayer(FluxboxWindow &win) = 0;
|
||||
|
||||
virtual void updateFrameExtents(FluxboxWindow &win) { }
|
||||
virtual bool checkClientMessage(const XClientMessageEvent &ce,
|
||||
BScreen * screen, WinClient * const winclient) = 0;
|
||||
|
||||
|
|
45
src/Ewmh.cc
45
src/Ewmh.cc
|
@ -140,6 +140,7 @@ void Ewmh::initForScreen(BScreen &screen) {
|
|||
m_net_wm_window_type_dock,
|
||||
m_net_wm_window_type_desktop,
|
||||
m_net_wm_window_type_splash,
|
||||
m_net_wm_window_type_dialog,
|
||||
m_net_wm_window_type_normal,
|
||||
|
||||
// window actions
|
||||
|
@ -168,6 +169,7 @@ void Ewmh::initForScreen(BScreen &screen) {
|
|||
|
||||
m_net_wm_moveresize,
|
||||
|
||||
m_net_frame_extents,
|
||||
|
||||
// desktop properties
|
||||
m_net_wm_desktop,
|
||||
|
@ -259,7 +261,6 @@ void Ewmh::setupFrame(FluxboxWindow &win) {
|
|||
// we also assume it shouldn't be visible in any toolbar
|
||||
win.setFocusHidden(true);
|
||||
win.setIconHidden(true);
|
||||
break;
|
||||
} else if (atoms[l] == m_net_wm_window_type_desktop) {
|
||||
/*
|
||||
* _NET_WM_WINDOW_TYPE_DESKTOP indicates a "false desktop" window
|
||||
|
@ -284,14 +285,28 @@ void Ewmh::setupFrame(FluxboxWindow &win) {
|
|||
* is starting up.
|
||||
*/
|
||||
win.setDecoration(FluxboxWindow::DECOR_NONE);
|
||||
win.setFocusHidden(true);
|
||||
win.setIconHidden(true);
|
||||
win.setMovable(false);
|
||||
} else if (atoms[l] == m_net_wm_window_type_normal) {
|
||||
// do nothing, this is ..normal..
|
||||
} else if (atoms[l] == m_net_wm_window_type_dialog) {
|
||||
// dialog windows should not be tabable
|
||||
win.setTabable(false);
|
||||
}
|
||||
|
||||
}
|
||||
XFree(data);
|
||||
}
|
||||
} else {
|
||||
// if _NET_WM_WINDOW_TYPE not set and this window
|
||||
// has transient_for the type must be set to _NET_WM_WINDOW_TYPE_DIALOG
|
||||
if ( win.winClient().isTransient() ) {
|
||||
win.winClient().
|
||||
changeProperty(m_net_wm_window_type,
|
||||
XA_ATOM, 32, PropModeReplace,
|
||||
(unsigned char*)&m_net_wm_window_type_dialog, 1);
|
||||
}
|
||||
}
|
||||
|
||||
setupState(win);
|
||||
|
||||
|
@ -305,8 +320,11 @@ void Ewmh::setupFrame(FluxboxWindow &win) {
|
|||
win.setWorkspace(desktop);
|
||||
|
||||
XFree(data);
|
||||
} else
|
||||
} else {
|
||||
updateWorkspace(win);
|
||||
}
|
||||
|
||||
updateFrameExtents(win);
|
||||
|
||||
}
|
||||
|
||||
|
@ -940,6 +958,7 @@ void Ewmh::createAtoms() {
|
|||
m_net_wm_window_type_dock = XInternAtom(disp, "_NET_WM_WINDOW_TYPE_DOCK", False);
|
||||
m_net_wm_window_type_desktop = XInternAtom(disp, "_NET_WM_WINDOW_TYPE_DESKTOP", False);
|
||||
m_net_wm_window_type_splash = XInternAtom(disp, "_NET_WM_WINDOW_TYPE_SPLASH", False);
|
||||
m_net_wm_window_type_dialog = XInternAtom(disp, "_NET_WM_WINDOW_TYPE_DIALOG", False);
|
||||
m_net_wm_window_type_normal = XInternAtom(disp, "_NET_WM_WINDOW_TYPE_NORMAL", False);
|
||||
|
||||
// state atom and the supported state atoms
|
||||
|
@ -976,6 +995,8 @@ void Ewmh::createAtoms() {
|
|||
m_net_wm_pid = XInternAtom(disp, "_NET_WM_PID", False);
|
||||
m_net_wm_handled_icons = XInternAtom(disp, "_NET_WM_HANDLED_ICONS", False);
|
||||
|
||||
m_net_frame_extents = XInternAtom(disp, "_NET_FRAME_EXTENTS", False);
|
||||
|
||||
m_net_wm_ping = XInternAtom(disp, "_NET_WM_PING", False);
|
||||
utf8_string = XInternAtom(disp, "UTF8_STRING", False);
|
||||
}
|
||||
|
@ -1220,6 +1241,23 @@ void Ewmh::setupState(FluxboxWindow &win) {
|
|||
}
|
||||
}
|
||||
|
||||
void Ewmh::updateFrameExtents(FluxboxWindow &win) {
|
||||
int extents[4];
|
||||
extents[0] = win.frame().x();
|
||||
extents[1] = win.frame().x() + win.frame().width();
|
||||
extents[2] = win.frame().y();
|
||||
extents[3] = win.frame().y() + win.frame().height();
|
||||
|
||||
FluxboxWindow::ClientList::iterator it = win.clientList().begin();
|
||||
FluxboxWindow::ClientList::iterator it_end = win.clientList().end();
|
||||
for (; it != it_end; ++it) {
|
||||
(*it)->changeProperty(m_net_frame_extents,
|
||||
XA_CARDINAL, 32, PropModeReplace,
|
||||
(unsigned char *)extents, 4);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Ewmh::WindowState::WindowState(int t_x, int t_y,
|
||||
unsigned int t_width,
|
||||
unsigned int t_height,
|
||||
|
@ -1255,3 +1293,4 @@ void Ewmh::saveState(FluxboxWindow &win, WindowState *state) {
|
|||
m_savedstate[&win] = state;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ public:
|
|||
|
||||
void setFullscreen(FluxboxWindow &win, bool value);
|
||||
|
||||
void updateFrameExtents(FluxboxWindow &win);
|
||||
private:
|
||||
|
||||
typedef struct WindowState {
|
||||
|
@ -83,6 +84,7 @@ private:
|
|||
|
||||
void setupState(FluxboxWindow &win);
|
||||
|
||||
|
||||
// root window properties
|
||||
Atom m_net_supported,
|
||||
m_net_client_list,
|
||||
|
@ -110,6 +112,7 @@ private:
|
|||
m_net_wm_window_type_dock,
|
||||
m_net_wm_window_type_desktop,
|
||||
m_net_wm_window_type_splash,
|
||||
m_net_wm_window_type_dialog,
|
||||
m_net_wm_window_type_normal,
|
||||
|
||||
// states
|
||||
|
@ -137,7 +140,9 @@ private:
|
|||
m_net_wm_action_close,
|
||||
|
||||
m_net_wm_strut, m_net_wm_icon_geometry, m_net_wm_icon, m_net_wm_pid,
|
||||
m_net_wm_handled_icons;
|
||||
m_net_wm_handled_icons,
|
||||
|
||||
m_net_frame_extents;
|
||||
|
||||
// application protocols
|
||||
Atom m_net_wm_ping;
|
||||
|
|
|
@ -3900,6 +3900,10 @@ void FluxboxWindow::sendConfigureNotify(bool send_to_netizens) {
|
|||
screen().updateNetizenConfigNotify(event);
|
||||
}
|
||||
} // end for
|
||||
|
||||
if (send_to_netizens) {
|
||||
Fluxbox::instance()->updateFrameExtents(*this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1847,3 +1847,11 @@ void Fluxbox::watchKeyRelease(BScreen &screen, unsigned int mods) {
|
|||
screen.rootWindow().window(), True,
|
||||
GrabModeAsync, GrabModeAsync, CurrentTime);
|
||||
}
|
||||
|
||||
void Fluxbox::updateFrameExtents(FluxboxWindow &win) {
|
||||
AtomHandlerContainerIt it = m_atomhandler.begin();
|
||||
AtomHandlerContainerIt it_end = m_atomhandler.end();
|
||||
for (; it != it_end; ++it ) {
|
||||
(*it).first->updateFrameExtents(win);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -182,6 +182,8 @@ public:
|
|||
* @param old_screen the old screen if any, can be the same as new screen
|
||||
*/
|
||||
void updateFocusedWindow(BScreen *screen, BScreen *old_screen);
|
||||
/// todo, remove this. just temporary
|
||||
void updateFrameExtents(FluxboxWindow &win);
|
||||
|
||||
void attachSignals(FluxboxWindow &win);
|
||||
void attachSignals(WinClient &winclient);
|
||||
|
|
Loading…
Reference in a new issue