1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-23 22:52:34 +01:00

wmaker: replace and be replaced (ICCCM protocol)

Use the same logic used by xfwm4, metacity et al to replace an existing
window manager on the screen and allow other window managers to replace
us, as defined by the ICCCM 2.0:

http://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html
  Communication with the Window Manager by Means of Selections

By convention those window managers try to become the selection owner of
the WM_Sn atom where n is the screen number.  If the atom is owned by
another window manager and the --replace argument was not given to wmaker
we fail to start.  If the argument was given we try to become the new
owner and wait for the existing window manger to exit.

After a successful startup we watch for SelectionClear events on the
atom and initiate a shutdown if one arrives, as that implies that
another window manager was started with --replace.
This commit is contained in:
Iain Patterson
2015-05-14 18:55:32 +02:00
committed by Carlos R. Mafra
parent fa5f8d9937
commit 28b0169147
5 changed files with 133 additions and 5 deletions

View File

@@ -103,6 +103,7 @@ static void handleFocusIn(XEvent *event);
static void handleMotionNotify(XEvent *event);
static void handleVisibilityNotify(XEvent *event);
static void handle_inotify_events(void);
static void handle_selection_clear(XSelectionClearEvent *event);
static void wdelete_death_handler(WMagicNumber id);
@@ -274,6 +275,10 @@ void DispatchEvent(XEvent * event)
#endif
break;
case SelectionClear:
handle_selection_clear(&event->xselectionclear);
break;
default:
handleExtensions(event);
break;
@@ -1886,3 +1891,17 @@ static void handleVisibilityNotify(XEvent * event)
return;
wwin->flags.obscured = (event->xvisibility.state == VisibilityFullyObscured);
}
static void handle_selection_clear(XSelectionClearEvent *event)
{
WScreen *scr = wScreenForWindow(event->window);
if (!scr)
return;
if (event->selection != scr->sn_atom)
return;
wmessage(_("another window manager is replacing us!"));
Shutdown(WSExitMode);
}