pidgin/plugins/disco/gtkdisco.c

changeset 27319
f684f9ad6c79
parent 27318
c3f7edff8506
child 27399
7f99a7d1f249
equal deleted inserted replaced
27318:c3f7edff8506 27319:f684f9ad6c79
115 { 115 {
116 dialog->account = account; 116 dialog->account = account;
117 gtk_widget_set_sensitive(dialog->browse_button, account != NULL); 117 gtk_widget_set_sensitive(dialog->browse_button, account != NULL);
118 } 118 }
119 119
120 static void register_button_cb(GtkButton *button, PidginDiscoDialog *dialog) 120 static void register_button_cb(GtkWidget *unused, PidginDiscoDialog *dialog)
121 { 121 {
122 xmpp_disco_service_register(dialog->selected); 122 xmpp_disco_service_register(dialog->selected);
123 } 123 }
124 124
125 static void discolist_cancel_cb(PidginDiscoList *pdl, const char *server) 125 static void discolist_cancel_cb(PidginDiscoList *pdl, const char *server)
144 pdl->server = g_strdup(server); 144 pdl->server = g_strdup(server);
145 pidgin_disco_list_set_in_progress(pdl, TRUE); 145 pidgin_disco_list_set_in_progress(pdl, TRUE);
146 xmpp_disco_start(pdl); 146 xmpp_disco_start(pdl);
147 } 147 }
148 148
149 static void browse_button_cb(GtkButton *button, PidginDiscoDialog *dialog) 149 static void browse_button_cb(GtkWidget *button, PidginDiscoDialog *dialog)
150 { 150 {
151 PurpleConnection *pc; 151 PurpleConnection *pc;
152 PidginDiscoList *pdl; 152 PidginDiscoList *pdl;
153 const char *username; 153 const char *username;
154 const char *at, *slash; 154 const char *at, *slash;
204 purple_connection_get_account(pc), NULL, NULL, pdl); 204 purple_connection_get_account(pc), NULL, NULL, pdl);
205 205
206 g_free(server); 206 g_free(server);
207 } 207 }
208 208
209 static void add_to_blist_cb(GtkButton *button, PidginDiscoDialog *dialog) 209 static void add_to_blist_cb(GtkWidget *unused, PidginDiscoDialog *dialog)
210 { 210 {
211 XmppDiscoService *service = dialog->selected; 211 XmppDiscoService *service = dialog->selected;
212 PurpleAccount *account; 212 PurpleAccount *account;
213 const char *jid; 213 const char *jid;
214 214
219 219
220 if (service->type == XMPP_DISCO_SERVICE_TYPE_CHAT) 220 if (service->type == XMPP_DISCO_SERVICE_TYPE_CHAT)
221 purple_blist_request_add_chat(account, NULL, NULL, jid); 221 purple_blist_request_add_chat(account, NULL, NULL, jid);
222 else 222 else
223 purple_blist_request_add_buddy(account, jid, NULL, NULL); 223 purple_blist_request_add_buddy(account, jid, NULL, NULL);
224 }
225
226 static gboolean
227 service_click_cb(GtkTreeView *tree, GdkEventButton *event, gpointer user_data)
228 {
229 PidginDiscoList *pdl;
230 XmppDiscoService *service;
231 GtkWidget *menu;
232
233 GtkTreePath *path;
234 GtkTreeIter iter;
235 GValue val;
236
237 if (event->button != 3 || event->type != GDK_BUTTON_PRESS)
238 return FALSE;
239
240 pdl = user_data;
241
242 /* Figure out what was clicked */
243 if (!gtk_tree_view_get_path_at_pos(tree, event->x, event->y, &path,
244 NULL, NULL, NULL))
245 return FALSE;
246 gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &iter, path);
247 gtk_tree_path_free(path);
248 val.g_type = 0;
249 gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN,
250 &val);
251 service = g_value_get_pointer(&val);
252
253 if (!service)
254 return FALSE;
255
256 menu = gtk_menu_new();
257
258 if (service->flags & XMPP_DISCO_ADD)
259 pidgin_new_item_from_stock(menu, _("Add to Buddy List"), GTK_STOCK_ADD,
260 G_CALLBACK(add_to_blist_cb), pdl->dialog,
261 0, 0, NULL);
262
263 if (service->flags & XMPP_DISCO_REGISTER) {
264 GtkWidget *item = pidgin_new_item(menu, _("Register"));
265 g_signal_connect(G_OBJECT(item), "activate",
266 G_CALLBACK(register_button_cb), pdl->dialog);
267 }
268
269 gtk_widget_show_all(menu);
270 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button,
271 event->time);
272 return FALSE;
224 } 273 }
225 274
226 static void 275 static void
227 selection_changed_cb(GtkTreeSelection *selection, PidginDiscoList *pdl) 276 selection_changed_cb(GtkTreeSelection *selection, PidginDiscoList *pdl)
228 { 277 {
287 if (service->flags & XMPP_DISCO_BROWSE) 336 if (service->flags & XMPP_DISCO_BROWSE)
288 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(pdl->tree), path)) 337 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(pdl->tree), path))
289 gtk_tree_view_collapse_row(GTK_TREE_VIEW(pdl->tree), path); 338 gtk_tree_view_collapse_row(GTK_TREE_VIEW(pdl->tree), path);
290 else 339 else
291 gtk_tree_view_expand_row(GTK_TREE_VIEW(pdl->tree), path, FALSE); 340 gtk_tree_view_expand_row(GTK_TREE_VIEW(pdl->tree), path, FALSE);
341 else if (service->flags & XMPP_DISCO_REGISTER)
342 register_button_cb(NULL, pdl->dialog);
292 else if (service->flags & XMPP_DISCO_ADD) 343 else if (service->flags & XMPP_DISCO_ADD)
293 add_to_blist_cb(GTK_BUTTON(pdl->dialog->add_button), pdl->dialog); 344 add_to_blist_cb(NULL, pdl->dialog);
294 else if (service->flags & XMPP_DISCO_REGISTER)
295 register_button_cb(GTK_BUTTON(pdl->dialog->register_button), pdl->dialog);
296 } 345 }
297 346
298 static void 347 static void
299 destroy_win_cb(GtkWidget *window, gpointer d) 348 destroy_win_cb(GtkWidget *window, gpointer d)
300 { 349 {
472 gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE); 521 gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE);
473 gtk_tree_view_column_set_sort_column_id(GTK_TREE_VIEW_COLUMN(column), DESCRIPTION_COLUMN); 522 gtk_tree_view_column_set_sort_column_id(GTK_TREE_VIEW_COLUMN(column), DESCRIPTION_COLUMN);
474 gtk_tree_view_column_set_reorderable(GTK_TREE_VIEW_COLUMN(column), TRUE); 523 gtk_tree_view_column_set_reorderable(GTK_TREE_VIEW_COLUMN(column), TRUE);
475 gtk_tree_view_append_column(GTK_TREE_VIEW(pdl->tree), column); 524 gtk_tree_view_append_column(GTK_TREE_VIEW(pdl->tree), column);
476 525
526 g_signal_connect(G_OBJECT(pdl->tree), "button-press-event", G_CALLBACK(service_click_cb), pdl);
477 g_signal_connect(G_OBJECT(pdl->tree), "row-expanded", G_CALLBACK(row_expanded_cb), pdl); 527 g_signal_connect(G_OBJECT(pdl->tree), "row-expanded", G_CALLBACK(row_expanded_cb), pdl);
478 g_signal_connect(G_OBJECT(pdl->tree), "row-activated", G_CALLBACK(row_activated_cb), pdl); 528 g_signal_connect(G_OBJECT(pdl->tree), "row-activated", G_CALLBACK(row_activated_cb), pdl);
479 529
480 pidgin_tooltip_setup_for_treeview(pdl->tree, pdl, 530 pidgin_tooltip_setup_for_treeview(pdl->tree, pdl,
481 disco_create_tooltip, 531 disco_create_tooltip,

mercurial