1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

dtwm: support _NET_WM_STATE_ABOVE and _NET_WM_STATE_BELOW.

This commit is contained in:
hyousatsu 2023-02-24 04:11:07 +00:00
parent e22fd8d84f
commit 2351a19d7e
6 changed files with 112 additions and 20 deletions

View file

@ -80,6 +80,17 @@ static void AcceptPrematureClientMessage (XClientMessageEvent *clientEvent)
sizeof(XClientMessageEvent)); sizeof(XClientMessageEvent));
} }
static void HandleVisibilityNotify (ClientData *pCD,
XVisibilityEvent *visibilityEvent)
{
if (pCD == pCD->pSD->topClient &&
visibilityEvent->state != VisibilityUnobscured)
Do_Raise (pCD, NULL, STACK_NORMAL);
else if (pCD == pCD->pSD->bottomClient &&
visibilityEvent->state != VisibilityFullyObscured)
Do_Lower (pCD, NULL, STACK_NORMAL);
}
/*************************************<->************************************* /*************************************<->*************************************
@ -699,6 +710,12 @@ Boolean HandleEventsOnClientWindow (ClientData *pCD, XEvent *pEvent)
break; break;
} }
case VisibilityNotify:
{
HandleVisibilityNotify (pCD, (XVisibilityEvent *)pEvent);
doXtDispatchEvent = False;
break;
}
} }
return (doXtDispatchEvent); return (doXtDispatchEvent);

View file

@ -27,11 +27,40 @@
#include "WmGlobal.h" #include "WmGlobal.h"
#include "WmEvent.h" #include "WmEvent.h"
#include "WmFunction.h"
#include "WmMultiHead.h" #include "WmMultiHead.h"
#include "WmProperty.h" #include "WmProperty.h"
#include "WmWinState.h" #include "WmWinState.h"
#include "WmWrkspace.h" #include "WmWrkspace.h"
static void ProcessNetWmStateAbove (ClientData *pCD, long action);
static void ProcessNetWmStateBelow (ClientData *pCD, long action);
static void ProcessNetWmStateMaximized (ClientData *pCD, long action)
{
int newState;
switch (action)
{
case _NET_WM_STATE_REMOVE:
if (pCD->clientState != MAXIMIZED_STATE) return;
newState = NORMAL_STATE;
break;
case _NET_WM_STATE_ADD:
if (pCD->clientState == MAXIMIZED_STATE) return;
newState = MAXIMIZED_STATE;
break;
case _NET_WM_STATE_TOGGLE:
newState = pCD->clientState == MAXIMIZED_STATE ?
NORMAL_STATE : MAXIMIZED_STATE;
break;
default:
return;
}
SetClientState (pCD, newState, GetTimestamp ());
}
static void ProcessNetWmStateFullscreen (ClientData *pCD, long action) static void ProcessNetWmStateFullscreen (ClientData *pCD, long action)
{ {
Boolean fullscreen = pCD->fullscreen; Boolean fullscreen = pCD->fullscreen;
@ -62,29 +91,50 @@ static void ProcessNetWmStateFullscreen (ClientData *pCD, long action)
} }
} }
static void ProcessNetWmStateMaximized (ClientData *pCD, long action) static void ProcessNetWmStateAbove (ClientData *pCD, long action)
{ {
int newState; if (action == _NET_WM_STATE_TOGGLE)
action = pCD == pCD->pSD->topClient ? _NET_WM_STATE_REMOVE :
_NET_WM_STATE_ADD;
switch (action) switch (action)
{ {
case _NET_WM_STATE_REMOVE: case _NET_WM_STATE_REMOVE:
if (pCD->clientState != MAXIMIZED_STATE) return; if (pCD->pSD->topClient == pCD) pCD->pSD->topClient = NULL;
newState = NORMAL_STATE;
break; break;
case _NET_WM_STATE_ADD: case _NET_WM_STATE_ADD:
if (pCD->clientState == MAXIMIZED_STATE) return; pCD->pSD->topClient = pCD;
newState = MAXIMIZED_STATE; ProcessNetWmStateBelow (pCD, _NET_WM_STATE_REMOVE);
break; Do_Raise (pCD, NULL, STACK_NORMAL);
case _NET_WM_STATE_TOGGLE:
newState = pCD->clientState == MAXIMIZED_STATE ?
NORMAL_STATE : MAXIMIZED_STATE;
break; break;
default: default:
return; return;
} }
SetClientState (pCD, newState, GetTimestamp ()); UpdateNetWmState (pCD->client, &wmGD.xa__NET_WM_STATE_ABOVE, 1, action);
}
static void ProcessNetWmStateBelow (ClientData *pCD, long action)
{
if (action == _NET_WM_STATE_TOGGLE)
action = pCD == pCD->pSD->bottomClient ? _NET_WM_STATE_REMOVE :
_NET_WM_STATE_ADD;
switch (action)
{
case _NET_WM_STATE_REMOVE:
if (pCD->pSD->bottomClient == pCD) pCD->pSD->bottomClient = NULL;
break;
case _NET_WM_STATE_ADD:
pCD->pSD->bottomClient = pCD;
ProcessNetWmStateAbove (pCD, _NET_WM_STATE_REMOVE);
Do_Lower (pCD, NULL, STACK_NORMAL);
break;
default:
return;
}
UpdateNetWmState (pCD->client, &wmGD.xa__NET_WM_STATE_BELOW, 1, action);
} }
/** /**
@ -145,6 +195,12 @@ void ProcessNetWmState (ClientData *pCD, long action,
else if (firstProperty == wmGD.xa__NET_WM_STATE_FULLSCREEN || else if (firstProperty == wmGD.xa__NET_WM_STATE_FULLSCREEN ||
secondProperty == wmGD.xa__NET_WM_STATE_FULLSCREEN) secondProperty == wmGD.xa__NET_WM_STATE_FULLSCREEN)
ProcessNetWmStateFullscreen (pCD, action); ProcessNetWmStateFullscreen (pCD, action);
else if (firstProperty == wmGD.xa__NET_WM_STATE_ABOVE ||
secondProperty == wmGD.xa__NET_WM_STATE_ABOVE)
ProcessNetWmStateAbove (pCD, action);
else if (firstProperty == wmGD.xa__NET_WM_STATE_BELOW ||
secondProperty == wmGD.xa__NET_WM_STATE_BELOW)
ProcessNetWmStateBelow (pCD, action);
if (!ClientInWorkspace (ACTIVE_WS, pCD)) if (!ClientInWorkspace (ACTIVE_WS, pCD))
SetClientState (pCD, pCD->clientState | UNSEEN_STATE, GetTimestamp ()); SetClientState (pCD, pCD->clientState | UNSEEN_STATE, GetTimestamp ());
@ -167,9 +223,11 @@ void SetupWmEwmh (void)
XA__NET_WM_VISIBLE_ICON_NAME, XA__NET_WM_VISIBLE_ICON_NAME,
XA__NET_WM_FULLSCREEN_MONITORS, XA__NET_WM_FULLSCREEN_MONITORS,
XA__NET_WM_STATE, XA__NET_WM_STATE,
XA__NET_WM_STATE_FULLSCREEN,
XA__NET_WM_STATE_MAXIMIZED_VERT, XA__NET_WM_STATE_MAXIMIZED_VERT,
XA__NET_WM_STATE_MAXIMIZED_HORZ XA__NET_WM_STATE_MAXIMIZED_HORZ,
XA__NET_WM_STATE_FULLSCREEN,
XA__NET_WM_STATE_ABOVE,
XA__NET_WM_STATE_BELOW
}; };
static char *atom_names[] = { static char *atom_names[] = {
@ -182,9 +240,11 @@ void SetupWmEwmh (void)
_XA__NET_WM_VISIBLE_ICON_NAME, _XA__NET_WM_VISIBLE_ICON_NAME,
_XA__NET_WM_FULLSCREEN_MONITORS, _XA__NET_WM_FULLSCREEN_MONITORS,
_XA__NET_WM_STATE, _XA__NET_WM_STATE,
_XA__NET_WM_STATE_FULLSCREEN,
_XA__NET_WM_STATE_MAXIMIZED_VERT, _XA__NET_WM_STATE_MAXIMIZED_VERT,
_XA__NET_WM_STATE_MAXIMIZED_HORZ _XA__NET_WM_STATE_MAXIMIZED_HORZ,
_XA__NET_WM_STATE_FULLSCREEN,
_XA__NET_WM_STATE_ABOVE,
_XA__NET_WM_STATE_BELOW
}; };
Atom atoms[XtNumber(atom_names) + 1]; Atom atoms[XtNumber(atom_names) + 1];
@ -198,11 +258,13 @@ void SetupWmEwmh (void)
wmGD.xa__NET_WM_VISIBLE_ICON_NAME = atoms[XA__NET_WM_VISIBLE_ICON_NAME]; wmGD.xa__NET_WM_VISIBLE_ICON_NAME = atoms[XA__NET_WM_VISIBLE_ICON_NAME];
wmGD.xa__NET_WM_FULLSCREEN_MONITORS = atoms[XA__NET_WM_FULLSCREEN_MONITORS]; wmGD.xa__NET_WM_FULLSCREEN_MONITORS = atoms[XA__NET_WM_FULLSCREEN_MONITORS];
wmGD.xa__NET_WM_STATE = atoms[XA__NET_WM_STATE]; wmGD.xa__NET_WM_STATE = atoms[XA__NET_WM_STATE];
wmGD.xa__NET_WM_STATE_FULLSCREEN = atoms[XA__NET_WM_STATE_FULLSCREEN];
wmGD.xa__NET_WM_STATE_MAXIMIZED_VERT = wmGD.xa__NET_WM_STATE_MAXIMIZED_VERT =
atoms[XA__NET_WM_STATE_MAXIMIZED_VERT]; atoms[XA__NET_WM_STATE_MAXIMIZED_VERT];
wmGD.xa__NET_WM_STATE_MAXIMIZED_HORZ = wmGD.xa__NET_WM_STATE_MAXIMIZED_HORZ =
atoms[XA__NET_WM_STATE_MAXIMIZED_HORZ]; atoms[XA__NET_WM_STATE_MAXIMIZED_HORZ];
wmGD.xa__NET_WM_STATE_FULLSCREEN = atoms[XA__NET_WM_STATE_FULLSCREEN];
wmGD.xa__NET_WM_STATE_ABOVE = atoms[XA__NET_WM_STATE_ABOVE];
wmGD.xa__NET_WM_STATE_BELOW = atoms[XA__NET_WM_STATE_BELOW];
for (scr = 0; scr < wmGD.numScreens; ++scr) for (scr = 0; scr < wmGD.numScreens; ++scr)
{ {
@ -230,6 +292,6 @@ void SetupWmEwmh (void)
XChangeProperty(DISPLAY, wmGD.Screens[scr].rootWindow, XChangeProperty(DISPLAY, wmGD.Screens[scr].rootWindow,
atoms[XA__NET_SUPPORTED], XA_ATOM, 32, PropModeReplace, atoms[XA__NET_SUPPORTED], XA_ATOM, 32, PropModeReplace,
(unsigned char *)&atoms[XA__NET_SUPPORTING_WM_CHECK], (unsigned char *)&atoms[XA__NET_SUPPORTING_WM_CHECK],
10); 12);
} }
} }

View file

@ -134,9 +134,11 @@ extern Pixel FPselectcolor;
#define _XA__NET_WM_VISIBLE_ICON_NAME "_NET_WM_VISIBLE_ICON_NAME" #define _XA__NET_WM_VISIBLE_ICON_NAME "_NET_WM_VISIBLE_ICON_NAME"
#define _XA__NET_WM_FULLSCREEN_MONITORS "_NET_WM_FULLSCREEN_MONITORS" #define _XA__NET_WM_FULLSCREEN_MONITORS "_NET_WM_FULLSCREEN_MONITORS"
#define _XA__NET_WM_STATE "_NET_WM_STATE" #define _XA__NET_WM_STATE "_NET_WM_STATE"
#define _XA__NET_WM_STATE_FULLSCREEN "_NET_WM_STATE_FULLSCREEN"
#define _XA__NET_WM_STATE_MAXIMIZED_VERT "_NET_WM_STATE_MAXIMIZED_VERT" #define _XA__NET_WM_STATE_MAXIMIZED_VERT "_NET_WM_STATE_MAXIMIZED_VERT"
#define _XA__NET_WM_STATE_MAXIMIZED_HORZ "_NET_WM_STATE_MAXIMIZED_HORZ" #define _XA__NET_WM_STATE_MAXIMIZED_HORZ "_NET_WM_STATE_MAXIMIZED_HORZ"
#define _XA__NET_WM_STATE_FULLSCREEN "_NET_WM_STATE_FULLSCREEN"
#define _XA__NET_WM_STATE_ABOVE "_NET_WM_STATE_ABOVE"
#define _XA__NET_WM_STATE_BELOW "_NET_WM_STATE_BELOW"
/* window manager exit value on fatal errors: */ /* window manager exit value on fatal errors: */
#define WM_ERROR_EXIT_VALUE 1 #define WM_ERROR_EXIT_VALUE 1
@ -1325,6 +1327,9 @@ typedef struct _WmScreenData
DtSvcHandle hWsm; /* WORKSPACEMGR message handle */ DtSvcHandle hWsm; /* WORKSPACEMGR message handle */
Boolean bMarqueeSelectionInitialized; Boolean bMarqueeSelectionInitialized;
/* top and bottom clients */
struct _ClientData *topClient;
struct _ClientData *bottomClient;
} WmScreenData; } WmScreenData;
typedef struct _WmScreenData *PtrScreenData; typedef struct _WmScreenData *PtrScreenData;
@ -1984,9 +1989,11 @@ typedef struct _WmGlobalData
Atom xa__NET_WM_VISIBLE_ICON_NAME; Atom xa__NET_WM_VISIBLE_ICON_NAME;
Atom xa__NET_WM_FULLSCREEN_MONITORS; Atom xa__NET_WM_FULLSCREEN_MONITORS;
Atom xa__NET_WM_STATE; Atom xa__NET_WM_STATE;
Atom xa__NET_WM_STATE_FULLSCREEN;
Atom xa__NET_WM_STATE_MAXIMIZED_VERT; Atom xa__NET_WM_STATE_MAXIMIZED_VERT;
Atom xa__NET_WM_STATE_MAXIMIZED_HORZ; Atom xa__NET_WM_STATE_MAXIMIZED_HORZ;
Atom xa__NET_WM_STATE_FULLSCREEN;
Atom xa__NET_WM_STATE_ABOVE;
Atom xa__NET_WM_STATE_BELOW;
/* atoms used for workspace management: */ /* atoms used for workspace management: */

