Split client message processing into client and root message parts.

SVN revision: 29536
This commit is contained in:
Kim Woelders 2007-04-15 14:34:46 +00:00
parent b4f9e38f87
commit 225f169b20
6 changed files with 104 additions and 77 deletions

View File

@ -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:

View File

@ -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);
}

View File

@ -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)

View File

@ -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);
}

View File

@ -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);

View File

@ -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);