Mercurial > pidgin.yaz
annotate src/gtkconn.c @ 6109:0922bb7a7bbc
[gaim-migrate @ 6571]
Make attempting to sign on to an account twice not crash Gaim, and make
the prompt for password request window only open once at max. I might
change this in a few minutes, but this works, and I wanted to commit it
before I break something.
Move the gaim_request_input() call for "Please enter your password" to
connection.c instead of gtkconn.c. There is no need for this to be in
gtkconn.c, and doing it in core means less work for UIs.
Make closing a notify window call the cancel action.
Set the titles for request windows, when given.
Remove a bit of odd, un-needed code from main.c (hitting "enter" in the
password field was calling doenter which called dologin. Now it just
calls dologin).
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 13 Jul 2003 18:33:25 +0000 |
parents | 99f4bbeb27bc |
children | 3c70f8be8558 |
rev | line source |
---|---|
5717 | 1 /* |
2 * gaim | |
3 * | |
4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
5 * | |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * This program 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 | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 * | |
20 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
21 #include "internal.h" |
5717 | 22 |
23 #include "account.h" | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
24 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
25 #include "util.h" |
5717 | 26 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
27 #include "gtkblist.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
28 #include "gtkutils.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
29 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
30 #include "ui.h" |
5717 | 31 |
32 struct signon_meter { | |
33 GaimAccount *account; | |
34 GtkWidget *button; | |
35 GtkWidget *progress; | |
36 GtkWidget *status; | |
37 }; | |
38 | |
39 struct meter_window { | |
40 GtkWidget *window; | |
41 GtkWidget *table; | |
42 gint rows; | |
43 gint active_count; | |
44 GSList *meters; | |
45 } *meter_win = NULL; | |
46 | |
5991
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
47 static void kill_meter(struct signon_meter *meter, const char *text); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
48 |
5717 | 49 static void cancel_signon(GtkWidget *button, struct signon_meter *meter) |
50 { | |
5991
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
51 if (meter->account->gc != NULL) { |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
52 meter->account->gc->wants_to_die = TRUE; |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
53 gaim_connection_destroy(meter->account->gc); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
54 } |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
55 else { |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
56 kill_meter(meter, _("Done.")); |
5987
6e19ad2ef712
[gaim-migrate @ 6435]
Christian Hammond <chipx86@chipx86.com>
parents:
5936
diff
changeset
|
57 |
5991
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
58 if (gaim_connections_get_all() == NULL) { |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
59 destroy_all_dialogs(); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
60 |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
61 gaim_blist_destroy(); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
62 |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
63 show_login(); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
64 } |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
65 } |
5717 | 66 } |
67 | |
68 static void cancel_all () { | |
69 GSList *m = meter_win ? meter_win->meters : NULL; | |
70 | |
71 while (m) { | |
72 cancel_signon(NULL, m->data); | |
73 m = meter_win ? meter_win->meters : NULL; | |
74 } | |
75 } | |
76 | |
77 static gint meter_destroy(GtkWidget *window, GdkEvent *evt, struct signon_meter *meter) | |
78 { | |
79 return TRUE; | |
80 } | |
81 | |
82 static struct signon_meter *find_signon_meter(GaimConnection *gc) | |
83 { | |
84 GSList *m = meter_win ? meter_win->meters : NULL; | |
85 | |
86 while (m) { | |
87 if (((struct signon_meter *)m->data)->account == gc->account) | |
88 return m->data; | |
89 m = m->next; | |
90 } | |
91 | |
92 return NULL; | |
93 } | |
94 | |
95 static GtkWidget* create_meter_pixmap (GaimConnection *gc) | |
96 { | |
97 GdkPixbuf *pb = create_prpl_icon(gc->account); | |
98 GdkPixbuf *scale = gdk_pixbuf_scale_simple(pb, 30,30,GDK_INTERP_BILINEAR); | |
99 GtkWidget *image = | |
100 gtk_image_new_from_pixbuf(scale); | |
101 g_object_unref(G_OBJECT(pb)); | |
102 g_object_unref(G_OBJECT(scale)); | |
103 return image; | |
104 } | |
105 | |
106 | |
107 | |
108 static struct signon_meter * | |
109 new_meter(GaimConnection *gc, GtkWidget *widget, | |
110 GtkWidget *table, gint *rows) | |
111 { | |
112 GtkWidget *graphic; | |
113 GtkWidget *label; | |
114 GtkWidget *nest_vbox; | |
115 GString *name_to_print; | |
116 struct signon_meter *meter; | |
117 | |
118 | |
119 meter = g_new0(struct signon_meter, 1); | |
120 | |
121 meter->account = gaim_connection_get_account(gc); | |
122 name_to_print = g_string_new(gaim_account_get_username(meter->account)); | |
123 | |
124 (*rows)++; | |
125 gtk_table_resize (GTK_TABLE(table), *rows, 4); | |
126 | |
127 graphic = create_meter_pixmap(gc); | |
128 | |
129 nest_vbox = gtk_vbox_new (FALSE, 0); | |
130 | |
131 g_string_prepend(name_to_print, _("Signon: ")); | |
132 label = gtk_label_new (name_to_print->str); | |
133 g_string_free(name_to_print, TRUE); | |
134 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); | |
135 | |
136 meter->status = gtk_label_new(""); | |
137 gtk_misc_set_alignment(GTK_MISC(meter->status), 0, 0.5); | |
138 gtk_widget_set_size_request(meter->status, 250, -1); | |
139 | |
140 meter->progress = gtk_progress_bar_new (); | |
141 | |
142 meter->button = gaim_pixbuf_button_from_stock (_("Cancel"), GTK_STOCK_CANCEL, GAIM_BUTTON_HORIZONTAL); | |
143 g_signal_connect(G_OBJECT (meter->button), "clicked", | |
144 G_CALLBACK (cancel_signon), meter); | |
145 | |
146 gtk_table_attach (GTK_TABLE (table), graphic, 0, 1, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
147 gtk_table_attach (GTK_TABLE (table), nest_vbox, 1, 2, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
148 gtk_box_pack_start (GTK_BOX (nest_vbox), GTK_WIDGET (label), FALSE, FALSE, 0); | |
149 gtk_box_pack_start (GTK_BOX (nest_vbox), GTK_WIDGET (meter->status), FALSE, FALSE, 0); | |
150 gtk_table_attach (GTK_TABLE (table), meter->progress, 2, 3, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
151 gtk_table_attach (GTK_TABLE (table), meter->button, 3, 4, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
152 | |
153 gtk_widget_show_all (GTK_WIDGET (meter_win->window)); | |
154 | |
155 meter_win->active_count++; | |
156 | |
157 return meter; | |
158 } | |
159 | |
160 static void kill_meter(struct signon_meter *meter, const char *text) { | |
161 gtk_widget_set_sensitive (meter->button, FALSE); | |
162 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(meter->progress), 1); | |
163 gtk_label_set_text(GTK_LABEL(meter->status), text); | |
164 meter_win->active_count--; | |
165 if (meter_win->active_count == 0) { | |
166 gtk_widget_destroy(meter_win->window); | |
167 g_free (meter_win); | |
168 meter_win = NULL; | |
169 } | |
170 } | |
171 | |
172 static void gaim_gtk_connection_connect_progress(GaimConnection *gc, | |
173 const char *text, size_t step, size_t step_count) | |
174 { | |
175 struct signon_meter *meter; | |
176 | |
177 if(!meter_win) { | |
178 GtkWidget *vbox; | |
179 GtkWidget *cancel_button; | |
180 | |
181 if(mainwindow) | |
182 gtk_widget_hide(mainwindow); | |
183 | |
184 meter_win = g_new0(struct meter_window, 1); | |
185 meter_win->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
186 gtk_window_set_resizable(GTK_WINDOW(meter_win->window), FALSE); | |
187 gtk_window_set_role(GTK_WINDOW(meter_win->window), "signon"); | |
188 gtk_container_set_border_width(GTK_CONTAINER(meter_win->window), 5); | |
189 gtk_window_set_title(GTK_WINDOW(meter_win->window), _("Signon")); | |
190 gtk_widget_realize(meter_win->window); | |
191 | |
192 vbox = gtk_vbox_new (FALSE, 0); | |
193 gtk_container_add(GTK_CONTAINER(meter_win->window), vbox); | |
194 | |
195 meter_win->table = gtk_table_new(1, 4, FALSE); | |
196 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(meter_win->table), | |
197 FALSE, FALSE, 0); | |
198 gtk_container_set_border_width(GTK_CONTAINER(meter_win->table), 5); | |
199 gtk_table_set_row_spacings(GTK_TABLE(meter_win->table), 5); | |
200 gtk_table_set_col_spacings(GTK_TABLE(meter_win->table), 10); | |
201 | |
202 cancel_button = gaim_pixbuf_button_from_stock(_("Cancel All"), | |
203 GTK_STOCK_QUIT, GAIM_BUTTON_HORIZONTAL); | |
204 g_signal_connect_swapped(G_OBJECT(cancel_button), "clicked", | |
205 G_CALLBACK(cancel_all), NULL); | |
206 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(cancel_button), | |
207 FALSE, FALSE, 0); | |
208 | |
209 g_signal_connect(G_OBJECT(meter_win->window), "delete_event", | |
210 G_CALLBACK(meter_destroy), NULL); | |
211 } | |
212 | |
213 meter = find_signon_meter(gc); | |
214 if(!meter) { | |
215 meter = new_meter(gc, meter_win->window, meter_win->table, | |
216 &meter_win->rows); | |
217 | |
218 meter_win->meters = g_slist_append(meter_win->meters, meter); | |
219 } | |
220 | |
221 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(meter->progress), | |
222 (float)step / (float)step_count); | |
223 gtk_label_set_text(GTK_LABEL(meter->status), text); | |
224 } | |
225 | |
226 static void gaim_gtk_connection_connected(GaimConnection *gc) | |
227 { | |
228 struct signon_meter *meter = find_signon_meter(gc); | |
229 | |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
230 gaim_setup(gc); |
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
231 |
6021 | 232 update_privacy_connections(); |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
233 do_away_menu(); |
5936
1b56a833d665
[gaim-migrate @ 6376]
Christian Hammond <chipx86@chipx86.com>
parents:
5885
diff
changeset
|
234 gaim_gtk_blist_update_protocol_actions(); |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
235 |
5717 | 236 if(meter) |
237 kill_meter(meter, _("Done.")); | |
238 } | |
239 | |
240 static void gaim_gtk_connection_disconnected(GaimConnection *gc, | |
241 const char *reason) | |
242 { | |
243 struct signon_meter *meter = find_signon_meter(gc); | |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
244 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
245 update_privacy_connections(); |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
246 do_away_menu(); |
5936
1b56a833d665
[gaim-migrate @ 6376]
Christian Hammond <chipx86@chipx86.com>
parents:
5885
diff
changeset
|
247 gaim_gtk_blist_update_protocol_actions(); |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
248 |
5717 | 249 if(meter) |
250 kill_meter(meter, _("Done.")); | |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
251 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
252 if (gaim_connections_get_all() != NULL) |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
253 return; |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
254 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
255 destroy_all_dialogs(); |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
256 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
257 gaim_blist_destroy(); |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
258 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
259 show_login(); |
5717 | 260 } |
261 | |
262 static void gaim_gtk_connection_notice(GaimConnection *gc, | |
263 const char *text) | |
264 { | |
265 } | |
266 | |
267 static GaimConnectionUiOps conn_ui_ops = | |
268 { | |
269 gaim_gtk_connection_connect_progress, | |
270 gaim_gtk_connection_connected, | |
271 gaim_gtk_connection_disconnected, | |
272 gaim_gtk_connection_notice | |
273 }; | |
274 | |
275 GaimConnectionUiOps *gaim_get_gtk_connection_ui_ops(void) | |
276 { | |
277 return &conn_ui_ops; | |
278 } | |
279 | |
280 | |
5746
2c04c55222b7
[gaim-migrate @ 6171]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5717
diff
changeset
|
281 void away_on_login(char *mesg) |
5717 | 282 { |
283 GSList *awy = away_messages; | |
284 struct away_message *a, *message = NULL; | |
285 struct gaim_gtk_buddy_list *gtkblist; | |
286 | |
287 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
288 | |
289 if (!gtkblist->window) { | |
290 return; | |
291 } | |
292 | |
293 if (mesg == NULL) { | |
294 /* Use default message */ | |
295 do_away_message(NULL, default_away); | |
296 } else { | |
297 /* Use argument */ | |
298 while (awy) { | |
299 a = (struct away_message *)awy->data; | |
300 if (strcmp(a->name, mesg) == 0) { | |
301 message = a; | |
302 break; | |
303 } | |
304 awy = awy->next; | |
305 } | |
306 if (message == NULL) | |
307 message = default_away; | |
308 do_away_message(NULL, message); | |
309 } | |
310 return; | |
311 } |