Action source handling - continued.

SVN revision: 18447
This commit is contained in:
Kim Woelders 2005-11-13 01:22:28 +00:00
parent e3f3a9c6bd
commit b8d230d659
8 changed files with 76 additions and 39 deletions

View File

@ -847,11 +847,12 @@ Ecore_X_Atom ECORE_X_ATOM_NET_FRAME_EXTENTS;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_USER_TIME;
#if 0 /* Not used */
Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_GEOMETRY;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_PID;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_HANDLED_ICONS;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_USER_TIME;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_PING;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
@ -863,9 +864,9 @@ Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_OPACITY;
Ecore_X_Atom ECORE_X_ATOM_NET_CLOSE_WINDOW;
Ecore_X_Atom ECORE_X_ATOM_NET_MOVERESIZE_WINDOW;
Ecore_X_Atom ECORE_X_ATOM_NET_WM_MOVERESIZE;
Ecore_X_Atom ECORE_X_ATOM_NET_RESTACK_WINDOW;
#if 0 /* Not yet implemented */
Ecore_X_Atom ECORE_X_ATOM_NET_RESTACK_WINDOW;
Ecore_X_Atom ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS;
#endif
@ -962,11 +963,12 @@ ecore_x_netwm_init(void)
ECORE_X_ATOM_NET_WM_ICON = _ATOM_GET("_NET_WM_ICON");
ECORE_X_ATOM_NET_WM_USER_TIME = _ATOM_GET("_NET_WM_USER_TIME");
#if 0 /* Not used */
ECORE_X_ATOM_NET_WM_ICON_GEOMETRY = _ATOM_GET("_NET_WM_ICON_GEOMETRY");
ECORE_X_ATOM_NET_WM_PID = _ATOM_GET("_NET_WM_PID");
ECORE_X_ATOM_NET_WM_HANDLED_ICONS = _ATOM_GET("_NET_WM_HANDLED_ICONS");
ECORE_X_ATOM_NET_WM_USER_TIME = _ATOM_GET("_NET_WM_USER_TIME");
ECORE_X_ATOM_NET_WM_PING = _ATOM_GET("_NET_WM_PING");
ECORE_X_ATOM_NET_WM_SYNC_REQUEST = _ATOM_GET("_NET_WM_SYNC_REQUEST");
@ -977,9 +979,9 @@ ecore_x_netwm_init(void)
ECORE_X_ATOM_NET_CLOSE_WINDOW = _ATOM_GET("_NET_CLOSE_WINDOW");
ECORE_X_ATOM_NET_MOVERESIZE_WINDOW = _ATOM_GET("_NET_MOVERESIZE_WINDOW");
ECORE_X_ATOM_NET_WM_MOVERESIZE = _ATOM_GET("_NET_WM_MOVERESIZE");
ECORE_X_ATOM_NET_RESTACK_WINDOW = _ATOM_GET("_NET_RESTACK_WINDOW");
#if 0 /* Not yet implemented */
ECORE_X_ATOM_NET_RESTACK_WINDOW = _ATOM_GET("_NET_RESTACK_WINDOW");
ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS =
_ATOM_GET("_NET_REQUEST_FRAME_EXTENTS");
#endif

View File

@ -179,11 +179,12 @@ extern Ecore_X_Atom ECORE_X_ATOM_NET_FRAME_EXTENTS;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_USER_TIME;
#if 0 /* Not used */
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_GEOMETRY;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_PID;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_HANDLED_ICONS;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_USER_TIME;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_PING;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
@ -195,9 +196,9 @@ extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_OPACITY;
extern Ecore_X_Atom ECORE_X_ATOM_NET_CLOSE_WINDOW;
extern Ecore_X_Atom ECORE_X_ATOM_NET_MOVERESIZE_WINDOW;
extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_MOVERESIZE;
extern Ecore_X_Atom ECORE_X_ATOM_NET_RESTACK_WINDOW;
#if 0 /* Not yet implemented */
extern Ecore_X_Atom ECORE_X_ATOM_NET_RESTACK_WINDOW;
extern Ecore_X_Atom ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS;
#endif

View File

@ -891,10 +891,10 @@ EventShow(const XEvent * ev)
case ClientMessage:
txt = XGetAtomName(disp, ev->xclient.message_type);
Eprintf
("%#08lx EV-%s win=%#lx ev_type=%s(%ld) data[0-3]= %08lx %08lx %08lx %08lx\n",
("%#08lx EV-%s win=%#lx ev_type=%s(%ld) data: %08lx %08lx %08lx %08lx %08lx\n",
ser, name, win, txt, ev->xclient.message_type,
ev->xclient.data.l[0], ev->xclient.data.l[1], ev->xclient.data.l[2],
ev->xclient.data.l[3]);
ev->xclient.data.l[3], ev->xclient.data.l[4]);
XFree(txt);
break;
case MappingNotify:

View File

@ -626,6 +626,7 @@ EwinIconify(EWin * ewin)
if (lst)
Efree(lst);
EwinStateUpdate(ewin);
HintsSetWindowState(ewin);
call_depth--;
@ -700,6 +701,7 @@ EwinDeIconify1(EWin * ewin, int dx, int dy)
if (lst)
Efree(lst);
EwinStateUpdate(ewin);
HintsSetWindowState(ewin);
call_depth--;
@ -734,6 +736,7 @@ EwinUnStick(EWin * ewin)
EoSetSticky(ewin, 0);
EwinMoveToDesktopAt(ewin, DesksGetCurrent(), EoGetX(ewin), EoGetY(ewin));
EwinBorderUpdateState(ewin);
EwinStateUpdate(ewin);
HintsSetWindowState(ewin);
HintsSetWindowDesktop(ewin);
SnapshotEwinUpdate(ewin, SNAP_USE_STICKY);
@ -762,6 +765,7 @@ EwinStick(EWin * ewin)
EoSetSticky(ewin, 1);
EwinMoveToDesktopAt(ewin, DesksGetCurrent(), x, y);
EwinBorderUpdateState(ewin);
EwinStateUpdate(ewin);
HintsSetWindowState(ewin);
HintsSetWindowDesktop(ewin);
SnapshotEwinUpdate(ewin, SNAP_USE_STICKY);
@ -1072,6 +1076,7 @@ EwinShade(EWin * ewin)
Eprintf("EwinShade-E\n");
#endif
EwinStateUpdate(ewin);
HintsSetWindowState(ewin);
}
@ -1279,11 +1284,12 @@ EwinUnShade(EWin * ewin)
Eprintf("EwinUnShade-E\n");
#endif
EwinStateUpdate(ewin);
HintsSetWindowState(ewin);
}
void
EwinSetFullscreen(EWin * ewin, int on)
EwinOpFullscreen(EWin * ewin, int source __UNUSED__, int on)
{
int x, y, w, h, ww, hh;
EWin **lst;
@ -1371,6 +1377,7 @@ EwinSetFullscreen(EWin * ewin, int on)
RaiseEwin(ewin);
EwinMoveResize(ewin, x, y, w, h);
}
HintsSetWindowState(ewin);
}
@ -1579,12 +1586,13 @@ EwinOpSkipLists(EWin * ewin, int source __UNUSED__, int skip)
ewin->props.skip_ext_task = skip;
ewin->props.skip_winlist = skip;
ewin->props.skip_focuslist = skip;
EwinStateUpdate(ewin);
HintsSetWindowState(ewin);
#if ENABLE_GNOME
GNOME_SetClientList();
#endif
SnapshotEwinUpdate(ewin, SNAP_USE_SKIP_LISTS);
EwinStateUpdate(ewin);
}
#if 0 /* Unused */
@ -1592,36 +1600,37 @@ void
EwinOpSkipTask(EWin * ewin, int skip)
{
ewin->props.skip_ext_task = skip;
EwinStateUpdate(ewin);
HintsSetWindowState(ewin);
#if ENABLE_GNOME
GNOME_SetClientList();
#endif
SnapshotEwinUpdate(ewin, SNAP_USE_SKIP_LISTS);
EwinStateUpdate(ewin);
}
void
EwinOpSkipFocus(EWin * ewin, int skip)
{
ewin->props.skip_focuslist = skip;
SnapshotEwinUpdate(ewin, SNAP_USE_SKIP_LISTS);
EwinStateUpdate(ewin);
SnapshotEwinUpdate(ewin, SNAP_USE_SKIP_LISTS);
}
void
EwinOpSkipWinlist(EWin * ewin, int skip)
{
ewin->props.skip_winlist = skip;
SnapshotEwinUpdate(ewin, SNAP_USE_SKIP_LISTS);
EwinStateUpdate(ewin);
SnapshotEwinUpdate(ewin, SNAP_USE_SKIP_LISTS);
}
void
EwinOpNeverFocus(EWin * ewin, int on)
{
ewin->props.never_focus = on;
SnapshotEwinUpdate(ewin, SNAP_USE_FOCUS_NEVER);
EwinStateUpdate(ewin);
SnapshotEwinUpdate(ewin, SNAP_USE_FOCUS_NEVER);
}
#endif
@ -1695,6 +1704,7 @@ EwinOpSetLayer(EWin * ewin, int source __UNUSED__, int layer)
}
EoSetLayer(ewin, layer);
RaiseEwin(ewin);
EwinStateUpdate(ewin);
HintsSetWindowState(ewin);
SnapshotEwinUpdate(ewin, SNAP_USE_LAYER);
}
@ -1783,6 +1793,7 @@ EwinOpMoveToDesk(EWin * ewin, int source __UNUSED__, Desk * dsk, int inc)
EwinMoveToDesktop(ewin, dsk);
RaiseEwin(ewin);
EwinBorderUpdateState(ewin);
EwinStateUpdate(ewin);
HintsSetWindowState(ewin);
HintsSetWindowDesktop(ewin);
SnapshotEwinUpdate(ewin, SNAP_USE_STICKY);

