1999-10-04 15:06:00 -07:00
|
|
|
/*
|
2004-01-19 14:30:35 -08:00
|
|
|
* Copyright (C) 2000-2004 Carsten Haitzler, Geoff Harrison and various contributors
|
2000-04-05 16:22:56 -07:00
|
|
|
*
|
1999-10-04 15:06:00 -07:00
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
* of this software and associated documentation files (the "Software"), to
|
|
|
|
* deal in the Software without restriction, including without limitation the
|
|
|
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
|
|
* sell copies of the Software, and to permit persons to whom the Software is
|
|
|
|
* furnished to do so, subject to the following conditions:
|
2000-04-05 16:22:56 -07:00
|
|
|
*
|
1999-10-04 15:06:00 -07:00
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
* all copies of the Software, its documentation and marketing & publicity
|
|
|
|
* materials, and acknowledgment shall be given in the documentation, materials
|
|
|
|
* and software packages that this Software was used.
|
2000-04-05 16:22:56 -07:00
|
|
|
*
|
1999-10-04 15:06:00 -07:00
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
|
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
1999-08-17 15:56:46 -07:00
|
|
|
#include "E.h"
|
|
|
|
|
2004-02-28 17:30:18 -08:00
|
|
|
#define FREE_AND_CLEAR(ptr) if (ptr) { Efree(ptr); ptr = NULL; }
|
|
|
|
|
2003-07-12 02:21:38 -07:00
|
|
|
static Atom E_XA_WM_STATE = 0;
|
|
|
|
static Atom E_XA_WM_CHANGE_STATE = 0;
|
2003-12-18 15:43:26 -08:00
|
|
|
static Atom E_XA_WM_NAME = 0;
|
|
|
|
static Atom E_XA_WM_COLORMAP_WINDOWS = 0;
|
|
|
|
static Atom E_XA_WM_DELETE_WINDOW = 0;
|
|
|
|
static Atom E_XA_WM_PROTOCOLS = 0;
|
|
|
|
static Atom E_XA_WM_SAVE_YOURSELF = 0;
|
|
|
|
static Atom E_XA_WM_TAKE_FOCUS = 0;
|
|
|
|
static Atom E_XA_WM_NORMAL_HINTS = 0;
|
|
|
|
static Atom E_XA_WM_CLASS = 0;
|
|
|
|
static Atom E_XA_WM_COMMAND = 0;
|
|
|
|
static Atom E_XA_WM_CLIENT_MACHINE = 0;
|
|
|
|
static Atom E_XA_WM_ICON_NAME = 0;
|
|
|
|
static Atom E_XA_WM_WINDOW_ROLE = 0;
|
|
|
|
static Atom E_XA_WM_HINTS = 0;
|
|
|
|
static Atom E_XA_WM_CLIENT_LEADER = 0;
|
2003-06-14 05:03:09 -07:00
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_Init(void)
|
|
|
|
{
|
2003-07-12 02:21:38 -07:00
|
|
|
E_XA_WM_STATE = XInternAtom(disp, "WM_STATE", False);
|
|
|
|
E_XA_WM_CHANGE_STATE = XInternAtom(disp, "WM_CHANGE_STATE", False);
|
2003-12-18 15:43:26 -08:00
|
|
|
E_XA_WM_NAME = XInternAtom(disp, "WM_NAME", False);
|
|
|
|
E_XA_WM_COLORMAP_WINDOWS = XInternAtom(disp, "WM_COLORMAP_WINDOWS", False);
|
|
|
|
E_XA_WM_DELETE_WINDOW = XInternAtom(disp, "WM_DELETE_WINDOW", False);
|
|
|
|
E_XA_WM_PROTOCOLS = XInternAtom(disp, "WM_PROTOCOLS", False);
|
|
|
|
E_XA_WM_SAVE_YOURSELF = XInternAtom(disp, "WM_SAVE_YOURSELF", False);
|
|
|
|
E_XA_WM_TAKE_FOCUS = XInternAtom(disp, "WM_TAKE_FOCUS", False);
|
|
|
|
E_XA_WM_NORMAL_HINTS = XInternAtom(disp, "WM_NORMAL_HINTS", False);
|
|
|
|
E_XA_WM_CLASS = XInternAtom(disp, "WM_CLASS", False);
|
|
|
|
E_XA_WM_COMMAND = XInternAtom(disp, "WM_COMMAND", False);
|
|
|
|
E_XA_WM_CLIENT_MACHINE = XInternAtom(disp, "WM_CLIENT_MACHINE", False);
|
|
|
|
E_XA_WM_ICON_NAME = XInternAtom(disp, "WM_ICON_NAME", False);
|
|
|
|
E_XA_WM_WINDOW_ROLE = XInternAtom(disp, "WM_WINDOW_ROLE", False);
|
|
|
|
E_XA_WM_HINTS = XInternAtom(disp, "WM_HINTS", False);
|
|
|
|
E_XA_WM_CLIENT_LEADER = XInternAtom(disp, "WM_CLIENT_LEADER", False);
|
2003-06-14 05:03:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_ProcessClientMessage(XClientMessageEvent * event)
|
|
|
|
{
|
|
|
|
EWin *ewin;
|
|
|
|
|
2003-07-12 02:21:38 -07:00
|
|
|
if (event->message_type == E_XA_WM_CHANGE_STATE)
|
2003-06-14 05:03:09 -07:00
|
|
|
{
|
|
|
|
ewin = FindItem(NULL, event->window, LIST_FINDBY_ID, LIST_TYPE_EWIN);
|
|
|
|
if (ewin == NULL)
|
2003-12-18 15:43:26 -08:00
|
|
|
return;
|
2003-06-14 05:03:09 -07:00
|
|
|
|
|
|
|
if (event->data.l[0] == IconicState)
|
|
|
|
{
|
|
|
|
if (!(ewin->iconified))
|
|
|
|
IconifyEwin(ewin);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
void
|
|
|
|
ICCCM_GetTitle(EWin * ewin, Atom atom_change)
|
|
|
|
{
|
|
|
|
XTextProperty xtp;
|
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_GetTitle");
|
2000-07-26 11:00:47 -07:00
|
|
|
|
2003-12-18 15:43:26 -08:00
|
|
|
if (atom_change && atom_change != E_XA_WM_NAME)
|
|
|
|
EDBUG_RETURN_;
|
|
|
|
|
2004-02-28 17:30:18 -08:00
|
|
|
if (ewin->icccm.wm_name)
|
|
|
|
Efree(ewin->icccm.wm_name);
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (XGetWMName(disp, ewin->client.win, &xtp))
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
int items;
|
|
|
|
char **list;
|
|
|
|
Status s;
|
|
|
|
|
|
|
|
if (xtp.format == 8)
|
|
|
|
{
|
|
|
|
s = XmbTextPropertyToTextList(disp, &xtp, &list, &items);
|
|
|
|
if ((s == Success) && (items > 0))
|
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_name = Estrdup(*list);
|
2003-05-22 12:15:03 -07:00
|
|
|
XFreeStringList(list);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_name = Estrdup((char *)xtp.value);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_name = Estrdup((char *)xtp.value);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
XFree(xtp.value);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
else if (!ewin->internal)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_name = Estrdup("No Title");
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
2004-02-28 17:30:18 -08:00
|
|
|
EwinChange(ewin, EWIN_CHANGE_NAME);
|
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_GetColormap(EWin * ewin)
|
|
|
|
{
|
|
|
|
XWindowAttributes xwa;
|
|
|
|
Window win, *wlist;
|
|
|
|
int num;
|
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_GetColormap");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (ewin->internal)
|
|
|
|
EDBUG_RETURN_;
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
win = ewin->client.win;
|
2003-12-18 15:43:26 -08:00
|
|
|
wlist = AtomGet(win, E_XA_WM_COLORMAP_WINDOWS, XA_WINDOW, &num);
|
1999-08-17 15:56:46 -07:00
|
|
|
if (wlist)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
win = wlist[0];
|
|
|
|
Efree(wlist);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
|
|
|
ewin->client.cmap = 0;
|
|
|
|
if (XGetWindowAttributes(disp, ewin->client.win, &xwa) && xwa.colormap)
|
|
|
|
ewin->client.cmap = xwa.colormap;
|
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_Delete(EWin * ewin)
|
|
|
|
{
|
|
|
|
XClientMessageEvent ev;
|
2003-12-18 15:43:26 -08:00
|
|
|
Atom *prop;
|
|
|
|
int num, i, del;
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_Delete");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (ewin->internal)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2004-04-07 14:50:19 -07:00
|
|
|
EUnmapWindow(disp, ewin->client.win);
|
2003-05-22 12:15:03 -07:00
|
|
|
EDBUG_RETURN_;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
del = 0;
|
2003-12-18 15:43:26 -08:00
|
|
|
if (XGetWMProtocols(disp, ewin->client.win, &prop, &num))
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
for (i = 0; i < num; i++)
|
2003-12-18 15:43:26 -08:00
|
|
|
if (prop[i] == E_XA_WM_DELETE_WINDOW)
|
2003-05-22 12:15:03 -07:00
|
|
|
del = 1;
|
|
|
|
XFree(prop);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
if (del)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ev.type = ClientMessage;
|
|
|
|
ev.window = ewin->client.win;
|
2003-12-18 15:43:26 -08:00
|
|
|
ev.message_type = E_XA_WM_PROTOCOLS;
|
2003-05-22 12:15:03 -07:00
|
|
|
ev.format = 32;
|
2003-12-18 15:43:26 -08:00
|
|
|
ev.data.l[0] = E_XA_WM_DELETE_WINDOW;
|
2003-05-22 12:15:03 -07:00
|
|
|
ev.data.l[1] = CurrentTime;
|
|
|
|
XSendEvent(disp, ewin->client.win, False, 0, (XEvent *) & ev);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
else
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
XKillClient(disp, (XID) ewin->client.win);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_Save(EWin * ewin)
|
|
|
|
{
|
|
|
|
XClientMessageEvent ev;
|
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_Save");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (ewin->internal)
|
|
|
|
EDBUG_RETURN_;
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
ev.type = ClientMessage;
|
|
|
|
ev.window = ewin->client.win;
|
2003-12-18 15:43:26 -08:00
|
|
|
ev.message_type = E_XA_WM_PROTOCOLS;
|
1999-08-17 15:56:46 -07:00
|
|
|
ev.format = 32;
|
2003-12-18 15:43:26 -08:00
|
|
|
ev.data.l[0] = E_XA_WM_SAVE_YOURSELF;
|
1999-08-17 15:56:46 -07:00
|
|
|
ev.data.l[1] = CurrentTime;
|
|
|
|
XSendEvent(disp, ewin->client.win, False, 0, (XEvent *) & ev);
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_Iconify(EWin * ewin)
|
|
|
|
{
|
2003-07-12 02:21:38 -07:00
|
|
|
unsigned long c[2] = { IconicState, 0 };
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_Iconify");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
2003-07-12 02:21:38 -07:00
|
|
|
XChangeProperty(disp, ewin->client.win, E_XA_WM_STATE, E_XA_WM_STATE,
|
|
|
|
32, PropModeReplace, (unsigned char *)c, 2);
|
1999-08-17 15:56:46 -07:00
|
|
|
AddItem(ewin, "ICON", ewin->client.win, LIST_TYPE_ICONIFIEDS);
|
2003-10-28 12:00:43 -08:00
|
|
|
EUnmapWindow(disp, ewin->client.win);
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_DeIconify(EWin * ewin)
|
|
|
|
{
|
2003-07-12 02:21:38 -07:00
|
|
|
unsigned long c[2] = { NormalState, 0 };
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_DeIconify");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
2003-07-12 02:21:38 -07:00
|
|
|
XChangeProperty(disp, ewin->client.win, E_XA_WM_STATE, E_XA_WM_STATE,
|
|
|
|
32, PropModeReplace, (unsigned char *)c, 2);
|
1999-12-06 09:12:20 -08:00
|
|
|
RemoveItem("ICON", ewin->client.win, LIST_FINDBY_BOTH, LIST_TYPE_ICONIFIEDS);
|
2003-10-28 12:00:43 -08:00
|
|
|
EMapWindow(disp, ewin->client.win);
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_MatchSize(EWin * ewin)
|
|
|
|
{
|
|
|
|
int w, h;
|
|
|
|
int i, j;
|
|
|
|
double aspect;
|
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_MatchSize");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
w = ewin->client.w;
|
|
|
|
h = ewin->client.h;
|
|
|
|
|
|
|
|
if (w < ewin->client.width.min)
|
|
|
|
w = ewin->client.width.min;
|
|
|
|
if (w > ewin->client.width.max)
|
|
|
|
w = ewin->client.width.max;
|
|
|
|
if (h < ewin->client.height.min)
|
|
|
|
h = ewin->client.height.min;
|
|
|
|
if (h > ewin->client.height.max)
|
|
|
|
h = ewin->client.height.max;
|
|
|
|
if ((w > 0) && (h > 0))
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
w -= ewin->client.base_w;
|
|
|
|
h -= ewin->client.base_h;
|
|
|
|
if ((w > 0) && (h > 0))
|
|
|
|
{
|
|
|
|
aspect = ((double)w) / ((double)h);
|
2004-03-20 07:49:05 -08:00
|
|
|
if (Mode.mode == MODE_RESIZE_H)
|
2003-05-22 12:15:03 -07:00
|
|
|
{
|
|
|
|
if (aspect < ewin->client.aspect_min)
|
|
|
|
h = (int)((double)w / ewin->client.aspect_min);
|
|
|
|
if (aspect > ewin->client.aspect_max)
|
|
|
|
h = (int)((double)w / ewin->client.aspect_max);
|
|
|
|
}
|
2004-03-20 07:49:05 -08:00
|
|
|
else if (Mode.mode == MODE_RESIZE_V)
|
2003-05-22 12:15:03 -07:00
|
|
|
{
|
|
|
|
if (aspect < ewin->client.aspect_min)
|
|
|
|
w = (int)((double)h * ewin->client.aspect_min);
|
|
|
|
if (aspect > ewin->client.aspect_max)
|
|
|
|
w = (int)((double)h * ewin->client.aspect_max);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (aspect < ewin->client.aspect_min)
|
|
|
|
w = (int)((double)h * ewin->client.aspect_min);
|
|
|
|
if (aspect > ewin->client.aspect_max)
|
|
|
|
h = (int)((double)w / ewin->client.aspect_max);
|
|
|
|
}
|
|
|
|
i = w / ewin->client.w_inc;
|
|
|
|
j = h / ewin->client.h_inc;
|
|
|
|
w = i * ewin->client.w_inc;
|
|
|
|
h = j * ewin->client.h_inc;
|
|
|
|
}
|
|
|
|
w += ewin->client.base_w;
|
|
|
|
h += ewin->client.base_h;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
ewin->client.w = w;
|
|
|
|
ewin->client.h = h;
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_Configure(EWin * ewin)
|
|
|
|
{
|
|
|
|
XEvent ev;
|
|
|
|
XWindowChanges xwc;
|
1999-11-15 08:20:08 -08:00
|
|
|
int d;
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_Configure");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-11-15 08:20:08 -08:00
|
|
|
d = ewin->desktop;
|
|
|
|
if (d < 0)
|
|
|
|
d = desks.current;
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-20 19:15:06 -07:00
|
|
|
if (ewin->shaded == 0)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
xwc.x = ewin->border->border.left;
|
|
|
|
xwc.y = ewin->border->border.top;
|
|
|
|
xwc.width = ewin->client.w;
|
|
|
|
xwc.height = ewin->client.h;
|
|
|
|
XConfigureWindow(disp, ewin->win_container,
|
|
|
|
CWX | CWY | CWWidth | CWHeight, &xwc);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-09-25 11:57:41 -07:00
|
|
|
else
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
xwc.x = -30;
|
|
|
|
xwc.y = -30;
|
|
|
|
xwc.width = 1;
|
|
|
|
xwc.height = 1;
|
|
|
|
XConfigureWindow(disp, ewin->win_container,
|
|
|
|
CWX | CWY | CWWidth | CWHeight, &xwc);
|
|
|
|
xwc.width = ewin->client.w;
|
|
|
|
xwc.height = ewin->client.h;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
xwc.x = 0;
|
|
|
|
xwc.y = 0;
|
1999-12-06 09:12:20 -08:00
|
|
|
XConfigureWindow(disp, ewin->client.win, CWX | CWY | CWWidth | CWHeight,
|
2003-05-22 12:15:03 -07:00
|
|
|
&xwc);
|
1999-08-17 15:56:46 -07:00
|
|
|
if ((ewin->menu) || (ewin->dialog))
|
|
|
|
EDBUG_RETURN_;
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
ev.type = ConfigureNotify;
|
|
|
|
ev.xconfigure.display = disp;
|
|
|
|
ev.xconfigure.event = ewin->client.win;
|
|
|
|
ev.xconfigure.window = ewin->client.win;
|
1999-11-15 08:20:08 -08:00
|
|
|
ev.xconfigure.x = desks.desk[d].x + ewin->x + ewin->border->border.left;
|
|
|
|
ev.xconfigure.y = desks.desk[d].y + ewin->y + ewin->border->border.top;
|
1999-08-17 15:56:46 -07:00
|
|
|
ev.xconfigure.width = ewin->client.w;
|
|
|
|
ev.xconfigure.height = ewin->client.h;
|
|
|
|
ev.xconfigure.border_width = 0;
|
|
|
|
ev.xconfigure.above = ewin->win;
|
|
|
|
ev.xconfigure.override_redirect = False;
|
|
|
|
XSendEvent(disp, ewin->client.win, False, StructureNotifyMask, &ev);
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-07-12 01:22:58 -07:00
|
|
|
ICCCM_AdoptStart(EWin * ewin)
|
1999-08-17 15:56:46 -07:00
|
|
|
{
|
2003-07-12 01:22:58 -07:00
|
|
|
Window win = ewin->client.win;
|
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG(6, "ICCCM_AdoptStart");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (!ewin->internal)
|
2003-07-12 01:22:58 -07:00
|
|
|
XAddToSaveSet(disp, win);
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-07-12 01:22:58 -07:00
|
|
|
ICCCM_Adopt(EWin * ewin)
|
1999-08-17 15:56:46 -07:00
|
|
|
{
|
2003-07-12 01:22:58 -07:00
|
|
|
Window win = ewin->client.win;
|
2003-07-12 02:21:38 -07:00
|
|
|
unsigned long c[2] = { 0, 0 };
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_Adopt");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (!ewin->internal)
|
2003-07-12 01:22:58 -07:00
|
|
|
XSetWindowBorderWidth(disp, win, 0);
|
1999-08-17 15:56:46 -07:00
|
|
|
EReparentWindow(disp, win, ewin->win_container, 0, 0);
|
2003-07-12 02:21:38 -07:00
|
|
|
c[0] = (ewin->client.start_iconified) ? IconicState : NormalState;
|
|
|
|
XChangeProperty(disp, win, E_XA_WM_STATE, E_XA_WM_STATE, 32, PropModeReplace,
|
|
|
|
(unsigned char *)c, 2);
|
1999-08-17 15:56:46 -07:00
|
|
|
ewin->x = ewin->client.x;
|
|
|
|
ewin->y = ewin->client.y;
|
|
|
|
ewin->reqx = ewin->client.x;
|
|
|
|
ewin->reqy = ewin->client.y;
|
1999-12-06 09:12:20 -08:00
|
|
|
ewin->w =
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->client.w + ewin->border->border.left + ewin->border->border.right;
|
1999-12-06 09:12:20 -08:00
|
|
|
ewin->h =
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->client.h + ewin->border->border.top + ewin->border->border.bottom;
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_Withdraw(EWin * ewin)
|
|
|
|
{
|
2003-07-12 02:21:38 -07:00
|
|
|
unsigned long c[2] = { WithdrawnState, 0 };
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_Withdraw");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
/* We have a choice of deleting the WM_STATE property
|
|
|
|
* or changing the value to Withdrawn. Since twm/fvwm does
|
|
|
|
* it that way, we change it to Withdrawn.
|
|
|
|
*/
|
2003-07-12 02:21:38 -07:00
|
|
|
XChangeProperty(disp, ewin->client.win, E_XA_WM_STATE, E_XA_WM_STATE,
|
|
|
|
32, PropModeReplace, (unsigned char *)c, 2);
|
2003-07-12 00:57:41 -07:00
|
|
|
XRemoveFromSaveSet(disp, ewin->client.win);
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_Cmap(EWin * ewin)
|
|
|
|
{
|
1999-10-20 08:55:01 -07:00
|
|
|
XWindowAttributes xwa;
|
|
|
|
Window *wlist = NULL;
|
|
|
|
int i, num;
|
1999-08-17 15:56:46 -07:00
|
|
|
|
1999-10-20 08:55:01 -07:00
|
|
|
EDBUG(6, "ICCCM_Cmap");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (!ewin)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2004-03-20 07:49:05 -08:00
|
|
|
if (Mode.current_cmap)
|
2003-05-22 12:15:03 -07:00
|
|
|
{
|
2004-03-20 07:49:05 -08:00
|
|
|
XUninstallColormap(disp, Mode.current_cmap);
|
|
|
|
Mode.current_cmap = 0;
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
EDBUG_RETURN_;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
if (Mode.cur_menu_mode)
|
1999-10-09 11:15:41 -07:00
|
|
|
EDBUG_RETURN_;
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-23 09:53:38 -07:00
|
|
|
ICCCM_GetColormap(ewin);
|
1999-10-20 08:55:01 -07:00
|
|
|
|
|
|
|
if (ewin->internal)
|
|
|
|
EDBUG_RETURN_;
|
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
if ((ewin->client.cmap) && (Mode.current_cmap != ewin->client.cmap))
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-12-18 15:43:26 -08:00
|
|
|
wlist =
|
|
|
|
AtomGet(ewin->client.win, E_XA_WM_COLORMAP_WINDOWS, XA_WINDOW, &num);
|
2003-05-22 12:15:03 -07:00
|
|
|
if (wlist)
|
|
|
|
{
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
|
|
|
if (XGetWindowAttributes(disp, wlist[i], &xwa))
|
|
|
|
{
|
|
|
|
if (xwa.colormap != DefaultColormap(disp, root.scr))
|
|
|
|
{
|
|
|
|
XInstallColormap(disp, xwa.colormap);
|
2004-03-20 07:49:05 -08:00
|
|
|
Mode.current_cmap = xwa.colormap;
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Efree(wlist);
|
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
XInstallColormap(disp, ewin->client.cmap);
|
2004-03-20 07:49:05 -08:00
|
|
|
Mode.current_cmap = ewin->client.cmap;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_Focus(EWin * ewin)
|
|
|
|
{
|
|
|
|
XClientMessageEvent ev;
|
2003-12-18 15:43:26 -08:00
|
|
|
Atom *prop;
|
|
|
|
int num, i, foc;
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_Focus");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (!ewin)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
XSetInputFocus(disp, root.win, RevertToPointerRoot, CurrentTime);
|
|
|
|
HintsSetActiveWindow(ewin);
|
|
|
|
EDBUG_RETURN_;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
|
|
|
foc = 0;
|
|
|
|
if (XGetWMProtocols(disp, ewin->client.win, &prop, &num))
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
for (i = 0; i < num; i++)
|
2003-12-18 15:43:26 -08:00
|
|
|
if (prop[i] == E_XA_WM_TAKE_FOCUS)
|
2003-05-22 12:15:03 -07:00
|
|
|
foc = 1;
|
|
|
|
XFree(prop);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
if (foc)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ev.type = ClientMessage;
|
|
|
|
ev.window = ewin->client.win;
|
2003-12-18 15:43:26 -08:00
|
|
|
ev.message_type = E_XA_WM_PROTOCOLS;
|
2003-05-22 12:15:03 -07:00
|
|
|
ev.format = 32;
|
2003-12-18 15:43:26 -08:00
|
|
|
ev.data.l[0] = E_XA_WM_TAKE_FOCUS;
|
2003-05-22 12:15:03 -07:00
|
|
|
ev.data.l[1] = CurrentTime;
|
|
|
|
XSendEvent(disp, ewin->client.win, False, 0, (XEvent *) & ev);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
/* else */
|
|
|
|
XSetInputFocus(disp, ewin->client.win, RevertToPointerRoot, CurrentTime);
|
2003-05-04 03:27:21 -07:00
|
|
|
HintsSetActiveWindow(ewin);
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_GetGeoms(EWin * ewin, Atom atom_change)
|
|
|
|
{
|
|
|
|
XSizeHints hint;
|
|
|
|
Window ww;
|
|
|
|
long mask;
|
1999-12-06 09:12:20 -08:00
|
|
|
unsigned int dummy, w, h, bw;
|
1999-08-17 15:56:46 -07:00
|
|
|
int x, y;
|
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_GetGeoms");
|
2000-07-26 11:00:47 -07:00
|
|
|
|
2003-12-18 15:43:26 -08:00
|
|
|
if (atom_change && atom_change != E_XA_WM_NORMAL_HINTS)
|
|
|
|
EDBUG_RETURN_;
|
|
|
|
|
1999-12-06 09:12:20 -08:00
|
|
|
EGetGeometry(disp, ewin->client.win, &ww, &x, &y, &w, &h, &bw, &dummy);
|
1999-08-17 15:56:46 -07:00
|
|
|
ewin->client.x = x;
|
|
|
|
ewin->client.y = y;
|
|
|
|
ewin->client.w = w;
|
|
|
|
ewin->client.h = h;
|
1999-12-06 09:12:20 -08:00
|
|
|
ewin->client.bw = bw;
|
1999-08-17 15:56:46 -07:00
|
|
|
if (XGetWMNormalHints(disp, ewin->client.win, &hint, &mask))
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
if (!(ewin->client.already_placed))
|
|
|
|
{
|
|
|
|
if ((hint.flags & USPosition) || ((hint.flags & PPosition)))
|
|
|
|
{
|
|
|
|
if (hint.flags & PWinGravity)
|
|
|
|
{
|
|
|
|
ewin->client.grav = hint.win_gravity;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.grav = NorthWestGravity;
|
|
|
|
}
|
|
|
|
ewin->client.x = x;
|
|
|
|
ewin->client.y = y;
|
|
|
|
if ((hint.flags & PPosition) && (!ewin->sticky))
|
|
|
|
{
|
|
|
|
int dsk;
|
|
|
|
|
|
|
|
dsk = ewin->desktop;
|
2004-03-20 07:49:05 -08:00
|
|
|
if ((dsk < 0) || (dsk >= Conf.desks.num))
|
2003-05-22 12:15:03 -07:00
|
|
|
dsk = desks.current;
|
|
|
|
ewin->client.x -= desks.desk[dsk].x;
|
|
|
|
ewin->client.y -= desks.desk[dsk].y;
|
|
|
|
if (ewin->client.x + ewin->client.w >= root.w)
|
|
|
|
{
|
|
|
|
ewin->client.x += desks.desk[dsk].x;
|
|
|
|
}
|
|
|
|
else if (ewin->client.x < 0)
|
|
|
|
{
|
|
|
|
ewin->client.x += desks.desk[dsk].x;
|
|
|
|
}
|
|
|
|
if (ewin->client.y + ewin->client.h >= root.h)
|
|
|
|
{
|
|
|
|
ewin->client.y += desks.desk[dsk].y;
|
|
|
|
}
|
|
|
|
else if (ewin->client.y < 0)
|
|
|
|
{
|
|
|
|
ewin->client.y += desks.desk[dsk].y;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ewin->client.already_placed = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.x = 0;
|
|
|
|
ewin->client.y = 0;
|
|
|
|
ewin->client.already_placed = 0;
|
|
|
|
}
|
|
|
|
if (hint.flags & PMinSize)
|
|
|
|
{
|
|
|
|
ewin->client.width.min = hint.min_width;
|
|
|
|
ewin->client.height.min = hint.min_height;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.width.min = 0;
|
|
|
|
ewin->client.height.min = 0;
|
|
|
|
}
|
|
|
|
if (hint.flags & PMaxSize)
|
|
|
|
{
|
|
|
|
ewin->client.width.max = hint.max_width;
|
|
|
|
ewin->client.height.max = hint.max_height;
|
|
|
|
if (hint.max_width < ewin->client.w)
|
|
|
|
ewin->client.width.max = ewin->client.w;
|
|
|
|
if (hint.max_height < ewin->client.h)
|
|
|
|
ewin->client.height.max = ewin->client.h;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.width.max = 65535;
|
|
|
|
ewin->client.height.max = 65535;
|
|
|
|
}
|
|
|
|
if (hint.flags & PResizeInc)
|
|
|
|
{
|
|
|
|
ewin->client.w_inc = hint.width_inc;
|
|
|
|
ewin->client.h_inc = hint.height_inc;
|
|
|
|
if (ewin->client.w_inc < 1)
|
|
|
|
ewin->client.w_inc = 1;
|
|
|
|
if (ewin->client.h_inc < 1)
|
|
|
|
ewin->client.h_inc = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.w_inc = 1;
|
|
|
|
ewin->client.h_inc = 1;
|
|
|
|
}
|
|
|
|
if (hint.flags & PAspect)
|
|
|
|
{
|
|
|
|
if ((hint.min_aspect.y > 0.0) && (hint.min_aspect.x > 0.0))
|
|
|
|
{
|
|
|
|
ewin->client.aspect_min =
|
|
|
|
((double)hint.min_aspect.x) / ((double)hint.min_aspect.y);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.aspect_min = 0.0;
|
|
|
|
}
|
|
|
|
if ((hint.max_aspect.y > 0.0) && (hint.max_aspect.x > 0.0))
|
|
|
|
{
|
|
|
|
ewin->client.aspect_max =
|
|
|
|
((double)hint.max_aspect.x) / ((double)hint.max_aspect.y);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.aspect_max = 65535.0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.aspect_min = 0.0;
|
|
|
|
ewin->client.aspect_max = 65535.0;
|
|
|
|
}
|
|
|
|
if (hint.flags & PBaseSize)
|
|
|
|
{
|
|
|
|
ewin->client.base_w = hint.base_width;
|
|
|
|
ewin->client.base_h = hint.base_height;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.base_w = ewin->client.width.min;
|
|
|
|
ewin->client.base_h = ewin->client.height.min;
|
|
|
|
}
|
|
|
|
if (ewin->client.width.min < ewin->client.base_w)
|
|
|
|
ewin->client.width.min = ewin->client.base_w;
|
|
|
|
if (ewin->client.height.min < ewin->client.base_h)
|
|
|
|
ewin->client.height.min = ewin->client.base_h;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
if (ewin->client.width.min == 0)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
if (ewin->internal)
|
|
|
|
{
|
|
|
|
ewin->client.width.min = w;
|
|
|
|
ewin->client.height.min = h;
|
|
|
|
ewin->client.width.max = w;
|
|
|
|
ewin->client.height.max = h;
|
|
|
|
}
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
ewin->client.no_resize_h = 0;
|
|
|
|
ewin->client.no_resize_v = 0;
|
|
|
|
if (ewin->client.width.min == ewin->client.width.max)
|
|
|
|
ewin->client.no_resize_h = 1;
|
|
|
|
if (ewin->client.height.min == ewin->client.height.max)
|
|
|
|
ewin->client.no_resize_v = 1;
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_GetInfo(EWin * ewin, Atom atom_change)
|
|
|
|
{
|
|
|
|
XClassHint hint;
|
|
|
|
XTextProperty xtp;
|
|
|
|
int cargc, i, size;
|
|
|
|
char **cargv, *s;
|
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_GetInfo");
|
2000-07-26 11:00:47 -07:00
|
|
|
|
2003-12-18 15:43:26 -08:00
|
|
|
if (atom_change == 0 || atom_change == E_XA_WM_CLASS)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
FREE_AND_CLEAR(ewin->icccm.wm_res_name);
|
|
|
|
FREE_AND_CLEAR(ewin->icccm.wm_res_class);
|
|
|
|
|
|
|
|
if (XGetClassHint(disp, ewin->client.win, &hint) ||
|
|
|
|
XGetClassHint(disp, ewin->client.group, &hint))
|
2003-05-22 12:15:03 -07:00
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_res_name = Estrdup(hint.res_name);
|
|
|
|
ewin->icccm.wm_res_class = Estrdup(hint.res_class);
|
2003-05-22 12:15:03 -07:00
|
|
|
XFree(hint.res_name);
|
|
|
|
XFree(hint.res_class);
|
|
|
|
}
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
|
|
|
|
2003-12-18 15:43:26 -08:00
|
|
|
if (atom_change == 0 || atom_change == E_XA_WM_COMMAND)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
FREE_AND_CLEAR(ewin->icccm.wm_command);
|
|
|
|
|
2003-05-22 12:15:03 -07:00
|
|
|
if (XGetCommand(disp, ewin->client.win, &cargv, &cargc))
|
|
|
|
{
|
|
|
|
if (cargc > 0)
|
|
|
|
{
|
|
|
|
size = strlen(cargv[0]) + 1;
|
|
|
|
s = Emalloc(size);
|
|
|
|
strcpy(s, cargv[0]);
|
|
|
|
for (i = 1; i < cargc; i++)
|
|
|
|
{
|
|
|
|
size += strlen(cargv[i]) + 1;
|
|
|
|
s = Erealloc(s, size);
|
|
|
|
strcat(s, " ");
|
|
|
|
strcat(s, cargv[i]);
|
|
|
|
}
|
|
|
|
XFreeStringList(cargv);
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_command = s;
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (XGetCommand(disp, ewin->client.group, &cargv, &cargc))
|
|
|
|
{
|
2004-03-26 13:21:47 -08:00
|
|
|
EWin *const *lst;
|
2004-03-20 07:58:46 -08:00
|
|
|
int lnum, ok = 1;
|
2003-05-22 12:15:03 -07:00
|
|
|
|
2004-04-01 14:41:22 -08:00
|
|
|
lst = EwinListGetAll(&lnum);
|
2004-03-26 13:21:47 -08:00
|
|
|
for (i = 0; i < lnum; i++)
|
2003-05-22 12:15:03 -07:00
|
|
|
{
|
2004-03-26 13:21:47 -08:00
|
|
|
if ((lst[i] != ewin)
|
|
|
|
&& (lst[i]->client.group == ewin->client.group))
|
2003-05-22 12:15:03 -07:00
|
|
|
{
|
2004-03-26 13:21:47 -08:00
|
|
|
ok = 0;
|
|
|
|
i = lnum;
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
}
|
2004-03-26 13:21:47 -08:00
|
|
|
|
2003-05-22 12:15:03 -07:00
|
|
|
if (cargc > 0)
|
|
|
|
{
|
|
|
|
if (ok)
|
|
|
|
{
|
|
|
|
size = strlen(cargv[0]) + 1;
|
|
|
|
s = Emalloc(size);
|
|
|
|
strcpy(s, cargv[0]);
|
|
|
|
for (i = 1; i < cargc; i++)
|
|
|
|
{
|
|
|
|
size += strlen(cargv[i]) + 1;
|
|
|
|
s = Erealloc(s, size);
|
|
|
|
strcat(s, " ");
|
|
|
|
strcat(s, cargv[i]);
|
|
|
|
}
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_command = s;
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
XFreeStringList(cargv);
|
|
|
|
}
|
|
|
|
}
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
|
|
|
|
2003-12-18 15:43:26 -08:00
|
|
|
if (atom_change == 0 || atom_change == E_XA_WM_CLIENT_MACHINE)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
FREE_AND_CLEAR(ewin->icccm.wm_machine);
|
|
|
|
|
|
|
|
if (XGetWMClientMachine(disp, ewin->client.win, &xtp) ||
|
|
|
|
XGetWMClientMachine(disp, ewin->client.group, &xtp))
|
2003-05-22 12:15:03 -07:00
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_machine = Estrdup((char *)xtp.value);
|
2003-05-22 12:15:03 -07:00
|
|
|
XFree(xtp.value);
|
|
|
|
}
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
|
|
|
|
2003-12-18 15:43:26 -08:00
|
|
|
if (atom_change == 0 || atom_change == E_XA_WM_ICON_NAME)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
FREE_AND_CLEAR(ewin->icccm.wm_icon_name);
|
2003-05-22 12:15:03 -07:00
|
|
|
|
2004-02-28 17:30:18 -08:00
|
|
|
if (XGetWMIconName(disp, ewin->client.win, &xtp) ||
|
|
|
|
XGetWMIconName(disp, ewin->client.group, &xtp))
|
2003-05-22 12:15:03 -07:00
|
|
|
{
|
|
|
|
if (xtp.encoding == XA_STRING)
|
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_icon_name = Estrdup((char *)xtp.value);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
char **cl;
|
|
|
|
Status status;
|
|
|
|
int n;
|
|
|
|
|
|
|
|
status = XmbTextPropertyToTextList(disp, &xtp, &cl, &n);
|
|
|
|
if (status >= Success && n > 0 && cl[0])
|
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_icon_name = Estrdup(cl[0]);
|
2003-05-22 12:15:03 -07:00
|
|
|
XFreeStringList(cl);
|
|
|
|
}
|
|
|
|
else
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_icon_name = Estrdup((char *)xtp.value);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
XFree(xtp.value);
|
|
|
|
}
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
|
|
|
|
2003-12-18 15:43:26 -08:00
|
|
|
if (atom_change == 0 || atom_change == E_XA_WM_WINDOW_ROLE)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
FREE_AND_CLEAR(ewin->icccm.wm_role);
|
|
|
|
|
2003-12-18 15:43:26 -08:00
|
|
|
s = AtomGet(ewin->client.win, E_XA_WM_WINDOW_ROLE, XA_STRING, &size);
|
2003-05-22 12:15:03 -07:00
|
|
|
if (s)
|
|
|
|
{
|
2004-02-28 17:30:18 -08:00
|
|
|
ewin->icccm.wm_role = Estrndup(s, size);
|
2003-12-18 15:43:26 -08:00
|
|
|
Efree(s);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
2000-02-28 10:08:25 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
void
|
|
|
|
ICCCM_GetHints(EWin * ewin, Atom atom_change)
|
|
|
|
{
|
2003-12-18 15:43:26 -08:00
|
|
|
XWMHints *hint;
|
1999-08-17 15:56:46 -07:00
|
|
|
Window w;
|
2003-12-18 15:43:26 -08:00
|
|
|
Atom *prop;
|
2003-12-11 13:13:50 -08:00
|
|
|
Window *cleader;
|
2003-12-18 15:43:26 -08:00
|
|
|
int i, num;
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_GetHints");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (ewin->internal)
|
|
|
|
EDBUG_RETURN_;
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
MWM_GetHints(ewin, atom_change);
|
2000-07-26 11:00:47 -07:00
|
|
|
|
2003-12-18 15:43:26 -08:00
|
|
|
hint = NULL;
|
|
|
|
if (atom_change == 0 || atom_change == E_XA_WM_HINTS)
|
1999-08-17 15:56:46 -07:00
|
|
|
hint = XGetWMHints(disp, ewin->client.win);
|
|
|
|
if (hint)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
/* I have to make sure the thing i'm docking is a dock app */
|
|
|
|
if ((hint->flags & StateHint)
|
|
|
|
&& (hint->initial_state == WithdrawnState))
|
|
|
|
{
|
|
|
|
if (hint->flags & (StateHint | IconWindowHint | IconPositionHint |
|
|
|
|
WindowGroupHint))
|
|
|
|
{
|
|
|
|
if ((hint->icon_x == 0) && (hint->icon_y == 0)
|
|
|
|
&& hint->window_group == ewin->client.win)
|
|
|
|
ewin->docked = 1;
|
|
|
|
}
|
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
2003-05-22 12:15:03 -07:00
|
|
|
if (hint->flags & InputHint)
|
|
|
|
{
|
|
|
|
if (hint->input)
|
|
|
|
{
|
|
|
|
ewin->client.need_input = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.need_input = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.need_input = 1;
|
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
2003-05-22 12:15:03 -07:00
|
|
|
if (hint->flags & StateHint)
|
|
|
|
{
|
|
|
|
if (hint->initial_state == IconicState)
|
|
|
|
{
|
|
|
|
ewin->client.start_iconified = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.start_iconified = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.start_iconified = 0;
|
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
2003-05-22 12:15:03 -07:00
|
|
|
if (hint->flags & IconPixmapHint)
|
|
|
|
{
|
|
|
|
ewin->client.icon_pmap = hint->icon_pixmap;
|
2004-02-28 17:30:18 -08:00
|
|
|
EwinChange(ewin, EWIN_CHANGE_ICON_PMAP);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.icon_pmap = 0;
|
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
2003-05-22 12:15:03 -07:00
|
|
|
if (hint->flags & IconMaskHint)
|
|
|
|
{
|
|
|
|
ewin->client.icon_mask = hint->icon_mask;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.icon_mask = 0;
|
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
2003-05-22 12:15:03 -07:00
|
|
|
if (hint->flags & IconWindowHint)
|
|
|
|
{
|
|
|
|
ewin->client.icon_win = hint->icon_window;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.icon_win = 0;
|
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
2003-05-22 12:15:03 -07:00
|
|
|
if (hint->flags & WindowGroupHint)
|
|
|
|
{
|
|
|
|
ewin->client.group = hint->window_group;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.group = 0;
|
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
2003-05-22 12:15:03 -07:00
|
|
|
XFree(hint);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
|
|
|
|
2003-12-18 15:43:26 -08:00
|
|
|
if (atom_change == 0 || atom_change == E_XA_WM_PROTOCOLS)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
if (XGetWMProtocols(disp, ewin->client.win, &prop, &num))
|
|
|
|
{
|
2003-12-18 15:43:26 -08:00
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
if (prop[i] == E_XA_WM_TAKE_FOCUS)
|
|
|
|
ewin->client.need_input = 1;
|
|
|
|
XFree(prop);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (!ewin->client.need_input)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->skipfocus = 1;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (XGetTransientForHint(disp, ewin->client.win, &w))
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->client.transient = 1;
|
|
|
|
ewin->client.transient_for = w;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
else
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->client.transient = 0;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (ewin->client.group == ewin->client.win)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->client.is_group_leader = 1;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
else
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->client.is_group_leader = 0;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
|
|
|
|
2003-12-18 15:43:26 -08:00
|
|
|
if (atom_change == 0 || atom_change == E_XA_WM_CLIENT_LEADER)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-12-18 15:43:26 -08:00
|
|
|
cleader =
|
|
|
|
AtomGet(ewin->client.win, E_XA_WM_CLIENT_LEADER, XA_WINDOW, &num);
|
2003-05-22 12:15:03 -07:00
|
|
|
if (cleader)
|
|
|
|
{
|
|
|
|
ewin->client.client_leader = *cleader;
|
|
|
|
if (!ewin->client.group)
|
|
|
|
ewin->client.group = *cleader;
|
2003-12-18 15:43:26 -08:00
|
|
|
Efree(cleader);
|
2003-05-22 12:15:03 -07:00
|
|
|
}
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_GetShapeInfo(EWin * ewin)
|
|
|
|
{
|
|
|
|
XRectangle *rl = NULL;
|
|
|
|
int rn = 0, ord;
|
|
|
|
int x, y;
|
|
|
|
unsigned int w, h, d;
|
|
|
|
Window rt;
|
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_GetShapeInfo");
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
GrabX();
|
|
|
|
EGetGeometry(disp, ewin->client.win, &rt, &x, &y, &w, &h, &d, &d);
|
|
|
|
rl = EShapeGetRectangles(disp, ewin->client.win, ShapeBounding, &rn, &ord);
|
|
|
|
UngrabX();
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (rn < 1)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->client.shaped = 0;
|
|
|
|
EShapeCombineMask(disp, ewin->win_container, ShapeBounding, 0, 0, None,
|
|
|
|
ShapeSet);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
else if (rn == 1)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
if ((rl[0].x <= 0) && (rl[0].y <= 0) && (rl[0].width >= w)
|
|
|
|
&& (rl[0].height >= h))
|
|
|
|
{
|
|
|
|
ewin->client.shaped = 0;
|
|
|
|
EShapeCombineMask(disp, ewin->win_container, ShapeBounding, 0, 0,
|
|
|
|
None, ShapeSet);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->client.shaped = 1;
|
|
|
|
EShapeCombineShape(disp, ewin->win_container, ShapeBounding, 0, 0,
|
|
|
|
ewin->client.win, ShapeBounding, ShapeSet);
|
|
|
|
}
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
else
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
ewin->client.shaped = 1;
|
|
|
|
EShapeCombineShape(disp, ewin->win_container, ShapeBounding, 0, 0,
|
|
|
|
ewin->client.win, ShapeBounding, ShapeSet);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-09-01 16:09:20 -07:00
|
|
|
if (rl)
|
1999-08-17 15:56:46 -07:00
|
|
|
XFree(rl);
|
2003-12-18 15:43:26 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_SetIconSizes()
|
|
|
|
{
|
|
|
|
XIconSize *is;
|
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_SetIconSizes");
|
|
|
|
is = XAllocIconSize();
|
|
|
|
is->min_width = 8;
|
|
|
|
is->min_height = 8;
|
|
|
|
is->max_width = 48;
|
|
|
|
is->max_height = 48;
|
|
|
|
is->width_inc = 1;
|
|
|
|
is->height_inc = 1;
|
|
|
|
XSetIconSizes(disp, root.win, is, 1);
|
|
|
|
XFree(is);
|
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_SetEInfo(EWin * ewin)
|
|
|
|
{
|
1999-09-03 14:44:07 -07:00
|
|
|
static Atom a = 0, aa = 0;
|
|
|
|
CARD32 c[8];
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_SetEInfo");
|
|
|
|
if (ewin->internal)
|
|
|
|
EDBUG_RETURN_;
|
|
|
|
if (!a)
|
|
|
|
a = XInternAtom(disp, "ENL_INTERNAL_DATA", False);
|
1999-09-03 14:44:07 -07:00
|
|
|
if (!aa)
|
|
|
|
aa = XInternAtom(disp, "ENL_INTERNAL_DATA_BORDER", False);
|
1999-08-17 15:56:46 -07:00
|
|
|
c[0] = ewin->desktop;
|
|
|
|
c[1] = ewin->sticky;
|
|
|
|
c[2] = ewin->x;
|
|
|
|
c[3] = ewin->y;
|
|
|
|
c[4] = ewin->iconified;
|
|
|
|
if (ewin->iconified)
|
|
|
|
ICCCM_DeIconify(ewin);
|
|
|
|
c[5] = ewin->shaded;
|
|
|
|
c[6] = ewin->client.w;
|
|
|
|
c[7] = ewin->client.h;
|
2000-06-04 12:45:55 -07:00
|
|
|
XChangeProperty(disp, ewin->client.win, a, XA_CARDINAL, 32, PropModeReplace,
|
2003-05-22 12:15:03 -07:00
|
|
|
(unsigned char *)c, 9);
|
1999-09-03 14:44:07 -07:00
|
|
|
XChangeProperty(disp, ewin->client.win, aa, XA_STRING, 8, PropModeReplace,
|
2003-05-22 12:15:03 -07:00
|
|
|
(unsigned char *)ewin->border->name,
|
|
|
|
strlen(ewin->border->name) + 1);
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_SetMainEInfo(void)
|
|
|
|
{
|
|
|
|
Atom a;
|
|
|
|
int i;
|
|
|
|
CARD32 cc[ENLIGHTENMENT_CONF_NUM_DESKTOPS * 2];
|
|
|
|
|
|
|
|
for (i = 0; i < ENLIGHTENMENT_CONF_NUM_DESKTOPS; i++)
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
cc[(i * 2)] = desks.desk[i].current_area_x;
|
|
|
|
cc[(i * 2) + 1] = desks.desk[i].current_area_y;
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
a = XInternAtom(disp, "ENL_INTERNAL_AREA_DATA", False);
|
|
|
|
XChangeProperty(disp, root.win, a, XA_CARDINAL, 32, PropModeReplace,
|
2003-05-22 12:15:03 -07:00
|
|
|
(unsigned char *)cc, ENLIGHTENMENT_CONF_NUM_DESKTOPS * 2);
|
1999-08-17 15:56:46 -07:00
|
|
|
a = XInternAtom(disp, "ENL_INTERNAL_DESK_DATA", False);
|
|
|
|
XChangeProperty(disp, root.win, a, XA_CARDINAL, 32, PropModeReplace,
|
2003-05-22 12:15:03 -07:00
|
|
|
(unsigned char *)(&desks.current), 1);
|
1999-08-17 15:56:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ICCCM_GetMainEInfo(void)
|
|
|
|
{
|
|
|
|
Atom a, a2;
|
2003-12-11 13:13:50 -08:00
|
|
|
CARD32 *c;
|
1999-08-17 15:56:46 -07:00
|
|
|
unsigned long lnum, ldummy;
|
|
|
|
int num, dummy, i;
|
2003-12-11 13:13:50 -08:00
|
|
|
unsigned char *puc;
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
a = XInternAtom(disp, "ENL_INTERNAL_AREA_DATA", False);
|
2003-12-11 13:13:50 -08:00
|
|
|
puc = NULL;
|
2000-07-28 10:23:35 -07:00
|
|
|
XGetWindowProperty(disp, root.win, a, 0, 10, False, XA_CARDINAL, &a2,
|
2003-12-11 13:13:50 -08:00
|
|
|
&dummy, &lnum, &ldummy, &puc);
|
|
|
|
c = (CARD32 *) puc;
|
1999-08-17 15:56:46 -07:00
|
|
|
num = (int)lnum;
|
|
|
|
if ((num > 0) && (c))
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
for (i = 0; i < (num / 2); i++)
|
|
|
|
{
|
|
|
|
if (i < ENLIGHTENMENT_CONF_NUM_DESKTOPS)
|
|
|
|
{
|
|
|
|
desks.desk[i].current_area_x = c[(i * 2)];
|
|
|
|
desks.desk[i].current_area_y = c[(i * 2) + 1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
XFree(c);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
a = XInternAtom(disp, "ENL_INTERNAL_DESK_DATA", False);
|
2003-12-11 13:13:50 -08:00
|
|
|
puc = NULL;
|
2000-07-28 10:23:35 -07:00
|
|
|
XGetWindowProperty(disp, root.win, a, 0, 10, False, XA_CARDINAL, &a2,
|
2003-12-11 13:13:50 -08:00
|
|
|
&dummy, &lnum, &ldummy, &puc);
|
|
|
|
c = (CARD32 *) puc;
|
1999-08-17 15:56:46 -07:00
|
|
|
num = (int)lnum;
|
|
|
|
if ((num > 0) && (c))
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2003-05-22 12:15:03 -07:00
|
|
|
GotoDesktop(*c);
|
|
|
|
XFree(c);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
ICCCM_GetEInfo(EWin * ewin)
|
|
|
|
{
|
1999-09-03 14:44:07 -07:00
|
|
|
static Atom a = 0, aa = 0;
|
1999-08-17 15:56:46 -07:00
|
|
|
Atom a2;
|
2003-12-11 13:13:50 -08:00
|
|
|
CARD32 *c;
|
|
|
|
char *str;
|
1999-08-17 15:56:46 -07:00
|
|
|
unsigned long lnum, ldummy;
|
|
|
|
int num, dummy;
|
2003-12-11 13:13:50 -08:00
|
|
|
unsigned char *puc;
|
1999-08-17 15:56:46 -07:00
|
|
|
|
|
|
|
EDBUG(6, "ICCCM_GetEInfo");
|
|
|
|
if (ewin->internal)
|
|
|
|
EDBUG_RETURN(0);
|
2003-12-11 13:13:50 -08:00
|
|
|
|
1999-08-17 15:56:46 -07:00
|
|
|
if (!a)
|
|
|
|
a = XInternAtom(disp, "ENL_INTERNAL_DATA", False);
|
1999-09-03 14:44:07 -07:00
|
|
|
if (!aa)
|
|
|
|
aa = XInternAtom(disp, "ENL_INTERNAL_DATA_BORDER", False);
|
2003-12-11 13:13:50 -08:00
|
|
|
|
|
|
|
puc = NULL;
|
2000-06-04 12:45:55 -07:00
|
|
|
XGetWindowProperty(disp, ewin->client.win, a, 0, 10, True, XA_CARDINAL, &a2,
|
2003-12-11 13:13:50 -08:00
|
|
|
&dummy, &lnum, &ldummy, &puc);
|
|
|
|
c = (CARD32 *) puc;
|
1999-08-17 15:56:46 -07:00
|
|
|
num = (int)lnum;
|
1999-09-03 14:44:07 -07:00
|
|
|
if ((num >= 8) && (c))
|
2000-07-26 11:00:47 -07:00
|
|
|
{
|
2004-03-20 07:49:05 -08:00
|
|
|
if (Mode.startup)
|
2003-05-22 12:15:03 -07:00
|
|
|
{
|
|
|
|
ewin->desktop = c[0];
|
|
|
|
ewin->sticky = c[1];
|
|
|
|
ewin->client.x = c[2];
|
|
|
|
ewin->client.y = c[3];
|
|
|
|
ewin->iconified = c[4];
|
|
|
|
ewin->shaded = c[5];
|
|
|
|
if (ewin->sticky)
|
|
|
|
ewin->desktop = -1;
|
|
|
|
if (ewin->iconified)
|
|
|
|
{
|
|
|
|
ewin->client.start_iconified = 1;
|
|
|
|
ewin->iconified = 0;
|
|
|
|
}
|
|
|
|
ewin->client.already_placed = 1;
|
|
|
|
if (num >= 9)
|
|
|
|
{
|
|
|
|
ewin->client.w = c[6];
|
|
|
|
ewin->client.h = c[7];
|
|
|
|
}
|
2003-12-27 11:20:15 -08:00
|
|
|
XFree(c);
|
2003-12-11 13:13:50 -08:00
|
|
|
|
|
|
|
puc = NULL;
|
2003-05-22 12:15:03 -07:00
|
|
|
XGetWindowProperty(disp, ewin->client.win, aa, 0, 0xffff, True,
|
2003-12-11 13:13:50 -08:00
|
|
|
XA_STRING, &a2, &dummy, &lnum, &ldummy, &puc);
|
|
|
|
str = (char *)puc;
|
2003-05-22 12:15:03 -07:00
|
|
|
num = (int)lnum;
|
|
|
|
if ((num > 0) && (str))
|
2003-12-27 11:20:15 -08:00
|
|
|
EwinSetBorderByName(ewin, str, 0);
|
2003-05-22 12:15:03 -07:00
|
|
|
XFree(str);
|
|
|
|
}
|
|
|
|
EDBUG_RETURN(1);
|
2000-07-26 11:00:47 -07:00
|
|
|
}
|
1999-08-17 15:56:46 -07:00
|
|
|
EDBUG_RETURN(0);
|
|
|
|
}
|