/** * * Beryl group plugin * * group.c * * Copyright : (C) 2006 by Patrick Niklaus * E-mail : patrick.niklaus [ a t ] googlemail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * * TODO: * * glow effect * * tab like switching between the windows * * a lot of other tab stuff... * * provide a tree system for groups * **/ #include #include #include #include #include #include #include #include #include #include #include "group_glow.h" /* * Constants * */ #define PI 3.1415926535897 #define NUM_CORNER_POINTS 25 //#define GROUP_DEBUG(fmt, args...) printf(fmt, ##args) #define GROUP_DEBUG(fmt, args...) #define GROUP_DISPLAY_OPTION_SELECT 0 #define GROUP_DISPLAY_OPTION_SELECT_SINGLE 1 #define GROUP_DISPLAY_OPTION_GROUPING 2 #define GROUP_DISPLAY_OPTION_UNGROUPING 3 #define GROUP_DISPLAY_OPTION_REMOVEING 4 #define GROUP_DISPLAY_OPTION_CLOSEING 5 #define GROUP_DISPLAY_OPTION_MINIMIZEING 6 #define GROUP_DISPLAY_OPTION_IGNORE 7 #define GROUP_DISPLAY_OPTION_TABMODE 8 #define GROUP_DISPLAY_OPTION_CHANGE_TAB_LEFT 9 #define GROUP_DISPLAY_OPTION_CHANGE_TAB_RIGHT 10 #define GROUP_DISPLAY_OPTION_NUM 11 #define GROUP_SCREEN_OPTION_TYPES 0 #define GROUP_SCREEN_OPTION_OPACITY 1 #define GROUP_SCREEN_OPTION_SATURATION 2 #define GROUP_SCREEN_OPTION_BRIGHTNESS 3 #define GROUP_SCREEN_OPTION_GLOW 4 #define GROUP_SCREEN_OPTION_MOVE 5 #define GROUP_SCREEN_OPTION_RESIZE 6 #define GROUP_SCREEN_OPTION_RAISE 7 #define GROUP_SCREEN_OPTION_AUTO_UNGROUP 8 #define GROUP_SCREEN_OPTION_AUTO_GROUP 9 #define GROUP_SCREEN_OPTION_RELATIVE_DISTANCE 10 #define GROUP_SCREEN_OPTION_SELECTION_COLOR 11 #define GROUP_SCREEN_OPTION_LINE_COLOR 12 #define GROUP_SCREEN_OPTION_TOLERANCE 13 #define GROUP_SCREEN_OPTION_STEPS 14 #define GROUP_SCREEN_OPTION_THUMB_SIZE 15 #define GROUP_SCREEN_OPTION_BORDER_WIDTH 16 #define GROUP_SCREEN_OPTION_BORDER_RADIUS 17 #define GROUP_SCREEN_OPTION_TAB_BORDER_COLOR 18 #define GROUP_SCREEN_OPTION_TAB_FILL_COLOR 19 #define GROUP_SCREEN_OPTION_TAB_CREATE_MIPMAPS 20 #define GROUP_SCREEN_OPTION_GLOW_SIZE 21 #define GROUP_SCREEN_OPTION_GLOW_OFFSET 22 #define GROUP_SCREEN_OPTION_NUM 23 /* * Helpers * */ #define GET_GROUP_DISPLAY(d) ((GroupDisplay *) (d)->privates[displayPrivateIndex].ptr) #define GROUP_DISPLAY(d) GroupDisplay *gd = GET_GROUP_DISPLAY (d) #define GET_GROUP_SCREEN(s, gd) ((GroupScreen *) (s)->privates[ (gd)->screenPrivateIndex].ptr) #define GROUP_SCREEN(s) GroupScreen *gs = GET_GROUP_SCREEN (s, GET_GROUP_DISPLAY (s->display)) #define GET_GROUP_WINDOW(w, gs) ((GroupWindow *) (w)->privates[ (gs)->windowPrivateIndex].ptr) #define GROUP_WINDOW(w) GroupWindow *gw = GET_GROUP_WINDOW (w, GET_GROUP_SCREEN (w->screen, GET_GROUP_DISPLAY (w->screen->display))) #define WIN_X(w) (w->attrib.x) #define WIN_Y(w) (w->attrib.y) #define WIN_WIDTH(w) (w->attrib.width) #define WIN_HEIGHT(w) (w->attrib.height) #define WIN_BORDER(w) (w->attrib.border_width) #define NUM_OPTIONS(s) (sizeof ( (s)->opt) / sizeof (CompOption)) #define N_WIN_TYPE (sizeof (groupDefaultTypes) / sizeof (groupDefaultTypes[0])) #define N_SEL_MODE (sizeof (groupSelectionModes) / sizeof (groupSelectionModes[0])) #define REAL_POSITION(x, s) ( (x >= 0)? x: x + (s)->hsize * (s)->width ) #define VIEWPORT(x, s) ( ( REAL_POSITION(x, s) / (s)->width ) % (s)->hsize ) #define TOP_TAB(g) ((g)->windows[(g)->topTab]) #define PREV_TOP_TAB(g) ((g)->windows[(g)->prevTopTab]) /* * Structs * */ /* * structs for pending callbacks */ typedef struct _GroupPendingMoves GroupPendingMoves; struct _GroupPendingMoves { CompWindow *w; int dx; int dy; Bool sync; GroupPendingMoves *next; }; typedef struct _GroupPendingResizes GroupPendingResizes; struct _GroupPendingResizes { CompWindow *w; int x; int y; int width; int height; int borderWidth; GroupPendingResizes *next; }; typedef struct _GroupPendingGrabs GroupPendingGrabs; struct _GroupPendingGrabs { CompWindow *w; int x; int y; unsigned int state; unsigned int mask; GroupPendingGrabs *next; }; typedef struct _GroupPendingUngrabs GroupPendingUngrabs; struct _GroupPendingUngrabs { CompWindow *w; GroupPendingUngrabs *next; }; /* * pointer to display list */ static int displayPrivateIndex; /* * GroupTabBarSlot */ typedef struct _GroupTabBarSlot GroupTabBarSlot; struct _GroupTabBarSlot { GroupTabBarSlot *prev; GroupTabBarSlot *next; int rx; int ry; int height; int width; CompWindow *window; }; /* * GroupTabBar */ typedef struct _GroupTabBar { GroupTabBarSlot *slots; GroupTabBarSlot *revSlots; int nSlots; Bool visible; int rx; int ry; int height; int width; } GroupTabBar; /* * GroupSelection */ typedef struct _GroupSelection GroupSelection; struct _GroupSelection { GroupSelection *prev; GroupSelection *next; CompWindow **windows; int nWins; int topTab; int prevTopTab; Bool tabbed; GroupTabBar *tabBar; int animationSteps; Bool ungroup; int dx, dy; //For tabbed windows. Bool animated; GLushort color[4]; }; /* * GroupDisplay structure */ typedef struct _GroupDisplay { int screenPrivateIndex; CompOption opt[GROUP_DISPLAY_OPTION_NUM]; HandleEventProc handleEvent; GroupSelection tmpSel; GroupSelection *groups; //GroupSelection *revGroups; Bool inAction; GroupSelection *lastActiveGroup; Bool ignoreMode; float cornerPointsX[NUM_CORNER_POINTS]; float cornerPointsY[NUM_CORNER_POINTS]; } GroupDisplay; /* * GroupScreen structure */ typedef struct _GroupScreen { int windowPrivateIndex; CompOption opt[GROUP_SCREEN_OPTION_NUM]; WindowMoveNotifyProc windowMoveNotify; WindowResizeNotifyProc windowResizeNotify; PreparePaintScreenProc preparePaintScreen; PaintScreenProc paintScreen; DrawWindowProc drawWindow; PaintWindowProc paintWindow; PaintTransformedScreenProc paintTransformedScreen; WindowGrabNotifyProc windowGrabNotify; WindowUngrabNotifyProc windowUngrabNotify; GroupPendingMoves *pendingMoves; GroupPendingResizes *pendingResizes; GroupPendingGrabs *pendingGrabs; GroupPendingUngrabs *pendingUngrabs; int wMask; Bool queued; // for selection Bool grab; Bool wasTransformed; int grabIndex; int x1; int y1; int x2; int y2; CompTexture glowTexture; } GroupScreen; /* * GroupWindow structure */ typedef struct _GroupWindow { GroupSelection *group; Bool inGroup; Bool inSelection; // for the tab bar GroupTabBarSlot *slot; // for scale notify... int oldWidth; int oldHeight; int oldX; int oldY; GLushort oldOpacity; // for tab animation Bool animate; int orgPosX; //Relative to the tabbed window. int orgPosY; //Relative to the tabbed window. int destinationX; int destinationY; } GroupWindow; /* * Pre-Difinitions * */ /** * * Beryl group plugin * * group.c * * Copyright : (C) 2006 by Patrick Niklaus * E-mail : patrick.niklaus [ a t ] googlemail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * * TODO: * * glow effect * * tab like switching between the windows * * a lot of other tab stuff... * * provide a tree system for groups * **/ #include #include #include #include #include #include #include #include #include #include #include "group_glow.h" #define PI 3.1415926535897 #define NUM_CORNER_POINTS 25 //#define GROUP_DEBUG(fmt, args...) printf(fmt, ##args) #define GROUP_DEBUG(fmt, args...) /* * Defaults * */ #define GROUP_SELECT_MODIFIERS_DEFAULT (CompSuperMask) #define GROUP_SELECT_BUTTON_DEFAULT Button1 #define GROUP_SELECT_SINGLE_MODIFIERS_DEFAULT (CompSuperMask) #define GROUP_SELECT_SINGLE_KEY_DEFAULT "s" #define GROUP_GROUPING_MODIFIERS_DEFAULT (CompSuperMask) #define GROUP_GROUPING_KEY_DEFAULT "g" #define GROUP_UNGROUPING_MODIFIERS_DEFAULT (CompSuperMask) #define GROUP_UNGROUPING_KEY_DEFAULT "u" #define GROUP_TABMODE_MODIFIERS_DEFAULT (CompSuperMask) #define GROUP_TABMODE_KEY_DEFAULT "t" #define GROUP_CHANGE_TAB_LEFT_MODIFIERS_DEFAULT (CompSuperMask) #define GROUP_CHANGE_TAB_LEFT_KEY_DEFAULT "Left" #define GROUP_CHANGE_TAB_RIGHT_MODIFIERS_DEFAULT (CompSuperMask) #define GROUP_CHANGE_TAB_RIGHT_KEY_DEFAULT "Right" #define GROUP_REMOVEING_MODIFIERS_DEFAULT (CompSuperMask) #define GROUP_REMOVEING_KEY_DEFAULT "r" #define GROUP_CLOSEING_MODIFIERS_DEFAULT (CompSuperMask) #define GROUP_CLOSEING_KEY_DEFAULT "c" #define GROUP_MINIMIZEING_MODIFIERS_DEFAULT (CompSuperMask) #define GROUP_MINIMIZEING_KEY_DEFAULT "b" #define GROUP_IGNORE_MODIFIERS_DEFAULT (CompAltMask) #define GROUP_IGNORE_KEY_DEFAULT "x" #define GROUP_DISPLAY_OPTION_SELECT 0 #define GROUP_DISPLAY_OPTION_SELECT_SINGLE 1 #define GROUP_DISPLAY_OPTION_GROUPING 2 #define GROUP_DISPLAY_OPTION_UNGROUPING 3 #define GROUP_DISPLAY_OPTION_REMOVEING 4 #define GROUP_DISPLAY_OPTION_CLOSEING 5 #define GROUP_DISPLAY_OPTION_MINIMIZEING 6 #define GROUP_DISPLAY_OPTION_IGNORE 7 #define GROUP_DISPLAY_OPTION_TABMODE 8 #define GROUP_DISPLAY_OPTION_CHANGE_TAB_LEFT 9 #define GROUP_DISPLAY_OPTION_CHANGE_TAB_RIGHT 10 #define GROUP_DISPLAY_OPTION_NUM 11 #define GROUP_OPACITY_DEFAULT 80 #define GROUP_OPACITY_MIN 0 #define GROUP_OPACITY_MAX 100 #define GROUP_SATURATION_DEFAULT 20 #define GROUP_SATURATION_MIN 0 #define GROUP_SATURATION_MAX 100 #define GROUP_BRIGHTNESS_DEFAULT 70 #define GROUP_BRIGHTNESS_MIN 0 #define GROUP_BRIGHTNESS_MAX 100 #define GROUP_TOLERANCE_DEFAULT 0 #define GROUP_TOLERANCE_MIN 0 #define GROUP_TOLERANCE_MAX 10 #define GROUP_STEPS_DEFAULT 10 #define GROUP_STEPS_MIN 1 #define GROUP_STEPS_MAX 10 #define GROUP_THUMB_SIZE_DEFAULT 64 #define GROUP_THUMB_SIZE_MIN 16 #define GROUP_THUMB_SIZE_MAX 128 #define GROUP_BORDER_WIDTH_DEFAULT 10 #define GROUP_BORDER_WIDTH_MIN 1 #define GROUP_BORDER_WIDTH_MAX 20 #define GROUP_BORDER_RADIUS_DEFAULT 10 #define GROUP_BORDER_RADIUS_MIN 1 #define GROUP_BORDER_RADIUS_MAX 20 #define GROUP_GLOW_SIZE_DEFAULT 32 #define GROUP_GLOW_SIZE_MIN 1 #define GROUP_GLOW_SIZE_MAX 300 #define GROUP_GLOW_OFFSET_DEFAULT 16 #define GROUP_GLOW_OFFSET_MIN 0 #define GROUP_GLOW_OFFSET_MAX 100 #define GROUP_MOVE_DEFAULT TRUE #define GROUP_RESIZE_DEFAULT TRUE #define GROUP_RAISE_DEFAULT TRUE #define GROUP_AUTO_UNGROUP_DEFAULT FALSE #define GROUP_AUTO_GROUP_DEFAULT FALSE #define GROUP_RELATIVE_DISTANCE_DEFAULT FALSE #define GROUP_COLOR_SELECTION_RED_DEFAULT 0x0000 #define GROUP_COLOR_SELECTION_GREEN_DEFAULT 0x0000 #define GROUP_COLOR_SELECTION_BLUE_DEFAULT 0x0000 #define GROUP_COLOR_SELECTION_ALPHA_DEFAULT 0x9999 #define GROUP_COLOR_LINE_RED_DEFAULT 0x0000 #define GROUP_COLOR_LINE_GREEN_DEFAULT 0x0000 #define GROUP_COLOR_LINE_BLUE_DEFAULT 0x0000 #define GROUP_COLOR_LINE_ALPHA_DEFAULT 0xABAB #define GROUP_COLOR_TAB_FILL_RED_DEFAULT 0x0000 #define GROUP_COLOR_TAB_FILL_GREEN_DEFAULT 0x0000 #define GROUP_COLOR_TAB_FILL_BLUE_DEFAULT 0x0000 #define GROUP_COLOR_TAB_FILL_ALPHA_DEFAULT 0x9999 #define GROUP_COLOR_TAB_BORDER_RED_DEFAULT 0x0000 #define GROUP_COLOR_TAB_BORDER_GREEN_DEFAULT 0x0000 #define GROUP_COLOR_TAB_BORDER_BLUE_DEFAULT 0x0000 #define GROUP_COLOR_TAB_BORDER_ALPHA_DEFAULT 0xABAB #define GROUP_TAB_CREATE_MIPMAPS_DEFAULT TRUE #define GROUP_GLOW_DEFAULT TRUE #define GROUP_SCREEN_OPTION_TYPES 0 #define GROUP_SCREEN_OPTION_OPACITY 1 #define GROUP_SCREEN_OPTION_SATURATION 2 #define GROUP_SCREEN_OPTION_BRIGHTNESS 3 #define GROUP_SCREEN_OPTION_GLOW 4 #define GROUP_SCREEN_OPTION_MOVE 5 #define GROUP_SCREEN_OPTION_RESIZE 6 #define GROUP_SCREEN_OPTION_RAISE 7 #define GROUP_SCREEN_OPTION_AUTO_UNGROUP 8 #define GROUP_SCREEN_OPTION_AUTO_GROUP 9 #define GROUP_SCREEN_OPTION_RELATIVE_DISTANCE 10 #define GROUP_SCREEN_OPTION_SELECTION_COLOR 11 #define GROUP_SCREEN_OPTION_LINE_COLOR 12 #define GROUP_SCREEN_OPTION_TOLERANCE 13 #define GROUP_SCREEN_OPTION_STEPS 14 #define GROUP_SCREEN_OPTION_THUMB_SIZE 15 #define GROUP_SCREEN_OPTION_BORDER_WIDTH 16 #define GROUP_SCREEN_OPTION_BORDER_RADIUS 17 #define GROUP_SCREEN_OPTION_TAB_BORDER_COLOR 18 #define GROUP_SCREEN_OPTION_TAB_FILL_COLOR 19 #define GROUP_SCREEN_OPTION_TAB_CREATE_MIPMAPS 20 #define GROUP_SCREEN_OPTION_GLOW_SIZE 21 #define GROUP_SCREEN_OPTION_GLOW_OFFSET 22 #define GROUP_SCREEN_OPTION_NUM 23 /* * Helpers * */ #define GET_GROUP_DISPLAY(d) ((GroupDisplay *) (d)->privates[displayPrivateIndex].ptr) #define GROUP_DISPLAY(d) GroupDisplay *gd = GET_GROUP_DISPLAY (d) #define GET_GROUP_SCREEN(s, gd) ((GroupScreen *) (s)->privates[ (gd)->screenPrivateIndex].ptr) #define GROUP_SCREEN(s) GroupScreen *gs = GET_GROUP_SCREEN (s, GET_GROUP_DISPLAY (s->display)) #define GET_GROUP_WINDOW(w, gs) ((GroupWindow *) (w)->privates[ (gs)->windowPrivateIndex].ptr) #define GROUP_WINDOW(w) GroupWindow *gw = GET_GROUP_WINDOW (w, GET_GROUP_SCREEN (w->screen, GET_GROUP_DISPLAY (w->screen->display))) #define WIN_X(w) (w->attrib.x) #define WIN_Y(w) (w->attrib.y) #define WIN_WIDTH(w) (w->attrib.width) #define WIN_HEIGHT(w) (w->attrib.height) #define WIN_BORDER(w) (w->attrib.border_width) #define NUM_OPTIONS(s) (sizeof ( (s)->opt) / sizeof (CompOption)) #define N_WIN_TYPE (sizeof (groupDefaultTypes) / sizeof (groupDefaultTypes[0])) #define N_SEL_MODE (sizeof (groupSelectionModes) / sizeof (groupSelectionModes[0])) #define REAL_POSITION(x, s) ( (x >= 0)? x: x + (s)->hsize * (s)->width ) #define VIEWPORT(x, s) ( ( REAL_POSITION(x, s) / (s)->width ) % (s)->hsize ) #define TOP_TAB(g) ((g)->windows[(g)->topTab]) #define PREV_TOP_TAB(g) ((g)->windows[(g)->prevTopTab]) /* * default windows for selection */ static char *groupDefaultTypes[] = { N_("Normal"), N_("Dialog"), N_("ModalDialog"), N_("Dnd") }; /* * structs for pending callbacks */ typedef struct _GroupPendingMoves GroupPendingMoves; struct _GroupPendingMoves { CompWindow *w; int dx; int dy; Bool sync; GroupPendingMoves *next; }; typedef struct _GroupPendingResizes GroupPendingResizes; struct _GroupPendingResizes { CompWindow *w; int x; int y; int width; int height; int borderWidth; GroupPendingResizes *next; }; typedef struct _GroupPendingGrabs GroupPendingGrabs; struct _GroupPendingGrabs { CompWindow *w; int x; int y; unsigned int state; unsigned int mask; GroupPendingGrabs *next; }; typedef struct _GroupPendingUngrabs GroupPendingUngrabs; struct _GroupPendingUngrabs { CompWindow *w; GroupPendingUngrabs *next; }; /* * pointer to display list */ static int displayPrivateIndex; /* * GroupTabBarSlot */ typedef struct _GroupTabBarSlot GroupTabBarSlot; struct _GroupTabBarSlot { GroupTabBarSlot *prev; GroupTabBarSlot *next; int rx; int ry; int height; int width; CompWindow *window; }; /* * GroupTabBar */ typedef struct _GroupTabBar { GroupTabBarSlot *slots; GroupTabBarSlot *revSlots; int nSlots; Bool visible; int rx; int ry; int height; int width; } GroupTabBar; /* * GroupSelection */ typedef struct _GroupSelection GroupSelection; struct _GroupSelection { GroupSelection *prev; GroupSelection *next; CompWindow **windows; int nWins; int topTab; int prevTopTab; Bool tabbed; GroupTabBar *tabBar; int animationSteps; Bool ungroup; int dx, dy; //For tabbed windows. Bool animated; GLushort color[4]; }; /* * GroupDisplay structure */ typedef struct _GroupDisplay { int screenPrivateIndex; CompOption opt[GROUP_DISPLAY_OPTION_NUM]; HandleEventProc handleEvent; GroupSelection tmpSel; GroupSelection *groups; //GroupSelection *revGroups; Bool inAction; GroupSelection *lastActiveGroup; Bool ignoreMode; float cornerPointsX[NUM_CORNER_POINTS]; float cornerPointsY[NUM_CORNER_POINTS]; } GroupDisplay; /* * GroupScreen structure */ typedef struct _GroupScreen { int windowPrivateIndex; CompOption opt[GROUP_SCREEN_OPTION_NUM]; WindowMoveNotifyProc windowMoveNotify; WindowResizeNotifyProc windowResizeNotify; PreparePaintScreenProc preparePaintScreen; PaintScreenProc paintScreen; DrawWindowProc drawWindow; PaintWindowProc paintWindow; PaintTransformedScreenProc paintTransformedScreen; WindowGrabNotifyProc windowGrabNotify; WindowUngrabNotifyProc windowUngrabNotify; GroupPendingMoves *pendingMoves; GroupPendingResizes *pendingResizes; GroupPendingGrabs *pendingGrabs; GroupPendingUngrabs *pendingUngrabs; int wMask; Bool queued; // for selection Bool grab; Bool wasTransformed; int grabIndex; int x1; int y1; int x2; int y2; CompTexture glowTexture; } GroupScreen; /* * GroupWindow structure */ typedef struct _GroupWindow { GroupSelection *group; Bool inGroup; Bool inSelection; // for the tab bar GroupTabBarSlot *slot; // for scale notify... int oldWidth; int oldHeight; int oldX; int oldY; GLushort oldOpacity; // for tab animation Bool animate; int orgPosX; //Relative to the tabbed window. int orgPosY; //Relative to the tabbed window. int destinationX; int destinationY; } GroupWindow; /* * Pre-Definitions * */ /* * options.c */ static void groupDisplayInitOptions(GroupDisplay * gd); static CompOption *groupGetDisplayOptions(CompDisplay * d, int *count); static Bool groupSetDisplayOption(CompDisplay * d, char *name, CompOptionValue * value); static void groupScreenInitOptions(GroupScreen * gs); static CompOption *groupGetScreenOptions(CompScreen * s, int *count); static Bool groupSetScreenOption(CompScreen * s, char *name, CompOptionValue * value); /* * group.c */ static void groupHandleEvent(CompDisplay * d, XEvent * event); static Bool groupGroupWindows(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static Bool groupUnGroupWindows(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static void groupUpdatePosBuffer(CompWindow * w, int x, int y, int width, int height); static void groupAddSkipMasks(CompWindow *w); static void groupRemoveSkipMasks(CompWindow *w); static int groupFindWindowIndex(CompWindow *w, GroupSelection *g); static void groupRecalcTabBarPos(GroupSelection *group); static void groupInsertTabBarSlot(GroupTabBar *bar, GroupTabBarSlot *slot); static void groupUnhookTabBarSlot(GroupTabBar *bar, GroupTabBarSlot *slot); static void groupCreateSlot(GroupSelection *group, CompWindow *w); static void groupInitTabBar(GroupSelection *group); static void groupDeleteTabBar(GroupSelection *group); static void groupTabGroup(CompWindow * main); static void groupUntabGroup(CompDisplay *d, GroupSelection *group); static void groupDeleteGroupWindow(CompDisplay * d, CompWindow * w); static void groupDeleteGroup(CompDisplay * d, GroupSelection *group); static void groupAddWindowToGroup(CompDisplay * d, CompWindow * w, GroupSelection *group); static void groupSyncWindows(GroupSelection *group); static void groupRaiseWindows(CompWindow * top, GroupSelection *group); static Bool groupInitTab(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static Bool groupChangeTab(CompDisplay * d, Bool direction); static Bool groupChangeTabLeft(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static Bool groupChangeTabRight(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static Bool groupRemoveWindow(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static Bool groupCloseWindows(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static Bool groupMinimizeWindows(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static Bool groupSetIgnore(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static Bool groupUnsetIgnore(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static void groupWindowResizeNotify(CompWindow * w); static void groupWindowGrabNotify(CompWindow * w, int x, int y, unsigned int state, unsigned int mask); static void groupWindowUngrabNotify(CompWindow * w); static void groupWindowMoveNotify(CompWindow * w, int dx, int dy, Bool immediate); /* * paint.c */ static void groupHandleChanges(CompScreen* s); static void groupDrawTabAnimation(CompScreen * s); static void groupTabBarVertices(CompScreen *s, int x, int y, int width, int height); static void groupPaintThumb(GroupSelection *group, GroupTabBarSlot *slot); static void groupPaintTabBar(GroupSelection * group); static void groupPreparePaintScreen(CompScreen * s, int msSinceLastPaint); static Bool groupPaintScreen(CompScreen * s, const ScreenPaintAttrib * sAttrib, Region region, int output, unsigned int mask); static void groupPaintTransformedScreen(CompScreen * s, const ScreenPaintAttrib * sa, Region region, int output, unsigned int mask); static Bool groupDrawWindow(CompWindow * w, const WindowPaintAttrib * attrib, Region region, unsigned int mask); static Bool groupPaintWindow(CompWindow * w, const WindowPaintAttrib * attrib, Region region, unsigned int mask); static void groupHandleMotionEvent(CompScreen * s, int xRoot, int yRoot); static void initCornerPoints(GroupDisplay * gd); /* * init.c */ static Bool groupInitDisplay(CompPlugin * p, CompDisplay * d); static void groupFiniDisplay(CompPlugin * p, CompDisplay * d); static Bool groupInitScreen(CompPlugin * p, CompScreen * s); static void groupFiniScreen(CompPlugin * p, CompScreen * s); static Bool groupInitWindow(CompPlugin * p, CompWindow * w); static void groupFiniWindow(CompPlugin * p, CompWindow * w); static Bool groupInit(CompPlugin * p); static void groupFini(CompPlugin * p); /* * queues.c */ static void groupEnqueueMoveNotify (CompWindow *w, int dx, int dy, Bool sync); static void groupDequeueMoveNotifies (CompScreen *s); static void groupEnqueueResizeNotify (CompWindow *w, int x, int y, int width, int height, int border_width); static void groupDequeueResizeNotifies (CompScreen *s); static void groupEnqueueGrabNotify (CompWindow *w, int x, int y, unsigned int state, unsigned int mask); static void groupDequeueGrabNotifies (CompScreen *s); static void groupEnqueueUngrabNotify (CompWindow *w); static void groupDequeueUngrabNotifies (CompScreen *s); /* * selection.c */ static CompWindow **groupFindWindowsInRegion(CompScreen * s, REGION reg, int *c) static void groupDeleteSelectionWindow(CompDisplay * d, CompWindow * w); static void groupAddWindowToSelection(CompDisplay * d, CompWindow * w); static void groupSelectWindow(CompDisplay * d, CompWindow * w); static Bool groupSelectSingle(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static Bool groupSelect(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption); static Bool groupSelectTerminate(CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption);