Handle screen resizing (xrandr). Event handling tweaks.

SVN revision: 13157
This commit is contained in:
Kim Woelders 2005-01-31 18:52:18 +00:00
parent e0e414c9cf
commit 4a0d6545be
8 changed files with 145 additions and 24 deletions

View File

@ -1380,6 +1380,7 @@ void DeskSetCurrentArea(int ax, int ay);
int DesksGetNumber(void);
int DesksGetCurrent(void);
void DesksSetCurrent(int desk);
void DesksResize(int w, int h);
void SlideWindowTo(Window win, int fx, int fy, int tx, int ty,
int speed);
@ -2079,6 +2080,7 @@ void SettingsComposite(void);
/* setup.c */
void MapUnmap(int start);
void SetupX(const char *dstr);
void RootResize(int root, int w, int h);
/* size.c */
void MaxSize(EWin * ewin, const char *resize_type);

View File

@ -252,7 +252,7 @@ CommsInit(void)
{
char s[1024];
comms_win = XCreateSimpleWindow(disp, VRoot.win, -100, -100, 5, 5, 0, 0, 0);
comms_win = ECreateEventWindow(VRoot.win, -100, -100, 5, 5);
ERegisterWindow(comms_win);
XSelectInput(disp, comms_win, StructureNotifyMask | SubstructureNotifyMask);
EventCallbackRegister(comms_win, 0, ClientHandleEvents, NULL);

View File

@ -459,6 +459,26 @@ DeskDestroy(int desk)
desks.desk[desk] = NULL;
}
static void
DeskResize(int desk, int w, int h)
{
Desk *d;
d = _DeskGet(desk);
if (desk > 0)
{
EResizeWindow(disp, EoGetWin(d), w, h);
if (!d->viewable)
EMoveWindow(disp, EoGetWin(d), VRoot.w, 0);
}
BackgroundPixmapFree(d->bg);
RefreshDesktop(desk);
DeskControlsDestroy(d);
DeskControlsCreate(d);
DeskControlsShow(d);
}
Window
DeskGetWin(int desk)
{
@ -555,7 +575,7 @@ DesksSetCurrent(int desk)
}
static void
DesktopsInit(void)
DesksInit(void)
{
int i;
@ -563,6 +583,20 @@ DesktopsInit(void)
DeskCreate(i, 0);
}
void
DesksResize(int w, int h)
{
int i;
for (i = 0; i < Conf.desks.num; i++)
DeskResize(i, w, h);
/* Restack buttons - Hmmm. */
StackDesktops();
ModulesSignal(ESIGNAL_DESK_RESIZE, NULL);
}
void
DesktopsEventsConfigure(int mode)
{
@ -1592,7 +1626,7 @@ DesktopsSighan(int sig, void *prm __UNUSED__)
switch (sig)
{
case ESIGNAL_INIT:
DesktopsInit();
DesksInit();
break;
case ESIGNAL_CONFIGURE:

View File

@ -58,6 +58,7 @@ typedef enum
ESIGNAL_DESK_SWITCH_START,
ESIGNAL_DESK_SWITCH_DONE,
ESIGNAL_DESK_CHANGE,
ESIGNAL_DESK_RESIZE,
ESIGNAL_BACKGROUND_CHANGE,
ESIGNAL_MOVE_START,
ESIGNAL_MOVE_DONE,

View File

@ -301,9 +301,7 @@ HandleEvent(XEvent * ev)
break;
case ConfigureNotify: /* 22 */
if (ev->xconfigure.window == VRoot.win)
DialogOK("Wheee! (ConfigureNotify)",
"Screen size changed to\n%dx%d pixels",
ev->xconfigure.width, ev->xconfigure.height);
RootResize(0, ev->xconfigure.width, ev->xconfigure.height);
break;
case ConfigureRequest: /* 23 */
break;
@ -321,9 +319,7 @@ HandleEvent(XEvent * ev)
{
XRRScreenChangeNotifyEvent *rrev = (XRRScreenChangeNotifyEvent *) ev;
DialogOK("Wheee! (RRScreenChangeNotify)",
"Screen size changed to\n%dx%d pixels (%dx%d millimeters)",
rrev->width, rrev->height, rrev->mwidth, rrev->mheight);
RootResize(1, rrev->width, rrev->height);
}
break;
#endif

View File

@ -33,11 +33,11 @@
#define EWIN_CONTAINER_EVENT_MASK \
(/* ButtonPressMask | ButtonReleaseMask | */ \
/* StructureNotifyMask | ResizeRedirectMask | */ \
/* SubstructureNotifyMask | */ SubstructureRedirectMask)
SubstructureNotifyMask | SubstructureRedirectMask)
#define EWIN_CLIENT_EVENT_MASK \
(EnterWindowMask | LeaveWindowMask | FocusChangeMask | \
StructureNotifyMask | ResizeRedirectMask | \
/* StructureNotifyMask | */ ResizeRedirectMask | \
PropertyChangeMask | ColormapChangeMask | VisibilityChangeMask)
static void EwinHandleEventsToplevel(XEvent * ev, void *prm);
@ -1025,7 +1025,6 @@ void
EwinReparent(EWin * ewin, Window parent)
{
EReparentWindow(disp, ewin->client.win, parent, 0, 0);
EDestroyWindow(disp, EoGetWin(ewin));
}
static void
@ -1120,7 +1119,10 @@ EwinEventUnmap(EWin * ewin)
Mode.doingslide = 0;
}
HideEwin(ewin);
ewin->shown = 0;
/* FIXME - This is to sync the client.win EXID mapped state */
EUnmapWindow(disp, ewin->client.win);
EUnmapWindow(disp, EoGetWin(ewin));
ModulesSignal(ESIGNAL_EWIN_UNMAP, ewin);
@ -1135,7 +1137,8 @@ EwinEventUnmap(EWin * ewin)
if (ewin->Close)
ewin->Close(ewin);
EwinWithdraw(ewin);
if (WinGetParent(ewin->client.win) == ewin->win_container)
EwinWithdraw(ewin);
}
static void
@ -1779,6 +1782,21 @@ EwinsEventsConfigure(int mode)
}
}
static void
EwinsTouch(void)
{
int i, num;
EWin *const *lst, *ewin;
lst = EwinListStackGet(&num);
for (i = num - 1; i >= 0; i--)
{
ewin = lst[i];
if (EwinIsMapped(ewin))
MoveEwin(ewin, EoGetX(ewin), EoGetY(ewin));
}
}
void
EwinsSetFree(void)
{
@ -1883,6 +1901,34 @@ EwinHandleEventsContainer(XEvent * ev, void *prm)
case CirculateRequest:
EwinEventCirculateRequest(ewin, ev);
break;
case DestroyNotify:
EwinEventDestroy(ewin);
break;
case UnmapNotify:
#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:
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 != ewin->win_container)
EwinEventDestroy(ewin);
break;
case ConfigureNotify:
break;
default:
Eprintf("EwinHandleEventsContainer: type=%2d win=%#lx: %s\n",
ev->type, ewin->client.win, EwinGetName(ewin));
@ -1910,6 +1956,8 @@ EwinHandleEventsClient(XEvent * ev, void *prm)
case VisibilityNotify:
EwinEventVisibility(ewin, ev->xvisibility.state);
break;
#if 0 /* FIXME - Remove? */
case DestroyNotify:
EwinEventDestroy(ewin);
break;
@ -1934,6 +1982,8 @@ EwinHandleEventsClient(XEvent * ev, void *prm)
if (ev->xreparent.parent == VRoot.win)
EwinEventDestroy(ewin);
break;
#endif
#if 0
case ConfigureRequest:
if (ev->xconfigurerequest.window == ewin->client.win)
@ -2060,6 +2110,9 @@ EwinsSighan(int sig, void *prm __UNUSED__)
MapUnmap(1);
break;
#endif
case ESIGNAL_DESK_RESIZE:
EwinsTouch();
break;
}
}

View File

@ -494,7 +494,7 @@ PagerDrawQueueCallback(DrawQueue * dq)
}
static void
PagerEwinMoveResize(EWin * ewin, int resize)
PagerEwinMoveResize(EWin * ewin, int resize __UNUSED__)
{
Pager *p = ewin->data;
int w, h;
@ -553,9 +553,6 @@ PagerEwinMoveResize(EWin * ewin, int resize)
lst = EwinListGetForDesk(&num, p->desktop);
for (i = 0; i < num; i++)
PagerEwinUpdateMini(p, lst[i]);
return;
resize = 0;
}
static void
@ -2251,6 +2248,9 @@ PagersSighan(int sig, void *prm)
case ESIGNAL_DESK_CHANGE:
ForceUpdatePagersForDesktop((int)prm);
break;
case ESIGNAL_DESK_RESIZE:
PagersReArea();
break;
case ESIGNAL_EWIN_UNMAP:
PagerEwinOutsideAreaUpdate((EWin *) prm);
break;

View File

@ -117,6 +117,7 @@ void
SetupX(const char *dstr)
{
char buf[128];
long mask;
/* In case we are going to fork, set up the master pid */
Mode.wm.master = 1;
@ -287,12 +288,15 @@ SetupX(const char *dstr)
/* select all the root window events to start managing */
Mode.wm.xselect = 1;
XSelectInput(disp, VRoot.win,
ButtonPressMask | ButtonReleaseMask | EnterWindowMask |
LeaveWindowMask | ButtonMotionMask | PropertyChangeMask |
SubstructureRedirectMask | KeyPressMask | KeyReleaseMask |
PointerMotionMask | ResizeRedirectMask |
SubstructureNotifyMask);
mask =
ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask |
ButtonMotionMask | PropertyChangeMask | SubstructureRedirectMask |
KeyPressMask | KeyReleaseMask | PointerMotionMask |
SubstructureNotifyMask;
if (Mode.wm.window)
mask |= StructureNotifyMask;
XSelectInput(disp, VRoot.win, mask);
ecore_x_sync();
Mode.wm.xselect = 0;
@ -355,3 +359,34 @@ SetupX(const char *dstr)
ScreenInit();
ZoomInit();
}
void
RootResize(int root, int w, int h)
{
if (EventDebug(EDBUG_TYPE_DESKS))
Eprintf("RootResize %d %dx%d\n", root, w, h);
if (root)
{
#if 0
RRoot.w = DisplayWidth(disp, RRoot.scr);
RRoot.h = DisplayHeight(disp, RRoot.scr);
if (w != RRoot.w || h != RRoot.h)
Eprintf
("RootResize (root): Screen size mismatch: root=%dx%d event=%dx%d\n",
RRoot.w, RRoot.h, w, h);
#endif
RRoot.w = w;
RRoot.h = h;
}
if (w == VRoot.w && h == VRoot.h)
return;
EWindowSync(VRoot.win);
VRoot.w = w;
VRoot.h = h;
DesksResize(w, h);
}