~guadalinex-members/gnome-system-tools/gnome-system-tools-2.22.2

« back to all changes in this revision

Viewing changes to src/common/gst-polkit-button.c

  • Committer: Juanje Ojeda Croissier
  • Date: 2009-04-06 15:47:26 UTC
  • Revision ID: jojeda@emergya.es-20090406154726-h29t5g1n1wwc4x2h
Tags: gnome-system-tools-2.22.2-0ubuntu3
Imported the g-s-t code directly from the source package gnome-system-tools-2.22.2-0ubuntu3 (jaunty)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (C) 2007 Carlos Garnacho
 
2
 *
 
3
 * This program is free software; you can redistribute it and/or modify
 
4
 * it under the terms of the GNU Lesser General Public License as
 
5
 * published by the Free Software Foundation; either version 2 of the
 
6
 * License, or (at your option) any later version.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful,
 
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
 * GNU General Public License for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU General Public License
 
14
 * along with this program; if not, write to the Free Software
 
15
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 
16
 *
 
17
 * Authors: Carlos Garnacho  <carlosg@gnome.org>
 
18
 */
 
19
 
 
20
#include <glib/gi18n.h>
 
21
#include "gst-polkit-action.h"
 
22
#include "gst-polkit-button.h"
 
23
 
 
24
#define GST_POLKIT_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GST_TYPE_POLKIT_BUTTON, GstPolKitButtonPriv))
 
25
 
 
26
typedef struct GstPolKitButtonPriv GstPolKitButtonPriv;
 
27
 
 
28
struct GstPolKitButtonPriv {
 
29
        GstPolKitAction *action;
 
30
        gchar *label;
 
31
};
 
32
 
 
33
enum {
 
34
        CHANGED,
 
35
        LAST_SIGNAL
 
36
};
 
37
 
 
38
enum {
 
39
        PROP_0,
 
40
        PROP_ACTION,
 
41
        PROP_LABEL,
 
42
        PROP_AUTHENTICATED
 
43
};
 
44
 
 
45
static void      gst_polkit_button_class_init    (GstPolKitButtonClass *class);
 
46
static void      gst_polkit_button_init          (GstPolKitButton      *button);
 
47
static void      gst_polkit_button_finalize      (GObject              *object);
 
48
 
 
49
static void      gst_polkit_button_get_property  (GObject              *object,
 
50
                                                  guint                 prop_id,
 
51
                                                  GValue               *value,
 
52
                                                  GParamSpec           *pspec);
 
53
static void      gst_polkit_button_set_property  (GObject              *object,
 
54
                                                  guint                 prop_id,
 
55
                                                  const GValue         *value,
 
56
                                                  GParamSpec           *pspec);
 
57
 
 
58
static void      gst_polkit_button_clicked       (GtkButton            *button);
 
59
 
 
60
 
 
61
static guint signals [LAST_SIGNAL] = { 0 };
 
62
 
 
63
G_DEFINE_TYPE (GstPolKitButton, gst_polkit_button, GTK_TYPE_BUTTON)
 
64
 
 
65
static void
 
66
gst_polkit_button_class_init (GstPolKitButtonClass *class)
 
67
{
 
68
        GObjectClass *object_class = G_OBJECT_CLASS (class);
 
69
        GtkButtonClass *button_class = GTK_BUTTON_CLASS (class);
 
70
 
 
71
        object_class->finalize = gst_polkit_button_finalize;
 
72
        object_class->get_property = gst_polkit_button_get_property;
 
73
        object_class->set_property = gst_polkit_button_set_property;
 
74
 
 
75
        button_class->clicked = gst_polkit_button_clicked;
 
76
 
 
77
        g_object_class_install_property (object_class,
 
78
                                         PROP_ACTION,
 
79
                                         g_param_spec_string ("action",
 
80
                                                              "Action",
 
81
                                                              "PolicyKit action to manipulate",
 
82
                                                              NULL,
 
83
                                                              G_PARAM_READWRITE));
 
84
        g_object_class_install_property (object_class,
 
85
                                         PROP_LABEL,
 
86
                                         g_param_spec_string ("label",
 
87
                                                              "Label",
 
88
                                                              "Button label",
 
89
                                                              NULL,
 
90
                                                              G_PARAM_READWRITE));
 
91
        g_object_class_install_property (object_class,
 
92
                                         PROP_AUTHENTICATED,
 
93
                                         g_param_spec_boolean ("authenticated",
 
94
                                                               "Authenticated",
 
95
                                                               "Whether the action is authenticated",
 
96
                                                               FALSE,
 
97
                                                               G_PARAM_READABLE));
 
98
        signals [CHANGED] =
 
99
                g_signal_new ("changed",
 
100
                              G_OBJECT_CLASS_TYPE (object_class),
 
101
                              G_SIGNAL_RUN_LAST,
 
102
                              G_STRUCT_OFFSET (GstPolKitButtonClass, changed),
 
103
                              NULL, NULL,
 
104
                              g_cclosure_marshal_VOID__VOID,
 
105
                              G_TYPE_NONE, 0);
 
106
 
 
107
        g_type_class_add_private (object_class,
 
108
                                  sizeof (GstPolKitButtonPriv));
 
109
}
 
