Handle screen resizing (xrandr). Event handling tweaks.
SVN revision: 13157
This commit is contained in:
parent
e0e414c9cf
commit
4a0d6545be
2
src/E.h
2
src/E.h
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
63
src/ewins.c
63
src/ewins.c
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
47
src/setup.c
47
src/setup.c
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue