Enlightenment CVS committal
Author : kwo
Project : e16
Module : e
Dir : e16/e/src
Modified Files:
E.h borders.c dialog.c events.c ewins.c hints.c menus.c
setup.c x.c
Log Message:
Attempt to improve badly behaving client handling.
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v
retrieving revision 1.347
retrieving revision 1.348
diff -u -3 -r1.347 -r1.348
--- E.h 22 Jan 2005 11:32:57 -0000 1.347
+++ E.h 23 Jan 2005 18:23:04 -0000 1.348
@@ -1270,9 +1270,8 @@
int txa, int typ, int tya, int borigin,
int bxp, int bxa, int byp, int bya,
char keep_for_shade);
-void BorderIncRefcount(const Border * b);
-void BorderDecRefcount(const Border * b);
void EwinBorderSelect(EWin * ewin);
+void EwinBorderDetach(EWin * ewin);
void EwinBorderSetTo(EWin * ewin, const Border * b);
void EwinBorderDraw(EWin * ewin, int do_shape, int queue_off);
void EwinBorderCalcSizes(EWin * ewin);
@@ -1593,7 +1592,6 @@
#define EWIN_CHANGE_DESKTOP (1<<3)
#define EWIN_CHANGE_LAYER (1<<4)
-void EwinGetPosition(const EWin * ewin, int *px, int *py);
void EwinRefresh(EWin * ewin);
void EwinUpdateAfterMoveResize(EWin * ewin, int resize);
void FloatEwin(EWin * ewin);
@@ -1610,11 +1608,10 @@
void SetContextEwin(EWin * ewin);
void EwinDetermineArea(EWin * ewin);
void EwinPropagateShapes(EWin * ewin);
-void AddToFamily(Window win);
+void AddToFamily(EWin * ewin, Window win);
EWin *AddInternalToFamily(Window win, const char *bname, int
type,
void *ptr,
void (*init) (EWin * ewin, void *ptr));
-void EwinWithdraw(EWin * ewin);
void EwinConformToDesktop(EWin * ewin);
void EwinReparent(EWin * ewin, Window parent);
void SyncBorderToEwin(EWin * ewin);
@@ -2275,6 +2272,7 @@
int GetWinDepth(Window win);
Window GetWinParent(Window win);
int WinExists(Window win);
+Window WinGetParent(Window win);
Window WindowAtXY_0(Window base, int bx, int by, int x, int y);
Window WindowAtXY(int x, int y);
Bool PointerAt(int *x, int *y);
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/borders.c,v
retrieving revision 1.242
retrieving revision 1.243
diff -u -3 -r1.242 -r1.243
--- borders.c 9 Jan 2005 22:35:59 -0000 1.242
+++ borders.c 23 Jan 2005 18:23:04 -0000 1.243
@@ -484,6 +484,18 @@
EDBUG_RETURN_;
}
+static void
+BorderIncRefcount(const Border * b)
+{
+ ((Border *) b)->ref_count++;
+}
+
+static void
+BorderDecRefcount(const Border * b)
+{
+ ((Border *) b)->ref_count--;
+}
+
void
EwinBorderSelect(EWin * ewin)
{
@@ -516,10 +528,34 @@
}
void
+EwinBorderDetach(EWin * ewin)
+{
+ const Border *b = ewin->border;
+ int i;
+
+ if (!b)
+ return;
+
+ EventCallbackUnregister(EoGetWin(ewin), 0, BorderFrameHandleEvents, ewin);
+ for (i = 0; i < b->num_winparts; i++)
+ {
+ EventCallbackUnregister(ewin->bits[i].win, 0,
+ BorderWinpartHandleEvents, &ewin->bits[i]);
+ if (ewin->bits[i].win)
+ EDestroyWindow(disp, ewin->bits[i].win);
+ }
+ if (ewin->bits)
+ Efree(ewin->bits);
+ ewin->bits = NULL;
+ BorderDecRefcount(b);
+
+ ewin->border = NULL;
+}
+
+void
EwinBorderSetTo(EWin * ewin, const Border * b)
{
int i;
- int px = 0, py = 0;
char s[1024];
AwaitIclass *await;
@@ -536,23 +572,7 @@
}
if (ewin->border)
- {
- EventCallbackUnregister(EoGetWin(ewin), 0, BorderFrameHandleEvents,
- ewin);
- px = ewin->border->border.left;
- py = ewin->border->border.top;
- for (i = 0; i < ewin->border->num_winparts; i++)
- {
- EventCallbackUnregister(ewin->bits[i].win, 0,
- BorderWinpartHandleEvents, &ewin->bits[i]);
- if (ewin->bits[i].win)
- EDestroyWindow(disp, ewin->bits[i].win);
- }
- if (ewin->bits)
- Efree(ewin->bits);
- ewin->bits = NULL;
- BorderDecRefcount(ewin->border);
- }
+ EwinBorderDetach(ewin);
ewin->border = b;
BorderIncRefcount(b);
@@ -814,18 +834,6 @@
}
void
-BorderIncRefcount(const Border * b)
-{
- ((Border *) b)->ref_count++;
-}
-
-void
-BorderDecRefcount(const Border * b)
-{
- ((Border *) b)->ref_count--;
-}
-
-void
EwinBorderMinShadeSize(EWin * ewin, int *mw, int *mh)
{
int i, pw, ph, w, h, min_w, min_h;
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/dialog.c,v
retrieving revision 1.95
retrieving revision 1.96
diff -u -3 -r1.95 -r1.96
--- dialog.c 13 Jan 2005 20:12:22 -0000 1.95
+++ dialog.c 23 Jan 2005 18:23:04 -0000 1.96
@@ -594,10 +594,10 @@
if (!d)
return;
- EUnmapWindow(disp, d->win);
-
if (d->exit_func)
d->exit_func(d, d->exit_val, NULL);
+
+ EUnmapWindow(disp, d->win);
}
DItem *
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/events.c,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -3 -r1.72 -r1.73
--- events.c 9 Jan 2005 22:36:00 -0000 1.72
+++ events.c 23 Jan 2005 18:23:04 -0000 1.73
@@ -351,14 +351,6 @@
EUnregisterWindow(ev->xdestroywindow.window);
break;
#endif
-
- case MapRequest: /* 20 */
- /* This is to catch badly behaving client window re-mappings */
- /* Firefox-1.0 unmap/maps during fullscreen toggle without waiting for
reparent or state */
- if (!FindItem
- (NULL, ev->xmaprequest.window, LIST_FINDBY_ID, LIST_TYPE_EWIN))
- AddToFamily(ev->xmaprequest.window);
- break;
}
EDBUG_RETURN_;
@@ -904,8 +896,9 @@
ev->xcreatewindow.window);
break;
case ReparentNotify:
- Eprintf("%#08lx EV-%s ev=%#lx win=%#lx parent=%#lx\n", ser, name, win,
- ev->xreparent.window, ev->xreparent.parent);
+ Eprintf("%#08lx EV-%s ev=%#lx win=%#lx parent=%#lx %d+%d\n", ser, name,
+ win, ev->xreparent.window, ev->xreparent.parent,
+ ev->xreparent.x, ev->xreparent.y);
break;
case ConfigureNotify:
Eprintf
@@ -916,8 +909,8 @@
break;
case ConfigureRequest:
Eprintf
- ("%#08lx EV-%s: win=%#lx parent=%#lx m=%#lx %d+%d %dx%d bw=%d
above=%#lx stk=%d\n",
- ser, name, ev->xconfigurerequest.window, win,
+ ("%#08lx EV-%s: ev=%#lx win=%#lx m=%#lx %d+%d %dx%d bw=%d above=%#lx
stk=%d\n",
+ ser, name, win, ev->xconfigurerequest.window,
ev->xconfigurerequest.value_mask, ev->xconfigurerequest.x,
ev->xconfigurerequest.y, ev->xconfigurerequest.width,
ev->xconfigurerequest.height, ev->xconfigurerequest.border_width,
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/ewins.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -3 -r1.10 -r1.11
--- ewins.c 22 Jan 2005 11:32:57 -0000 1.10
+++ ewins.c 23 Jan 2005 18:23:04 -0000 1.11
@@ -62,8 +62,6 @@
EWin *ewin;
XSetWindowAttributes att;
- EDBUG(5, "EwinCreate");
-
ewin = Ecalloc(1, sizeof(EWin));
ewin->type = type;
@@ -148,7 +146,13 @@
ModulesSignal(ESIGNAL_EWIN_CREATE, ewin);
- EDBUG_RETURN(ewin);
+ return ewin;
+}
+
+static void
+EwinCleanup(EWin * ewin)
+{
+ EwinBorderDetach(ewin);
}
static void
@@ -157,9 +161,8 @@
EWin **lst;
int i, num;
- EDBUG(5, "FreeEwin");
if (!ewin)
- EDBUG_RETURN_;
+ return;
if (EventDebug(EDBUG_TYPE_EWINS))
Eprintf("EwinDestroy %#lx %s state=%d\n", ewin->client.win,
@@ -169,6 +172,9 @@
ECompMgrWinDel(&ewin->o, True, False);
RemoveItem(NULL, ewin->client.win, LIST_FINDBY_ID, LIST_TYPE_EWIN);
+ EventCallbackUnregister(EoGetWin(ewin), 0, EwinHandleEventsToplevel, ewin);
+ EventCallbackUnregister(ewin->win_container, 0, EwinHandleEventsContainer,
+ ewin);
EventCallbackUnregister(ewin->client.win, 0, EwinHandleEventsClient, ewin);
if (!EwinIsInternal(ewin))
EUnregisterWindow(ewin->client.win);
@@ -176,8 +182,6 @@
EobjListStackDel(&ewin->o);
EobjListFocusDel(&ewin->o);
- XSelectInput(disp, ewin->client.win, 0);
-
HintsSetClientList();
UnmatchEwinToSnapInfo(ewin);
@@ -194,8 +198,8 @@
if (lst)
Efree(lst);
- if (ewin->border)
- BorderDecRefcount(ewin->border);
+ EwinCleanup(ewin);
+
if (ewin->icccm.wm_name)
Efree(ewin->icccm.wm_name);
if (ewin->icccm.wm_res_class)
@@ -230,8 +234,6 @@
}
GroupsEwinRemove(ewin);
Efree(ewin);
-
- EDBUG_RETURN_;
}
void
@@ -240,8 +242,6 @@
char dofloat = 0;
int desk, x, y, w, h, xd, yd;
- EDBUG(5, "DetermineEwinFloat");
-
desk = EoGetDesk(ewin);
x = EoGetX(ewin);
y = EoGetY(ewin);
@@ -283,7 +283,6 @@
if (dofloat)
FloatEwinAt(ewin, x + xd, y + yd);
}
- EDBUG_RETURN_;
}
EWin *
@@ -293,12 +292,10 @@
int dum, x, y;
unsigned int mr;
- EDBUG(5, "GetEwinByCurrentPointer");
-
XQueryPointer(disp, DeskGetWin(DesksGetCurrent()), &rt, &ch, &x, &y, &dum,
&dum, &mr);
- EDBUG_RETURN(FindEwinByBase(ch));
+ return FindEwinByBase(ch);
}
EWin *
@@ -309,8 +306,6 @@
EWin *const *lst, *ewin;
int i, num;
- EDBUG(5, "GetEwinPointerInClient");
-
desk = DesktopAt(Mode.x, Mode.y);
XQueryPointer(disp, DeskGetWin(desk), &rt, &ch, &dum, &dum, &px, &py,
(unsigned int *)&dum);
@@ -329,17 +324,16 @@
h = EoGetH(ewin);
if ((px >= x) && (py >= y) && (px < (x + w)) && (py < (y + h)) &&
EwinIsMapped(ewin))
- EDBUG_RETURN(ewin);
+ return ewin;
}
- EDBUG_RETURN(NULL);
+ return NULL;
}
EWin *
GetFocusEwin(void)
{
- EDBUG(4, "GetFocusEwin");
- EDBUG_RETURN(Mode.focuswin);
+ return Mode.focuswin;
}
EWin *
@@ -350,7 +344,7 @@
#if 0
ewin = Mode.mouse_over_ewin;
if (ewin && ewin->type != EWIN_TYPE_MENU)
- EDBUG_RETURN(ewin);
+ return ewin;
#endif
ewin = Mode.context_ewin;
@@ -388,8 +382,6 @@
{
int ax, ay;
- EDBUG(4, "EwinDetermineArea");
-
DeskGetArea(EoGetDesk(ewin), &ax, &ay);
ax = (EoGetX(ewin) + (EoGetW(ewin) / 2) + (ax * VRoot.w)) / VRoot.w;
ay = (EoGetY(ewin) + (EoGetH(ewin) / 2) + (ay * VRoot.h)) / VRoot.h;
@@ -402,14 +394,12 @@
ewin->area_y = ay;
HintsSetWindowArea(ewin);
}
-
- EDBUG_RETURN_;
}
/*
* Derive frame window position from client window and border properties
*/
-void
+static void
EwinGetPosition(const EWin * ewin, int *px, int *py)
{
int x, y, bw, frame_lr, frame_tb;
@@ -506,18 +496,16 @@
{
/* We must reparent after getting original window position */
EReparentWindow(disp, ewin->client.win, ewin->win_container, 0, 0);
- XMoveWindow(disp, ewin->client.win, 0, 0);
ICCCM_Adopt(ewin);
}
static EWin *
-Adopt(Window win)
+Adopt(EWin * ewin, Window win)
{
- EWin *ewin;
-
- EDBUG(4, "Adopt");
-
- ewin = EwinCreate(win, EWIN_TYPE_NORMAL);
+ if (ewin)
+ EwinCleanup(ewin);
+ else
+ ewin = EwinCreate(win, EWIN_TYPE_NORMAL);
ICCCM_AdoptStart(ewin);
ICCCM_GetTitle(ewin, 0);
@@ -554,7 +542,7 @@
Eprintf("Adopt %#lx %s state=%d\n", ewin->client.win,
EwinGetName(ewin), ewin->state);
- EDBUG_RETURN(ewin);
+ return ewin;
}
static EWin *
@@ -562,8 +550,6 @@
{
EWin *ewin;
- EDBUG(4, "AdoptInternal");
-
ewin = EwinCreate(win, type);
ewin->border = border;
@@ -631,55 +617,28 @@
HintsSetWindowState(ewin);
HintsSetClientList();
- EDBUG_RETURN(ewin);
+ return ewin;
}
void
-AddToFamily(Window win)
+AddToFamily(EWin * ewin, Window win)
{
- EWin *ewin, *ewin2;
+ EWin *ewin2;
EWin **lst;
- int i, k, num, speed, fx, fy, x, y, desk;
+ int i, k, num, fx, fy, x, y, desk;
char doslide, manplace;
- EDBUG(3, "AddToFamily");
-
- /* find the client window if it's already managed */
- ewin = FindItem(NULL, win, LIST_FINDBY_ID, LIST_TYPE_EWIN);
+ ecore_x_grab();
- if (ewin)
+ if (!WinExists(win))
{
- /* Some clients MapRequest more than once ?!? */
- Eprintf("AddToFamily: Already managing %#lx\n", ewin->client.win);
-#if 0
- /* if its iconified - de-iconify */
- if (ewin->iconified)
- {
-#if 0 /* FIXME - When do we need this? */
- RemoveMiniIcon(ewin);
-#endif
- EoSetDesk(ewin, DesksGetCurrent());
- DeskGetCurrentArea(&x, &y);
- MoveEwinToArea(ewin, x, y);
- RaiseEwin(ewin);
- EwinConformToDesktop(ewin);
- ShowEwin(ewin);
- ICCCM_DeIconify(ewin);
- ewin->iconified = 0;
- }
-#endif
- EDBUG_RETURN_;
+ Eprintf("Window is gone %#lx\n", win);
+ ecore_x_ungrab();
+ return;
}
- /* grab that server */
- ecore_x_grab();
-
- speed = Conf.slidespeedmap;
- doslide = Conf.mapslide && !Mode.wm.startup;
- manplace = 0;
-
/* adopt the new baby */
- ewin = Adopt(win);
+ ewin = Adopt(ewin, win);
/* if it hasn't been planted on a desktop - assign it the current desktop */
desk = EoGetDesk(ewin);
@@ -691,6 +650,7 @@
ewin->props.donthide = 1;
}
+ doslide = Conf.mapslide && !Mode.wm.startup;
/* if set for borderless then dont slide it in */
if ((!ewin->client.mwm_decor_title) && (!ewin->client.mwm_decor_border))
doslide = 0;
@@ -781,11 +741,12 @@
ewin->client.already_placed = 1;
ShowEwin(ewin);
ecore_x_ungrab();
- EDBUG_RETURN_;
+ return;
}
ResizeEwin(ewin, ewin->client.w, ewin->client.h);
+ manplace = 0;
if ((!ewin->client.transient) && (Conf.place.manual)
&& (!ewin->client.already_placed) && (!Mode.wm.startup) &&
(!Mode.place))
{
@@ -857,7 +818,7 @@
ewin->state = EWIN_STATE_MAPPED;
EwinIconify(ewin);
ewin->state = EWIN_STATE_ICONIC;
- EDBUG_RETURN_;
+ return;
}
/* if we should slide it in and are not currently in the middle of a slide
*/
@@ -891,7 +852,7 @@
ecore_x_ungrab();
EoSetFloating(ewin, 1); /* Causes reparenting to root */
ActionMoveStart(ewin, 1, 0, 0);
- EDBUG_RETURN_;
+ return;
}
else if ((doslide) && (!Mode.doingslide))
{
@@ -922,7 +883,7 @@
RaiseEwin(ewin);
MoveEwin(ewin, fx, fy);
ShowEwin(ewin);
- SlideEwinTo(ewin, fx, fy, x, y, speed);
+ SlideEwinTo(ewin, fx, fy, x, y, Conf.slidespeedmap);
MoveEwinToDesktopAt(ewin, desk, x, y);
}
else
@@ -936,8 +897,6 @@
EwinDetermineArea(ewin);
ecore_x_ungrab();
-
- EDBUG_RETURN_;
}
EWin *
@@ -947,8 +906,6 @@
EWin *ewin;
Border *b;
- EDBUG(3, "AddInternalToFamily");
-
b = NULL;
if (bname)
{
@@ -975,29 +932,36 @@
ecore_x_ungrab();
- EDBUG_RETURN(ewin);
+ return ewin;
}
-void
+static void
EwinWithdraw(EWin * ewin)
{
Window win;
+ int x, y;
if (EventDebug(EDBUG_TYPE_EWINS))
Eprintf("EwinWithdraw %#lx %s state=%d\n", ewin->client.win,
EwinGetName(ewin), ewin->state);
+ ecore_x_grab();
+
/* Park the client window on the root */
+ x = ewin->client.x;
+ y = ewin->client.y;
XTranslateCoordinates(disp, ewin->client.win, VRoot.win,
-ewin->border->border.left,
- -ewin->border->border.top, &ewin->client.x,
- &ewin->client.y, &win);
- EReparentWindow(disp, ewin->client.win, VRoot.win, ewin->client.x,
- ewin->client.y);
-
+ -ewin->border->border.top, &x, &y, &win);
+ EReparentWindow(disp, ewin->client.win, VRoot.win, x, y);
ICCCM_Withdraw(ewin);
HintsDelWindowHints(ewin);
- EwinDestroy(ewin);
+
+ ecore_x_sync();
+ ecore_x_ungrab();
+
+ if (EwinIsInternal(ewin))
+ EwinDestroy(ewin);
}
void
@@ -1005,8 +969,6 @@
{
Window dwin;
- EDBUG(3, "EwinConformToDesktop");
-
dwin = DeskGetWin(EoGetDesk(ewin));
if ((ewin->iconified) && (ewin->parent != dwin))
{
@@ -1047,15 +1009,43 @@
EwinDetermineArea(ewin);
HintsSetWindowDesktop(ewin);
-
- EDBUG_RETURN_;
}
void
EwinReparent(EWin * ewin, Window parent)
{
EReparentWindow(disp, ewin->client.win, parent, 0, 0);
- EwinDestroy(ewin);
+ EDestroyWindow(disp, EoGetWin(ewin));
+}
+
+static void
+EwinEventMapRequest(EWin * ewin, Window win)
+{
+ if (ewin)
+ {
+ if (ewin->state == EWIN_STATE_ICONIC)
+ EwinDeIconify(ewin);
+ if (ewin->state == EWIN_STATE_WITHDRAWN)
+ AddToFamily(ewin, win);
+ else
+ Eprintf("AddToFamily: Already managing %s %#lx\n", "A",
+ ewin->client.win);
+ }
+ else
+ {
+ /* Check if we are already managing it */
+ ewin = FindItem(NULL, win, LIST_FINDBY_ID, LIST_TYPE_EWIN);
+
+ /* Some clients MapRequest more than once ?!? */
+ if (ewin)
+ {
+ Eprintf("AddToFamily: Already managing %s %#lx\n", "B",
+ ewin->client.win);
+ ShowEwin(ewin);
+ }
+ else
+ AddToFamily(NULL, win);
+ }
}
static void
@@ -1094,13 +1084,13 @@
if (GetZoomEWin() == ewin)
Zoom(NULL);
- /* Set state to unknown until we can set the correct one */
- ewin->state = (ewin->iconified) ? EWIN_STATE_ICONIC : EWIN_STATE_WITHDRAWN;
-
if (EventDebug(EDBUG_TYPE_EWINS))
Eprintf("EwinEventUnmap %#lx %s state=%d\n", ewin->client.win,
EwinGetName(ewin), ewin->state);
+ if (ewin->state == EWIN_STATE_WITHDRAWN)
+ return;
+
ActionsEnd(ewin);
if (ewin == GetContextEwin())
@@ -1120,14 +1110,18 @@
Mode.doingslide = 0;
}
+ HideEwin(ewin);
+
ModulesSignal(ESIGNAL_EWIN_UNMAP, ewin);
if (ewin->iconified)
{
- HideEwin(ewin);
+ ewin->state = EWIN_STATE_ICONIC;
return;
}
+ ewin->state = EWIN_STATE_WITHDRAWN;
+
if (ewin->Close)
ewin->Close(ewin);
@@ -1234,7 +1228,7 @@
xwc.border_width = ev->xconfigurerequest.border_width;
xwc.sibling = ev->xconfigurerequest.above;
xwc.stack_mode = ev->xconfigurerequest.detail;
- XConfigureWindow(disp, win, ev->xconfigurerequest.value_mask, &xwc);
+ EConfigureWindow(disp, win, ev->xconfigurerequest.value_mask, &xwc);
}
}
@@ -1363,10 +1357,9 @@
EWin **lst;
int i, num;
- EDBUG(3, "FloatEwin");
call_depth++;
if (call_depth > 256)
- EDBUG_RETURN_;
+ return;
EoSetFloating(ewin, 1);
EoSetDesk(ewin, 0);
@@ -1380,7 +1373,6 @@
Efree(lst);
call_depth--;
- EDBUG_RETURN_;
}
#endif
@@ -1392,10 +1384,9 @@
EWin **lst;
int i, num;
- EDBUG(3, "FloatEwinAt");
call_depth++;
if (call_depth > 256)
- EDBUG_RETURN_;
+ return;
if (EoIsFloating(ewin))
EoSetFloating(ewin, 2);
@@ -1415,7 +1406,6 @@
Efree(lst);
call_depth--;
- EDBUG_RETURN_;
}
/*
@@ -1429,8 +1419,6 @@
XWindowChanges xwc;
unsigned int value_mask;
- EDBUG(3, "RestackEwin");
-
if (EventDebug(EDBUG_TYPE_STACKING))
Eprintf("RestackEwin %#lx %s\n", ewin->client.win, EwinGetName(ewin));
@@ -1468,7 +1456,7 @@
ModulesSignal(ESIGNAL_EWIN_CHANGE, ewin);
done:
- EDBUG_RETURN_;
+ ;
}
void
@@ -1478,9 +1466,8 @@
EWin **lst;
int i, num;
- EDBUG(3, "RaiseEwin");
if (call_depth > 256)
- EDBUG_RETURN_;
+ return;
call_depth++;
if (EventDebug(EDBUG_TYPE_RAISELOWER))
@@ -1518,7 +1505,6 @@
done:
call_depth--;
- EDBUG_RETURN_;
}
void
@@ -1528,9 +1514,8 @@
EWin **lst;
int i, num;
- EDBUG(3, "LowerEwin");
if (call_depth > 256)
- EDBUG_RETURN_;
+ return;
call_depth++;
if (EventDebug(EDBUG_TYPE_RAISELOWER))
@@ -1564,16 +1549,13 @@
done:
call_depth--;
- EDBUG_RETURN_;
}
void
ShowEwin(EWin * ewin)
{
- EDBUG(3, "ShowEwin");
-
if (ewin->shown)
- EDBUG_RETURN_;
+ return;
ewin->shown = 1;
if (ewin->client.win)
@@ -1585,26 +1567,22 @@
if (EoGetWin(ewin))
EMapWindow(disp, EoGetWin(ewin));
-
- EDBUG_RETURN_;
}
void
HideEwin(EWin * ewin)
{
- EDBUG(3, "HideEwin");
-
if (!ewin->shown || !EwinIsMapped(ewin))
- EDBUG_RETURN_;
+ return;
ewin->shown = 0;
if (GetZoomEWin() == ewin)
Zoom(NULL);
+ EUnmapWindow(disp, ewin->client.win);
+
if (EoGetWin(ewin))
EUnmapWindow(disp, EoGetWin(ewin));
-
- EDBUG_RETURN_;
}
Window
@@ -1870,13 +1848,17 @@
{
EWin *ewin = (EWin *) prm;
+#if 0
+ Eprintf("EwinHandleEventsContainer: type=%2d win=%#lx: %s\n",
+ ev->type, ewin->client.win, EwinGetName(ewin));
+#endif
switch (ev->type)
{
case ButtonPress:
FocusHandleClick(ewin, ev->xany.window);
break;
case MapRequest:
- EwinDeIconify(ewin);
+ EwinEventMapRequest(ewin, ev->xmaprequest.window);
break;
case ConfigureRequest:
EwinEventConfigureRequest(ewin, ev);
@@ -1915,23 +1897,28 @@
EwinEventVisibility(ewin, ev->xvisibility.state);
break;
case DestroyNotify:
- if (ev->xdestroywindow.window == ewin->client.win)
- EwinEventDestroy(ewin);
+ EwinEventDestroy(ewin);
break;
case UnmapNotify:
- if (ev->xunmap.window != ewin->client.win)
- break;
+#if 0
if (ewin->state == EWIN_STATE_NEW)
{
Eprintf("EwinEventUnmap %#lx: Ignoring bogus Unmap event\n",
ewin->client.win);
break;
}
+#endif
EwinEventUnmap(ewin);
break;
case MapNotify:
- if (ev->xmap.window == ewin->client.win)
- EwinEventMap(ewin);
+ EwinEventMap(ewin);
+ break;
+ case ReparentNotify:
+ /* Check if window parent hasn't changed already (compress?) */
+ if (WinGetParent(ev->xreparent.window) != ev->xreparent.parent)
+ break;
+ if (ev->xreparent.parent == VRoot.win)
+ EwinEventDestroy(ewin);
break;
#if 0
case ConfigureRequest:
@@ -1975,21 +1962,25 @@
break;
case MapRequest:
- AddToFamily(ev->xmaprequest.window);
+ EwinEventMapRequest(NULL, ev->xmaprequest.window);
break;
case ConfigureRequest:
#if 0
Eprintf("EwinHandleEventsRoot ConfigureRequest %#lx\n",
ev->xconfigurerequest.window);
#endif
- EwinEventConfigureRequest(NULL, ev);
+ ewin = FindItem(NULL, ev->xconfigurerequest.window, LIST_FINDBY_ID,
+ LIST_TYPE_EWIN);
+ EwinEventConfigureRequest(ewin, ev);
break;
case ResizeRequest:
#if 0
Eprintf("EwinHandleEventsRoot ResizeRequest %#lx\n",
ev->xresizerequest.window);
#endif
- EwinEventResizeRequest(NULL, ev);
+ ewin = FindItem(NULL, ev->xresizerequest.window, LIST_FINDBY_ID,
+ LIST_TYPE_EWIN);
+ EwinEventResizeRequest(ewin, ev);
break;
case CirculateRequest:
#if 0
@@ -2011,6 +2002,8 @@
/* Catch clients destroyed after MapRequest but before being reparented
*/
ewin = FindItem(NULL, ev->xdestroywindow.window, LIST_FINDBY_ID,
LIST_TYPE_EWIN);
+ if (!ewin)
+ ewin = FindEwinByBase(ev->xdestroywindow.window);
if (ewin)
EwinEventDestroy(ewin);
break;
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/hints.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -3 -r1.29 -r1.30
--- hints.c 22 Jan 2005 11:32:58 -0000 1.29
+++ hints.c 23 Jan 2005 18:23:04 -0000 1.30
@@ -430,6 +430,9 @@
CARD32 *cc;
n_desks = DesksGetNumber();
+ if (n_desks <= 0)
+ return;
+
cc = Emalloc(2 * n_desks * sizeof(CARD32));
if (!cc)
return;
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/menus.c,v
retrieving revision 1.160
retrieving revision 1.161
diff -u -3 -r1.160 -r1.161
--- menus.c 21 Jan 2005 20:12:11 -0000 1.160
+++ menus.c 23 Jan 2005 18:23:04 -0000 1.161
@@ -173,10 +173,6 @@
void
MenuHide(Menu * m)
{
- EWin *ewin;
-
- EDBUG(5, "MenuHide");
-
if (m->win)
EUnmapWindow(disp, m->win);
@@ -184,12 +180,6 @@
m->stuck = 0;
m->shown = 0;
-
- ewin = FindEwinByMenu(m);
- if (ewin)
- HideEwin(ewin);
-
- EDBUG_RETURN_;
}
static void
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/setup.c,v
retrieving revision 1.145
retrieving revision 1.146
diff -u -3 -r1.145 -r1.146
--- setup.c 10 Jan 2005 23:34:46 -0000 1.145
+++ setup.c 23 Jan 2005 18:23:04 -0000 1.146
@@ -97,7 +97,7 @@
if (Mode.wm.exiting)
EMapWindow(disp, wlist[i]);
else
- AddToFamily(wlist[i]);
+ AddToFamily(NULL, wlist[i]);
}
}
}
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/x.c,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -3 -r1.73 -r1.74
--- x.c 2 Jan 2005 15:38:52 -0000 1.73
+++ x.c 23 Jan 2005 18:23:04 -0000 1.74
@@ -653,9 +653,10 @@
if (xid)
{
#if 0
- Eprintf("EReparentWindow: %p %#lx: %#lx->%#lx %d,%d %dx%d -> %d,%d\n",
- xid, xid->win, xid->parent, parent, xid->x, xid->y, xid->w,
- xid->h, x, y);
+ Eprintf
+ ("EReparentWindow: %p %#lx: %d %#lx->%#lx %d,%d %dx%d -> %d,%d\n",
+ xid, xid->win, xid->mapped, xid->parent, parent, xid->x, xid->y,
+ xid->w, xid->h, x, y);
#endif
if (parent == xid->parent)
{
@@ -999,6 +1000,19 @@
}
Window
+WinGetParent(Window win)
+{
+ Window parent, rt;
+ Window *pch = NULL;
+ unsigned int nch = 0;
+
+ if (!XQueryTree(disp, win, &rt, &parent, &pch, &nch))
+ return None;
+
+ return parent;
+}
+
+Window
WindowAtXY_0(Window base, int bx, int by, int x, int y)
{
Window *list = NULL;
-------------------------------------------------------
This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting
Tool for open source databases. Create drag-&-drop reports. Save time
by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc.
Download a FREE copy at http://www.intelliview.com/go/osdn_nl
_______________________________________________
enlightenment-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs