~shnatsel/+junk/cairo-compmgr

« back to all changes in this revision

Viewing changes to src/ccm-tray-menu.c

  • Committer: Sergey "Shnatsel" Davidoff
  • Date: 2012-03-04 22:53:22 UTC
  • Revision ID: shnatsel@gmail.com-20120304225322-q2hz82j51yxv1qqw
fixed up build dependencies

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */
 
2
/*
 
3
 * cairo-compmgr
 
4
 * Copyright (C) Nicolas Bruguier 2007-2010 <gandalfn@club-internet.fr>
 
5
 * 
 
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.
 
10
 * 
 
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.
 
15
 * 
 
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.
 
21
 */
 
22
 
 
23
#include <config.h>
 
24
 
 
25
#include "ccm.h"
 
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"
 
31
 
 
32
/*
 
33
 * Standard gettext macros.
 
34
 */
 
35
#ifdef ENABLE_NLS
 
36
#  include <libintl.h>
 
37
#  undef _
 
38
#  define _(String) dgettext (PACKAGE, String)
 
39
#  ifdef gettext_noop
 
40
#    define N_(String) gettext_noop (String)
 
41
#  else
 
42
#    define N_(String) (String)
 
43
#  endif
 
44
#else
 
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)
 
52
#endif
 
53
 
 
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"
 
57
 
 
58
G_DEFINE_TYPE (CCMTrayMenu, ccm_tray_menu, GTK_TYPE_MENU);
 
59
 
 
60
struct _CCMTrayMenuPrivate
 
61
{
 
62
    CCMDisplay *display;
 
63
    GtkWidget *ccm_menu;
 
64
    GtkWidget *preferences_menu;
 
65
    GtkWidget *about_menu;
 
66
    GtkWidget *quit_menu;
 
67
    CCMConfig *config;
 
68
    CCMPreferences *preferences;
 
69
};
 
70
 
 
71
#define CCM_TRAY_MENU_GET_PRIVATE(o) \
 
72
(G_TYPE_INSTANCE_GET_PRIVATE ((o), CCM_TYPE_TRAY_MENU, CCMTrayMenuPrivate))
 
73
 
 
74
static void
 
75
ccm_tray_menu_init (CCMTrayMenu * self)
 
76
{
 
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;
 
85
}
 
86
 
 
87
static void
 
88
ccm_tray_menu_finalize (GObject * object)
 
89
{
 
90
    CCMTrayMenu *self = CCM_TRAY_MENU (object);
 
91
 
 
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);
 
98
 
 
99
    G_OBJECT_CLASS (ccm_tray_menu_parent_class)->finalize (object);
 
100
}
 
101
 
 
102
static void
 
103
ccm_tray_menu_class_init (CCMTrayMenuClass * klass)
 
104
{
 
105
    GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
106
 
 
107
    g_type_class_add_private (klass, sizeof (CCMTrayMenuPrivate));
 
108
 
 
109
    object_class->finalize = ccm_tray_menu_finalize;
 
110
}
 
111
 
 
112
 
 
113
static void
 
114
ccm_tray_menu_ccm_menu_activate (CCMTrayMenu * self, GtkWidget * ccm_menu)
 
115
{
 
116
    gboolean val =
 
117
        gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (ccm_menu));
 
118
 
 
119
    ccm_debug ("CCM ACTIVATE %i", val);
 
120
 
 
121
    ccm_config_set_boolean (self->priv->config, val, NULL);
 
122
}
 
123
 
 
124
static void
 
125
ccm_tray_menu_preferences_menu_activate (CCMTrayMenu * self,
 
126
                                         GtkWidget * preferences_menu)
 
127
{
 
128
    ccm_preferences_show (self->priv->preferences);
 
129
}
 
130
 
 
131
static void
 
132
ccm_tray_menu_about_menu_activate (CCMTrayMenu * self, GtkWidget * about_menu)
 
133
{
 
134
    GtkWidget *about_dialog;
 
135
    GdkPixbuf *logo = gdk_pixbuf_new_from_file (CCM_LOGO_PIXMAP, NULL);
 
136
 
 
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);
 
147
 
 
148
    gtk_dialog_run (GTK_DIALOG (about_dialog));
 
149
    gtk_widget_destroy (about_dialog);
 
150
}
 
151
 
 
152
static void
 
153
ccm_tray_menu_quit_menu_activate (CCMTrayMenu * self, GtkWidget * ccm_menu)
 
154
{
 
155
    gtk_main_quit ();
 
156
}
 
157
 
 
158
static void
 
159
ccm_tray_menu_enable_ccm_changed (CCMTrayMenu * self, CCMConfig * config)
 
160
{
 
161
    gboolean val = ccm_config_get_boolean (config, NULL);
 
162
 
 
163
    ccm_debug ("CCM ENABLE %i", val);
 
164
 
 
165
    if (val)
 
166
    {
 
167
        if (!self->priv->display)
 
168
            self->priv->display = ccm_display_new (NULL);
 
169
    }
 
170
    else if (self->priv->display)
 
171
    {
 
172
        ccm_debug ("UNSET CCM");
 
173
        g_object_unref (self->priv->display);
 
174
        self->priv->display = NULL;
 
175
    }
 
176
}
 
177
 
 
178
static gboolean
 
179
ccm_tray_menu_on_preferences_reload (CCMTrayMenu * self,
 
180
                                     CCMPreferences * preferences)
 
181
{
 
182
    gboolean ret = FALSE;
 
183
 
 
184
    if (self->priv->display)
 
185
    {
 
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);
 
190
        ret = TRUE;
 
191
    }
 
192
 
 
193
    return ret;
 
194
}
 
195
 
 
196
CCMTrayMenu *
 
197
ccm_tray_menu_new (void)
 
198
{
 
199
    CCMTrayMenu *self = g_object_new (CCM_TYPE_TRAY_MENU, NULL);
 
200
    GtkWidget *separator;
 
201
    gboolean val;
 
202
 
 
203
    /* Get config */
 
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,
 
207
                              self);
 
208
    val = ccm_config_get_boolean (self->priv->config, NULL);
 
209
 
 
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,
 
215
                              self);
 
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),
 
218
                                    val);
 
219
 
 
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),
 
224
                              self);
 
225
 
 
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),
 
230
                              "activate",
 
231
                              (GCallback)
 
232
                              ccm_tray_menu_preferences_menu_activate, self);
 
233
    gtk_menu_shell_append (GTK_MENU_SHELL (self), self->priv->preferences_menu);
 
234
 
 
235
    /* Create separator */
 
236
    separator = gtk_separator_menu_item_new ();
 
237
    gtk_menu_shell_append (GTK_MENU_SHELL (self), separator);
 
238
 
 
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,
 
244
                              self);
 
245
    gtk_menu_shell_append (GTK_MENU_SHELL (self), self->priv->about_menu);
 
246
 
 
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,
 
252
                              self);
 
253
    gtk_menu_shell_append (GTK_MENU_SHELL (self), self->priv->quit_menu);
 
254
 
 
255
    gtk_widget_show_all (GTK_WIDGET (self));
 
256
 
 
257
    /* Start ccm if enabled */
 
258
    if (val)
 
259
        self->priv->display = ccm_display_new (NULL);
 
260
 
 
261
    return self;
 
262
}