Mercurial > pidgin
comparison src/gtknotify.c @ 10439:911530134bf8
[gaim-migrate @ 11697]
sf patch #1086253, from Alex Converse
closes sf rfe #991372, from Adam Petaccia
"New Buddy Search Results Dialog," used for oscar
Also some memleak fixes from me. My bad.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Tue, 28 Dec 2004 06:24:32 +0000 |
parents | ec140184437b |
children | e6b87f7e8988 |
comparison
equal
deleted
inserted
replaced
10438:d90ece33e72f | 10439:911530134bf8 |
---|---|
31 #include "debug.h" | 31 #include "debug.h" |
32 #include "prefs.h" | 32 #include "prefs.h" |
33 #include "gtkstock.h" | 33 #include "gtkstock.h" |
34 #include "util.h" | 34 #include "util.h" |
35 | 35 |
36 #include "gtkblist.h" | |
36 #include "gtkimhtml.h" | 37 #include "gtkimhtml.h" |
37 #include "gtknotify.h" | 38 #include "gtknotify.h" |
38 #include "gtkutils.h" | 39 #include "gtkutils.h" |
39 | 40 |
40 typedef struct | 41 typedef struct |
43 char *url; | 44 char *url; |
44 GtkWidget *dialog; | 45 GtkWidget *dialog; |
45 GtkWidget *label; | 46 GtkWidget *label; |
46 | 47 |
47 } GaimNotifyMailData; | 48 } GaimNotifyMailData; |
49 | |
50 typedef struct | |
51 { | |
52 GaimAccount *account; | |
53 GtkListStore *model; | |
54 GtkWidget *treeview; | |
55 GtkWidget *window; | |
56 | |
57 } GaimNotifySearchResultsData; | |
58 | |
59 enum | |
60 { | |
61 COLUMN_ICON, | |
62 COLUMN_SCREENNAME, | |
63 NUM_COLUMNS | |
64 }; | |
48 | 65 |
49 static void *gaim_gtk_notify_emails(size_t count, gboolean detailed, | 66 static void *gaim_gtk_notify_emails(size_t count, gboolean detailed, |
50 const char **subjects, | 67 const char **subjects, |
51 const char **froms, const char **tos, | 68 const char **froms, const char **tos, |
52 const char **urls, GCallback cb, | 69 const char **urls, GCallback cb, |
69 | 86 |
70 static void | 87 static void |
71 formatted_close_cb(GtkWidget *win, GdkEvent *event, void *user_data) | 88 formatted_close_cb(GtkWidget *win, GdkEvent *event, void *user_data) |
72 { | 89 { |
73 gaim_notify_close(GAIM_NOTIFY_FORMATTED, win); | 90 gaim_notify_close(GAIM_NOTIFY_FORMATTED, win); |
91 } | |
92 | |
93 static void | |
94 searchresults_close_cb(GaimNotifySearchResultsData *data, GdkEvent *event, void *user_data) | |
95 { | |
96 gaim_notify_close(GAIM_NOTIFY_SEARCHRESULTS, data); | |
97 } | |
98 | |
99 static void | |
100 add_buddy_helper_cb(GtkWidget *widget, GaimNotifySearchResultsData *data) | |
101 { | |
102 GtkTreeSelection *selection; | |
103 GtkTreeModel *model; | |
104 GtkTreeIter iter; | |
105 gchar *buddy; | |
106 | |
107 g_return_if_fail(data != NULL); | |
108 | |
109 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data->treeview)); | |
110 | |
111 if (gtk_tree_selection_get_selected(selection, &model, &iter)) | |
112 { | |
113 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, | |
114 COLUMN_SCREENNAME, &buddy, -1); | |
115 gaim_blist_request_add_buddy(data->account, buddy, NULL, NULL); | |
116 g_free(buddy); | |
117 } | |
74 } | 118 } |
75 | 119 |
76 static void * | 120 static void * |
77 gaim_gtk_notify_message(GaimNotifyMsgType type, const char *title, | 121 gaim_gtk_notify_message(GaimNotifyMsgType type, const char *title, |
78 const char *primary, const char *secondary, | 122 const char *primary, const char *secondary, |
376 | 420 |
377 return window; | 421 return window; |
378 } | 422 } |
379 | 423 |
380 static void * | 424 static void * |
425 gaim_gtk_notify_searchresults(GaimConnection *gc, const char *title, | |
426 const char *primary, const char *secondary, | |
427 const char **results, GCallback cb, | |
428 void *user_data) | |
429 { | |
430 GtkWidget *window; | |
431 GtkWidget *vbox; | |
432 GtkWidget *button_area; | |
433 GtkWidget *label; | |
434 GtkWidget *close_button; | |
435 GtkWidget *add_button; | |
436 GtkWidget *sw; | |
437 GtkWidget *treeview; | |
438 GdkPixbuf *icon, *scaled; | |
439 GaimNotifySearchResultsData *data; | |
440 GtkListStore *model; | |
441 GtkCellRenderer *renderer; | |
442 GtkTreeIter iter; | |
443 int i; | |
444 char *label_text; | |
445 | |
446 data = g_malloc(sizeof(GaimNotifySearchResultsData)); | |
447 | |
448 /* Create the window */ | |
449 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
450 gtk_window_set_title(GTK_WINDOW(window), (title ? title :_("Search Results"))); | |
451 gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); | |
452 gtk_container_set_border_width(GTK_CONTAINER(window), 12); | |
453 | |
454 g_signal_connect_swapped(G_OBJECT(window), "delete_event", | |
455 G_CALLBACK(searchresults_close_cb), data); | |
456 | |
457 /* Setup the main vbox */ | |
458 vbox = gtk_vbox_new(FALSE, 12); | |
459 gtk_container_add(GTK_CONTAINER(window), vbox); | |
460 gtk_widget_show(vbox); | |
461 | |
462 /* Setup the descriptive label */ | |
463 label_text = g_strdup_printf( | |
464 "<span weight=\"bold\" size=\"larger\">%s</span>%s%s", | |
465 (primary ? primary : ""), | |
466 (primary && secondary ? "\n" : ""), | |
467 (secondary ? secondary : "")); | |
468 label = gtk_label_new(NULL); | |
469 gtk_label_set_markup(GTK_LABEL(label), label_text); | |
470 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
471 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
472 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
473 gtk_widget_show(label); | |
474 g_free(label_text); | |
475 | |
476 /* Setup the list model */ | |
477 model = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING); | |
478 | |
479 /* Setup the scrolled window containing the treeview */ | |
480 sw = gtk_scrolled_window_new(NULL, NULL); | |
481 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
482 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); | |
483 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), | |
484 GTK_SHADOW_IN); | |
485 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); | |
486 gtk_widget_show(sw); | |
487 | |
488 /* Setup the treeview */ | |
489 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); | |
490 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE); | |
491 gtk_widget_set_size_request(treeview, 250, 150); | |
492 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), | |
493 GTK_SELECTION_SINGLE); | |
494 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); | |
495 gtk_container_add(GTK_CONTAINER(sw), treeview); | |
496 gtk_widget_show(treeview); | |
497 | |
498 /* icon column */ | |
499 renderer = gtk_cell_renderer_pixbuf_new (); | |
500 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), | |
501 -1, "Icon", renderer, | |
502 "pixbuf", COLUMN_ICON, | |
503 NULL); | |
504 | |
505 /* screenname column */ | |
506 renderer = gtk_cell_renderer_text_new(); | |
507 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), | |
508 -1, "Screenname", renderer, | |
509 "text", COLUMN_SCREENNAME, | |
510 NULL); | |
511 | |
512 /* Setup the button area */ | |
513 button_area = gtk_hbutton_box_new(); | |
514 gtk_box_pack_start(GTK_BOX(vbox), button_area, FALSE, FALSE, 0); | |
515 gtk_button_box_set_layout(GTK_BUTTON_BOX(button_area), GTK_BUTTONBOX_END); | |
516 gtk_box_set_spacing(GTK_BOX(button_area), 12); | |
517 gtk_widget_show(button_area); | |
518 | |
519 /* Add the Add button */ | |
520 add_button = gtk_button_new_from_stock(GTK_STOCK_ADD); | |
521 gtk_box_pack_start(GTK_BOX(button_area), add_button, FALSE, FALSE, 0); | |
522 gtk_widget_show(add_button); | |
523 | |
524 /* Add the Close button */ | |
525 close_button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); | |
526 gtk_box_pack_start(GTK_BOX(button_area), close_button, FALSE, FALSE, 0); | |
527 gtk_widget_show(close_button); | |
528 | |
529 /* Add the buddies to the tree view */ | |
530 icon = create_prpl_icon(gc->account); | |
531 scaled = gdk_pixbuf_scale_simple(icon, 16, 16, GDK_INTERP_BILINEAR); | |
532 | |
533 for (i = 0; results[i] != NULL; i++) | |
534 { | |
535 gtk_list_store_append(model, &iter); | |
536 gtk_list_store_set(model, &iter, | |
537 COLUMN_ICON, scaled, | |
538 COLUMN_SCREENNAME, results[i], | |
539 -1); | |
540 } | |
541 | |
542 data->account = gc->account; | |
543 data->model = model; | |
544 data->treeview = treeview; | |
545 data->window = window; | |
546 | |
547 /* Connect Signals */ | |
548 g_signal_connect(G_OBJECT(add_button), "clicked", | |
549 G_CALLBACK(add_buddy_helper_cb), data); | |
550 g_signal_connect_swapped(G_OBJECT(close_button), "clicked", | |
551 G_CALLBACK(searchresults_close_cb), data); | |
552 | |
553 /* Show the window */ | |
554 gtk_widget_show(window); | |
555 return data; | |
556 } | |
557 | |
558 static void * | |
381 gaim_gtk_notify_userinfo(GaimConnection *gc, const char *who, | 559 gaim_gtk_notify_userinfo(GaimConnection *gc, const char *who, |
382 const char *title, const char *primary, | 560 const char *title, const char *primary, |
383 const char *secondary, const char *text, | 561 const char *secondary, const char *text, |
384 GCallback cb, void *user_data) | 562 GCallback cb, void *user_data) |
385 { | 563 { |
395 GaimNotifyMailData *data = (GaimNotifyMailData *)ui_handle; | 573 GaimNotifyMailData *data = (GaimNotifyMailData *)ui_handle; |
396 | 574 |
397 gtk_widget_destroy(data->dialog); | 575 gtk_widget_destroy(data->dialog); |
398 | 576 |
399 g_free(data->url); | 577 g_free(data->url); |
578 g_free(data); | |
579 } | |
580 else if (type == GAIM_NOTIFY_SEARCHRESULTS) | |
581 { | |
582 GaimNotifySearchResultsData *data = (GaimNotifySearchResultsData *)ui_handle; | |
583 | |
584 gtk_widget_destroy(data->window); | |
585 | |
400 g_free(data); | 586 g_free(data); |
401 } | 587 } |
402 else | 588 else |
403 gtk_widget_destroy(GTK_WIDGET(ui_handle)); | 589 gtk_widget_destroy(GTK_WIDGET(ui_handle)); |
404 } | 590 } |
610 { | 796 { |
611 gaim_gtk_notify_message, | 797 gaim_gtk_notify_message, |
612 gaim_gtk_notify_email, | 798 gaim_gtk_notify_email, |
613 gaim_gtk_notify_emails, | 799 gaim_gtk_notify_emails, |
614 gaim_gtk_notify_formatted, | 800 gaim_gtk_notify_formatted, |
801 gaim_gtk_notify_searchresults, | |
615 gaim_gtk_notify_userinfo, | 802 gaim_gtk_notify_userinfo, |
616 gaim_gtk_notify_uri, | 803 gaim_gtk_notify_uri, |
617 gaim_gtk_close_notify | 804 gaim_gtk_close_notify |
618 }; | 805 }; |
619 | 806 |