ewmh compliance updates
This commit is contained in:
parent
a72fc5e002
commit
2d971ad48c
6 changed files with 49 additions and 6 deletions
|
@ -1,5 +1,11 @@
|
||||||
(Format: Year/Month/Day)
|
(Format: Year/Month/Day)
|
||||||
Changes for 1.0rc3:
|
Changes for 1.0rc3:
|
||||||
|
*06/07/22:
|
||||||
|
* Ewmh compliance updates: (Mark)
|
||||||
|
- implemented _NET_WM_MOVERESIZE_CANCEL (new in version 1.4.draft-1)
|
||||||
|
- move windows to last remaining workspace when a workspace is removed
|
||||||
|
- implemented _NET_REQUEST_FRAME_EXTENTS
|
||||||
|
Ewmh.cc/hh Workspace.cc/hh Screen.cc
|
||||||
*06/07/21:
|
*06/07/21:
|
||||||
* Stop using fixed values for num/caps/scroll lock, and ignore scroll lock
|
* Stop using fixed values for num/caps/scroll lock, and ignore scroll lock
|
||||||
as a modifier (Mark)
|
as a modifier (Mark)
|
||||||
|
|
38
src/Ewmh.cc
38
src/Ewmh.cc
|
@ -30,6 +30,7 @@
|
||||||
#include "Layer.hh"
|
#include "Layer.hh"
|
||||||
#include "WinClientUtil.hh"
|
#include "WinClientUtil.hh"
|
||||||
#include "fluxbox.hh"
|
#include "fluxbox.hh"
|
||||||
|
#include "FbWinFrameTheme.hh"
|
||||||
|
|
||||||
#include "FbTk/App.hh"
|
#include "FbTk/App.hh"
|
||||||
#include "FbTk/FbWindow.hh"
|
#include "FbTk/FbWindow.hh"
|
||||||
|
@ -61,7 +62,8 @@ enum EwmhMoveResizeDirection {
|
||||||
_NET_WM_MOVERESIZE_SIZE_LEFT = 7,
|
_NET_WM_MOVERESIZE_SIZE_LEFT = 7,
|
||||||
_NET_WM_MOVERESIZE_MOVE = 8, // movement only
|
_NET_WM_MOVERESIZE_MOVE = 8, // movement only
|
||||||
_NET_WM_MOVERESIZE_SIZE_KEYBOARD = 9, // size via keyboard
|
_NET_WM_MOVERESIZE_SIZE_KEYBOARD = 9, // size via keyboard
|
||||||
_NET_WM_MOVERESIZE_MOVE_KEYBOARD = 10
|
_NET_WM_MOVERESIZE_MOVE_KEYBOARD = 10, // move via keyboard
|
||||||
|
_NET_WM_MOVERESIZE_CANCEL = 11 // cancel operation
|
||||||
};
|
};
|
||||||
|
|
||||||
Ewmh::Ewmh() {
|
Ewmh::Ewmh() {
|
||||||
|
@ -166,6 +168,7 @@ void Ewmh::initForScreen(BScreen &screen) {
|
||||||
m_net_moveresize_window,
|
m_net_moveresize_window,
|
||||||
m_net_workarea,
|
m_net_workarea,
|
||||||
m_net_restack_window,
|
m_net_restack_window,
|
||||||
|
m_net_request_frame_extents,
|
||||||
|
|
||||||
m_net_wm_moveresize,
|
m_net_wm_moveresize,
|
||||||
|
|
||||||
|
@ -311,6 +314,13 @@ void Ewmh::setupFrame(FluxboxWindow &win) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOT YET IMPLEMENTED:
|
||||||
|
* _NET_WM_WINDOW_TYPE_TOOLBAR
|
||||||
|
* _NET_WM_WINDOW_TYPE_MENU
|
||||||
|
* _NET_WM_WINDOW_TYPE_UTILITY
|
||||||
|
*/
|
||||||
|
|
||||||
setupState(win);
|
setupState(win);
|
||||||
|
|
||||||
if (win.winClient().property(m_net_wm_desktop, 0, 1, False, XA_CARDINAL,
|
if (win.winClient().property(m_net_wm_desktop, 0, 1, False, XA_CARDINAL,
|
||||||
|
@ -872,6 +882,24 @@ bool Ewmh::checkClientMessage(const XClientMessageEvent &ce,
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
} else if (ce.message_type == m_net_request_frame_extents) {
|
||||||
|
if (!screen)
|
||||||
|
return true;
|
||||||
|
FbWinFrameTheme &theme = screen->winFrameTheme();
|
||||||
|
int title_h = theme.titleHeight() ||
|
||||||
|
theme.font().height() + 2*theme.bevelWidth() + 2;
|
||||||
|
title_h += theme.border().width();
|
||||||
|
int handle_h = theme.handleWidth() + theme.border().width();
|
||||||
|
int extents[4];
|
||||||
|
// our frames currently don't protrude from left/right
|
||||||
|
extents[0] = 0;
|
||||||
|
extents[1] = 0;
|
||||||
|
extents[2] = title_h;
|
||||||
|
extents[3] = handle_h;
|
||||||
|
|
||||||
|
XChangeProperty(FbTk::App::instance()->display(), ce.window,
|
||||||
|
m_net_frame_extents, XA_CARDINAL, 32, PropModeReplace,
|
||||||
|
(unsigned char *)extents, 4);
|
||||||
|
|
||||||
} else if (ce.message_type == m_net_wm_moveresize) {
|
} else if (ce.message_type == m_net_wm_moveresize) {
|
||||||
if (winclient == 0 || winclient->fbwindow() == 0)
|
if (winclient == 0 || winclient->fbwindow() == 0)
|
||||||
|
@ -903,6 +931,12 @@ bool Ewmh::checkClientMessage(const XClientMessageEvent &ce,
|
||||||
case _NET_WM_MOVERESIZE_MOVE_KEYBOARD:
|
case _NET_WM_MOVERESIZE_MOVE_KEYBOARD:
|
||||||
winclient->fbwindow()->startMoving(ce.data.l[0], ce.data.l[1]);
|
winclient->fbwindow()->startMoving(ce.data.l[0], ce.data.l[1]);
|
||||||
break;
|
break;
|
||||||
|
case _NET_WM_MOVERESIZE_CANCEL:
|
||||||
|
if (winclient->fbwindow()->isMoving())
|
||||||
|
winclient->fbwindow()->stopMoving(true);
|
||||||
|
if (winclient->fbwindow()->isResizing())
|
||||||
|
winclient->fbwindow()->stopResizing(true);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
cerr << "Ewmh: Unknown move/resize direction: " << ce.data.l[2] << endl;
|
cerr << "Ewmh: Unknown move/resize direction: " << ce.data.l[2] << endl;
|
||||||
break;
|
break;
|
||||||
|
@ -958,6 +992,8 @@ void Ewmh::createAtoms() {
|
||||||
m_net_close_window = XInternAtom(disp, "_NET_CLOSE_WINDOW", False);
|
m_net_close_window = XInternAtom(disp, "_NET_CLOSE_WINDOW", False);
|
||||||
m_net_moveresize_window = XInternAtom(disp, "_NET_MOVERESIZE_WINDOW", False);
|
m_net_moveresize_window = XInternAtom(disp, "_NET_MOVERESIZE_WINDOW", False);
|
||||||
m_net_restack_window = XInternAtom(disp, "_NET_RESTACK_WINDOW", False);
|
m_net_restack_window = XInternAtom(disp, "_NET_RESTACK_WINDOW", False);
|
||||||
|
m_net_request_frame_extents = XInternAtom(disp,
|
||||||
|
"_NET_REQUEST_FRAME_EXTENTS", False);
|
||||||
|
|
||||||
|
|
||||||
m_net_wm_moveresize = XInternAtom(disp, "_NET_WM_MOVERESIZE", False);
|
m_net_wm_moveresize = XInternAtom(disp, "_NET_WM_MOVERESIZE", False);
|
||||||
|
|
|
@ -99,7 +99,8 @@ private:
|
||||||
m_net_supporting_wm_check,
|
m_net_supporting_wm_check,
|
||||||
m_net_virtual_roots,
|
m_net_virtual_roots,
|
||||||
m_net_moveresize_window,
|
m_net_moveresize_window,
|
||||||
m_net_restack_window;
|
m_net_restack_window,
|
||||||
|
m_net_request_frame_extents;
|
||||||
|
|
||||||
// root window messages
|
// root window messages
|
||||||
Atom m_net_close_window, m_net_wm_moveresize;
|
Atom m_net_close_window, m_net_wm_moveresize;
|
||||||
|
|
|
@ -1031,7 +1031,7 @@ int BScreen::removeLastWorkspace() {
|
||||||
if (m_current_workspace->workspaceID() == wkspc->workspaceID())
|
if (m_current_workspace->workspaceID() == wkspc->workspaceID())
|
||||||
changeWorkspaceID(m_current_workspace->workspaceID() - 1);
|
changeWorkspaceID(m_current_workspace->workspaceID() - 1);
|
||||||
|
|
||||||
wkspc->removeAll();
|
wkspc->removeAll(wkspc->workspaceID()-1);
|
||||||
|
|
||||||
//remove last workspace
|
//remove last workspace
|
||||||
m_workspaces_list.pop_back();
|
m_workspaces_list.pop_back();
|
||||||
|
|
|
@ -229,11 +229,11 @@ void Workspace::hideAll(bool interrupt_moving) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Workspace::removeAll() {
|
void Workspace::removeAll(unsigned int dest) {
|
||||||
Windows::iterator it = m_windowlist.begin();
|
Windows::iterator it = m_windowlist.begin();
|
||||||
Windows::const_iterator it_end = m_windowlist.end();
|
Windows::const_iterator it_end = m_windowlist.end();
|
||||||
for (; it != it_end; ++it)
|
for (; it != it_end; ++it)
|
||||||
(*it)->iconify();
|
m_screen.sendToWorkspace(dest, *it, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ public:
|
||||||
void showAll();
|
void showAll();
|
||||||
void hideAll(bool interrupt_moving);
|
void hideAll(bool interrupt_moving);
|
||||||
/// Iconify all windows on this workspace
|
/// Iconify all windows on this workspace
|
||||||
void removeAll();
|
void removeAll(unsigned int dest);
|
||||||
void reconfigure();
|
void reconfigure();
|
||||||
void shutdown();
|
void shutdown();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue