2 * Copyright (C) 2000-2007 Carsten Haitzler, Geoff Harrison and various contributors
3 * Copyright (C) 2004-2009 Kim Woelders
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to
7 * deal in the Software without restriction, including without limitation the
8 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9 * sell copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies of the Software, its documentation and marketing & publicity
14 * materials, and acknowledgment shall be given in the documentation, materials
15 * and software packages that this Software was used.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #include "backgrounds.h"
46 #include <X11/extensions/Xrandr.h>
49 #define EDESK_EVENT_MASK \
50 (ButtonPressMask | ButtonReleaseMask | \
51 EnterWindowMask | LeaveWindowMask /* | PointerMotionMask | ButtonMotionMask */ | \
52 SubstructureNotifyMask | SubstructureRedirectMask | PropertyChangeMask)
54 #define ENLIGHTENMENT_CONF_NUM_DESKTOPS 32
59 Desk *desk[ENLIGHTENMENT_CONF_NUM_DESKTOPS];
60 unsigned int order[ENLIGHTENMENT_CONF_NUM_DESKTOPS];
64 static void DeskRaise(unsigned int num);
65 static void DeskLower(unsigned int num);
66 static void DeskHandleEvents(Win win, XEvent * ev, void *prm);
67 static void DeskButtonCallback(EObj * eo, XEvent * ev,
71 static Desktops desks;
73 #define _DeskGet(d) (desks.desk[d])
76 DeskControlsCreate(Desk * dsk)
79 const char *ic1, *ic2, *ic3;
84 char ac1[64], ac2[64], ac3[64];
88 int x[3], y[3], w[3], h[3], m, n, o;
91 if (Conf.desks.dragdir < 0 || Conf.desks.dragdir > 3)
92 Conf.desks.dragdir = 2;
93 if (Conf.desks.dragbar_ordering < 0 || Conf.desks.dragbar_ordering > 5)
94 Conf.desks.dragbar_ordering = 1;
95 if (Conf.desks.dragbar_width < 0)
96 Conf.desks.dragbar_width = 0;
97 else if (Conf.desks.dragbar_width > 64)
98 Conf.desks.dragbar_width = 64;
99 if (Conf.desks.dragbar_length < 0)
100 Conf.desks.dragbar_length = 0;
101 else if (Conf.desks.dragbar_length > WinGetW(VROOT))
102 Conf.desks.dragbar_length = WinGetW(VROOT);
104 Esnprintf(ac1, sizeof(ac1), "DRAGBAR_DESKTOP_%i", dsk->num);
105 if (!ActionclassFind(ac1))
107 ac = ActionclassCreate(ac1, 0);
108 a = ActionCreate(EVENT_MOUSE_DOWN, 0, 0, 0, 1, 0, NULL, NULL);
109 ActionclassAddAction(ac, a);
111 Esnprintf(s, sizeof(s), "desk drag %i", dsk->num);
114 a = ActionCreate(EVENT_MOUSE_DOWN, 0, 0, 0, 3, 0, NULL, NULL);
115 ActionclassAddAction(ac, a);
116 ActionAddTo(a, "menus show deskmenu");
118 a = ActionCreate(EVENT_MOUSE_DOWN, 0, 0, 0, 2, 0, NULL, NULL);
119 ActionclassAddAction(ac, a);
120 ActionAddTo(a, "menus show windowlist");
124 t = _("Hold down the mouse button and drag\n"
125 "the mouse to be able to drag the desktop\n"
127 "Click right mouse button for a list of all\n"
128 "Desktops and their applications.\n"
129 "Click middle mouse button for a list of all\n"
130 "applications currently running.\n");
131 ActionclassSetTooltipString(ac, t);
135 t = _("This is the Root desktop.\n"
136 "You cannot drag the root desktop around.\n"
137 "Click right mouse button for a list of all\n"
138 "Desktops and their applications.\n"
139 "Click middle mouse button for a list of all\n"
140 "applications currently running.\n");
141 ActionclassSetTooltipString(ac, t);
145 Esnprintf(ac2, sizeof(ac2), "RAISEBUTTON_DESKTOP_%i", dsk->num);
146 if (!ActionclassFind(ac2))
148 ac = ActionclassCreate(ac2, 0);
149 a = ActionCreate(EVENT_MOUSE_UP, 1, 0, 1, 0, 0, NULL, NULL);
150 ActionclassAddAction(ac, a);
152 ActionAddTo(a, "desk next");
153 t = _("Click here to raise this desktop\nto the top.\n");
154 ActionclassSetTooltipString(ac, t);
157 Esnprintf(ac3, sizeof(ac3), "LOWERBUTTON_DESKTOP_%i", dsk->num);
158 if (!ActionclassFind(ac3))
160 ac = ActionclassCreate(ac3, 0);
161 a = ActionCreate(EVENT_MOUSE_UP, 1, 0, 1, 0, 0, NULL, NULL);
162 ActionclassAddAction(ac, a);
164 ActionAddTo(a, "desk prev");
165 t = _("Click here to lower this desktop\nto the bottom.\n");
166 ActionclassSetTooltipString(ac, t);
169 if (Conf.desks.dragdir < 2)
171 ic1 = "DESKTOP_DRAGBUTTON_VERT";
172 ic2 = "DESKTOP_RAISEBUTTON_VERT";
173 ic3 = "DESKTOP_LOWERBUTTON_VERT";
175 ic4 = "DESKTOP_DESKRAY_VERT";
180 ic1 = "DESKTOP_DRAGBUTTON_HORIZ";
181 ic2 = "DESKTOP_RAISEBUTTON_HORIZ";
182 ic3 = "DESKTOP_LOWERBUTTON_HORIZ";
184 ic4 = "DESKTOP_DESKRAY_HORIZ";
188 switch (Conf.desks.dragbar_ordering)
227 switch (Conf.desks.dragdir)
231 w[0] = w[1] = w[2] = h[0] = h[1] = Conf.desks.dragbar_width;
232 if (Conf.desks.dragbar_length == 0)
233 h[2] = WinGetH(VROOT) - (Conf.desks.dragbar_width * 2);
235 h[2] = Conf.desks.dragbar_length;
236 x[0] = x[1] = x[2] = 0;
242 w[0] = w[1] = w[2] = h[0] = h[1] = Conf.desks.dragbar_width;
243 if (Conf.desks.dragbar_length == 0)
244 h[2] = WinGetH(VROOT) - (Conf.desks.dragbar_width * 2);
246 h[2] = Conf.desks.dragbar_length;
247 x[0] = x[1] = x[2] = WinGetW(VROOT) - Conf.desks.dragbar_width;
253 h[0] = h[1] = h[2] = w[0] = w[1] = Conf.desks.dragbar_width;
254 if (Conf.desks.dragbar_length == 0)
255 w[2] = WinGetW(VROOT) - (Conf.desks.dragbar_width * 2);
257 w[2] = Conf.desks.dragbar_length;
258 y[0] = y[1] = y[2] = 0;
264 h[0] = h[1] = h[2] = w[0] = w[1] = Conf.desks.dragbar_width;
265 if (Conf.desks.dragbar_length == 0)
266 w[2] = WinGetW(VROOT) - (Conf.desks.dragbar_width * 2);
268 w[2] = Conf.desks.dragbar_length;
269 y[0] = y[1] = y[2] = WinGetH(VROOT) - Conf.desks.dragbar_width;
278 if (Conf.desks.dragbar_width > 0)
280 b = ButtonCreate("_DESKTOP_DRAG_CONTROL", 1, ic2, ac2, NULL, NULL,
281 -1, FLAG_FIXED, 1, 99999, 1, 99999, 0, 0, x[0], 0,
282 y[0], 0, 0, w[0], 0, h[0], 0, dsk->num, 0);
283 b = ButtonCreate("_DESKTOP_DRAG_CONTROL", 1, ic3, ac3, NULL, NULL,
284 -1, FLAG_FIXED, 1, 99999, 1, 99999, 0, 0, x[1], 0,
285 y[1], 0, 0, w[1], 0, h[1], 0, dsk->num, 0);
286 b = ButtonCreate("_DESKTOP_DRAG_CONTROL", 1, ic1, ac1, NULL, NULL,
287 -1, FLAG_FIXED, 1, 99999, 1, 99999, 0, 0, x[2], 0,
288 y[2], 0, 0, w[2], 0, h[2], 0, dsk->num, 0);
289 ButtonSetCallback(b, DeskButtonCallback, EoObj(dsk));
295 if (Conf.desks.dragdir == 0)
297 b = ButtonCreate("_DESKTOP_DESKRAY_DRAG_CONTROL", 2, ic4, ac1,
298 NULL, NULL, 1, FLAG_FIXED_VERT, 1, 99999, 1,
299 99999, 0, 0, EoGetX(dsk), 0, EoGetY(dsk),
300 0, 0, 0, 0, 0, 1, 0, 1);
302 else if (Conf.desks.dragdir == 1)
304 b = ButtonCreate("_DESKTOP_DESKRAY_DRAG_CONTROL", 2, ic4, ac1,
305 NULL, NULL, 1, FLAG_FIXED_VERT, 1, 99999, 1,
307 EoGetX(dsk) + WinGetW(VROOT) -
308 Conf.desks.dragbar_width, 0, EoGetY(dsk),
309 0, 0, 0, 0, 0, 1, 0, 1);
311 else if (Conf.desks.dragdir == 2)
313 b = ButtonCreate("_DESKTOP_DESKRAY_DRAG_CONTROL", 2, ic4, ac1,
314 NULL, NULL, 1, FLAG_FIXED_HORIZ, 1, 99999, 1,
315 99999, 0, 0, EoGetX(dsk), 0, EoGetY(dsk),
316 0, 0, 0, 0, 0, 1, 0, 1);
320 b = ButtonCreate("_DESKTOP_DESKRAY_DRAG_CONTROL", 2, ic4, ac1,
321 NULL, NULL, 1, FLAG_FIXED_HORIZ, 1, 99999, 1,
322 99999, 0, 0, EoGetX(dsk), 0,
323 EoGetY(dsk) + WinGetH(VROOT) -
324 Conf.desks.dragbar_width, 0, 0, 0, 0, 0, 1, 0, 1);
333 DeskControlsDestroy(Desk * dsk, int id)
335 ButtonsForeach(id, dsk, ButtonDestroy);
339 DeskControlsShow(Desk * dsk, int id)
341 ButtonsForeach(id, dsk, ButtonShow);
345 DeskConfigure(Desk * dsk)
349 DeskControlsCreate(dsk);
350 DeskControlsShow(dsk, 1);
352 bg = BackgroundGetForDesk(dsk->num);
353 DeskBackgroundSet(dsk, bg);
357 EoMove(dsk, WinGetW(VROOT), 0);
361 ModulesSignal(ESIGNAL_DESK_ADDED, dsk);
365 DeskCreate(int desk, int configure)
374 if (desk < 0 || desk >= ENLIGHTENMENT_CONF_NUM_DESKTOPS)
377 dsk = ECALLOC(Desk, 1);
379 desks.desk[desk] = dsk;
381 desks.order[desk] = desk;
383 win = (desk == 0) ? VROOT : NULL;
385 Esnprintf(buf, sizeof(buf), "Desk-%d", desk);
386 EoSetNoRedirect(dsk, 1);
387 EoInit(dsk, EOBJ_TYPE_DESK, win,
388 0, 0, WinGetW(VROOT), WinGetH(VROOT), 0, buf);
389 EventCallbackRegister(EoGetWin(dsk), 0, DeskHandleEvents, dsk);
390 dsk->bg.o = EoObj(dsk);
394 #if !USE_BG_WIN_ON_ALL_DESKS /* TBD - Use per virtual root bg window? */
396 /* Add background window */
397 eo = EobjWindowCreate(EOBJ_TYPE_ROOT_BG,
398 0, 0, WinGetW(VROOT), WinGetH(VROOT),
402 EventCallbackRegister(EobjGetWin(eo), 0, DeskHandleEvents, dsk);
404 ESelectInput(EobjGetWin(eo), EnterWindowMask);
410 EoSetFloating(dsk, 1);
412 /* Set the _XROOT... atoms so apps will find them even before the bg is set */
413 HintsSetRootInfo(EoGetWin(dsk), None, 0);
416 #if USE_BG_WIN_ON_ALL_DESKS /* TBD - Use per virtual root bg window? */
418 /* Add background window */
419 Esnprintf(buf, sizeof(buf), "Desk-bg-%d", desk);
420 eo = EobjWindowCreate(EOBJ_TYPE_MISC,
421 0, 0, WinGetW(VROOT), WinGetH(VROOT), 0, buf);
423 EobjReparent(eo, EoObj(dsk), 0, 0);
426 EventCallbackRegister(EobjGetWin(eo), 0, DeskHandleEvents, dsk);
430 HintsSetRootHints(EoGetWin(dsk));
436 ESelectInputChange(EoGetWin(dsk), EDESK_EVENT_MASK, 0);
438 ESelectInput(EoGetWin(dsk), EDESK_EVENT_MASK);
444 DeskDestroy(Desk * dsk)
446 ModulesSignal(ESIGNAL_DESK_REMOVED, dsk);
451 EventCallbackUnregister(EobjGetWin(dsk->bg.o_bg), 0, DeskHandleEvents,
453 EobjWindowDestroy(dsk->bg.o_bg);
456 EventCallbackUnregister(EoGetWin(dsk), 0, DeskHandleEvents, dsk);
458 DeskControlsDestroy(dsk, 1);
459 DeskControlsDestroy(dsk, 2);
462 BackgroundDecRefcount(dsk->bg.bg);
466 desks.desk[dsk->num] = NULL;
471 DeskGetBackgroundObj(const Desk * dsk)
473 return (dsk) ? dsk->bg.o : NULL;
477 DeskGetBackgroundPixmap(const Desk * dsk)
485 DeskBackgroundGet(const Desk * dsk)
487 return (dsk) ? dsk->bg.bg : NULL;
491 DeskBackgroundConfigure(Desk * dsk)
494 Pixmap pmap = dsk->bg.pmap;
495 unsigned long pixel = dsk->bg.pixel;
497 if (EDebug(EDBUG_TYPE_DESKS))
499 ("DeskBackgroundConfigure %d v=%d %#lx/%#lx: ext=%d pmap=%#lx/%#lx pixel=%#lx/%#lx\n",
500 dsk->num, dsk->viewable, EoGetXwin(dsk), EobjGetXwin(dsk->bg.o),
501 BackgroundIsNone(dsk->bg.bg), pmap, dsk->bg.pmap_set, pixel,
507 if (ECompMgrIsActive())
509 dsk->bg.o = dsk->bg.o_bg;
510 EobjMap(dsk->bg.o_bg, 0);
514 dsk->bg.o = EoObj(dsk);
515 EobjUnmap(dsk->bg.o_bg);
520 win = EobjGetWin(dsk->bg.o);
522 if (dsk->viewable || !dsk->bg.bg)
524 #if !USE_BG_WIN_ON_ALL_DESKS
525 if (ECompMgrDeskConfigure(dsk))
527 ESetWindowBackgroundPixmap(win, None);
534 ESetWindowBackgroundPixmap(win, pmap);
535 if (dsk->num == 0 && win != VROOT)
536 ESetWindowBackgroundPixmap(VROOT, pmap);
540 ESetWindowBackground(win, pixel);
541 if (dsk->num == 0 && win != VROOT)
542 ESetWindowBackground(VROOT, pixel);
547 HintsSetRootInfo(EoGetWin(dsk), pmap, pixel);
551 if (!Conf.hints.set_xroot_info_on_root_window)
552 HintsSetRootInfo(EoGetWin(dsk), None, 0);
554 ESetWindowBackgroundPixmap(win, None);
555 if (dsk->num == 0 && win != VROOT)
556 ESetWindowBackgroundPixmap(VROOT, None);
561 DeskBackgroundRefresh(Desk * dsk, int why)
563 Background *bg = dsk->bg.bg;
564 Pixmap pmap = dsk->bg.pmap;
565 unsigned long pixel = dsk->bg.pixel;
569 if (EDebug(EDBUG_TYPE_DESKS))
570 Eprintf("DeskBackgroundRefresh %d v=%d why=%d pmap=%#lx pixel=%#lx\n",
571 dsk->num, dsk->viewable, why, pmap, pixel);
575 case DESK_BG_REFRESH:
576 if (bg && dsk->viewable)
580 case DESK_BG_RECONFIGURE_ALL:
584 case DESK_BG_TIMEOUT:
585 if (bg && dsk->viewable)
590 if (!bg || dsk->viewable)
599 if (BackgroundGetSeqNo(bg) == dsk->bg.seq_no)
602 pmap = BackgroundGetPixmap(bg);
606 BackgroundRealize(bg, EoGetWin(dsk), None,
607 EoGetW(dsk), EoGetH(dsk), 1, &pmap, &pixel);
609 BackgroundPixmapSet(bg, pmap);
611 dsk->bg.seq_no = BackgroundGetSeqNo(bg);
616 if (dsk->bg.pmap == None)
626 pmap = (Mode.root.ext_pmap_valid) ? Mode.root.ext_pmap : None;
628 changed = pmap != dsk->bg.pmap_set;
633 if (reconfigure || pmap != dsk->bg.pmap_set || pixel != dsk->bg.pixel)
635 dsk->bg.pixel = pixel;
636 DeskBackgroundConfigure(dsk);
637 dsk->bg.pmap_set = pmap;
640 if (bg && dsk->viewable)
641 if (Conf.hints.set_xroot_info_on_root_window && dsk->num > 0)
642 HintsSetRootInfo(VROOT, pmap, pixel);
645 ModulesSignal(ESIGNAL_BACKGROUND_CHANGE, dsk);
649 DeskBackgroundSet(Desk * dsk, Background * bg)
654 BackgroundSetForDesk(bg, dsk->num);
655 if (bg && BackgroundIsNone(bg))
658 if (dsk->bg.bg != bg)
661 BackgroundDecRefcount(dsk->bg.bg);
663 BackgroundIncRefcount(bg);
668 DeskBackgroundRefresh(dsk, DESK_BG_REFRESH);
672 DesksBackgroundRefresh(Background * bg, int why)
677 for (i = 0; i < Conf.desks.num; i++)
680 if (!dsk) /* May happen during init */
682 if (bg && dsk->bg.bg != bg)
684 DeskBackgroundRefresh(dsk, why);
689 DeskResize(int desk, int w, int h)
694 dsk = _DeskGet(desk);
698 x = (dsk->viewable) ? EoGetX(dsk) : WinGetW(VROOT);
699 EoMoveResize(dsk, x, 0, w, h);
703 EobjMoveResize(dsk->bg.o_bg, 0, 0, w, h);
705 DeskBackgroundRefresh(dsk, DESK_BG_REFRESH);
706 DeskControlsDestroy(dsk, 1);
707 DeskControlsCreate(dsk);
708 DeskControlsShow(dsk, 1);
712 DeskGet(unsigned int desk)
714 if (desk >= Conf.desks.num)
717 return _DeskGet(desk);
721 DeskGetRelative(Desk * dsk, int inc)
725 desk = (dsk) ? dsk->num : 0;
727 desk %= Conf.desks.num;
729 return _DeskGet(desk);
733 DeskGetArea(const Desk * dsk, int *ax, int *ay)
740 *ax = dsk->current_area_x;
741 *ay = dsk->current_area_y;
745 DeskSetArea(Desk * dsk, int ax, int ay)
750 dsk->current_area_x = ax;
751 dsk->current_area_y = ay;
755 DeskSetDirtyStack(Desk * dsk, EObj * eo)
758 dsk->stack.latest = eo;
759 if (EobjGetType(eo) == EOBJ_TYPE_EWIN)
760 dsk->stack.update_client_list = 1;
761 if (EDebug(EDBUG_TYPE_STACKING))
762 Eprintf("DeskSetDirtyStack %d (%d): %s\n", dsk->num, dsk->stack.dirty,
767 DeskCurrentGetArea(int *ax, int *ay)
769 DeskGetArea(desks.current, ax, ay);
773 DeskCurrentSetArea(int ax, int ay)
775 DeskSetArea(desks.current, ax, ay);
781 return Conf.desks.num;
785 DesksGetCurrent(void)
787 return desks.current;
791 DesksGetCurrentNum(void)
793 return desks.current->num;
797 DesksSetCurrent(Desk * dsk)
805 DesksResize(int w, int h)
809 BackgroundsInvalidate(0);
811 for (i = 0; i < Conf.desks.num; i++)
816 ModulesSignal(ESIGNAL_DESK_RESIZE, NULL);
820 ChangeNumberOfDesktops(unsigned int quantity)
826 if (quantity >= ENLIGHTENMENT_CONF_NUM_DESKTOPS)
827 quantity = ENLIGHTENMENT_CONF_NUM_DESKTOPS;
829 if (quantity <= 0 || quantity == Conf.desks.num)
832 for (i = quantity; i < Conf.desks.num; i++)
835 if (quantity > Conf.desks.num)
837 while (Conf.desks.num < quantity)
840 DeskCreate(Conf.desks.num - 1, 1);
843 else if (quantity < Conf.desks.num)
845 lst = EwinListGetAll(&num);
846 for (j = 0; j < num; j++)
848 if (EoGetDeskNum(lst[j]) >= quantity)
849 EwinMoveToDesktop(lst[j], _DeskGet(quantity - 1));
852 while (Conf.desks.num > quantity)
854 DeskDestroy(_DeskGet(Conf.desks.num - 1));
859 if (DesksGetCurrentNum() >= Conf.desks.num)
860 DeskGotoNum(Conf.desks.num - 1);
862 HintsSetDesktopConfig();
868 DesksControlsCreate(void)
872 for (i = 0; i < Conf.desks.num; i++)
873 DeskControlsCreate(_DeskGet(i));
877 DesksControlsDestroy(void)
881 for (i = 0; i < Conf.desks.num; i++)
882 DeskControlsDestroy(_DeskGet(i), 1);
886 DesksControlsShow(void)
890 for (i = 0; i < Conf.desks.num; i++)
891 DeskControlsShow(_DeskGet(i), 1);
895 DesksControlsRefresh(void)
897 DesksControlsDestroy();
898 DesksControlsCreate();
908 ButtonsForeach(2, NULL, ButtonShow);
914 ButtonsForeach(2, NULL, ButtonHide);
919 DeskButtonShowDefault(Button * b)
921 if (!ButtonDoShowDefault(b))
927 DeskShowButtons(void)
929 ButtonsForeach(0, NULL, DeskButtonShowDefault);
933 MoveToDeskTop(Desk * dsk)
941 while (j < 0 && i < (int)Conf.desks.num)
943 if (desks.order[i] == dsk->num)
951 for (i = j - 1; i >= 0; i--)
952 desks.order[i + 1] = desks.order[i];
953 desks.order[0] = dsk->num;
958 MoveToDeskBottom(Desk * dsk)
966 while (j < 0 && i < (int)Conf.desks.num)
968 if (desks.order[i] == dsk->num)
974 if (j < (int)Conf.desks.num - 1)
976 for (i = j; i < (int)Conf.desks.num - 1; i++)
977 desks.order[i] = desks.order[i + 1];
978 desks.order[Conf.desks.num - 1] = dsk->num;
983 DesktopAt(int x, int y)
988 for (i = 0; i < Conf.desks.num; i++)
990 dsk = _DeskGet(desks.order[i]);
991 if (x >= EoGetX(dsk) && x < (EoGetX(dsk) + WinGetW(VROOT)) &&
992 y >= EoGetY(dsk) && y < (EoGetY(dsk) + WinGetH(VROOT)))
993 return _DeskGet(desks.order[i]);
999 DesksStackingCheck(void)
1004 for (i = 0; i < Conf.desks.num; i++)
1007 if (i && !dsk->viewable)
1009 if (!dsk->stack.dirty)
1016 _DesksIdler(void *data __UNUSED__)
1018 DesksStackingCheck();
1022 DeskMove(Desk * dsk, int x, int y)
1033 while (n < 0 && i < Conf.desks.num)
1035 if (desks.order[i] == dsk->num)
1039 if (n < 0) /* Should not be possible */
1042 dx = x - EoGetX(dsk);
1043 dy = y - EoGetY(dsk);
1045 if (x == 0 && y == 0)
1047 /* Desks below are obscured - touch and set unviewable */
1048 for (i = n + 1; i < Conf.desks.num; i++)
1050 dd = _DeskGet(desks.order[i]);
1052 BackgroundTouch(dd->bg.bg);
1060 for (i = n + 1; i < Conf.desks.num; i++)
1062 dd = _DeskGet(desks.order[i]);
1063 if (!dd->viewable && v)
1066 DeskBackgroundRefresh(_DeskGet(desks.order[i]),
1069 else if (dd->viewable && !v)
1071 BackgroundTouch(dd->bg.bg);
1075 if (EoGetX(dd) == 0 && EoGetY(dd) == 0)
1083 ButtonMoveRelative(dsk->tag, dx, dy);
1085 #if 0 /* FIXME - Remove? */
1088 lst = EwinListGetAll(&n);
1089 for (i = 0; i < (unsigned int)n; i++)
1090 if (EoGetDesk(lst[i]) == dsk)
1091 ICCCM_Configure(lst[i]);
1096 DeskHide(unsigned int desk)
1100 if (desk <= 0 || desk >= Conf.desks.num)
1103 dsk = _DeskGet(desk);
1106 BackgroundTouch(dsk->bg.bg);
1108 EoMove(dsk, WinGetW(VROOT), 0);
1112 DeskEnter(Desk * dsk)
1119 DeskBackgroundRefresh(dsk, DESK_BG_REFRESH);
1122 desks.previous = desks.current = dsk;
1126 for (i = Conf.desks.num - 1; i > 0; i--)
1127 DeskHide(desks.order[i]);
1130 EwinsMoveStickyToDesk(dsk);
1131 ButtonsMoveStickyToDesk(dsk);
1132 DesksStackingCheck();
1133 HintsSetCurrentDesktop();
1140 DeskGotoNum(unsigned int desk)
1144 if (Conf.desks.desks_wraparound)
1145 desk %= Conf.desks.num;
1146 if (desk >= Conf.desks.num || desk == desks.current->num)
1149 dsk = _DeskGet(desk);
1154 DeskSwitchStart(void)
1156 FocusNewDeskBegin();
1160 DeskSwitchDone(void)
1166 DeskGoto(Desk * dsk)
1168 if (!dsk || dsk == desks.previous)
1171 if (EDebug(EDBUG_TYPE_DESKS))
1172 Eprintf("DeskGoto %d\n", dsk->num);
1174 ModulesSignal(ESIGNAL_DESK_SWITCH_START, NULL);
1181 if (Conf.desks.slidein)
1187 switch (Conf.desks.dragdir)
1195 x = -WinGetW(VROOT);
1204 y = -WinGetH(VROOT);
1207 DeskMove(dsk, x, y);
1209 EobjSlideTo(&dsk->o, x, y, 0, 0, Conf.desks.slidespeed);
1213 EobjSlideTo(&dsk->o, EoGetX(dsk), EoGetY(dsk), 0, 0,
1214 Conf.desks.slidespeed);
1222 DeskMove(dsk, 0, 0);
1232 ModulesSignal(ESIGNAL_DESK_SWITCH_DONE, NULL);
1234 if (EDebug(EDBUG_TYPE_DESKS))
1235 Eprintf("DeskGoto %d done\n", dsk->num);
1239 UncoverDesktop(unsigned int desk)
1243 if (desk >= Conf.desks.num)
1246 dsk = _DeskGet(desk);
1249 DeskBackgroundRefresh(dsk, DESK_BG_REFRESH);
1253 DeskRaise(unsigned int desk)
1257 if (desk >= Conf.desks.num)
1260 dsk = _DeskGet(desk);
1262 if (EDebug(EDBUG_TYPE_DESKS))
1263 Eprintf("DeskRaise(%d) current=%d\n", desk, desks.current->num);
1269 ModulesSignal(ESIGNAL_DESK_SWITCH_DONE, NULL);
1275 DeskLower(unsigned int desk)
1279 if ((desk <= 0) || (desk >= Conf.desks.num))
1282 dsk = _DeskGet(desk);
1285 MoveToDeskBottom(dsk);
1287 if (EDebug(EDBUG_TYPE_DESKS))
1288 Eprintf("DeskLower(%d) %d -> %d\n", desk, desks.current->num,
1291 desks.previous = desks.current = DeskGet(desks.order[0]);
1295 UncoverDesktop(desks.order[0]);
1298 EwinsMoveStickyToDesk(desks.current);
1299 ButtonsMoveStickyToDesk(desks.current);
1300 DesksStackingCheck();
1302 if (Mode.mode == MODE_NONE)
1303 ModulesSignal(ESIGNAL_DESK_SWITCH_DONE, NULL);
1304 HintsSetCurrentDesktop();
1317 if (desk < 0 || desk >= Conf.desks.num)
1320 dsk = _DeskGet(desk);
1323 DeskBackgroundRefresh(dsk, DESK_BG_REFRESH);
1324 MoveToDeskTop(desk);
1328 for (i = Conf.desks.num - 1; i > 0; i--)
1329 DeskHide(desks.order[i]);
1335 DeskRestackSimple(Desk * dsk)
1337 EObj *const *lst, *eo;
1340 unsigned int value_mask;
1342 eo = dsk->stack.latest;
1345 if (EDebug(EDBUG_TYPE_STACKING))
1346 Eprintf("DeskRestackSimple %#lx %s\n", EobjGetXwin(eo), EobjGetName(eo));
1348 lst = EobjListStackGetForDesk(&num, dsk);
1352 for (i = 0; i < num; i++)
1360 xwc.stack_mode = Above;
1361 xwc.sibling = EobjGetXwin(lst[i + 1]);
1365 xwc.stack_mode = Below;
1366 xwc.sibling = EobjGetXwin(lst[i - 1]);
1368 value_mask = CWSibling | CWStackMode;
1369 if (EDebug(EDBUG_TYPE_STACKING))
1370 Eprintf("DeskRestackSimple %#10lx %s %#10lx\n", EobjGetXwin(eo),
1371 (xwc.stack_mode == Above) ? "Above" : "Below", xwc.sibling);
1372 XConfigureWindow(disp, EobjGetXwin(eo), value_mask, &xwc);
1375 #define _APPEND_TO_WIN_LIST(win) \
1377 wl = EREALLOC(Window, wl, ++tot); \
1378 wl[tot - 1] = win; \
1381 DeskRestack(Desk * dsk)
1385 EObj *const *lst, *eo;
1387 if (!dsk->stack.dirty)
1390 /* Special case if only one window needs restacking */
1391 if (dsk->stack.dirty == 1)
1393 DeskRestackSimple(dsk);
1397 /* Build the window stack, top to bottom */
1400 lst = EobjListStackGetForDesk(&num, dsk);
1402 /* Normal objects */
1403 for (i = 0; i < num; i++)
1406 _APPEND_TO_WIN_LIST(EobjGetXwin(eo));
1410 if (EDebug(EDBUG_TYPE_STACKING))
1412 Eprintf("DeskRestack %d (%d):\n", dsk->num, dsk->stack.dirty);
1413 for (i = 0; i < tot; i++)
1414 Eprintf(" win=%#10lx parent=%#10lx\n", wl[i],
1415 EXWindowGetParent(wl[i]));
1418 EXRestackWindows(wl, tot);
1423 if (dsk->stack.update_client_list)
1425 dsk->stack.update_client_list = 0;
1426 HintsSetClientStacking();
1429 dsk->stack.dirty = 0;
1430 dsk->stack.latest = NULL;
1434 DeskGotoByEwin(EWin * ewin)
1436 if (EoIsSticky(ewin) || EoIsFloating(ewin))
1439 DeskGoto(EoGetDesk(ewin));
1440 DeskCurrentGotoArea(ewin->area_x, ewin->area_y);
1446 static int area_w = 3;
1447 static int area_h = 3;
1450 DesksFixArea(int *ax, int *ay)
1454 if (Conf.desks.areas_wraparound)
1459 else if (*ax >= area_w)
1461 if (Conf.desks.areas_wraparound)
1469 if (Conf.desks.areas_wraparound)
1474 else if (*ay >= area_h)
1476 if (Conf.desks.areas_wraparound)
1484 AreaXYToLinear(int ax, int ay)
1486 DesksFixArea(&ax, &ay);
1487 return (ay * area_w) + ax;
1491 AreaLinearToXY(int a, int *ax, int *ay)
1495 else if (a >= (area_w * area_h))
1496 a = (area_w * area_h) - 1;
1498 *ax = a - (*ay * area_w);
1502 SetAreaSize(int aw, int ah)
1508 Conf.desks.areas_nx = area_w = aw;
1509 Conf.desks.areas_ny = area_h = ah;
1510 HintsSetViewportConfig();
1512 ModulesSignal(ESIGNAL_AREA_CONFIGURED, NULL);
1516 DesksGetAreaSize(int *aw, int *ah)
1523 SetNewAreaSize(int ax, int ay)
1534 DesksGetAreaSize(&a, &b);
1535 if ((a == ax) && (b == ay))
1538 SetAreaSize(ax, ay);
1540 lst = EwinListGetAll(&num);
1541 for (i = 0; i < num; i++)
1543 if (!EoIsSticky(lst[i]))
1545 if (lst[i]->area_x >= ax)
1546 EwinMoveToArea(lst[i], ax - 1, lst[i]->area_x);
1547 if (lst[i]->area_y >= ay)
1548 EwinMoveToArea(lst[i], lst[i]->area_x, ay - 1);
1552 DeskCurrentGetArea(&a, &b);
1555 DeskCurrentGotoArea(ax - 1, b);
1556 DeskCurrentGetArea(&a, &b);
1559 DeskCurrentGotoArea(a, ay - 1);
1565 SetCurrentLinearArea(int a)
1569 AreaLinearToXY(a, &ax, &ay);
1570 DeskCurrentGotoArea(ax, ay);
1574 GetCurrentLinearArea(void)
1578 DeskCurrentGetArea(&ax, &ay);
1580 return AreaXYToLinear(ax, ay);
1584 MoveCurrentLinearAreaBy(int a)
1586 SetCurrentLinearArea(GetCurrentLinearArea() + a);
1590 DeskCurrentGotoArea(int ax, int ay)
1592 EWin *const *lst, *ewin;
1593 int i, num, dx, dy, pax, pay;
1595 if ((Mode.mode == MODE_RESIZE) || (Mode.mode == MODE_RESIZE_H)
1596 || (Mode.mode == MODE_RESIZE_V))
1599 DesksFixArea(&ax, &ay);
1600 DeskCurrentGetArea(&pax, &pay);
1602 if (ax == pax && ay == pay)
1605 if (EDebug(EDBUG_TYPE_DESKS))
1606 Eprintf("DeskCurrentGotoArea %d,%d\n", ax, ay);
1608 ModulesSignal(ESIGNAL_AREA_SWITCH_START, NULL);
1610 dx = WinGetW(VROOT) * (ax - pax);
1611 dy = WinGetH(VROOT) * (ay - pay);
1614 SoundPlay(SOUND_MOVE_AREA_LEFT);
1616 SoundPlay(SOUND_MOVE_AREA_RIGHT);
1618 SoundPlay(SOUND_MOVE_AREA_UP);
1620 SoundPlay(SOUND_MOVE_AREA_DOWN);
1624 /* remove lots of event masks from windows.. we dont want to bother */
1625 /* handling events as a result of our playing wiht windows */
1628 /* set the current area up in out data structs */
1629 DeskCurrentSetArea(ax, ay);
1631 /* move all the windows around */
1632 lst = EwinListGetAll(&num);
1633 if (Conf.desks.slidein)
1638 /* create the list of windwos to move */
1639 for (i = 0; i < num; i++)
1642 if (EoIsSticky(ewin) || ewin->state.iconified)
1644 if (EoGetDesk(ewin) != DesksGetCurrent() && !EoIsFloating(ewin))
1647 if (EoIsFloating(ewin) && Conf.movres.mode_move == 0)
1651 wl = EREALLOC(EObj *, wl, wnum);
1652 wl[wnum - 1] = &ewin->o;
1658 EobjsSlideBy(wl, wnum, -dx, -dy, Conf.desks.slidespeed);
1664 /* move all windows to their final positions */
1665 Mode.move.check = 0;
1666 for (i = 0; i < num; i++)
1669 if (EwinIsTransientChild(ewin))
1671 if (EoGetDesk(ewin) != DesksGetCurrent() && !EoIsFloating(ewin))
1674 if (EoIsSticky(ewin) ||
1675 (EoIsFloating(ewin) && Conf.movres.mode_move == 0) ||
1676 (!ewin->state.iconified && Conf.desks.slidein))
1677 EwinMove(ewin, EoGetX(ewin), EoGetY(ewin));
1679 EwinMove(ewin, EoGetX(ewin) - dx, EoGetY(ewin) - dy);
1681 Mode.move.check = 1;
1683 if (!Conf.desks.slidein)
1686 /* set hints up for it */
1687 HintsSetDesktopViewport();
1691 /* re-focus on a new ewin on that new desktop area */
1694 ModulesSignal(ESIGNAL_AREA_SWITCH_DONE, DesksGetCurrent());
1696 /* update which "edge flip resistance" detector windows are visible */
1701 DeskCurrentMoveAreaBy(int dx, int dy)
1705 DeskCurrentGetArea(&ax, &ay);
1706 DeskCurrentGotoArea(ax + dx, ay + dy);
1712 static char sentpress = 0;
1715 ButtonProxySendEvent(XEvent * ev)
1717 if (Mode.button_proxy_win)
1718 EXSendEvent(Mode.button_proxy_win, SubstructureNotifyMask, ev);
1722 DeskDragStart(int desk)
1726 if (!(dsk = DeskGet(desk)))
1729 desks.drag_x0 = Mode.events.cx - EoGetX(dsk);
1730 desks.drag_y0 = Mode.events.cy - EoGetY(dsk);
1732 Mode.mode = MODE_DESKDRAG;
1736 DeskDragEnd(Desk * dsk __UNUSED__)
1738 Mode.mode = MODE_NONE;
1742 DeskDragMotion(Desk * dsk)
1746 x = Mode.events.mx - desks.drag_x0;
1747 y = Mode.events.my - desks.drag_y0;
1749 switch (Conf.desks.dragdir)
1774 DeskMove(dsk, x, y);
1778 DeskButtonCallback(EObj * eo, XEvent * ev, ActionClass * ac)
1782 if (Mode.mode != MODE_DESKDRAG)
1785 ActionclassEvent(ac, ev, NULL);
1796 DeskDragMotion(dsk);
1802 DeskCheckAction(Desk * dsk __UNUSED__, XEvent * ev)
1806 ac = ActionclassFind("DESKBINDINGS");
1810 return ActionclassEvent(ac, ev, NULL);
1814 DeskEventButtonPress(Desk * dsk, XEvent * ev)
1816 /* Don't handle desk bindings while doing stuff */
1820 GrabPointerRelease();
1822 if (!DeskCheckAction(dsk, ev))
1823 ButtonProxySendEvent(ev);
1827 DeskEventButtonRelease(Desk * dsk, XEvent * ev)
1829 /* Don't handle desk bindings while doing stuff */
1835 /* We never get here? */
1837 ButtonProxySendEvent(ev);
1840 DeskCheckAction(dsk, ev);
1844 DeskRootResize(int root, int w, int h)
1846 if (EDebug(EDBUG_TYPE_DESKS))
1847 Eprintf("DeskRootResize %d %dx%d\n", root, w, h);
1849 if (root && (VROOT != RROOT))
1855 /* Quit if no change */
1856 if (w == WinGetW(VROOT) && h == WinGetH(VROOT))
1861 /* Quit if size is not final */
1862 if (w != WinGetW(VROOT) || h != WinGetH(VROOT))
1868 Mode.screen.w_old = WinGetW(VROOT);
1869 Mode.screen.h_old = WinGetH(VROOT);
1872 static ActionClass *
1873 DeskGetAclass(void *data __UNUSED__)
1875 return ActionclassFind("DESKBINDINGS");
1879 DeskPropertyChange(Desk * dsk, XEvent * ev)
1883 if (ev->xproperty.atom == E_XROOTPMAP_ID)
1885 /* Possible race here? */
1886 pmap = HintsGetRootPixmap(EoGetWin(dsk));
1887 if (EDebug(EDBUG_TYPE_DESKS))
1888 Eprintf("DeskPropertyChange win=%#lx _XROOTPMAP_ID=%#lx\n",
1889 ev->xany.window, pmap);
1890 if (ev->xany.window != WinGetXwin(VROOT))
1892 if (pmap == dsk->bg.pmap)
1894 if (pmap == Mode.root.ext_pmap)
1896 Mode.root.ext_pmap = pmap;
1897 Mode.root.ext_pmap_valid = EDrawableCheck(pmap, 0);
1898 DesksBackgroundRefresh(NULL, DESK_BG_REFRESH);
1900 else if (ev->xproperty.atom == E_XROOTCOLOR_PIXEL)
1902 if (EDebug(EDBUG_TYPE_DESKS))
1903 Eprintf("DeskPropertyChange win=%#lx _XROOTCOLOR_PIXEL\n",
1905 if (ev->xany.window != WinGetXwin(VROOT))
1911 DeskHandleEvents(Win win __UNUSED__, XEvent * ev, void *prm)
1913 Desk *dsk = (Desk *) prm;
1918 DeskEventButtonPress(dsk, ev);
1921 DeskEventButtonRelease(dsk, ev);
1925 FocusHandleEnter(NULL, ev);
1928 FocusHandleLeave(NULL, ev);
1932 /* Motion over desk buttons doesn't go here - We probably don't care much. */
1933 DesksSetCurrent(DesktopAt(Mode.events.mx, Mode.events.my));
1934 TooltipsSetPending(1, DeskGetAclass, dsk);
1937 case ConfigureNotify:
1938 if (ev->xconfigure.window == WinGetXwin(VROOT))
1939 DeskRootResize(0, ev->xconfigure.width, ev->xconfigure.height);
1942 case PropertyNotify:
1943 if (ev->xany.window == WinGetXwin(VROOT))
1944 DeskPropertyChange(dsk, ev);
1948 case EX_EVENT_SCREEN_CHANGE_NOTIFY:
1950 XRRScreenChangeNotifyEvent *rrev = (XRRScreenChangeNotifyEvent *) ev;
1952 DeskRootResize(1, rrev->width, rrev->height);
1962 DeskDragdirSet(const char *params)
1968 pd = Conf.desks.dragdir;
1970 if (params && params[0])
1971 Conf.desks.dragdir = atoi(params);
1974 Conf.desks.dragdir++;
1975 if (Conf.desks.dragdir > 3)
1976 Conf.desks.dragdir = 0;
1979 if (pd == Conf.desks.dragdir)
1982 for (i = 1; i < Conf.desks.num; i++)
1985 EoMove(dsk, (dsk->viewable) ? 0 : WinGetW(VROOT), 0);
1987 DesksControlsRefresh();
1991 DeskDragbarOrderSet(const char *params)
1995 pd = Conf.desks.dragbar_ordering;
1997 if (params && params[0])
1998 Conf.desks.dragbar_ordering = atoi(params);
2001 Conf.desks.dragbar_ordering++;
2002 if (Conf.desks.dragbar_ordering > 5)
2003 Conf.desks.dragbar_ordering = 0;
2006 if (pd == Conf.desks.dragbar_ordering)
2009 DesksControlsRefresh();
2015 doDragbarWidthSet(EWin * edummy, const char *params)
2020 pd = Conf.desks.dragbar_width;
2022 Conf.desks.dragbar_width = atoi(params);
2024 if (pd != Conf.desks.dragbar_width)
2026 DesksControlsRefresh();
2032 doDragbarLengthSet(EWin * edummy, const char *params)
2037 pd = Conf.desks.dragbar_length;
2039 Conf.desks.dragbar_length = atoi(params);
2041 if (pd != Conf.desks.dragbar_length)
2043 DesksControlsRefresh();
2051 doDeskray(EWin * edummy, const char *params)
2058 Conf.deskmode = MODE_NONE;
2062 Conf.deskmode = MODE_DESKRAY;
2068 if (Conf.deskmode == MODE_DESKRAY)
2071 Conf.deskmode = MODE_NONE;
2075 Conf.deskmode = MODE_DESKRAY;
2081 #endif /* ENABLE_DESKRAY */
2088 memset(&desks, 0, sizeof(desks));
2090 Mode.screen.w_old = WinGetW(VROOT);
2091 Mode.screen.h_old = WinGetH(VROOT);
2093 /* Backward compatibility hack */
2094 if (Conf.desks.edge_flip_resistance <= 0)
2095 Conf.desks.edge_flip_mode = EDGE_FLIP_OFF;
2097 desks.previous = NULL;
2099 for (i = 0; i < Conf.desks.num; i++)
2102 SetAreaSize(Conf.desks.areas_nx, Conf.desks.areas_ny);
2104 /* Retreive stuff from last time we were loaded if we're restarting */
2105 EHintsGetDeskInfo();
2107 HintsSetDesktopConfig();
2111 DesksConfigure(void)
2115 for (i = 0; i < Conf.desks.num; i++)
2116 DeskConfigure(_DeskGet(i));
2126 DesksSighan(int sig, void *prm __UNUSED__)
2134 case ESIGNAL_CONFIGURE:
2139 /* Draw all the buttons that belong on the desktop */
2141 IdlerAdd(_DesksIdler, NULL);
2150 static int tmp_desktops;
2151 static DItem *tmp_desk_text;
2152 static char tmp_desktop_slide;
2153 static int tmp_desktop_slide_speed;
2154 static char tmp_desktop_wraparound;
2155 static char tmp_dragbar;
2156 static int tmp_dragdir;
2159 CB_ConfigureDesktops(Dialog * d __UNUSED__, int val, void *data __UNUSED__)
2164 ChangeNumberOfDesktops(tmp_desktops);
2165 Conf.desks.slidein = tmp_desktop_slide;
2166 Conf.desks.slidespeed = tmp_desktop_slide_speed;
2167 Conf.desks.desks_wraparound = tmp_desktop_wraparound;
2169 if ((Conf.desks.dragdir != tmp_dragdir) ||
2170 ((tmp_dragbar) && (Conf.desks.dragbar_width < 1)) ||
2171 ((!tmp_dragbar) && (Conf.desks.dragbar_width > 0)))
2174 Conf.desks.dragbar_width = 16;
2176 Conf.desks.dragbar_width = 0;
2177 Conf.desks.dragdir = tmp_dragdir;
2178 DesksControlsRefresh();
2183 CB_DesktopDisplayRedraw(Dialog * d, int val, void *data)
2185 static char called = 0;
2186 static int prev_desktops = -1;
2187 static Win wins[ENLIGHTENMENT_CONF_NUM_DESKTOPS];
2198 if ((val != 1) && (prev_desktops == tmp_desktops))
2201 prev_desktops = tmp_desktops;
2202 di = (DItem *) data;
2203 win = DialogItemAreaGetWindow(di);
2204 DialogItemAreaGetSize(di, &w, &h);
2208 ic = ImageclassFind("SETTINGS_DESKTOP_AREA", 1);
2209 ImageclassApply(ic, win, 0, 0, STATE_NORMAL, ST_SOLID);
2210 for (i = 0; i < ENLIGHTENMENT_CONF_NUM_DESKTOPS; i++)
2215 for (i = 0; i < tmp_desktops; i++)
2221 wins[i] = ECreateWindow(win, 0, 0, 64, 48, 0);
2222 ESetWindowBorderWidth(wins[i], 1);
2224 bg = DeskBackgroundGet(DeskGet(i));
2229 pmap = EGetWindowBackgroundPixmap(wins[i]);
2230 BackgroundApplyPmap(bg, wins[i], pmap, 64, 48);
2234 ic = ImageclassFind("SETTINGS_DESKTOP_AREA", 1);
2235 ImageclassApply(ic, wins[i], 0, 0, STATE_NORMAL, ST_SOLID);
2240 for (i = tmp_desktops - 1; i >= 0; i--)
2244 num = tmp_desktops - 1;
2247 EMoveWindow(wins[i], (i * (w - 64 - 2)) / num,
2248 (i * (h - 48 - 2)) / num);
2249 ERaiseWindow(wins[i]);
2250 EMapWindow(wins[i]);
2253 for (i = tmp_desktops; i < ENLIGHTENMENT_CONF_NUM_DESKTOPS; i++)
2257 EUnmapWindow(wins[i]);
2260 Esnprintf(s, sizeof(s), "%i", tmp_desktops);
2261 DialogItemSetText(tmp_desk_text, s);
2262 DialogDrawItems(d, tmp_desk_text, 0, 0, 99999, 99999);
2266 CB_DesktopDisplayAreaRedraw(DItem * di, int val __UNUSED__,
2267 void *data __UNUSED__)
2269 CB_DesktopDisplayRedraw(DialogItemGetDialog(di), 1, di);
2273 _DlgFillDesks(Dialog * d __UNUSED__, DItem * table, void *data __UNUSED__)
2275 DItem *di, *slider, *radio;
2277 tmp_desktops = Conf.desks.num;
2278 tmp_desktop_slide = Conf.desks.slidein;
2279 tmp_desktop_slide_speed = Conf.desks.slidespeed;
2280 tmp_desktop_wraparound = Conf.desks.desks_wraparound;
2281 if (Conf.desks.dragbar_width < 1)
2285 tmp_dragdir = Conf.desks.dragdir;
2287 DialogItemTableSetOptions(table, 2, 0, 0, 0);
2289 di = DialogAddItem(table, DITEM_TEXT);
2290 DialogItemSetColSpan(di, 2);
2291 DialogItemSetText(di, _("Number of virtual desktops:\n"));
2293 di = tmp_desk_text = DialogAddItem(table, DITEM_TEXT);
2294 DialogItemSetColSpan(di, 2);
2295 DialogItemSetText(di, "X");
2297 di = slider = DialogAddItem(table, DITEM_SLIDER);
2298 DialogItemSliderSetBounds(di, 1, 32);
2299 DialogItemSliderSetUnits(di, 1);
2300 DialogItemSliderSetJump(di, 1);
2301 DialogItemSetColSpan(di, 2);
2302 DialogItemSliderSetValPtr(di, &tmp_desktops);
2304 di = DialogAddItem(table, DITEM_AREA);
2305 DialogItemSetColSpan(di, 2);
2306 DialogItemAreaSetSize(di, 128, 96);
2307 DialogItemAreaSetInitFunc(di, CB_DesktopDisplayAreaRedraw);
2309 DialogItemSetCallback(slider, CB_DesktopDisplayRedraw, 0, di);
2311 di = DialogAddItem(table, DITEM_SEPARATOR);
2312 DialogItemSetColSpan(di, 2);
2314 di = DialogAddItem(table, DITEM_CHECKBUTTON);
2315 DialogItemSetColSpan(di, 2);
2316 DialogItemSetText(di, _("Slide desktops around when changing"));
2317 DialogItemCheckButtonSetPtr(di, &tmp_desktop_slide);
2319 di = DialogAddItem(table, DITEM_TEXT);
2320 DialogItemSetColSpan(di, 2);
2321 DialogItemSetAlign(di, 1024, 512);
2322 DialogItemSetText(di, _("Desktop Slide speed:\n"));
2324 di = DialogAddItem(table, DITEM_SLIDER);
2325 DialogItemSetColSpan(di, 2);
2326 DialogItemSliderSetBounds(di, 0, 20000);
2327 DialogItemSliderSetUnits(di, 500);
2328 DialogItemSliderSetJump(di, 1000);
2329 DialogItemSliderSetValPtr(di, &tmp_desktop_slide_speed);
2331 di = DialogAddItem(table, DITEM_SEPARATOR);
2332 DialogItemSetColSpan(di, 2);
2334 di = DialogAddItem(table, DITEM_CHECKBUTTON);
2335 DialogItemSetColSpan(di, 2);
2336 DialogItemSetText(di, _("Wrap desktops around"));
2337 DialogItemCheckButtonSetPtr(di, &tmp_desktop_wraparound);
2339 di = DialogAddItem(table, DITEM_SEPARATOR);
2340 DialogItemSetColSpan(di, 2);
2342 di = DialogAddItem(table, DITEM_CHECKBUTTON);
2343 DialogItemSetColSpan(di, 2);
2344 DialogItemSetText(di, _("Display desktop dragbar"));
2345 DialogItemCheckButtonSetPtr(di, &tmp_dragbar);
2347 di = DialogAddItem(table, DITEM_TEXT);
2348 DialogItemSetColSpan(di, 2);
2349 DialogItemSetAlign(di, 0, 512);
2350 DialogItemSetText(di, _("Drag bar position:"));
2352 radio = di = DialogAddItem(table, DITEM_RADIOBUTTON);
2353 DialogItemSetColSpan(di, 2);
2354 DialogItemSetText(di, _("Top"));
2355 DialogItemRadioButtonSetFirst(di, radio);
2356 DialogItemRadioButtonGroupSetVal(di, 2);
2358 di = DialogAddItem(table, DITEM_RADIOBUTTON);
2359 DialogItemSetColSpan(di, 2);
2360 DialogItemSetText(di, _("Bottom"));
2361 DialogItemRadioButtonSetFirst(di, radio);
2362 DialogItemRadioButtonGroupSetVal(di, 3);
2364 di = DialogAddItem(table, DITEM_RADIOBUTTON);
2365 DialogItemSetColSpan(di, 2);
2366 DialogItemSetText(di, _("Left"));
2367 DialogItemRadioButtonSetFirst(di, radio);
2368 DialogItemRadioButtonGroupSetVal(di, 0);
2370 di = DialogAddItem(table, DITEM_RADIOBUTTON);
2371 DialogItemSetColSpan(di, 2);
2372 DialogItemSetText(di, _("Right"));
2373 DialogItemRadioButtonSetFirst(di, radio);
2374 DialogItemRadioButtonGroupSetVal(di, 1);
2375 DialogItemRadioButtonGroupSetValPtr(radio, &tmp_dragdir);
2378 const DialogDef DlgDesks = {
2379 "CONFIGURE_DESKTOPS",
2381 N_("Multiple Desktop Settings"),
2382 SOUND_SETTINGS_DESKTOPS,
2384 N_("Enlightenment Multiple Desktop\n" "Settings Dialog\n"),
2386 DLG_OAC, CB_ConfigureDesktops,
2389 static int tmp_area_x;
2390 static int tmp_area_y;
2391 static int tmp_edge_flip;
2392 static int tmp_edge_resist;
2393 static DItem *tmp_area_text;
2394 static char tmp_area_wraparound;
2397 CB_ConfigureAreas(Dialog * d __UNUSED__, int val, void *data __UNUSED__)
2402 SetNewAreaSize(tmp_area_x, tmp_area_y);
2403 Conf.desks.areas_wraparound = tmp_area_wraparound;
2404 Conf.desks.edge_flip_mode = tmp_edge_flip;
2405 if (tmp_edge_resist < 1)
2406 tmp_edge_resist = 1;
2407 Conf.desks.edge_flip_resistance = tmp_edge_resist;
2411 CB_AreaDisplayRedraw(Dialog * d __UNUSED__, int val, void *data)
2413 static int prev_ax = 0, prev_ay = 0;
2420 if ((val != 1) && (prev_ax == tmp_area_x) && (prev_ay == tmp_area_y))
2423 prev_ax = tmp_area_x;
2424 prev_ay = tmp_area_y;
2426 di = (DItem *) data;
2427 win = DialogItemAreaGetWindow(di);
2428 DialogItemAreaGetSize(di, &w, &h);
2435 ic = ImageclassFind("SETTINGS_AREA_AREA", 1);
2436 ImageclassApply(ic, win, 0, 0, STATE_NORMAL, ST_SOLID);
2438 /* Note: awin is destroyed when the dialog is destroyed */
2439 awin = ECreateWindow(win, 0, 0, 18, 14, 0);
2440 ic = ImageclassFind("SETTINGS_AREADESK_AREA", 1);
2441 pmap = EGetWindowBackgroundPixmap(awin);
2442 ImageclassApplySimple(ic, awin, pmap, STATE_NORMAL, 0, 0, 18, 14);
2446 EMoveResizeWindow(awin, (w - ww) / 2, (h - hh) / 2, ww, hh);
2449 Esnprintf(s, sizeof(s), "%i x %i", prev_ax, prev_ay);
2450 DialogItemSetText(tmp_area_text, s);
2451 DialogDrawItems(d, tmp_area_text, 0, 0, 99999, 99999);
2455 CB_AreaDisplayAreaRedraw(DItem * di, int val __UNUSED__, void *data __UNUSED__)
2457 CB_AreaDisplayRedraw(DialogItemGetDialog(di), 1, di);
2461 _DlgFillAreas(Dialog * d __UNUSED__, DItem * table, void *data __UNUSED__)
2463 DItem *di, *slider, *slider2, *table2, *radio;
2465 tmp_area_wraparound = Conf.desks.areas_wraparound;
2467 tmp_edge_flip = Conf.desks.edge_flip_mode;
2468 tmp_edge_resist = Conf.desks.edge_flip_resistance;
2470 DesksGetAreaSize(&tmp_area_x, &tmp_area_y);
2472 DialogItemTableSetOptions(table, 1, 0, 0, 0);
2474 di = DialogAddItem(table, DITEM_TEXT);
2475 DialogItemSetText(di, _("Virtual Desktop size:\n"));
2477 di = tmp_area_text = DialogAddItem(table, DITEM_TEXT);
2478 DialogItemSetText(di, "X");
2480 table2 = DialogAddItem(table, DITEM_TABLE);
2481 DialogItemTableSetOptions(table2, 2, 0, 0, 0);
2483 di = DialogAddItem(table2, DITEM_NONE);
2485 di = slider = DialogAddItem(table2, DITEM_SLIDER);
2486 DialogItemSliderSetMinLength(di, 10);
2487 DialogItemSliderSetBounds(di, 1, 8);
2488 DialogItemSliderSetUnits(di, 1);
2489 DialogItemSliderSetJump(di, 1);
2490 DialogItemSliderSetValPtr(di, &tmp_area_x);
2492 di = slider2 = DialogAddItem(table2, DITEM_SLIDER);
2493 DialogItemSliderSetMinLength(di, 10);
2494 DialogItemSliderSetOrientation(di, 0);
2495 DialogItemSetFill(di, 0, 1);
2496 DialogItemSliderSetBounds(di, 1, 8);
2497 DialogItemSliderSetUnits(di, 1);
2498 DialogItemSliderSetJump(di, 1);
2499 DialogItemSliderSetValPtr(di, &tmp_area_y);
2501 di = DialogAddItem(table2, DITEM_AREA);
2502 DialogItemAreaSetSize(di, 160, 120);
2503 DialogItemAreaSetInitFunc(di, CB_AreaDisplayAreaRedraw);
2505 DialogItemSetCallback(slider, CB_AreaDisplayRedraw, 0, di);
2506 DialogItemSetCallback(slider2, CB_AreaDisplayRedraw, 0, di);
2508 di = DialogAddItem(table, DITEM_SEPARATOR);
2510 di = DialogAddItem(table, DITEM_CHECKBUTTON);
2511 DialogItemSetText(di, _("Wrap virtual desktops around"));
2512 DialogItemCheckButtonSetPtr(di, &tmp_area_wraparound);
2514 di = DialogAddItem(table, DITEM_SEPARATOR);
2516 di = DialogAddItem(table, DITEM_TEXT);
2517 DialogItemSetAlign(di, 0, 512);
2518 DialogItemSetText(di, _("Edge Flip Mode:"));
2520 radio = di = DialogAddItem(table, DITEM_RADIOBUTTON);
2521 DialogItemSetText(di, _("Off"));
2522 DialogItemRadioButtonSetFirst(di, radio);
2523 DialogItemRadioButtonGroupSetVal(di, EDGE_FLIP_OFF);
2525 di = DialogAddItem(table, DITEM_RADIOBUTTON);
2526 DialogItemSetText(di, _("On"));
2527 DialogItemRadioButtonSetFirst(di, radio);
2528 DialogItemRadioButtonGroupSetVal(di, EDGE_FLIP_ON);
2530 di = DialogAddItem(table, DITEM_RADIOBUTTON);
2531 DialogItemSetText(di, _("Only when moving window"));
2532 DialogItemRadioButtonSetFirst(di, radio);
2533 DialogItemRadioButtonGroupSetVal(di, EDGE_FLIP_MOVE);
2534 DialogItemRadioButtonGroupSetValPtr(radio, &tmp_edge_flip);
2536 di = DialogAddItem(table, DITEM_TEXT);
2537 DialogItemSetText(di, _("Resistance at edge of screen:\n"));
2539 di = DialogAddItem(table, DITEM_SLIDER);
2540 DialogItemSliderSetMinLength(di, 10);
2541 DialogItemSliderSetBounds(di, 1, 100);
2542 DialogItemSliderSetUnits(di, 1);
2543 DialogItemSliderSetJump(di, 10);
2544 DialogItemSliderSetValPtr(di, &tmp_edge_resist);
2547 const DialogDef DlgAreas = {
2550 N_("Virtual Desktop Settings"),
2551 SOUND_SETTINGS_AREA,
2553 N_("Enlightenment Virtual Desktop\n" "Settings Dialog\n"),
2555 DLG_OAC, CB_ConfigureAreas,
2557 #endif /* ENABLE_DIALOGS */
2564 DeskOpGoto(unsigned int desk)
2567 Desk *pd = DesksGetCurrent();
2569 if (desk >= Conf.desks.num)
2572 dsk = _DeskGet(desk);
2576 if (DesksGetCurrent() != pd)
2577 SoundPlay(SOUND_DESKTOP_SHUT);
2581 DeskOpGotoRel(int drel)
2585 desk = (int)DesksGetCurrentNum() + drel;
2586 if (Conf.desks.desks_wraparound)
2587 desk = (desk + Conf.desks.num) % Conf.desks.num;
2589 DeskOpGoto((unsigned int)desk);
2593 DeskOpDrag(int desk)
2595 DeskDragStart(desk);
2599 DesksIpcDesk(const char *params)
2602 char cmd[128], prm[128];
2606 cmd[0] = prm[0] = '\0';
2611 sscanf(p, "%100s %100s %n", cmd, prm, &len);
2615 desk = DesksGetCurrentNum();
2617 if (!p || cmd[0] == '?')
2619 IpcPrintf("Current Desktop: %d/%d\n", desk, Conf.desks.num);
2621 else if (!strncmp(cmd, "set", 3))
2623 sscanf(prm, "%i", &desk);
2624 ChangeNumberOfDesktops(desk);
2626 else if (!strncmp(cmd, "list", 2))
2630 for (desk = 0; desk < Conf.desks.num; desk++)
2632 dsk = _DeskGet(desk);
2634 ("Desk %d: viewable=%d order=%d x,y=%4d,%4d wxh=%4dx%4d area x,y=%d,%d pmap=%#lx\n",
2635 desk, dsk->viewable, desks.order[desk],
2636 EoGetX(dsk), EoGetY(dsk), EoGetW(dsk), EoGetH(dsk),
2637 dsk->current_area_x, dsk->current_area_y, dsk->bg.pmap);
2640 else if (!strncmp(cmd, "goto", 2))
2642 sscanf(prm, "%i", &desk);
2645 else if (!strncmp(cmd, "next", 2))
2649 else if (!strncmp(cmd, "prev", 2))
2653 else if (!strncmp(cmd, "this", 2))
2657 else if (!strncmp(cmd, "raise", 2))
2659 sscanf(prm, "%i", &desk);
2660 SoundPlay(SOUND_DESKTOP_RAISE);
2663 else if (!strncmp(cmd, "lower", 2))
2665 sscanf(prm, "%i", &desk);
2666 SoundPlay(SOUND_DESKTOP_LOWER);
2669 else if (!strcmp(cmd, "drag"))
2675 else if (!strcmp(cmd, "clear"))
2677 EwinsShowDesktop(!Mode.showing_desktop);
2679 else if (!strncmp(cmd, "arrange", 3))
2686 DesksIpcArea(const char *params)
2689 char cmd[128], prm[128];
2693 cmd[0] = prm[0] = '\0';
2698 sscanf(p, "%100s %100s %n", cmd, prm, &len);
2702 DeskCurrentGetArea(&ax, &ay);
2704 if (!p || cmd[0] == '?')
2706 IpcPrintf("Current Area: %d %d\n", ax, ay);
2708 else if (!strncmp(cmd, "set", 3))
2710 sscanf(params, "%*s %i %i", &ax, &ay);
2711 SetNewAreaSize(ax, ay);
2713 else if (!strncmp(cmd, "goto", 2))
2715 sscanf(params, "%*s %i %i", &ax, &ay);
2716 DeskCurrentGotoArea(ax, ay);
2718 else if (!strncmp(cmd, "move", 2))
2721 sscanf(params, "%*s %i %i", &dx, &dy);
2722 DeskCurrentMoveAreaBy(dx, dy);
2724 else if (!strncmp(cmd, "lgoto", 2))
2726 sscanf(params, "%*s %i", &ax);
2727 SetCurrentLinearArea(ax);
2729 else if (!strncmp(cmd, "lmove", 2))
2732 sscanf(params, "%*s %i", &dx);
2733 MoveCurrentLinearAreaBy(dx);
2737 static const IpcItem DesksIpcArray[] = {
2741 "Desktop functions",
2742 " desk ? Desktop info\n"
2743 " desk drag Start deskdrag\n"
2744 " desk set <nd> Set number of desktops\n"
2745 " desk goto <d> Goto specified desktop\n"
2746 " desk list Show desk info\n"
2747 " desk next Goto next desktop\n"
2748 " desk prev Goto previous desktop\n"
2749 " desk this Goto this desktop\n"
2750 " desk lower <d> Lower desktop\n"
2751 " desk raise <d> Raise desktop\n"
2752 " desk arrange Arrange windows on desktop\"\n"
2753 " desk clear \"Show Desktop\"\n"}
2759 " area ? Area info\n"
2760 " area set <nx> <ny> Set area size\n"
2761 " area goto <ax> <ay> Goto specified area\n"
2762 " area move <dx> <dy> Move relative to current area\n"
2763 " area lgoto <al> Goto specified linear area\n"
2764 " area lmove <dl> Move relative to current linear area\n"}
2767 #define N_IPC_FUNCS (sizeof(DesksIpcArray)/sizeof(IpcItem))
2770 DesksCfgFuncCount(void *item __UNUSED__, const char *value)
2772 ChangeNumberOfDesktops(atoi(value));
2776 DesksCfgFuncDragdir(void *item __UNUSED__, const char *value)
2778 DeskDragdirSet(value);
2782 DesksCfgFuncDragdbarOrder(void *item __UNUSED__, const char *value)
2784 DeskDragbarOrderSet(value);
2788 AreasCfgFuncSizeX(void *item __UNUSED__, const char *value)
2792 DesksGetAreaSize(&ax, &ay);
2793 SetNewAreaSize(atoi(value), ay);
2797 AreasCfgFuncSizeY(void *item __UNUSED__, const char *value)
2801 DesksGetAreaSize(&ax, &ay);
2802 SetNewAreaSize(ax, atoi(value));
2805 static const CfgItem DesksCfgItems[] = {
2806 CFG_FUNC_INT(Conf.desks, num, 2, DesksCfgFuncCount),
2807 CFG_FUNC_INT(Conf.desks, dragdir, 2, DesksCfgFuncDragdir),
2808 CFG_ITEM_INT(Conf.desks, dragbar_width, 16),
2809 CFG_ITEM_INT(Conf.desks, dragbar_length, 0),
2810 CFG_FUNC_INT(Conf.desks, dragbar_ordering, 1, DesksCfgFuncDragdbarOrder),
2811 CFG_ITEM_BOOL(Conf.desks, desks_wraparound, 0),
2812 CFG_ITEM_BOOL(Conf.desks, slidein, 1),
2813 CFG_ITEM_INT(Conf.desks, slidespeed, 6000),
2815 CFG_FUNC_INT(Conf.desks, areas_nx, 2, AreasCfgFuncSizeX),
2816 CFG_FUNC_INT(Conf.desks, areas_ny, 1, AreasCfgFuncSizeY),
2817 CFG_ITEM_BOOL(Conf.desks, areas_wraparound, 0),
2819 CFG_ITEM_INT(Conf.desks, edge_flip_mode, EDGE_FLIP_ON),
2820 CFG_ITEM_INT(Conf.desks, edge_flip_resistance, 25),
2822 #define N_CFG_ITEMS (sizeof(DesksCfgItems)/sizeof(CfgItem))
2827 extern const EModule ModDesktops;
2828 const EModule ModDesktops = {
2831 {N_IPC_FUNCS, DesksIpcArray},
2832 {N_CFG_ITEMS, DesksCfgItems}