View file

@ -1272,6 +1272,9 @@ InitWmScreen (WmScreenData *pSD, int sNum)
pSD->iconBoxControl = False; pSD->iconBoxControl = False;
pSD->displayResolutionType = _DtGetDisplayResolution(DISPLAY, sNum); pSD->displayResolutionType = _DtGetDisplayResolution(DISPLAY, sNum);
pSD->topClient = NULL;
pSD->bottomClient = NULL;
/* /*
* We've got display resolution type--now, let's get color * We've got display resolution type--now, let's get color
* characteristics. * characteristics.

View file

@ -921,6 +921,8 @@ void WithdrawWindow (ClientData *pCD)
int i; int i;
XWindowChanges xwc; XWindowChanges xwc;
if (pCD->pSD->topClient == pCD) pCD->pSD->topClient = NULL;
if (pCD->pSD->bottomClient == pCD) pCD->pSD->bottomClient = NULL;
/* /*
* Put the client window into a withdrawn state: * Put the client window into a withdrawn state:

View file

@ -250,7 +250,8 @@ GetClientInfo (WmScreenData *pSD, Window clientWindow, long manageFlags)
* Listen for property change events on the window so that we keep * Listen for property change events on the window so that we keep
* in sync with the hints. * in sync with the hints.
*/ */
sAttributes.event_mask = (PropertyChangeMask | ColormapChangeMask); sAttributes.event_mask = (PropertyChangeMask | ColormapChangeMask |
VisibilityChangeMask);
XChangeWindowAttributes (DISPLAY, pCD->client, CWEventMask, XChangeWindowAttributes (DISPLAY, pCD->client, CWEventMask,
&sAttributes); &sAttributes);