110
 
 
111
static void
 
112
update_button_state (GstPolKitButton *button)
 
113
{
 
114
        GstPolKitButtonPriv *priv;
 
115
        PolKitResult result;
 
116
        GtkWidget *image = NULL;
 
117
        const gchar *tooltip = NULL;
 
118
        gboolean sensitive = FALSE;
 
119
 
 
120
        priv = GST_POLKIT_BUTTON_GET_PRIVATE (button);
 
121
        result = gst_polkit_action_get_result (priv->action);
 
122
 
 
123
        switch (result) {
 
124
        case POLKIT_RESULT_YES:
 
125
                image = gtk_image_new_from_stock (GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON);
 
126
                tooltip = N_("This action is allowed");
 
127
                break;
 
128
        case POLKIT_RESULT_ONLY_VIA_ADMIN_AUTH:
 
129
        case POLKIT_RESULT_ONLY_VIA_ADMIN_AUTH_KEEP_SESSION:
 
130
        case POLKIT_RESULT_ONLY_VIA_ADMIN_AUTH_KEEP_ALWAYS:
 
131
        case POLKIT_RESULT_ONLY_VIA_SELF_AUTH:
 
132
        case POLKIT_RESULT_ONLY_VIA_SELF_AUTH_KEEP_SESSION:
 
133
        case POLKIT_RESULT_ONLY_VIA_SELF_AUTH_KEEP_ALWAYS:
 
134
        case POLKIT_RESULT_UNKNOWN:
 
135
                image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION, GTK_ICON_SIZE_BUTTON);
 
136
                sensitive = TRUE;
 
137
                break;
 
138
        case POLKIT_RESULT_NO:
 
139
                image = gtk_image_new_from_stock (GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON);
 
140
                tooltip = N_("This action is not allowed");
 
141
                break;
 
142
        default:
 
143
                g_warning ("Unhandled PolKitResult");
 
144
        }
 
145
 
 
146
        gtk_button_set_image (GTK_BUTTON (button), image);
 
147
        gtk_widget_set_tooltip_text (GTK_WIDGET (button), _(tooltip));
 
148
        gtk_widget_set_sensitive (GTK_WIDGET (button), sensitive);
 
149
}
 
150
 
 
151
static void
 
152
action_state_changed (GstPolKitButton *button)
 
153
{
 
154
        update_button_state (button);
 
155
        g_signal_emit (button, signals[CHANGED], 0);
 
156
}
 
157
 
 
158
static void
 
159
gst_polkit_button_init (GstPolKitButton *button)
 
160
{
 
161
        GstPolKitButtonPriv *priv;
 
162
 
 
163
        priv = GST_POLKIT_BUTTON_GET_PRIVATE (button);
 
164
        priv->action = gst_polkit_action_new (NULL, GTK_WIDGET (button));
 
165
 
 
166
        g_signal_connect_swapped (priv->action, "changed",
 
167
                                  G_CALLBACK (action_state_changed), button);
 
168
 
 
169
        update_button_state (button);
 
170
}
 
171
 
 
172
static void
 
173
gst_polkit_button_finalize (GObject *object)
 
174
{
 
175
        GstPolKitButtonPriv *priv;
 
176
 
 
177
        priv = GST_POLKIT_BUTTON_GET_PRIVATE (object);
 
178
 
 
179
        g_object_unref (priv->action);
 
180
        g_free (priv->label);
 
181
 
 
182
        G_OBJECT_CLASS (gst_polkit_button_parent_class)->finalize (object);
 
183
}
 
184
 
 
185
static void
 
186
gst_polkit_button_get_property (GObject    *object,
 
187
                                guint       prop_id,
 
188
                                GValue     *value,
 
189
                                GParamSpec *pspec)
 
190
{
 
191
        GstPolKitButtonPriv *priv;
 
192
 
 
193
        priv = GST_POLKIT_BUTTON_GET_PRIVATE (object);
 
194
 
 
195
        switch (prop_id) {
 
196
        case PROP_ACTION:
 
197
                g_value_set_string (value, gst_polkit_action_get_action (priv->action));
 
198
                break;
 
199
        case PROP_LABEL:
 
200
                g_value_set_string (value, priv->label);
 
201
                break;
 
202
        default:
 
203
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 
204
        }
 
205
}
 
206
 
 
207
static void
 
208
gst_polkit_button_set_property (GObject      *object,
 
209
                                guint         prop_id,
 
210
                                const GValue *value,
 
211
                                GParamSpec   *pspec)
 
212
{
 
213
        GstPolKitButton *button;
 
214
 
 
215
        button = GST_POLKIT_BUTTON (object);
 
216
 
 
217
        switch (prop_id) {
 
218
        case PROP_ACTION:
 
219
                gst_polkit_button_set_action (button, g_value_get_string (value));
 
220
                break;
 
221
        case PROP_LABEL:
 
222
                gst_polkit_button_set_label (button, g_value_get_string (value));
 
223
                break;
 
224
        default:
 
225
                break;
 
226
        }
 
227
}
 
228
 
 
229
static void
 
230
gst_polkit_button_clicked (GtkButton *button)
 
231
{
 
232
        GstPolKitButtonPriv *priv;
 
233
        PolKitResult result;
 
234
 
 
235
        priv = GST_POLKIT_BUTTON_GET_PRIVATE (button);
 
236
        gst_polkit_action_authenticate (priv->action);
 
237
        result = gst_polkit_action_get_result (priv->action);
 
238
 
 
239
        if (result == POLKIT_RESULT_UNKNOWN) {
 
240
                GtkWidget *dialog, *toplevel;
 
241
 
 
242
                toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button));
 
243
                dialog = gtk_message_dialog_new (GTK_WINDOW (toplevel),
 
244
                                                 GTK_DIALOG_MODAL,
 
245
                                                 GTK_MESSAGE_ERROR,
 
246
                                                 GTK_BUTTONS_CLOSE,
 
247
                                                 _("Could not authenticate"));
 
248
                gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
 
249
                                                          _("An unexpected error has occurred."));
 
250
 
 
251
                gtk_dialog_run (GTK_DIALOG (dialog));
 
252
                gtk_widget_destroy (dialog);
 
253
        }
 
254
 
 
255
        update_button_state (GST_POLKIT_BUTTON (button));
 
256
}
 
257
 
 
258
GtkWidget *
 
259
gst_polkit_button_new (const gchar *action,
 
260
                       const gchar *label)
 
261
{
 
262
        return g_object_new (GST_TYPE_POLKIT_BUTTON,
 
263
                             "action", action,
 
264
                             "label", label,
 
265
                             NULL);
 
266
}
 
267
 
 
268
G_CONST_RETURN gchar *
 
269
gst_polkit_button_get_action (GstPolKitButton *button)
 
270
{
 
271
        GstPolKitButtonPriv *priv;
 
272
 
 
273
        g_return_val_if_fail (GST_IS_POLKIT_BUTTON (button), NULL);
 
274
 
 
275
        priv = GST_POLKIT_BUTTON_GET_PRIVATE (button);
 
276
        return gst_polkit_action_get_action (priv->action);
 
277
}
 
278
 
 
279
void
 
280
gst_polkit_button_set_action (GstPolKitButton *button,
 
281
                              const gchar     *action)
 
282
{
 
283
        GstPolKitButtonPriv *priv;
 
284
        gchar *str;
 
285
 
 
286
        g_return_if_fail (GST_IS_POLKIT_BUTTON (button));
 
287
 
 
288
        priv = GST_POLKIT_BUTTON_GET_PRIVATE (button);
 
289
        gst_polkit_action_set_action (priv->action, action);
 
290
        update_button_state (button);
 
291
 
 
292
        g_object_notify (G_OBJECT (button), "action");
 
293
}
 
294
 
 
295
G_CONST_RETURN gchar *
 
296
gst_polkit_button_get_label (GstPolKitButton *button)
 
297
{
 
298
        GstPolKitButtonPriv *priv;
 
299
 
 
300
        g_return_val_if_fail (GST_IS_POLKIT_BUTTON (button), NULL);
 
301
 
 
302
        priv = GST_POLKIT_BUTTON_GET_PRIVATE (button);
 
303
        return priv->label;
 
304
}
 
305
 
 
306
void
 
307
gst_polkit_button_set_label (GstPolKitButton *button,
 
308
                             const gchar     *label)
 
309
{
 
310
        GstPolKitButtonPriv *priv;
 
311
        gchar *str;
 
312
 
 
313
        g_return_if_fail (GST_IS_POLKIT_BUTTON (button));
 
314
 
 
315
        priv = GST_POLKIT_BUTTON_GET_PRIVATE (button);
 
316
 
 
317
        str = g_strdup (label);
 
318
        g_free (priv->label);
 
319
        priv->label = str;
 
320
 
 
321
        gtk_button_set_label (GTK_BUTTON (button), priv->label);
 
322
 
 
323
        g_object_notify (G_OBJECT (button), "label");
 
324
}
 
325
 
 
326
gboolean
 
327
gst_polkit_button_get_authenticated (GstPolKitButton *button)
 
328
{
 
329
        GstPolKitButtonPriv *priv;
 
330
 
 
331
        g_return_val_if_fail (GST_IS_POLKIT_BUTTON (button), FALSE);
 
332
 
 
333
        priv = GST_POLKIT_BUTTON_GET_PRIVATE (button);
 
334
        return gst_polkit_action_get_authenticated (priv->action);
 
335
}