Split client message processing into client and root message parts.
SVN revision: 29536
This commit is contained in:
parent
b4f9e38f87
commit
225f169b20
|
@ -2268,7 +2268,7 @@ EwinHandleEventsClient(Win win __UNUSED__, XEvent * ev, void *prm)
|
|||
break;
|
||||
|
||||
case ClientMessage:
|
||||
HintsProcessClientMessage(&(ev->xclient));
|
||||
HintsProcessClientClientMessage(ewin, &(ev->xclient));
|
||||
break;
|
||||
|
||||
case EX_EVENT_SHAPE_NOTIFY:
|
||||
|
@ -2348,7 +2348,7 @@ EwinHandleEventsRoot(Win win __UNUSED__, XEvent * ev, void *prm __UNUSED__)
|
|||
break;
|
||||
|
||||
case ClientMessage:
|
||||
HintsProcessClientMessage(&(ev->xclient));
|
||||
HintsProcessRootClientMessage(&(ev->xclient));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
80
src/ewmh.c
80
src/ewmh.c
|
@ -809,6 +809,25 @@ EWMH_DelWindowHints(const EWin * ewin)
|
|||
XDeleteProperty(disp, EwinGetClientXwin(ewin), ECORE_X_ATOM_NET_WM_STATE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Process property change
|
||||
*/
|
||||
void
|
||||
EWMH_ProcessPropertyChange(EWin * ewin, Atom atom_change)
|
||||
{
|
||||
if (atom_change == ECORE_X_ATOM_NET_WM_NAME)
|
||||
EWMH_GetWindowName(ewin);
|
||||
else if (atom_change == ECORE_X_ATOM_NET_WM_ICON_NAME)
|
||||
EWMH_GetWindowIconName(ewin);
|
||||
else if (atom_change == ECORE_X_ATOM_NET_WM_STRUT_PARTIAL ||
|
||||
atom_change == ECORE_X_ATOM_NET_WM_STRUT)
|
||||
EWMH_GetWindowStrut(ewin);
|
||||
else if (atom_change == ECORE_X_ATOM_NET_WM_WINDOW_OPACITY)
|
||||
EWMH_GetWindowOpacity(ewin);
|
||||
else if (atom_change == ECORE_X_ATOM_NET_WM_USER_TIME)
|
||||
EWMH_GetWindowUserTime(ewin);
|
||||
}
|
||||
|
||||
/*
|
||||
* Process configuration requests from clients
|
||||
*/
|
||||
|
@ -828,15 +847,8 @@ do_set(int is_set, int action)
|
|||
}
|
||||
|
||||
void
|
||||
EWMH_ProcessClientMessage(XClientMessageEvent * ev)
|
||||
EWMH_ProcessRootClientMessage(XClientMessageEvent * ev)
|
||||
{
|
||||
EWin *ewin;
|
||||
int source;
|
||||
Time ts;
|
||||
|
||||
/*
|
||||
* The ones that don't target an application window
|
||||
*/
|
||||
if (ev->message_type == ECORE_X_ATOM_NET_CURRENT_DESKTOP)
|
||||
{
|
||||
DeskGotoNum(ev->data.l[0]);
|
||||
|
@ -852,28 +864,24 @@ EWMH_ProcessClientMessage(XClientMessageEvent * ev)
|
|||
EwinsShowDesktop(ev->data.l[0]);
|
||||
goto done;
|
||||
}
|
||||
#if 0 /* These messages are sent to dedicated window */
|
||||
else if (ev->message_type == ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN)
|
||||
{
|
||||
#if 0
|
||||
Eprintf
|
||||
("EWMH_ProcessClientMessage: ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN: %lx: %s\n",
|
||||
ev->window, (char *)ev->data.l);
|
||||
#endif
|
||||
Eprintf("ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN: %lx: %s\n",
|
||||
ev->window, (char *)ev->data.l);
|
||||
goto done;
|
||||
}
|
||||
else if (ev->message_type == ECORE_X_ATOM_NET_STARTUP_INFO)
|
||||
{
|
||||
#if 0
|
||||
Eprintf
|
||||
("EWMH_ProcessClientMessage: ECORE_X_ATOM_NET_STARTUP_INFO : %lx: %s\n",
|
||||
ev->window, (char *)ev->data.l);
|
||||
#endif
|
||||
Eprintf("ECORE_X_ATOM_NET_STARTUP_INFO : %lx: %s\n",
|
||||
ev->window, (char *)ev->data.l);
|
||||
goto done;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0 /* Obsolete? */
|
||||
EWin *ewin;
|
||||
|
||||
/*
|
||||
* The ones that do target an application window
|
||||
*/
|
||||
ewin = EwinFindByClient(ev->window);
|
||||
if (ewin == NULL)
|
||||
{
|
||||
|
@ -898,6 +906,17 @@ EWMH_ProcessClientMessage(XClientMessageEvent * ev)
|
|||
}
|
||||
goto done;
|
||||
}
|
||||
#endif
|
||||
|
||||
done:
|
||||
;
|
||||
}
|
||||
|
||||
void
|
||||
EWMH_ProcessClientClientMessage(EWin * ewin, XClientMessageEvent * ev)
|
||||
{
|
||||
int source;
|
||||
Time ts;
|
||||
|
||||
if (ev->message_type == ECORE_X_ATOM_NET_ACTIVE_WINDOW)
|
||||
{
|
||||
|
@ -1085,22 +1104,3 @@ EWMH_ProcessClientMessage(XClientMessageEvent * ev)
|
|||
done:
|
||||
;
|
||||
}
|
||||
|
||||
/*
|
||||
* Process received window property change
|
||||
*/
|
||||
void
|
||||
EWMH_ProcessPropertyChange(EWin * ewin, Atom atom_change)
|
||||
{
|
||||
if (atom_change == ECORE_X_ATOM_NET_WM_NAME)
|
||||
EWMH_GetWindowName(ewin);
|
||||
else if (atom_change == ECORE_X_ATOM_NET_WM_ICON_NAME)
|
||||
EWMH_GetWindowIconName(ewin);
|
||||
else if (atom_change == ECORE_X_ATOM_NET_WM_STRUT_PARTIAL ||
|
||||
atom_change == ECORE_X_ATOM_NET_WM_STRUT)
|
||||
EWMH_GetWindowStrut(ewin);
|
||||
else if (atom_change == ECORE_X_ATOM_NET_WM_WINDOW_OPACITY)
|
||||
EWMH_GetWindowOpacity(ewin);
|
||||
else if (atom_change == ECORE_X_ATOM_NET_WM_USER_TIME)
|
||||
EWMH_GetWindowUserTime(ewin);
|
||||
}
|
||||
|
|
40
src/gnome.c
40
src/gnome.c
|
@ -751,20 +751,14 @@ GNOME_SetHints(Window win_wm_check)
|
|||
}
|
||||
|
||||
void
|
||||
GNOME_ProcessClientMessage(XClientMessageEvent * event)
|
||||
GNOME_ProcessRootClientMessage(XClientMessageEvent * event)
|
||||
{
|
||||
static Atom a2 = 0, a3 = 0, a4 = 0, a5 = 0;
|
||||
|
||||
EWin *ewin;
|
||||
static Atom a2 = 0, a3 = 0;
|
||||
|
||||
if (!a2)
|
||||
a2 = XInternAtom(disp, "_WIN_AREA", False);
|
||||
if (!a3)
|
||||
a3 = XInternAtom(disp, "_WIN_WORKSPACE", False);
|
||||
if (!a4)
|
||||
a4 = XInternAtom(disp, "_WIN_LAYER", False);
|
||||
if (!a5)
|
||||
a5 = XInternAtom(disp, "_WIN_STATE", False);
|
||||
|
||||
if (event->message_type == a2)
|
||||
{
|
||||
|
@ -776,26 +770,30 @@ GNOME_ProcessClientMessage(XClientMessageEvent * event)
|
|||
DeskGotoNum(event->data.l[0]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
GNOME_ProcessClientClientMessage(EWin * ewin, XClientMessageEvent * event)
|
||||
{
|
||||
static Atom a4 = 0, a5 = 0;
|
||||
|
||||
if (!a4)
|
||||
a4 = XInternAtom(disp, "_WIN_LAYER", False);
|
||||
if (!a5)
|
||||
a5 = XInternAtom(disp, "_WIN_STATE", False);
|
||||
|
||||
if (event->message_type == a4)
|
||||
{
|
||||
ewin = EwinFindByClient(event->window);
|
||||
if (ewin)
|
||||
{
|
||||
unsigned int val;
|
||||
unsigned int val;
|
||||
|
||||
val = event->data.l[0];
|
||||
EoSetLayer(ewin, val);
|
||||
ecore_x_window_prop_card32_set(EwinGetClientXwin(ewin), a4,
|
||||
&val, 1);
|
||||
EwinRaise(ewin);
|
||||
}
|
||||
val = event->data.l[0];
|
||||
EoSetLayer(ewin, val);
|
||||
ecore_x_window_prop_card32_set(EwinGetClientXwin(ewin), a4, &val, 1);
|
||||
EwinRaise(ewin);
|
||||
return;
|
||||
}
|
||||
if (event->message_type == a5)
|
||||
{
|
||||
ewin = EwinFindByClient(event->window);
|
||||
if (!ewin)
|
||||
return;
|
||||
if (event->data.l[0] & WIN_STATE_FIXED_POSITION)
|
||||
{
|
||||
if (event->data.l[1] & WIN_STATE_FIXED_POSITION)
|
||||
|
|
31
src/hints.c
31
src/hints.c
|
@ -266,7 +266,7 @@ HintsProcessPropertyChange(EWin * ewin, Atom atom_change)
|
|||
}
|
||||
|
||||
void
|
||||
HintsProcessClientMessage(XClientMessageEvent * event)
|
||||
HintsProcessClientClientMessage(EWin * ewin, XClientMessageEvent * event)
|
||||
{
|
||||
char *name;
|
||||
|
||||
|
@ -275,12 +275,35 @@ HintsProcessClientMessage(XClientMessageEvent * event)
|
|||
return;
|
||||
|
||||
if (!memcmp(name, "WM_", 3))
|
||||
ICCCM_ProcessClientMessage(event);
|
||||
ICCCM_ProcessClientClientMessage(ewin, event);
|
||||
else if (!memcmp(name, "_NET_", 5))
|
||||
EWMH_ProcessClientMessage(event);
|
||||
EWMH_ProcessClientClientMessage(ewin, event);
|
||||
#if ENABLE_GNOME
|
||||
else if (!memcmp(name, "_WIN_", 5))
|
||||
GNOME_ProcessClientMessage(event);
|
||||
GNOME_ProcessClientClientMessage(ewin, event);
|
||||
#endif
|
||||
XFree(name);
|
||||
}
|
||||
|
||||
void
|
||||
HintsProcessRootClientMessage(XClientMessageEvent * event)
|
||||
{
|
||||
char *name;
|
||||
|
||||
name = XGetAtomName(disp, event->message_type);
|
||||
if (name == NULL)
|
||||
return;
|
||||
|
||||
#if 0
|
||||
if (!memcmp(name, "WM_", 3))
|
||||
ICCCM_ProcessRootClientMessage(event);
|
||||
else
|
||||
#endif
|
||||
if (!memcmp(name, "_NET_", 5))
|
||||
EWMH_ProcessRootClientMessage(event);
|
||||
#if ENABLE_GNOME
|
||||
else if (!memcmp(name, "_WIN_", 5))
|
||||
GNOME_ProcessRootClientMessage(event);
|
||||
#endif
|
||||
XFree(name);
|
||||
}
|
||||
|
|
19
src/hints.h
19
src/hints.h
|
@ -51,8 +51,11 @@ void EWMH_SetWindowOpacity(const EWin * ewin);
|
|||
void EWMH_SetWindowActions(const EWin * ewin);
|
||||
void EWMH_GetWindowHints(EWin * ewin);
|
||||
void EWMH_DelWindowHints(const EWin * ewin);
|
||||
void EWMH_ProcessClientMessage(XClientMessageEvent * event);
|
||||
void EWMH_ProcessPropertyChange(EWin * ewin, Atom atom_change);
|
||||
void EWMH_ProcessClientClientMessage(EWin * ewin,
|
||||
XClientMessageEvent *
|
||||
event);
|
||||
void EWMH_ProcessRootClientMessage(XClientMessageEvent * event);
|
||||
|
||||
#if ENABLE_GNOME
|
||||
/* gnome.c */
|
||||
|
@ -68,7 +71,10 @@ void GNOME_SetAreaCount(void);
|
|||
void GNOME_GetHints(EWin * ewin, Atom atom_change);
|
||||
void GNOME_DelHints(const EWin * ewin);
|
||||
void GNOME_SetHints(Window win_wm_check);
|
||||
void GNOME_ProcessClientMessage(XClientMessageEvent * event);
|
||||
void GNOME_ProcessClientClientMessage(EWin * ewin,
|
||||
XClientMessageEvent *
|
||||
event);
|
||||
void GNOME_ProcessRootClientMessage(XClientMessageEvent * event);
|
||||
#endif
|
||||
|
||||
/* hints.c */
|
||||
|
@ -91,7 +97,10 @@ void HintsSetWindowBorder(const EWin * ewin);
|
|||
void HintsGetWindowHints(EWin * ewin);
|
||||
void HintsDelWindowHints(const EWin * ewin);
|
||||
void HintsProcessPropertyChange(EWin * ewin, Atom atom_change);
|
||||
void HintsProcessClientMessage(XClientMessageEvent * event);
|
||||
void HintsProcessClientClientMessage(EWin * ewin,
|
||||
XClientMessageEvent *
|
||||
event);
|
||||
void HintsProcessRootClientMessage(XClientMessageEvent * event);
|
||||
|
||||
Pixmap HintsGetRootPixmap(Win win);
|
||||
void HintsSetRootHints(Win win);
|
||||
|
@ -110,7 +119,9 @@ void SelectionRelease(ESelection * sel);
|
|||
|
||||
/* icccm.c */
|
||||
void ICCCM_Init(void);
|
||||
void ICCCM_ProcessClientMessage(XClientMessageEvent * event);
|
||||
void ICCCM_ProcessClientClientMessage(EWin * ewin,
|
||||
XClientMessageEvent *
|
||||
event);
|
||||
void ICCCM_GetTitle(EWin * ewin, Atom atom_change);
|
||||
void ICCCM_Delete(const EWin * ewin);
|
||||
void ICCCM_Save(const EWin * ewin);
|
||||
|
|
|
@ -54,17 +54,12 @@ ICCCM_Init(void)
|
|||
}
|
||||
|
||||
void
|
||||
ICCCM_ProcessClientMessage(XClientMessageEvent * event)
|
||||
ICCCM_ProcessClientClientMessage(EWin * ewin, XClientMessageEvent * event)
|
||||
{
|
||||
EWin *ewin;
|
||||
Atom a;
|
||||
|
||||
if (event->message_type == ECORE_X_ATOM_WM_CHANGE_STATE)
|
||||
{
|
||||
ewin = EwinFindByClient(event->window);
|
||||
if (ewin == NULL)
|
||||
return;
|
||||
|
||||
if (event->data.l[0] == IconicState)
|
||||
{
|
||||
EwinIconify(ewin);
|
||||
|
|
Loading…
Reference in New Issue