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:
committed by
Carlos R. Mafra
parent
fa5f8d9937
commit
28b0169147
19
src/event.c
19
src/event.c
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user