45
45
/// WINDOW CONTROLS ///
46
46
///////////////////////
48
void cd_app_menu_set_window_border (Window Xid, gboolean bWithBorder)
50
Display *dpy = cairo_dock_get_Xdisplay();
53
memset(&mwmhints, 0, sizeof(mwmhints));
54
prop = XInternAtom(dpy, "_MOTIF_WM_HINTS", False);
55
mwmhints.flags = MWM_HINTS_DECORATIONS;
56
mwmhints.decorations = bWithBorder;
57
XChangeProperty (dpy, Xid, prop,
58
prop, 32, PropModeReplace,
59
(unsigned char *) &mwmhints,
60
PROP_MWM_HINTS_ELEMENTS);
63
static void _get_window_allowed_actions (Window Xid)
48
static void _get_window_allowed_actions (GldiWindowActor *actor)
67
52
myData.bCanMinimize = FALSE;
68
53
myData.bCanMaximize = FALSE;
69
54
myData.bCanClose = FALSE;
73
Atom aReturnedType = 0;
74
int aReturnedFormat = 0;
75
unsigned long iLeftBytes, iBufferNbElements = 0;
76
gulong *pXStateBuffer = NULL;
77
Display *dpy = cairo_dock_get_Xdisplay ();
78
Atom allowedActions = XInternAtom (dpy, "_NET_WM_ALLOWED_ACTIONS", False);
79
Atom atomMinimize = XInternAtom (dpy, "_NET_WM_ACTION_MINIMIZE", False);
80
Atom atomMaximizeHorz = XInternAtom (dpy, "_NET_WM_ACTION_MAXIMIZE_HORZ", False);
81
Atom atomMaximizeVert = XInternAtom (dpy, "_NET_WM_ACTION_MAXIMIZE_VERT", False);
82
Atom atomClose = XInternAtom (dpy, "_NET_WM_ACTION_CLOSE", False);
84
XGetWindowProperty (dpy,
85
Xid, allowedActions, 0, G_MAXULONG, False, XA_ATOM,
86
&aReturnedType, &aReturnedFormat, &iBufferNbElements, &iLeftBytes, (guchar **)&pXStateBuffer);
88
if (iBufferNbElements > 0)
90
myData.bCanMinimize = FALSE;
91
myData.bCanMaximize = FALSE;
92
myData.bCanClose = FALSE;
94
for (i = 0; i < iBufferNbElements; i ++)
96
if (pXStateBuffer[i] == atomMinimize)
98
myData.bCanMinimize = TRUE;
100
else if (pXStateBuffer[i] == atomMaximizeHorz || pXStateBuffer[i] == atomMaximizeVert)
102
myData.bCanMaximize = TRUE;
104
else if (pXStateBuffer[i] == atomClose)
106
myData.bCanClose = TRUE;
110
else // by default, allow all actions.
112
cd_warning ("couldn't get allowed actions for the window %u", Xid);
113
myData.bCanMinimize = TRUE;
114
myData.bCanMaximize = TRUE;
115
myData.bCanClose = TRUE;
118
XFree (pXStateBuffer);
57
gldi_window_can_minimize_maximize_close (actor, &myData.bCanMinimize, &myData.bCanMaximize, &myData.bCanClose);
121
static void _set_border (Icon *icon, CairoContainer *pContainer, gboolean bWithBorder)
60
static void _set_border (GldiWindowActor *actor, gboolean bWithBorder)
123
if (icon->bIsMaximized)
124
cd_app_menu_set_window_border (icon->Xid, bWithBorder);
62
if (actor->bIsMaximized)
63
gldi_window_set_border (actor, bWithBorder);
126
65
void cd_app_menu_set_windows_borders (gboolean bWithBorder)
128
cairo_dock_foreach_applis ((CairoDockForeachIconFunc)_set_border, FALSE, GINT_TO_POINTER (bWithBorder));
67
gldi_windows_foreach (FALSE, (GFunc)_set_border, GINT_TO_POINTER (bWithBorder));
379
320
/// START / STOP ///
380
321
////////////////////
382
static gboolean _get_current_window_idle (CairoDockModuleInstance *myApplet)
323
static gboolean _get_current_window_idle (GldiModuleInstance *myApplet)
384
325
// get the controls and menu of the current window.
385
Window iActiveWindow = cairo_dock_get_current_active_window ();
326
GldiWindowActor *actor = gldi_windows_get_active ();
387
cd_app_menu_set_current_window (iActiveWindow);
328
cd_app_menu_set_current_window (actor);
389
330
myData.iSidInitIdle = 0;
392
static gboolean _remove_windows_borders (CairoDockModuleInstance *myApplet)
333
static gboolean _remove_windows_borders_idle (GldiModuleInstance *myApplet)
394
335
cd_app_menu_set_windows_borders (FALSE);
439
380
g_source_remove (myData.iSidInitIdle);
440
381
if (myData.iSidInitIdle2 != 0)
441
382
g_source_remove (myData.iSidInitIdle2);
383
gldi_icon_unset_appli (myIcon);
445
void cd_app_menu_set_current_window (Window iActiveWindow)
387
void cd_app_menu_set_current_window (GldiWindowActor *actor)
447
cd_debug ("%s (%ld)", __func__, iActiveWindow);
448
if (iActiveWindow != myData.iCurrentWindow)
389
cd_debug ("%s (%p)", __func__, actor);
390
if (actor != myData.pCurrentWindow)
450
myData.iPreviousWindow = myData.iCurrentWindow;
451
myData.iCurrentWindow = iActiveWindow;
452
myIcon->Xid = iActiveWindow; // set the Xid on our icon, so that the dock adds the usual actions in our right-click menu.
392
myData.pPreviousWindow = myData.pCurrentWindow;
393
myData.pCurrentWindow = actor;
394
gldi_icon_set_appli (myIcon, actor); // set the actor on our icon, so that the dock adds the usual actions in our right-click menu. // this takes a reference on the actor, and remove the ref on the previous one.
454
396
if (myConfig.bDisplayMenu)
455
_get_application_menu (iActiveWindow);
397
_get_application_menu (actor);
457
399
if (myConfig.bDisplayControls)
458
_get_window_allowed_actions (iActiveWindow);
400
_get_window_allowed_actions (actor);
460
402
// update the icon
461
Icon *icon = cairo_dock_get_icon_with_Xid (iActiveWindow);
462
CD_APPLET_SET_NAME_FOR_MY_ICON (icon ? icon->cName : NULL);
403
CD_APPLET_SET_NAME_FOR_MY_ICON (actor ? actor->cName : NULL);
464
405
cd_app_menu_redraw_icon ();