View File

@ -649,19 +649,19 @@ EwinStateUpdate(EWin * ewin)
ewin->state.inhibit_move =
EwinInhGetUser(ewin, move) || ewin->state.fullscreen;
ewin->state.inhibit_resize =
EwinInhGetUser(ewin, size) || ewin->state.shaded ||
ewin->state.fullscreen;
ewin->state.inhibit_resize = ewin->state.iconified || ewin->state.shaded ||
EwinInhGetUser(ewin, size) || ewin->state.fullscreen;
ewin->state.inhibit_iconify = EwinInhGetWM(ewin, iconify);
ewin->state.inhibit_shade = ewin->state.no_border || ewin->state.fullscreen;
ewin->state.inhibit_shade = ewin->state.no_border ||
ewin->state.iconified || ewin->state.fullscreen;
ewin->state.inhibit_stick = 0;
ewin->state.inhibit_max_hor =
ewin->state.inhibit_max_hor = ewin->state.inhibit_resize ||
ewin->props.no_resize_h || ewin->state.fullscreen;
ewin->state.inhibit_max_ver =
ewin->state.inhibit_max_ver = ewin->state.inhibit_resize ||
ewin->props.no_resize_v || ewin->state.fullscreen;
ewin->state.inhibit_fullscreeen =
ewin->state.inhibit_move || ewin->state.inhibit_resize;
ewin->state.inhibit_change_desk = 0;
ewin->state.inhibit_change_desk = ewin->state.iconified;
ewin->state.inhibit_close = EwinInhGetApp(ewin, close) ||
EwinInhGetUser(ewin, close);
}
@ -783,7 +783,7 @@ AddToFamily(EWin * ewin, Window win)
if (ewin->state.fullscreen)
{
EwinSetFullscreen(ewin, 2);
EwinOpFullscreen(ewin, OPSRC_WM, 2);
ewin->state.placed = 1;
EwinMoveToDesktopAt(ewin, dsk, EoGetX(ewin), EoGetY(ewin));
ShowEwin(ewin);

View File

@ -332,7 +332,6 @@ void EwinInstantShade(EWin * ewin, int force);
void EwinInstantUnShade(EWin * ewin);
void EwinShade(EWin * ewin);
void EwinUnShade(EWin * ewin);
void EwinSetFullscreen(EWin * ewin, int on);
void EwinMoveToArea(EWin * ewin, int ax, int ay);
void EwinOpClose(EWin * ewin, int source);
@ -349,6 +348,7 @@ void EwinOpSetBorder(EWin * ewin, int source, const char *name);
void EwinOpSetOpacity(EWin * ewin, int source, int opacity);
void EwinOpMoveToDesk(EWin * ewin, int source, struct _desk *dsk,
int inc);
void EwinOpFullscreen(EWin * ewin, int source, int on);
/* finders.c */
EWin *EwinFindByPtr(const EWin * ewin);

View File

@ -49,6 +49,13 @@
#define _NET_WM_STATE_ADD 1
#define _NET_WM_STATE_TOGGLE 2
/* Source indication */
#define _NET_WM_SOURCE_UNKNOWN 0
#define _NET_WM_SOURCE_APP 1
#define _NET_WM_SOURCE_USER 2
#define OPSRC(src) (((src) == _NET_WM_SOURCE_USER) ? _NET_WM_SOURCE_USER : _NET_WM_SOURCE_APP)
#ifndef ENABLE_HINTS_GNOME
Atom _G_WIN_LAUER;
#endif
@ -789,6 +796,8 @@ void
EWMH_ProcessClientMessage(XClientMessageEvent * ev)
{
EWin *ewin;
int source;
Time ts;
/*
* The ones that don't target an application window
@ -857,23 +866,29 @@ EWMH_ProcessClientMessage(XClientMessageEvent * ev)
if (ev->message_type == ECORE_X_ATOM_NET_ACTIVE_WINDOW)
{
EwinOpActivate(ewin, OPSRC_UNKNOWN);
source = OPSRC(ev->data.l[0]);
ts = ev->data.l[1];
/* cwin = ev->data.l[2]; */
EwinOpActivate(ewin, source);
}
else if (ev->message_type == ECORE_X_ATOM_NET_CLOSE_WINDOW)
{
EwinOpClose(ewin, OPSRC_UNKNOWN);
/* ts = ev->data.l[0]; */
source = OPSRC(ev->data.l[1]);
EwinOpClose(ewin, source);
}
else if (ev->message_type == ECORE_X_ATOM_NET_WM_DESKTOP)
{
source = OPSRC(ev->data.l[1]);
if ((unsigned)ev->data.l[0] == 0xFFFFFFFF)
{
if (!EoIsSticky(ewin))
EwinOpStick(ewin, OPSRC_UNKNOWN, 1);
EwinOpStick(ewin, source, 1);
}
else
{
if (EoIsSticky(ewin))
EwinOpStick(ewin, OPSRC_UNKNOWN, 0);
EwinOpStick(ewin, source, 0);
else
EwinMoveToDesktop(ewin, DeskGet(ev->data.l[0]));
}
@ -890,6 +905,7 @@ EWMH_ProcessClientMessage(XClientMessageEvent * ev)
action = ev->data.l[0];
atom = ev->data.l[1];
atom2 = ev->data.l[2];
source = OPSRC(ev->data.l[3]);
if (atom == ECORE_X_ATOM_NET_WM_STATE_MODAL)
{
action = do_set(ewin->state.modal, action);
@ -899,12 +915,12 @@ EWMH_ProcessClientMessage(XClientMessageEvent * ev)
else if (atom == ECORE_X_ATOM_NET_WM_STATE_STICKY)
{
action = do_set(EoIsSticky(ewin), action);
EwinOpStick(ewin, OPSRC_UNKNOWN, action);
EwinOpStick(ewin, source, action);
}
else if (atom == ECORE_X_ATOM_NET_WM_STATE_SHADED)
{
action = do_set(ewin->state.shaded, action);
EwinOpShade(ewin, OPSRC_UNKNOWN, action);
EwinOpShade(ewin, source, action);
}
else if (atom == ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR)
{
@ -958,23 +974,23 @@ EWMH_ProcessClientMessage(XClientMessageEvent * ev)
if (ewin->state.fullscreen == action)
goto done;
EwinSetFullscreen(ewin, action);
EwinOpFullscreen(ewin, source, action);
}
else if (atom == ECORE_X_ATOM_NET_WM_STATE_ABOVE)
{
action = do_set(EoGetLayer(ewin) >= 6, action);
if (action)
EwinOpSetLayer(ewin, OPSRC_UNKNOWN, 6);
EwinOpSetLayer(ewin, source, 6);
else
EwinOpSetLayer(ewin, OPSRC_UNKNOWN, 4);
EwinOpSetLayer(ewin, source, 4);
}
else if (atom == ECORE_X_ATOM_NET_WM_STATE_BELOW)
{
action = do_set(EoGetLayer(ewin) <= 2, action);
if (action)
EwinOpSetLayer(ewin, OPSRC_UNKNOWN, 2);
EwinOpSetLayer(ewin, source, 2);
else
EwinOpSetLayer(ewin, OPSRC_UNKNOWN, 4);
EwinOpSetLayer(ewin, source, 4);
}
else if (atom == ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION)
{
@ -991,14 +1007,16 @@ EWMH_ProcessClientMessage(XClientMessageEvent * ev)
grav = flags & 0xf;
if (grav == 0)
grav = ewin->client.grav;
x = (flags & 0x100) ? ev->data.l[1] : EoGetX(ewin);
y = (flags & 0x200) ? ev->data.l[2] : EoGetY(ewin);
w = (flags & 0x400) ? ev->data.l[3] : ewin->client.w;
h = (flags & 0x800) ? ev->data.l[4] : ewin->client.h;
x = (flags & 0x0100) ? ev->data.l[1] : EoGetX(ewin);
y = (flags & 0x0200) ? ev->data.l[2] : EoGetY(ewin);
w = (flags & 0x0400) ? ev->data.l[3] : ewin->client.w;
h = (flags & 0x0800) ? ev->data.l[4] : ewin->client.h;
/* source = OPSRC((flags & 0xF000) >> 12); */
EwinMoveResizeWithGravity(ewin, x, y, w, h, grav);
}
else if (ev->message_type == ECORE_X_ATOM_NET_WM_MOVERESIZE)
{
/* source = OPSRC(ev->data.l[4]); */
switch (ev->data.l[2])
{
case _NET_WM_MOVERESIZE_SIZE_TOPLEFT:
@ -1023,6 +1041,11 @@ EWMH_ProcessClientMessage(XClientMessageEvent * ev)
break;
}
}
else if (ev->message_type == ECORE_X_ATOM_NET_RESTACK_WINDOW)
{
/* source = OPSRC(ev->data.l[0]); */
/* FIXME - Implement */
}
done:
;

View File

@ -639,7 +639,7 @@ IPC_WinOps(const char *params, Client * c __UNUSED__)
case EWIN_OP_FULLSCREEN:
on = ewin->state.fullscreen;
if (SetEwinBoolean(wop->name, &on, param1, 1))
EwinSetFullscreen(ewin, on);
EwinOpFullscreen(ewin, OPSRC_USER, on);
break;
case EWIN_OP_ZOOM: