]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-base-password-dialog.c
Updated Spanish Translation
[empathy.git] / libempathy-gtk / empathy-base-password-dialog.c
1 /*
2  * empathy-base-password-dialog.c - Source for EmpathyBasePasswordDialog
3  * Copyright (C) 2010 Collabora Ltd.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19
20 #include "config.h"
21 #include "empathy-base-password-dialog.h"
22
23 #include <glib/gi18n-lib.h>
24 #include <tp-account-widgets/tpaw-utils.h>
25
26 #include "empathy-utils.h"
27
28 #define DEBUG_FLAG EMPATHY_DEBUG_SASL
29 #include "empathy-debug.h"
30
31 G_DEFINE_TYPE (EmpathyBasePasswordDialog, empathy_base_password_dialog,
32     GTK_TYPE_MESSAGE_DIALOG)
33
34 enum {
35   PROP_ACCOUNT = 1,
36
37   LAST_PROPERTY,
38 };
39
40 struct _EmpathyBasePasswordDialogPriv {
41   gboolean grabbing;
42 };
43
44 static void
45 empathy_base_password_dialog_get_property (GObject *object,
46     guint property_id,
47     GValue *value,
48     GParamSpec *pspec)
49 {
50   EmpathyBasePasswordDialog *self = (EmpathyBasePasswordDialog *) object;
51
52   switch (property_id)
53     {
54     case PROP_ACCOUNT:
55       g_value_set_object (value, self->account);
56       break;
57     default:
58       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
59       break;
60     }
61 }
62
63 static void
64 empathy_base_password_dialog_set_property (GObject *object,
65     guint property_id,
66     const GValue *value,
67     GParamSpec *pspec)
68 {
69   EmpathyBasePasswordDialog *self = (EmpathyBasePasswordDialog *) object;
70
71   switch (property_id)
72     {
73     case PROP_ACCOUNT:
74       g_assert (self->account == NULL); /* construct only */
75       self->account = g_value_dup_object (value);
76       break;
77     default:
78       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
79       break;
80     }
81 }
82
83 static void
84 empathy_base_password_dialog_dispose (GObject *object)
85 {
86   EmpathyBasePasswordDialog *self = (EmpathyBasePasswordDialog *) object;
87
88   tp_clear_object (&self->account);
89
90   G_OBJECT_CLASS (empathy_base_password_dialog_parent_class)->dispose (object);
91 }
92
93 static void
94 clear_icon_released_cb (GtkEntry *entry,
95     GtkEntryIconPosition icon_pos,
96     GdkEvent *event,
97     gpointer user_data)
98 {
99   gtk_entry_set_text (entry, "");
100 }
101
102 static void
103 password_entry_changed_cb (GtkEditable *entry,
104     gpointer user_data)
105 {
106   EmpathyBasePasswordDialog *self = user_data;
107   const gchar *str;
108
109   str = gtk_entry_get_text (GTK_ENTRY (entry));
110
111   gtk_entry_set_icon_sensitive (GTK_ENTRY (entry),
112       GTK_ENTRY_ICON_SECONDARY, !TPAW_STR_EMPTY (str));
113
114   gtk_widget_set_sensitive (self->ok_button,
115       !TPAW_STR_EMPTY (str));
116 }
117
118 static void
119 password_entry_activate_cb (GtkEntry *entry,
120     EmpathyBasePasswordDialog *self)
121 {
122   gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_OK);
123 }
124
125 static gboolean
126 base_password_dialog_grab_keyboard (GtkWidget *widget,
127     GdkEvent *event,
128     gpointer user_data)
129 {
130   EmpathyBasePasswordDialog *self = user_data;
131
132   if (!self->priv->grabbing)
133     {
134       GdkDevice *device = gdk_event_get_device (event);
135
136       if (device != NULL)
137         {
138           GdkGrabStatus status = gdk_device_grab (device,
139               gtk_widget_get_window (widget),
140               GDK_OWNERSHIP_WINDOW,
141               FALSE,
142               GDK_ALL_EVENTS_MASK,
143               NULL,
144               gdk_event_get_time (event));
145
146           if (status != GDK_GRAB_SUCCESS)
147             DEBUG ("Could not grab keyboard; grab status was %u", status);
148           else
149             self->priv->grabbing = TRUE;
150         }
151       else
152         DEBUG ("Could not get the event device!");
153     }
154
155   return FALSE;
156 }
157
158 static gboolean
159 base_password_dialog_ungrab_keyboard (GtkWidget *widget,
160     GdkEvent *event,
161     gpointer user_data)
162 {
163   EmpathyBasePasswordDialog *self = user_data;
164
165   if (self->priv->grabbing)
166     {
167       GdkDevice *device = gdk_event_get_device (event);
168
169       if (device != NULL)
170         {
171           gdk_device_ungrab (device, gdk_event_get_time (event));
172           self->priv->grabbing = FALSE;
173         }
174       else
175         DEBUG ("Could not get the event device!");
176     }
177
178   return FALSE;
179 }
180
181 static gboolean
182 base_password_dialog_window_state_changed (GtkWidget *widget,
183     GdkEventWindowState *event,
184     gpointer data)
185 {
186   GdkWindowState state = gdk_window_get_state (gtk_widget_get_window (widget));
187
188   if (state & GDK_WINDOW_STATE_WITHDRAWN
189       || state & GDK_WINDOW_STATE_ICONIFIED
190       || state & GDK_WINDOW_STATE_FULLSCREEN
191       || state & GDK_WINDOW_STATE_MAXIMIZED)
192     {
193       base_password_dialog_ungrab_keyboard (widget, (GdkEvent *) event, data);
194     }
195   else
196     {
197       base_password_dialog_grab_keyboard (widget, (GdkEvent *) event, data);
198     }
199
200   return FALSE;
201 }
202
203 static void
204 empathy_base_password_dialog_constructed (GObject *object)
205 {
206   EmpathyBasePasswordDialog *self;
207   GtkWidget *icon;
208   GtkBox *box;
209   gchar *text;
210
211   self = EMPATHY_BASE_PASSWORD_DIALOG (object);
212
213   g_assert (self->account != NULL);
214
215   self->priv->grabbing = FALSE;
216
217   /* dialog */
218   gtk_dialog_add_button (GTK_DIALOG (self),
219       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
220
221   self->ok_button = gtk_dialog_add_button (GTK_DIALOG (self),
222       GTK_STOCK_OK, GTK_RESPONSE_OK);
223   gtk_widget_set_sensitive (self->ok_button, FALSE);
224
225   text = g_strdup_printf (_("Enter your password for account\n<b>%s</b>"),
226       tp_account_get_display_name (self->account));
227   gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (self), text);
228   g_free (text);
229
230   gtk_window_set_icon_name (GTK_WINDOW (self),
231       GTK_STOCK_DIALOG_AUTHENTICATION);
232
233   box = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self)));
234
235   /* dialog icon */
236   icon = gtk_image_new_from_icon_name (
237       tp_account_get_icon_name (self->account), GTK_ICON_SIZE_DIALOG);
238   gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (self), icon);
239   gtk_widget_show (icon);
240
241   /* entry */
242   self->entry = gtk_entry_new ();
243   gtk_entry_set_visibility (GTK_ENTRY (self->entry), FALSE);
244
245   /* entry clear icon */
246   gtk_entry_set_icon_from_stock (GTK_ENTRY (self->entry),
247       GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR);
248   gtk_entry_set_icon_sensitive (GTK_ENTRY (self->entry),
249       GTK_ENTRY_ICON_SECONDARY, FALSE);
250
251   g_signal_connect (self->entry, "icon-release",
252       G_CALLBACK (clear_icon_released_cb), NULL);
253   g_signal_connect (self->entry, "changed",
254       G_CALLBACK (password_entry_changed_cb), self);
255   g_signal_connect (self->entry, "activate",
256       G_CALLBACK (password_entry_activate_cb), self);
257
258   gtk_box_pack_start (box, self->entry, FALSE, FALSE, 0);
259   gtk_widget_show (self->entry);
260
261   /* remember password ticky box */
262   self->ticky = gtk_check_button_new_with_label (_("Remember password"));
263
264   gtk_box_pack_start (box, self->ticky, FALSE, FALSE, 0);
265
266   g_signal_connect (self, "window-state-event",
267       G_CALLBACK (base_password_dialog_window_state_changed), self);
268   g_signal_connect (self, "map-event",
269       G_CALLBACK (base_password_dialog_grab_keyboard), self);
270   g_signal_connect (self, "unmap-event",
271       G_CALLBACK (base_password_dialog_ungrab_keyboard), self);
272
273   gtk_widget_grab_focus (self->entry);
274
275   gtk_window_set_position (GTK_WINDOW (self), GTK_WIN_POS_CENTER_ALWAYS);
276
277   gtk_window_set_keep_above (GTK_WINDOW (self), TRUE);
278 }
279
280 static void
281 empathy_base_password_dialog_init (EmpathyBasePasswordDialog *self)
282 {
283   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
284       EMPATHY_TYPE_BASE_PASSWORD_DIALOG, EmpathyBasePasswordDialogPriv);
285 }
286
287 static void
288 empathy_base_password_dialog_class_init (EmpathyBasePasswordDialogClass *klass)
289 {
290   GParamSpec *pspec;
291   GObjectClass *oclass = G_OBJECT_CLASS (klass);
292
293   g_type_class_add_private (klass, sizeof (EmpathyBasePasswordDialogPriv));
294
295   oclass->set_property = empathy_base_password_dialog_set_property;
296   oclass->get_property = empathy_base_password_dialog_get_property;
297   oclass->dispose = empathy_base_password_dialog_dispose;
298   oclass->constructed = empathy_base_password_dialog_constructed;
299
300   pspec = g_param_spec_object ("account", "The TpAccount",
301       "The TpAccount to be used.",
302       TP_TYPE_ACCOUNT,
303       G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
304   g_object_class_install_property (oclass, PROP_ACCOUNT, pspec);
305 }