1
/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */
4
* Copyright (C) Nicolas Bruguier 2007-2010 <gandalfn@club-internet.fr>
6
* cairo-compmgr is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
11
* cairo-compmgr is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with cairo-compmgr. If not, write to:
18
* The Free Software Foundation, Inc.,
19
* 51 Franklin Street, Fifth Floor
20
* Boston, MA 02110-1301, USA.
26
#include "ccm-debug.h"
27
#include "ccm-config.h"
28
#include "ccm-display.h"
29
#include "ccm-preferences.h"
30
#include "ccm-tray-menu.h"
33
* Standard gettext macros.
38
# define _(String) dgettext (PACKAGE, String)
40
# define N_(String) gettext_noop (String)
42
# define N_(String) (String)
45
# define textdomain(String) (String)
46
# define gettext(String) (String)
47
# define dgettext(Domain,Message) (Message)
48
# define dcgettext(Domain,Message,Type) (Message)
49
# define bindtextdomain(Domain,Directory) (Domain)
50
# define _(String) (String)
51
# define N_(String) (String)
54
#define CCM_LOGO_PIXMAP PACKAGE_PIXMAP_DIR "/cairo-compmgr.png"
55
#define CCM_LOGO_ON PACKAGE_PIXMAP_DIR "/cairo-compmgr-on-24.png"
56
#define CCM_LOGO_OFF PACKAGE_PIXMAP_DIR "/cairo-compmgr-off-24.png"
58
G_DEFINE_TYPE (CCMTrayMenu, ccm_tray_menu, GTK_TYPE_MENU);
60
struct _CCMTrayMenuPrivate
64
GtkWidget *preferences_menu;
65
GtkWidget *about_menu;
68
CCMPreferences *preferences;
71
#define CCM_TRAY_MENU_GET_PRIVATE(o) \
72
(G_TYPE_INSTANCE_GET_PRIVATE ((o), CCM_TYPE_TRAY_MENU, CCMTrayMenuPrivate))
75
ccm_tray_menu_init (CCMTrayMenu * self)
77
self->priv = CCM_TRAY_MENU_GET_PRIVATE (self);
78
self->priv->display = NULL;
79
self->priv->ccm_menu = NULL;
80
self->priv->preferences_menu = NULL;
81
self->priv->about_menu = NULL;
82
self->priv->quit_menu = NULL;
83
self->priv->config = NULL;
84
self->priv->preferences = NULL;
88
ccm_tray_menu_finalize (GObject * object)
90
CCMTrayMenu *self = CCM_TRAY_MENU (object);
92
if (self->priv->display)
93
g_object_unref (self->priv->display);
94
if (self->priv->config)
95
g_object_unref (self->priv->config);
96
if (self->priv->preferences)
97
g_object_unref (self->priv->preferences);
99
G_OBJECT_CLASS (ccm_tray_menu_parent_class)->finalize (object);
103
ccm_tray_menu_class_init (CCMTrayMenuClass * klass)
105
GObjectClass *object_class = G_OBJECT_CLASS (klass);
107
g_type_class_add_private (klass, sizeof (CCMTrayMenuPrivate));
109
object_class->finalize = ccm_tray_menu_finalize;
114
ccm_tray_menu_ccm_menu_activate (CCMTrayMenu * self, GtkWidget * ccm_menu)
117
gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (ccm_menu));
119
ccm_debug ("CCM ACTIVATE %i", val);
121
ccm_config_set_boolean (self->priv->config, val, NULL);
125
ccm_tray_menu_preferences_menu_activate (CCMTrayMenu * self,
126
GtkWidget * preferences_menu)
128
ccm_preferences_show (self->priv->preferences);
132
ccm_tray_menu_about_menu_activate (CCMTrayMenu * self, GtkWidget * about_menu)
134
GtkWidget *about_dialog;
135
GdkPixbuf *logo = gdk_pixbuf_new_from_file (CCM_LOGO_PIXMAP, NULL);
137
/* Create About dialog */
138
about_dialog = gtk_about_dialog_new ();
139
gtk_about_dialog_set_name ((GtkAboutDialog *) about_dialog,
140
"Cairo Composite Manager");
141
gtk_about_dialog_set_version ((GtkAboutDialog *) about_dialog, VERSION);
142
gtk_about_dialog_set_comments ((GtkAboutDialog *) about_dialog,
143
_("Cairo Composite Manager"));
144
gtk_about_dialog_set_copyright ((GtkAboutDialog *) about_dialog,
145
"Copyright (c) Nicolas Bruguier");
146
gtk_about_dialog_set_logo ((GtkAboutDialog *) about_dialog, logo);
148
gtk_dialog_run (GTK_DIALOG (about_dialog));
149
gtk_widget_destroy (about_dialog);
153
ccm_tray_menu_quit_menu_activate (CCMTrayMenu * self, GtkWidget * ccm_menu)
159
ccm_tray_menu_enable_ccm_changed (CCMTrayMenu * self, CCMConfig * config)
161
gboolean val = ccm_config_get_boolean (config, NULL);
163
ccm_debug ("CCM ENABLE %i", val);
167
if (!self->priv->display)
168
self->priv->display = ccm_display_new (NULL);
170
else if (self->priv->display)
172
ccm_debug ("UNSET CCM");
173
g_object_unref (self->priv->display);
174
self->priv->display = NULL;
179
ccm_tray_menu_on_preferences_reload (CCMTrayMenu * self,
180
CCMPreferences * preferences)
182
gboolean ret = FALSE;
184
if (self->priv->display)
186
ccm_preferences_hide(preferences);
187
g_object_unref (self->priv->display);
188
self->priv->display = ccm_display_new (NULL);
189
ccm_preferences_show(preferences);
197
ccm_tray_menu_new (void)
199
CCMTrayMenu *self = g_object_new (CCM_TYPE_TRAY_MENU, NULL);
200
GtkWidget *separator;
204
self->priv->config = ccm_config_new (-1, NULL, "enable");
205
g_signal_connect_swapped (self->priv->config, "changed",
206
(GCallback) ccm_tray_menu_enable_ccm_changed,
208
val = ccm_config_get_boolean (self->priv->config, NULL);
210
/* Create composite menu */
211
self->priv->ccm_menu =
212
gtk_check_menu_item_new_with_label (_("Composite desktop"));
213
g_signal_connect_swapped (GTK_WIDGET (self->priv->ccm_menu), "activate",
214
(GCallback) ccm_tray_menu_ccm_menu_activate,
216
gtk_menu_shell_append (GTK_MENU_SHELL (self), self->priv->ccm_menu);
217
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (self->priv->ccm_menu),
220
/* Get preferences dialog */
221
self->priv->preferences = ccm_preferences_new ();
222
g_signal_connect_swapped (self->priv->preferences, "reload",
223
G_CALLBACK (ccm_tray_menu_on_preferences_reload),
226
/* Create preferences menu */
227
self->priv->preferences_menu =
228
gtk_image_menu_item_new_from_stock (GTK_STOCK_PREFERENCES, NULL);
229
g_signal_connect_swapped (GTK_WIDGET (self->priv->preferences_menu),
232
ccm_tray_menu_preferences_menu_activate, self);
233
gtk_menu_shell_append (GTK_MENU_SHELL (self), self->priv->preferences_menu);
235
/* Create separator */
236
separator = gtk_separator_menu_item_new ();
237
gtk_menu_shell_append (GTK_MENU_SHELL (self), separator);
239
/* Create about menu */
240
self->priv->about_menu =
241
gtk_image_menu_item_new_from_stock (GTK_STOCK_ABOUT, NULL);
242
g_signal_connect_swapped (GTK_WIDGET (self->priv->about_menu), "activate",
243
(GCallback) ccm_tray_menu_about_menu_activate,
245
gtk_menu_shell_append (GTK_MENU_SHELL (self), self->priv->about_menu);
247
/* Create quit menu */
248
self->priv->quit_menu =
249
gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT, NULL);
250
g_signal_connect_swapped (GTK_WIDGET (self->priv->quit_menu), "activate",
251
(GCallback) ccm_tray_menu_quit_menu_activate,
253
gtk_menu_shell_append (GTK_MENU_SHELL (self), self->priv->quit_menu);
255
gtk_widget_show_all (GTK_WIDGET (self));
257
/* Start ccm if enabled */
259
self->priv->display = ccm_display_new (NULL);