comparison src/dialogs.c @ 4359:5fb47ec9bfe4

[gaim-migrate @ 4625] Wow, okay, where to begin with this one ;) I rewrote the whole conversation backend. It is now core/UI split. Here's how it works.. Every conversation is represented by a gaim_conversation structure. This branches out into gaim_im and gaim_chat structures. Every conversation lives in (well, normally, but it doesn't have to) a gaim_window structure. This is a _CORE_ representation of a window. There can be multiple gaim_window structures around. The gaim_window and gaim_conversation structures have UI-specific operation structures associated with them. At the moment, the only UI is GTK+, and this will be for some time. Don't start thinking you can write a QT UI now. It's just not going to happen. Everything that is done on a conversation is done through the core API. This API does core processing and then calls the UI operations for the rendering and anything else. Now, what does this give the user? - Multiple windows. - Multiple tabs per window. - Draggable tabs. - Send As menu is moved to the menubar. - Menubar for chats. - Some very cool stuff in the future, like replacing, say, IRC chat windows with an X-Chat interface, or whatever. - Later on, customizable window/conversation positioning. For developers: - Fully documented API - Core/UI split - Variable checking and mostly sane handling of incorrect variables. - Logical structure to conversations, both core and UI. - Some very cool stuff in the future, like replacing, say, IRC chat windows with an X-Chat interface, or whatever. - Later on, customizable window/conversation positioning. - Oh yeah, and the beginning of a stock icon system. Now, there are things that aren't there yet. You will see tabs even if you have them turned off. This will be fixed in time. Also, the preferences will change to work with the new structure. I'm starting school in 2 days, so it may not be done immediately, but hopefully in the next week. Enjoy! committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Mon, 20 Jan 2003 09:10:23 +0000
parents 7142f59bec2c
children 8299114f5693
comparison
equal deleted inserted replaced
4358:2b8abf7f9cc1 4359:5fb47ec9bfe4
238 GtkWidget *window; 238 GtkWidget *window;
239 GtkWidget *url; 239 GtkWidget *url;
240 GtkWidget *text; 240 GtkWidget *text;
241 GtkWidget *toggle; 241 GtkWidget *toggle;
242 GtkWidget *entry; 242 GtkWidget *entry;
243 struct conversation *c; 243 struct gaim_conversation *c;
244 }; 244 };
245 245
246 struct passwddlg { 246 struct passwddlg {
247 GtkWidget *window; 247 GtkWidget *window;
248 GtkWidget *ok; 248 GtkWidget *ok;
277 277
278 /*------------------------------------------------------------------------*/ 278 /*------------------------------------------------------------------------*/
279 /* Destroys */ 279 /* Destroys */
280 /*------------------------------------------------------------------------*/ 280 /*------------------------------------------------------------------------*/
281 281
282 static gint delete_event_dialog(GtkWidget *w, GdkEventAny *e, struct conversation *c) 282 static gint delete_event_dialog(GtkWidget *w, GdkEventAny *e, struct gaim_conversation *c)
283 { 283 {
284 struct gaim_gtk_conversation *gtkconv;
284 gchar *object_data; 285 gchar *object_data;
286
285 object_data = gtk_object_get_user_data(GTK_OBJECT(w)); 287 object_data = gtk_object_get_user_data(GTK_OBJECT(w));
286 288
289 gtkconv = GAIM_GTK_CONVERSATION(c);
290
287 if (GTK_IS_COLOR_SELECTION_DIALOG(w)) { 291 if (GTK_IS_COLOR_SELECTION_DIALOG(w)) {
288 set_state_lock(1); 292 gaim_gtk_set_state_lock(TRUE);
289 if (w == c->fg_color_dialog) { 293 if (w == gtkconv->dialogs.fg_color) {
290 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(c->fgcolorbtn), FALSE); 294 gtk_toggle_button_set_state(
291 c->fg_color_dialog = NULL; 295 GTK_TOGGLE_BUTTON(gtkconv->toolbar.fgcolor), FALSE);
296 gtkconv->dialogs.fg_color = NULL;
292 } else { 297 } else {
293 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(c->bgcolorbtn), FALSE); 298 gtk_toggle_button_set_state(
294 c->bg_color_dialog = NULL; 299 GTK_TOGGLE_BUTTON(gtkconv->toolbar.bgcolor), FALSE);
300 gtkconv->dialogs.bg_color = NULL;
295 } 301 }
296 set_state_lock(0); 302 gaim_gtk_set_state_lock(FALSE);
297 } else if (GTK_IS_FONT_SELECTION_DIALOG(w)) { 303 } else if (GTK_IS_FONT_SELECTION_DIALOG(w)) {
298 set_state_lock(1); 304 gaim_gtk_set_state_lock(TRUE);
299 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(c->font), FALSE); 305 gtk_toggle_button_set_state(
300 set_state_lock(0); 306 GTK_TOGGLE_BUTTON(gtkconv->toolbar.normal_size), FALSE);
301 c->font_dialog = NULL; 307 gaim_gtk_set_state_lock(FALSE);
308 gtkconv->dialogs.font = NULL;
302 } else if (!g_strcasecmp(object_data, "smiley dialog")) { 309 } else if (!g_strcasecmp(object_data, "smiley dialog")) {
303 set_state_lock(1); 310 gaim_gtk_set_state_lock(TRUE);
304 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(c->smiley), FALSE); 311 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(gtkconv->toolbar.smiley),
305 set_state_lock(0); 312 FALSE);
306 c->smiley_dialog = NULL; 313 gaim_gtk_set_state_lock(FALSE);
314 gtkconv->dialogs.smiley = NULL;
307 } else if (!g_strcasecmp(object_data, "log dialog")) { 315 } else if (!g_strcasecmp(object_data, "log dialog")) {
308 set_state_lock(1); 316 gaim_gtk_set_state_lock(TRUE);
309 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(c->log_button), FALSE); 317 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtkconv->toolbar.log),
310 set_state_lock(0); 318 FALSE);
311 c->log_dialog = NULL; 319 gaim_gtk_set_state_lock(FALSE);
320 gtkconv->dialogs.log = NULL;
312 } 321 }
313 322
314 dialogwindows = g_list_remove(dialogwindows, w); 323 dialogwindows = g_list_remove(dialogwindows, w);
315 gtk_widget_destroy(w); 324 gtk_widget_destroy(w);
316 325
393 char *filename = g_build_filename(DATADIR, "pixmaps", "gaim", "dialogs", "gaim_warning.png", NULL); 402 char *filename = g_build_filename(DATADIR, "pixmaps", "gaim", "dialogs", "gaim_warning.png", NULL);
394 char *labeltext; 403 char *labeltext;
395 GtkWidget *hbox, *vbox; 404 GtkWidget *hbox, *vbox;
396 GtkWidget *label; 405 GtkWidget *label;
397 GtkWidget *img = gtk_image_new_from_file(filename); 406 GtkWidget *img = gtk_image_new_from_file(filename);
398 struct conversation *c = find_conversation(who); 407 struct gaim_conversation *c = gaim_find_conversation(who);
399 408
400 struct warning *w = g_new0(struct warning, 1); 409 struct warning *w = g_new0(struct warning, 1);
401 w->who = who; 410 w->who = who;
402 w->gc = gc; 411 w->gc = gc;
403 412
448 } 457 }
449 458
450 void do_remove_buddy(struct buddy *b) 459 void do_remove_buddy(struct buddy *b)
451 { 460 {
452 struct group *g = find_group_by_buddy(b); 461 struct group *g = find_group_by_buddy(b);
453 struct conversation *cv; 462 struct gaim_conversation *c;
454 463
455 if (!b) 464 if (!b)
456 return; 465 return;
466
467 g = find_group_by_buddy(b);
457 468
458 debug_printf(_("Removing '%s' from buddy list.\n"), b->name); 469 debug_printf(_("Removing '%s' from buddy list.\n"), b->name);
459 serv_remove_buddy(b->user->gc, b->name, g->name); 470 serv_remove_buddy(b->user->gc, b->name, g->name);
460 remove_buddy(b); 471 remove_buddy(b);
461 gaim_blist_save(); 472 gaim_blist_save();
462 473
463 cv = find_conversation(b->name); 474 c = gaim_find_conversation(b->name);
464 475
465 if (cv) 476 if (c != NULL)
466 update_convo_add_button(cv); 477 gaim_conversation_update(c, GAIM_CONV_UPDATE_REMOVE);
467
468 } 478 }
469 479
470 void show_confirm_del(struct gaim_connection *gc, gchar *name) 480 void show_confirm_del(struct gaim_connection *gc, gchar *name)
471 { 481 {
472 struct buddy *bd = find_buddy(gc->user, name); 482 struct buddy *bd = find_buddy(gc->user, name);
552 562
553 563
554 564
555 static void do_im(GtkWidget *widget, int resp, struct getuserinfo *info) 565 static void do_im(GtkWidget *widget, int resp, struct getuserinfo *info)
556 { 566 {
557 char *who; 567 const char *who;
558 struct conversation *c; 568 struct gaim_conversation *conv;
559 569
560 if (resp == GTK_RESPONSE_OK) { 570 if (resp == GTK_RESPONSE_OK) {
561 who = g_strdup(gtk_entry_get_text(GTK_ENTRY(info->entry))); 571 who = gtk_entry_get_text(GTK_ENTRY(info->entry));
562 572
563 if (!g_strcasecmp(who, "")) { 573 if (!g_strcasecmp(who, "")) {
564 g_free(who); 574 g_free(info);
565 return; 575 return;
566 } 576 }
567 577
568 c = find_conversation(who); 578 conv = gaim_find_conversation(who);
569 579
570 if (c == NULL) { 580 if (conv == NULL)
571 c = new_conversation(who); 581 conv = gaim_conversation_new(GAIM_CONV_IM, who);
572 } else { 582 else
573 gdk_window_raise(c->window->window); 583 gaim_window_raise(gaim_conversation_get_window(conv));
574 } 584
575 if (info->gc) 585 if (info->gc)
576 set_convo_gc(c, info->gc); 586 gaim_conversation_set_user(conv, info->gc->user);
577 587 }
578 g_free(who); 588
579 }
580
581 destroy_dialog(NULL, imdialog); 589 destroy_dialog(NULL, imdialog);
582 imdialog = NULL; 590 imdialog = NULL;
583 g_free(info); 591 g_free(info);
584 } 592 }
585 593
866 874
867 /*------------------------------------------------------------------------*/ 875 /*------------------------------------------------------------------------*/
868 /* The dialog for adding buddies */ 876 /* The dialog for adding buddies */
869 /*------------------------------------------------------------------------*/ 877 /*------------------------------------------------------------------------*/
870 878
871 extern void add_callback(GtkWidget *, struct conversation *); 879 extern void add_callback(GtkWidget *, struct gaim_conversation *);
872 880
873 void do_add_buddy(GtkWidget *w, int resp, struct addbuddy *a) 881 void do_add_buddy(GtkWidget *w, int resp, struct addbuddy *a)
874 { 882 {
875 const char *grp, *who, *whoalias; 883 const char *grp, *who, *whoalias;
876 struct conversation *c; 884 struct gaim_conversation *c;
877 885
878 if (resp == GTK_RESPONSE_OK) { 886 if (resp == GTK_RESPONSE_OK) {
879 887
880 who = gtk_entry_get_text(GTK_ENTRY(a->entry)); 888 who = gtk_entry_get_text(GTK_ENTRY(a->entry));
881 grp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(a->combo)->entry)); 889 grp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(a->combo)->entry));
882 whoalias = gtk_entry_get_text(GTK_ENTRY(a->entry_for_alias)); 890 whoalias = gtk_entry_get_text(GTK_ENTRY(a->entry_for_alias));
883 891
884 c = find_conversation(who); 892 c = gaim_find_conversation(who);
885 893
886 add_buddy(a->gc->user, grp, who, whoalias); 894 add_buddy(a->gc->user, grp, who, whoalias);
887 serv_add_buddy(a->gc, who); 895 serv_add_buddy(a->gc, who);
888 896
889 if (c != NULL) { 897 if (c != NULL)
890 update_buttons_by_protocol(c); 898 gaim_conversation_update(c, GAIM_CONV_UPDATE_ADD);
891 }
892 899
893 gaim_blist_save(); 900 gaim_blist_save();
894 } 901 }
895 902
896 destroy_dialog(NULL, a->window); 903 destroy_dialog(NULL, a->window);
1896 (edit_bp->options & OPT_POUNCE_SEND_IM) ? TRUE : FALSE); 1903 (edit_bp->options & OPT_POUNCE_SEND_IM) ? TRUE : FALSE);
1897 gtk_entry_set_text(GTK_ENTRY(b->messentry), edit_bp->message); 1904 gtk_entry_set_text(GTK_ENTRY(b->messentry), edit_bp->message);
1898 } 1905 }
1899 gtk_widget_show(b->messentry); 1906 gtk_widget_show(b->messentry);
1900 1907
1901 g_signal_connect(GTK_OBJECT(b->sendim), "clicked", G_CALLBACK(toggle_sensitive), b->messentry); 1908 g_signal_connect(GTK_OBJECT(b->sendim), "clicked",
1909 G_CALLBACK(gaim_gtk_toggle_sensitive), b->messentry);
1902 1910
1903 b->command = gtk_check_button_new_with_label(_("Execute command on pounce")); 1911 b->command = gtk_check_button_new_with_label(_("Execute command on pounce"));
1904 gtk_table_attach(GTK_TABLE(table), b->command, 0, 1, 2, 3, GTK_FILL, 0, 0, 0); 1912 gtk_table_attach(GTK_TABLE(table), b->command, 0, 1, 2, 3, GTK_FILL, 0, 0, 0);
1905 if(edit_bp) 1913 if(edit_bp)
1906 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b->command), 1914 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b->command),
1918 gtk_entry_set_text(GTK_ENTRY(b->commentry), edit_bp->command); 1926 gtk_entry_set_text(GTK_ENTRY(b->commentry), edit_bp->command);
1919 } 1927 }
1920 else 1928 else
1921 gtk_widget_set_sensitive(GTK_WIDGET(b->commentry), FALSE); 1929 gtk_widget_set_sensitive(GTK_WIDGET(b->commentry), FALSE);
1922 gtk_widget_show(b->commentry); 1930 gtk_widget_show(b->commentry);
1923 g_signal_connect(GTK_OBJECT(b->command), "clicked", G_CALLBACK(toggle_sensitive), b->commentry); 1931 g_signal_connect(GTK_OBJECT(b->command), "clicked",
1932 G_CALLBACK(gaim_gtk_toggle_sensitive), b->commentry);
1924 1933
1925 b->sound = gtk_check_button_new_with_label(_("Play sound on pounce")); 1934 b->sound = gtk_check_button_new_with_label(_("Play sound on pounce"));
1926 if(edit_bp) 1935 if(edit_bp)
1927 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b->sound), 1936 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b->sound),
1928 (edit_bp->options & OPT_POUNCE_SOUND) ? TRUE : FALSE); 1937 (edit_bp->options & OPT_POUNCE_SOUND) ? TRUE : FALSE);
1939 (edit_bp->options & OPT_POUNCE_SOUND) ? TRUE : FALSE); 1948 (edit_bp->options & OPT_POUNCE_SOUND) ? TRUE : FALSE);
1940 gtk_entry_set_text(GTK_ENTRY(b->soundentry), edit_bp->sound); 1949 gtk_entry_set_text(GTK_ENTRY(b->soundentry), edit_bp->sound);
1941 } else 1950 } else
1942 gtk_widget_set_sensitive(GTK_WIDGET(b->soundentry), FALSE); 1951 gtk_widget_set_sensitive(GTK_WIDGET(b->soundentry), FALSE);
1943 gtk_widget_show(b->soundentry); 1952 gtk_widget_show(b->soundentry);
1944 g_signal_connect(GTK_OBJECT(b->sound), "clicked", G_CALLBACK(toggle_sensitive), b->soundentry); 1953 g_signal_connect(GTK_OBJECT(b->sound), "clicked",
1954 G_CALLBACK(gaim_gtk_toggle_sensitive), b->soundentry);
1945 /* </pounce type="action"> */ 1955 /* </pounce type="action"> */
1946 1956
1947 b->save = gtk_check_button_new_with_label(_("Save this pounce after activation")); 1957 b->save = gtk_check_button_new_with_label(_("Save this pounce after activation"));
1948 gtk_container_set_border_width(GTK_CONTAINER(b->save), 7); 1958 gtk_container_set_border_width(GTK_CONTAINER(b->save), 7);
1949 if(edit_bp) 1959 if(edit_bp)
2598 2608
2599 /*------------------------------------------------------------------------*/ 2609 /*------------------------------------------------------------------------*/
2600 /* Functions Called To Add A Log */ 2610 /* Functions Called To Add A Log */
2601 /*------------------------------------------------------------------------*/ 2611 /*------------------------------------------------------------------------*/
2602 2612
2603 void cancel_log(GtkWidget *widget, struct conversation *c) 2613 void cancel_log(GtkWidget *widget, struct gaim_conversation *c)
2604 { 2614 {
2605 if (c->log_button) { 2615 struct gaim_gtk_conversation *gtkconv;
2606 set_state_lock(1); 2616
2607 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(c->log_button), FALSE); 2617 gtkconv = GAIM_GTK_CONVERSATION(c);
2608 set_state_lock(0); 2618
2609 } 2619 if (gtkconv->toolbar.log) {
2610 dialogwindows = g_list_remove(dialogwindows, c->log_dialog); 2620 gaim_gtk_set_state_lock(TRUE);
2611 gtk_widget_destroy(c->log_dialog); 2621 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtkconv->toolbar.log),
2612 c->log_dialog = NULL; 2622 FALSE);
2613 } 2623 gaim_gtk_set_state_lock(FALSE);
2614 2624 }
2615 void do_log(GtkWidget *w, struct conversation *c) 2625
2616 { 2626 dialogwindows = g_list_remove(dialogwindows, gtkconv->dialogs.log);
2627 gtk_widget_destroy(gtkconv->dialogs.log);
2628 gtkconv->dialogs.log = NULL;
2629 }
2630
2631 void do_log(GtkWidget *w, struct gaim_conversation *c)
2632 {
2633 struct gaim_gtk_conversation *gtkconv;
2617 struct log_conversation *l; 2634 struct log_conversation *l;
2618 char buf[128];
2619 const char *file; 2635 const char *file;
2620 char path[PATHSIZE]; 2636 char path[PATHSIZE];
2621 2637
2638 gtkconv = GAIM_GTK_CONVERSATION(c);
2639
2622 if (!find_log_info(c->name)) { 2640 if (!find_log_info(c->name)) {
2623 file = gtk_file_selection_get_filename(GTK_FILE_SELECTION(c->log_dialog)); 2641 file = gtk_file_selection_get_filename(
2642 GTK_FILE_SELECTION(gtkconv->dialogs.log));
2643
2624 strncpy(path, file, PATHSIZE - 1); 2644 strncpy(path, file, PATHSIZE - 1);
2625 if (file_is_dir(path, c->log_dialog)) { 2645
2646 if (file_is_dir(path, gtkconv->dialogs.log))
2626 return; 2647 return;
2627 }
2628 2648
2629 l = (struct log_conversation *)g_new0(struct log_conversation, 1); 2649 l = (struct log_conversation *)g_new0(struct log_conversation, 1);
2630 strcpy(l->name, c->name); 2650 strcpy(l->name, gaim_conversation_get_name(c));
2631 strcpy(l->filename, file); 2651 strcpy(l->filename, file);
2632 log_conversations = g_list_append(log_conversations, l); 2652 log_conversations = g_list_append(log_conversations, l);
2633 2653
2634 if (c != NULL) { 2654 if (c != NULL)
2635 g_snprintf(buf, sizeof(buf), LOG_CONVERSATION_TITLE, c->name); 2655 gaim_conversation_set_logging(c, TRUE);
2636 gtk_window_set_title(GTK_WINDOW(c->window), buf);
2637 }
2638 } 2656 }
2639 2657
2640 save_prefs(); 2658 save_prefs();
2641 cancel_log(NULL, c); 2659 cancel_log(NULL, c);
2642 } 2660 }
2643 2661
2644 void show_log_dialog(struct conversation *c) 2662 void show_log_dialog(struct gaim_conversation *c)
2645 { 2663 {
2664 struct gaim_gtk_conversation *gtkconv;
2646 char *buf = g_malloc(BUF_LEN); 2665 char *buf = g_malloc(BUF_LEN);
2647 2666
2648 if (!c->log_dialog) { 2667 gtkconv = GAIM_GTK_CONVERSATION(c);
2649 c->log_dialog = gtk_file_selection_new(_("Gaim - Log Conversation")); 2668
2650 2669 if (!gtkconv->dialogs.log) {
2651 gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(c->log_dialog)); 2670 gtkconv->dialogs.log = gtk_file_selection_new(_("Gaim - Log Conversation"));
2652 2671
2653 g_snprintf(buf, BUF_LEN - 1, "%s" G_DIR_SEPARATOR_S "%s.log", gaim_home_dir(), normalize(c->name)); 2672 gtk_file_selection_hide_fileop_buttons(
2654 gtk_object_set_user_data(GTK_OBJECT(c->log_dialog), "log dialog"); 2673 GTK_FILE_SELECTION(gtkconv->dialogs.log));
2655 gtk_file_selection_set_filename(GTK_FILE_SELECTION(c->log_dialog), buf); 2674
2656 g_signal_connect(GTK_OBJECT(c->log_dialog), "delete_event", 2675 g_snprintf(buf, BUF_LEN - 1, "%s" G_DIR_SEPARATOR_S "%s.log",
2657 G_CALLBACK(delete_event_dialog), c); 2676 gaim_home_dir(), normalize(c->name));
2658 g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(c->log_dialog)->ok_button), "clicked", 2677 gtk_object_set_user_data(GTK_OBJECT(gtkconv->dialogs.log),
2659 G_CALLBACK(do_log), c); 2678 "log dialog");
2660 g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(c->log_dialog)->cancel_button), 2679 gtk_file_selection_set_filename(GTK_FILE_SELECTION(gtkconv->dialogs.log),
2661 "clicked", G_CALLBACK(cancel_log), c); 2680 buf);
2681 g_signal_connect(G_OBJECT(gtkconv->dialogs.log), "delete_event",
2682 G_CALLBACK(delete_event_dialog), c);
2683 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(gtkconv->dialogs.log)->ok_button), "clicked",
2684 G_CALLBACK(do_log), c);
2685 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(gtkconv->dialogs.log)->cancel_button), "clicked",
2686 G_CALLBACK(cancel_log), c);
2662 } 2687 }
2663 2688
2664 g_free(buf); 2689 g_free(buf);
2665 2690
2666 gtk_widget_show(c->log_dialog); 2691 gtk_widget_show(gtkconv->dialogs.log);
2667 gdk_window_raise(c->log_dialog->window); 2692 gdk_window_raise(gtkconv->dialogs.log->window);
2668 } 2693 }
2669 2694
2670 /*------------------------------------------------------*/ 2695 /*------------------------------------------------------*/
2671 /* Find Buddy By Email */ 2696 /* Find Buddy By Email */
2672 /*------------------------------------------------------*/ 2697 /*------------------------------------------------------*/
2916 2941
2917 /*------------------------------------------------------*/ 2942 /*------------------------------------------------------*/
2918 /* Link Dialog */ 2943 /* Link Dialog */
2919 /*------------------------------------------------------*/ 2944 /*------------------------------------------------------*/
2920 2945
2921 void cancel_link(GtkWidget *widget, struct conversation *c) 2946 void cancel_link(GtkWidget *widget, struct gaim_conversation *c)
2922 { 2947 {
2923 if (c->link) { 2948 struct gaim_gtk_conversation *gtkconv;
2924 set_state_lock(1); 2949
2925 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(c->link), FALSE); 2950 gtkconv = GAIM_GTK_CONVERSATION(c);
2926 set_state_lock(0); 2951
2927 } 2952 if (gtkconv->toolbar.link) {
2928 destroy_dialog(NULL, c->link_dialog); 2953 gaim_gtk_set_state_lock(TRUE);
2929 c->link_dialog = NULL; 2954 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(gtkconv->toolbar.link),
2955 FALSE);
2956 gaim_gtk_set_state_lock(FALSE);
2957 }
2958
2959 destroy_dialog(NULL, gtkconv->toolbar.link);
2960 gtkconv->toolbar.link = NULL;
2930 } 2961 }
2931 2962
2932 void do_insert_link(GtkWidget *w, int resp, struct linkdlg *b) 2963 void do_insert_link(GtkWidget *w, int resp, struct linkdlg *b)
2933 { 2964 {
2965 struct gaim_gtk_conversation *gtkconv;
2934 char *open_tag; 2966 char *open_tag;
2935 const char *urltext, *showtext; 2967 const char *urltext, *showtext;
2968
2969 gtkconv = GAIM_GTK_CONVERSATION(b->c);
2936 2970
2937 if (resp == GTK_RESPONSE_OK) { 2971 if (resp == GTK_RESPONSE_OK) {
2938 2972
2939 open_tag = g_malloc(2048); 2973 open_tag = g_malloc(2048);
2940 2974
2943 2977
2944 if (!strlen(showtext)) 2978 if (!strlen(showtext))
2945 showtext = urltext; 2979 showtext = urltext;
2946 2980
2947 g_snprintf(open_tag, 2048, "<A HREF=\"%s\">%s", urltext, showtext); 2981 g_snprintf(open_tag, 2048, "<A HREF=\"%s\">%s", urltext, showtext);
2948 surround(b->c, open_tag, "</A>"); 2982 gaim_gtk_surround(gtkconv, open_tag, "</A>");
2949 2983
2950 g_free(open_tag); 2984 g_free(open_tag);
2951 } 2985 }
2952 2986
2953 if (b->c->link) { 2987 if (gtkconv->toolbar.link) {
2954 set_state_lock(1); 2988 gaim_gtk_set_state_lock(TRUE);
2955 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b->c->link), FALSE); 2989 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(gtkconv->toolbar.link),
2956 set_state_lock(0); 2990 FALSE);
2957 } 2991 gaim_gtk_set_state_lock(FALSE);
2958 2992 }
2959 b->c->link_dialog = NULL; 2993
2994 gtkconv->dialogs.link = NULL;
2960 destroy_dialog(NULL, b->window); 2995 destroy_dialog(NULL, b->window);
2961 } 2996 }
2962 2997
2963 void show_insert_link(GtkWidget *linky, struct conversation *c) 2998 void show_insert_link(GtkWidget *linky, struct gaim_conversation *c)
2964 { 2999 {
3000 struct gaim_gtk_conversation *gtkconv;
3001 struct gaim_gtk_window *gtkwin;
2965 GtkWidget *table; 3002 GtkWidget *table;
2966 GtkWidget *label; 3003 GtkWidget *label;
2967 GtkWidget *hbox; 3004 GtkWidget *hbox;
2968 GtkWidget *vbox; 3005 GtkWidget *vbox;
2969 3006
2970 if (!c->link_dialog) { 3007 gtkconv = GAIM_GTK_CONVERSATION(c);
3008 gtkwin = GAIM_GTK_WINDOW(gaim_conversation_get_window(c));
3009
3010 if (gtkconv->dialogs.link == NULL) {
2971 struct linkdlg *a = g_new0(struct linkdlg, 1); 3011 struct linkdlg *a = g_new0(struct linkdlg, 1);
2972 char *filename = g_build_filename(DATADIR, "pixmaps", "gaim", "dialogs", "gaim_question.png", NULL); 3012 char *filename = g_build_filename(DATADIR, "pixmaps", "gaim",
3013 "dialogs", "gaim_question.png", NULL);
2973 GtkWidget *img = gtk_image_new_from_file(filename); 3014 GtkWidget *img = gtk_image_new_from_file(filename);
2974 3015
2975 g_free(filename); 3016 g_free(filename);
2976 3017
2977 a->c = c; 3018 a->c = c;
2978 GAIM_DIALOG(a->window); 3019 a->window = gtk_dialog_new_with_buttons(_("Gaim - Insert Link"),
2979 a->window = gtk_dialog_new_with_buttons(_("Gaim - Insert Link"), GTK_WINDOW(c->window), GTK_DIALOG_MODAL, 3020 GTK_WINDOW(gtkwin->window), GTK_DIALOG_MODAL, GTK_STOCK_CANCEL,
2980 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, _("Insert"), GTK_RESPONSE_OK, NULL); 3021 GTK_RESPONSE_CANCEL, _("Insert"), GTK_RESPONSE_OK, NULL);
2981 3022
2982 gtk_dialog_set_default_response(GTK_DIALOG(a->window), GTK_RESPONSE_OK); 3023 gtk_dialog_set_default_response(GTK_DIALOG(a->window), GTK_RESPONSE_OK);
2983 gtk_container_set_border_width(GTK_CONTAINER(a->window), 6); 3024 gtk_container_set_border_width(GTK_CONTAINER(a->window), 6);
2984 gtk_window_set_resizable(GTK_WINDOW(a->window), FALSE); 3025 gtk_window_set_resizable(GTK_WINDOW(a->window), FALSE);
2985 gtk_dialog_set_has_separator(GTK_DIALOG(a->window), FALSE); 3026 gtk_dialog_set_has_separator(GTK_DIALOG(a->window), FALSE);
2986 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(a->window)->vbox), 12); 3027 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(a->window)->vbox), 12);
2987 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(a->window)->vbox), 6); 3028 gtk_container_set_border_width(
3029 GTK_CONTAINER(GTK_DIALOG(a->window)->vbox), 6);
2988 gtk_window_set_role(GTK_WINDOW(a->window), "insert_link"); 3030 gtk_window_set_role(GTK_WINDOW(a->window), "insert_link");
2989 3031
2990 hbox = gtk_hbox_new(FALSE, 12); 3032 hbox = gtk_hbox_new(FALSE, 12);
2991 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(a->window)->vbox), hbox); 3033 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(a->window)->vbox), hbox);
2992 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); 3034 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
2993 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); 3035 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
2994 3036
2995 vbox = gtk_vbox_new(FALSE, 0); 3037 vbox = gtk_vbox_new(FALSE, 0);
2996 gtk_container_add(GTK_CONTAINER(hbox), vbox); 3038 gtk_container_add(GTK_CONTAINER(hbox), vbox);
2997 3039
2998 label = gtk_label_new(_("Please enter the URL and description of the link that you want to insert. The description is optional.\n")); 3040 label = gtk_label_new(_("Please enter the URL and description of "
3041 "the link that you want to insert. The "
3042 "description is optional.\n"));
2999 3043
3000 gtk_widget_set_size_request(GTK_WIDGET(label), 335, -1); 3044 gtk_widget_set_size_request(GTK_WIDGET(label), 335, -1);
3001 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); 3045 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
3002 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); 3046 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
3003 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); 3047 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
3004 3048
3005 hbox = gtk_hbox_new(FALSE, 6); 3049 hbox = gtk_hbox_new(FALSE, 6);
3006 gtk_container_add(GTK_CONTAINER(vbox), hbox); 3050 gtk_container_add(GTK_CONTAINER(vbox), hbox);
3007 3051
3008 g_signal_connect(GTK_OBJECT(a->window), "destroy", G_CALLBACK(destroy_dialog), a->window); 3052 g_signal_connect(G_OBJECT(a->window), "destroy",
3009 g_signal_connect(GTK_OBJECT(a->window), "destroy", G_CALLBACK(free_dialog), a); 3053 G_CALLBACK(destroy_dialog), a->window);
3054 g_signal_connect(G_OBJECT(a->window), "destroy",
3055 G_CALLBACK(free_dialog), a);
3010 dialogwindows = g_list_prepend(dialogwindows, a->window); 3056 dialogwindows = g_list_prepend(dialogwindows, a->window);
3011 3057
3012 table = gtk_table_new(4, 2, FALSE); 3058 table = gtk_table_new(4, 2, FALSE);
3013 gtk_table_set_row_spacings(GTK_TABLE(table), 5); 3059 gtk_table_set_row_spacings(GTK_TABLE(table), 5);
3014 gtk_table_set_col_spacings(GTK_TABLE(table), 5); 3060 gtk_table_set_col_spacings(GTK_TABLE(table), 5);
3031 3077
3032 a->text = gtk_entry_new(); 3078 a->text = gtk_entry_new();
3033 gtk_table_attach_defaults(GTK_TABLE(table), a->text, 1, 2, 1, 2); 3079 gtk_table_attach_defaults(GTK_TABLE(table), a->text, 1, 2, 1, 2);
3034 gtk_entry_set_activates_default (GTK_ENTRY(a->text), TRUE); 3080 gtk_entry_set_activates_default (GTK_ENTRY(a->text), TRUE);
3035 3081
3036 g_signal_connect(G_OBJECT(a->window), "response", G_CALLBACK(do_insert_link), a); 3082 g_signal_connect(G_OBJECT(a->window), "response",
3083 G_CALLBACK(do_insert_link), a);
3037 3084
3038 a->toggle = linky; 3085 a->toggle = linky;
3039 c->link_dialog = a->window; 3086 gtkconv->dialogs.link = a->window;
3040 } 3087 }
3041 3088
3042 gtk_widget_show_all(GTK_WIDGET(c->link_dialog)); 3089 gtk_widget_show_all(gtkconv->dialogs.link);
3043 gdk_window_raise(c->link_dialog->window); 3090 gdk_window_raise(gtkconv->dialogs.link->window);
3044 } 3091 }
3045 3092
3046 /*------------------------------------------------------*/ 3093 /*------------------------------------------------------*/
3047 /* Color Selection Dialog */ 3094 /* Color Selection Dialog */
3048 /*------------------------------------------------------*/ 3095 /*------------------------------------------------------*/
3049 3096
3050 GtkWidget *fgcseld = NULL; 3097 GtkWidget *fgcseld = NULL;
3051 GtkWidget *bgcseld = NULL; 3098 GtkWidget *bgcseld = NULL;
3052 3099
3053 void cancel_fgcolor(GtkWidget *widget, struct conversation *c) 3100 void cancel_fgcolor(GtkWidget *widget, struct gaim_conversation *c)
3054 { 3101 {
3055 if (c->fgcolorbtn && widget) { 3102 struct gaim_gtk_conversation *gtkconv;
3056 set_state_lock(1); 3103
3057 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(c->fgcolorbtn), FALSE); 3104 gtkconv = GAIM_GTK_CONVERSATION(c);
3058 set_state_lock(0); 3105
3059 } 3106 if (gtkconv->toolbar.fgcolor && widget) {
3060 dialogwindows = g_list_remove(dialogwindows, c->fg_color_dialog); 3107 gaim_gtk_set_state_lock(TRUE);
3061 gtk_widget_destroy(c->fg_color_dialog); 3108 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(gtkconv->toolbar.fgcolor),
3062 c->fg_color_dialog = NULL; 3109 FALSE);
3063 } 3110 gaim_gtk_set_state_lock(FALSE);
3064 3111 }
3065 void cancel_bgcolor(GtkWidget *widget, struct conversation *c) 3112
3066 { 3113 dialogwindows = g_list_remove(dialogwindows, gtkconv->dialogs.fg_color);
3067 if (c->bgcolorbtn && widget) { 3114 gtk_widget_destroy(gtkconv->dialogs.fg_color);
3068 set_state_lock(1); 3115 gtkconv->dialogs.fg_color = NULL;
3069 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(c->bgcolorbtn), FALSE); 3116 }
3070 set_state_lock(0); 3117
3071 } 3118 void cancel_bgcolor(GtkWidget *widget, struct gaim_conversation *c)
3072 dialogwindows = g_list_remove(dialogwindows, c->bg_color_dialog); 3119 {
3073 gtk_widget_destroy(c->bg_color_dialog); 3120 struct gaim_gtk_conversation *gtkconv;
3074 c->bg_color_dialog = NULL; 3121
3122 gtkconv = GAIM_GTK_CONVERSATION(c);
3123
3124 if (gtkconv->toolbar.bgcolor && widget) {
3125 gaim_gtk_set_state_lock(TRUE);
3126 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(gtkconv->toolbar.bgcolor),
3127 FALSE);
3128 gaim_gtk_set_state_lock(FALSE);
3129 }
3130
3131 dialogwindows = g_list_remove(dialogwindows, gtkconv->dialogs.bg_color);
3132 gtk_widget_destroy(gtkconv->dialogs.bg_color);
3133 gtkconv->dialogs.bg_color = NULL;
3075 } 3134 }
3076 3135
3077 void do_fgcolor(GtkWidget *widget, GtkColorSelection *colorsel) 3136 void do_fgcolor(GtkWidget *widget, GtkColorSelection *colorsel)
3078 { 3137 {
3079 GdkColor text_color; 3138 GdkColor text_color;
3080 struct conversation *c; 3139 struct gaim_conversation *c;
3140 struct gaim_gtk_conversation *gtkconv;
3081 char *open_tag; 3141 char *open_tag;
3082 3142
3083 open_tag = g_malloc(30); 3143 open_tag = g_malloc(30);
3084 3144
3085 gtk_color_selection_get_current_color(colorsel, &text_color); 3145 gtk_color_selection_get_current_color(colorsel, &text_color);
3086 3146
3087 c = gtk_object_get_user_data(GTK_OBJECT(colorsel)); 3147 c = gtk_object_get_user_data(GTK_OBJECT(colorsel));
3088 /* GTK_IS_EDITABLE(c->entry); huh? */ 3148 /* GTK_IS_EDITABLE(c->entry); huh? */
3089 3149
3090 c->fgcol = text_color; 3150 gtkconv = GAIM_GTK_CONVERSATION(c);
3091 c->hasfg = 1; 3151
3092 g_snprintf(open_tag, 23, "<FONT COLOR=\"#%02X%02X%02X\">", text_color.red/256, 3152 gtkconv->fg_color = text_color;
3093 text_color.green/256, text_color.blue/256); 3153 gtkconv->has_fg = TRUE;
3094 surround(c, open_tag, "</FONT>"); 3154 g_snprintf(open_tag, 23, "<FONT COLOR=\"#%02X%02X%02X\">",
3095 debug_printf("#%02X%02X%02X\n", text_color.red/256, text_color.green/256, text_color.blue/256); 3155 text_color.red / 256,
3156 text_color.green / 256,
3157 text_color.blue / 256);
3158 gaim_gtk_surround(gtkconv, open_tag, "</FONT>");
3159 debug_printf("#%02X%02X%02X\n",
3160 text_color.red / 256,
3161 text_color.green / 256,
3162 text_color.blue / 256);
3096 g_free(open_tag); 3163 g_free(open_tag);
3097 cancel_fgcolor(NULL, c); 3164 cancel_fgcolor(NULL, c);
3098 } 3165 }
3099 3166
3100 void do_bgcolor(GtkWidget *widget, GtkColorSelection *colorsel) 3167 void do_bgcolor(GtkWidget *widget, GtkColorSelection *colorsel)
3101 { 3168 {
3102 GdkColor text_color; 3169 GdkColor text_color;
3103 struct conversation *c; 3170 struct gaim_conversation *c;
3171 struct gaim_gtk_conversation *gtkconv;
3104 char *open_tag; 3172 char *open_tag;
3105 3173
3106 open_tag = g_malloc(30); 3174 open_tag = g_malloc(30);
3107 3175
3108 gtk_color_selection_get_current_color(colorsel, &text_color); 3176 gtk_color_selection_get_current_color(colorsel, &text_color);
3109 3177
3110 c = gtk_object_get_user_data(GTK_OBJECT(colorsel)); 3178 c = gtk_object_get_user_data(GTK_OBJECT(colorsel));
3111 /* GTK_IS_EDITABLE(c->entry); huh? */ 3179 /* GTK_IS_EDITABLE(c->entry); huh? */
3112 3180
3113 c->bgcol = text_color; 3181 gtkconv = GAIM_GTK_CONVERSATION(c);
3114 c->hasbg = 1; 3182
3115 g_snprintf(open_tag, 25, "<BODY BGCOLOR=\"#%02X%02X%02X\">", text_color.red/256, 3183 gtkconv->bg_color = text_color;
3116 text_color.green/256, text_color.blue/256); 3184 gtkconv->has_bg = TRUE;
3117 surround(c, open_tag, "</BODY>"); 3185 g_snprintf(open_tag, 25, "<BODY BGCOLOR=\"#%02X%02X%02X\">",
3118 debug_printf("#%02X%02X%02X\n", text_color.red/256, text_color.green/256, text_color.blue/256); 3186 text_color.red / 256,
3187 text_color.green / 256,
3188 text_color.blue / 256);
3189 gaim_gtk_surround(gtkconv, open_tag, "</BODY>");
3190 debug_printf("#%02X%02X%02X\n",
3191 text_color.red / 256,
3192 text_color.green / 256,
3193 text_color.blue / 256);
3119 g_free(open_tag); 3194 g_free(open_tag);
3120 cancel_bgcolor(NULL, c); 3195 cancel_bgcolor(NULL, c);
3121 } 3196 }
3122 3197
3123 void show_fgcolor_dialog(struct conversation *c, GtkWidget *color) 3198 void show_fgcolor_dialog(struct gaim_conversation *c, GtkWidget *color)
3124 { 3199 {
3200 struct gaim_gtk_conversation *gtkconv;
3125 GtkWidget *colorsel; 3201 GtkWidget *colorsel;
3202
3203 gtkconv = GAIM_GTK_CONVERSATION(c);
3126 3204
3127 if (color == NULL) { /* we came from the prefs */ 3205 if (color == NULL) { /* we came from the prefs */
3128 if (fgcseld) 3206 if (fgcseld)
3129 return; 3207 return;
3130 3208
3141 gtk_widget_show(fgcseld); 3219 gtk_widget_show(fgcseld);
3142 gdk_window_raise(fgcseld->window); 3220 gdk_window_raise(fgcseld->window);
3143 return; 3221 return;
3144 } 3222 }
3145 3223
3146 if (!c->fg_color_dialog) { 3224 if (!gtkconv->dialogs.fg_color) {
3147 3225
3148 c->fg_color_dialog = gtk_color_selection_dialog_new(_("Select Text Color")); 3226 gtkconv->dialogs.fg_color = gtk_color_selection_dialog_new(_("Select Text Color"));
3149 colorsel = GTK_COLOR_SELECTION_DIALOG(c->fg_color_dialog)->colorsel; 3227 colorsel = GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.fg_color)->colorsel;
3150 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), &fgcolor); 3228 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), &fgcolor);
3151 gtk_object_set_user_data(GTK_OBJECT(colorsel), c); 3229 gtk_object_set_user_data(GTK_OBJECT(colorsel), c);
3152 3230
3153 g_signal_connect(GTK_OBJECT(c->fg_color_dialog), "delete_event", 3231 g_signal_connect(GTK_OBJECT(gtkconv->dialogs.fg_color), "delete_event",
3154 G_CALLBACK(delete_event_dialog), c); 3232 G_CALLBACK(delete_event_dialog), c);
3155 g_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(c->fg_color_dialog)->ok_button), 3233 g_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.fg_color)->ok_button),
3156 "clicked", G_CALLBACK(do_fgcolor), colorsel); 3234 "clicked", G_CALLBACK(do_fgcolor), colorsel);
3157 g_signal_connect(GTK_OBJECT 3235 g_signal_connect(GTK_OBJECT
3158 (GTK_COLOR_SELECTION_DIALOG(c->fg_color_dialog)->cancel_button), 3236 (GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.fg_color)->cancel_button),
3159 "clicked", G_CALLBACK(cancel_fgcolor), c); 3237 "clicked", G_CALLBACK(cancel_fgcolor), c);
3160 3238
3161 gtk_widget_realize(c->fg_color_dialog); 3239 gtk_widget_realize(gtkconv->dialogs.fg_color);
3162 } 3240 }
3163 3241
3164 gtk_widget_show(c->fg_color_dialog); 3242 gtk_widget_show(gtkconv->dialogs.fg_color);
3165 gdk_window_raise(c->fg_color_dialog->window); 3243 gdk_window_raise(gtkconv->dialogs.fg_color->window);
3166 } 3244 }
3167 3245
3168 void show_bgcolor_dialog(struct conversation *c, GtkWidget *color) 3246 void show_bgcolor_dialog(struct gaim_conversation *c, GtkWidget *color)
3169 { 3247 {
3248 struct gaim_gtk_conversation *gtkconv;
3170 GtkWidget *colorsel; 3249 GtkWidget *colorsel;
3250
3251 gtkconv = GAIM_GTK_CONVERSATION(c);
3171 3252
3172 if (color == NULL) { /* we came from the prefs */ 3253 if (color == NULL) { /* we came from the prefs */
3173 if (bgcseld) 3254 if (bgcseld)
3174 return; 3255 return;
3175 3256
3186 gtk_widget_show(bgcseld); 3267 gtk_widget_show(bgcseld);
3187 gdk_window_raise(bgcseld->window); 3268 gdk_window_raise(bgcseld->window);
3188 return; 3269 return;
3189 } 3270 }
3190 3271
3191 if (!c->bg_color_dialog) { 3272 if (!gtkconv->dialogs.bg_color) {
3192 3273
3193 c->bg_color_dialog = gtk_color_selection_dialog_new(_("Select Background Color")); 3274 gtkconv->dialogs.bg_color = gtk_color_selection_dialog_new(_("Select Background Color"));
3194 colorsel = GTK_COLOR_SELECTION_DIALOG(c->bg_color_dialog)->colorsel; 3275 colorsel = GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.bg_color)->colorsel;
3195 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), &bgcolor); 3276 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), &bgcolor);
3196 gtk_object_set_user_data(GTK_OBJECT(colorsel), c); 3277 gtk_object_set_user_data(GTK_OBJECT(colorsel), c);
3197 3278
3198 g_signal_connect(GTK_OBJECT(c->bg_color_dialog), "delete_event", 3279 g_signal_connect(GTK_OBJECT(gtkconv->dialogs.bg_color), "delete_event",
3199 G_CALLBACK(delete_event_dialog), c); 3280 G_CALLBACK(delete_event_dialog), c);
3200 g_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(c->bg_color_dialog)->ok_button), 3281 g_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.bg_color)->ok_button),
3201 "clicked", G_CALLBACK(do_bgcolor), colorsel); 3282 "clicked", G_CALLBACK(do_bgcolor), colorsel);
3202 g_signal_connect(GTK_OBJECT 3283 g_signal_connect(GTK_OBJECT
3203 (GTK_COLOR_SELECTION_DIALOG(c->bg_color_dialog)->cancel_button), 3284 (GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.bg_color)->cancel_button),
3204 "clicked", G_CALLBACK(cancel_bgcolor), c); 3285 "clicked", G_CALLBACK(cancel_bgcolor), c);
3205 3286
3206 gtk_widget_realize(c->bg_color_dialog); 3287 gtk_widget_realize(gtkconv->dialogs.bg_color);
3207 } 3288 }
3208 3289
3209 gtk_widget_show(c->bg_color_dialog); 3290 gtk_widget_show(gtkconv->dialogs.bg_color);
3210 gdk_window_raise(c->bg_color_dialog->window); 3291 gdk_window_raise(gtkconv->dialogs.bg_color->window);
3211 } 3292 }
3212 3293
3213 /*------------------------------------------------------------------------*/ 3294 /*------------------------------------------------------------------------*/
3214 /* Font Selection Dialog */ 3295 /* Font Selection Dialog */
3215 /*------------------------------------------------------------------------*/ 3296 /*------------------------------------------------------------------------*/
3216 3297
3217 void cancel_font(GtkWidget *widget, struct conversation *c) 3298 void cancel_font(GtkWidget *widget, struct gaim_conversation *c)
3218 { 3299 {
3219 if (c->font && widget) { 3300 struct gaim_gtk_conversation *gtkconv;
3220 set_state_lock(1); 3301
3221 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(c->font), FALSE); 3302 gtkconv = GAIM_GTK_CONVERSATION(c);
3222 set_state_lock(0); 3303
3223 } 3304 if (gtkconv->toolbar.normal_size && widget) {
3224 dialogwindows = g_list_remove(dialogwindows, c->font_dialog); 3305 gaim_gtk_set_state_lock(TRUE);
3225 gtk_widget_destroy(c->font_dialog); 3306 gtk_toggle_button_set_state(
3226 c->font_dialog = NULL; 3307 GTK_TOGGLE_BUTTON(gtkconv->toolbar.normal_size), FALSE);
3308 gaim_gtk_set_state_lock(FALSE);
3309 }
3310
3311 dialogwindows = g_list_remove(dialogwindows, gtkconv->dialogs.font);
3312 gtk_widget_destroy(gtkconv->dialogs.font);
3313 gtkconv->dialogs.font = NULL;
3227 } 3314 }
3228 3315
3229 void apply_font(GtkWidget *widget, GtkFontSelection *fontsel) 3316 void apply_font(GtkWidget *widget, GtkFontSelection *fontsel)
3230 { 3317 {
3231 /* this could be expanded to include font size, weight, etc. 3318 /* this could be expanded to include font size, weight, etc.
3232 but for now only works with font face */ 3319 but for now only works with font face */
3233 int i = 0; 3320 int i = 0;
3234 char *fontname; 3321 char *fontname;
3235 struct conversation *c = gtk_object_get_user_data(GTK_OBJECT(fontsel)); 3322 struct gaim_conversation *c = gtk_object_get_user_data(GTK_OBJECT(fontsel));
3236 3323
3237 if (c) { 3324 if (c) {
3238 fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(fontsel)); 3325 fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(fontsel));
3239 while(fontname[i] && !isdigit(fontname[i])) { 3326 while(fontname[i] && !isdigit(fontname[i])) {
3240 i++; 3327 i++;
3241 } 3328 }
3242 fontname[i] = 0; 3329 fontname[i] = 0;
3243 set_font_face(fontname, c); 3330 gaim_gtk_set_font_face(GAIM_GTK_CONVERSATION(c), fontname);
3244 } else { 3331 } else {
3245 fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(fontsel)); 3332 fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(fontsel));
3246 while(fontface[i] && !isdigit(fontname[i]) && i < sizeof(fontface)) { 3333 while(fontface[i] && !isdigit(fontname[i]) && i < sizeof(fontface)) {
3247 fontface[i] = fontname[i]; 3334 fontface[i] = fontname[i];
3248 i++; 3335 i++;
3257 { 3344 {
3258 gtk_widget_destroy(fontseld); 3345 gtk_widget_destroy(fontseld);
3259 fontseld = NULL; 3346 fontseld = NULL;
3260 } 3347 }
3261 3348
3262 void show_font_dialog(struct conversation *c, GtkWidget *font) 3349 void show_font_dialog(struct gaim_conversation *c, GtkWidget *font)
3263 { 3350 {
3351 struct gaim_gtk_conversation *gtkconv;
3264 char fonttif[128]; 3352 char fonttif[128];
3353
3354 gtkconv = GAIM_GTK_CONVERSATION(c);
3355
3265 if (!font) { /* we came from the prefs dialog */ 3356 if (!font) { /* we came from the prefs dialog */
3266 if (fontseld) 3357 if (fontseld)
3267 return; 3358 return;
3268 fontseld = gtk_font_selection_dialog_new(_("Select Font")); 3359 fontseld = gtk_font_selection_dialog_new(_("Select Font"));
3269 if (fontface[0]) { 3360 if (fontface[0]) {
3286 gtk_widget_show(fontseld); 3377 gtk_widget_show(fontseld);
3287 gdk_window_raise(fontseld->window); 3378 gdk_window_raise(fontseld->window);
3288 return; 3379 return;
3289 } 3380 }
3290 3381
3291 if (!c->font_dialog) { 3382 if (!gtkconv->dialogs.font) {
3292 c->font_dialog = gtk_font_selection_dialog_new(_("Select Font")); 3383 gtkconv->dialogs.font = gtk_font_selection_dialog_new(_("Select Font"));
3293 3384
3294 if (font) 3385 if (font)
3295 gtk_object_set_user_data(GTK_OBJECT(c->font_dialog), c); 3386 gtk_object_set_user_data(GTK_OBJECT(gtkconv->dialogs.font), c);
3296 else 3387 else
3297 gtk_object_set_user_data(GTK_OBJECT(c->font_dialog), NULL); 3388 gtk_object_set_user_data(GTK_OBJECT(gtkconv->dialogs.font), NULL);
3298 3389
3299 if (c->fontface[0]) { 3390 if (gtkconv->fontface[0]) {
3300 g_snprintf(fonttif, sizeof(fonttif), "%s 12", c->fontface); 3391 g_snprintf(fonttif, sizeof(fonttif), "%s 12", gtkconv->fontface);
3301 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(c->font_dialog), 3392 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(gtkconv->dialogs.font),
3302 fonttif); 3393 fonttif);
3303 } else { 3394 } else {
3304 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(c->font_dialog), 3395 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(gtkconv->dialogs.font),
3305 DEFAULT_FONT_FACE); 3396 DEFAULT_FONT_FACE);
3306 } 3397 }
3307 3398
3308 g_signal_connect(GTK_OBJECT(c->font_dialog), "delete_event", 3399 g_signal_connect(GTK_OBJECT(gtkconv->dialogs.font), "delete_event",
3309 G_CALLBACK(delete_event_dialog), c); 3400 G_CALLBACK(delete_event_dialog), c);
3310 g_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(c->font_dialog)->ok_button), 3401 g_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(gtkconv->dialogs.font)->ok_button),
3311 "clicked", G_CALLBACK(apply_font), c->font_dialog); 3402 "clicked", G_CALLBACK(apply_font), gtkconv->dialogs.font);
3312 g_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(c->font_dialog)->cancel_button), 3403 g_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(gtkconv->dialogs.font)->cancel_button),
3313 "clicked", G_CALLBACK(cancel_font), c); 3404 "clicked", G_CALLBACK(cancel_font), c);
3314 3405
3315 gtk_widget_realize(c->font_dialog); 3406 gtk_widget_realize(gtkconv->dialogs.font);
3316 3407
3317 } 3408 }
3318 gtk_widget_show(c->font_dialog); 3409
3319 gdk_window_raise(c->font_dialog->window); 3410 gtk_widget_show(gtkconv->dialogs.font);
3411 gdk_window_raise(gtkconv->dialogs.font->window);
3320 } 3412 }
3321 3413
3322 /*------------------------------------------------------------------------*/ 3414 /*------------------------------------------------------------------------*/
3323 /* The dialog for import/export */ 3415 /* The dialog for import/export */
3324 /*------------------------------------------------------------------------*/ 3416 /*------------------------------------------------------------------------*/
3610 gtk_widget_show(ca->window); 3702 gtk_widget_show(ca->window);
3611 } 3703 }
3612 3704
3613 /* smiley dialog */ 3705 /* smiley dialog */
3614 3706
3615 void close_smiley_dialog(GtkWidget *widget, struct conversation *c) 3707 void close_smiley_dialog(GtkWidget *widget, struct gaim_conversation *c)
3616 { 3708 {
3617 if (c->smiley) { 3709 struct gaim_gtk_conversation *gtkconv;
3618 set_state_lock(1); 3710
3619 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(c->smiley), FALSE); 3711 gtkconv = GAIM_GTK_CONVERSATION(c);
3620 set_state_lock(0); 3712
3621 } 3713 if (gtkconv->toolbar.smiley) {
3622 dialogwindows = g_list_remove(dialogwindows, c->smiley_dialog); 3714 gaim_gtk_set_state_lock(TRUE);
3623 gtk_widget_destroy(c->smiley_dialog); 3715 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(gtkconv->toolbar.smiley),
3624 c->smiley_dialog = NULL; 3716 FALSE);
3717 gaim_gtk_set_state_lock(FALSE);
3718 }
3719 dialogwindows = g_list_remove(dialogwindows, gtkconv->dialogs.smiley);
3720 gtk_widget_destroy(gtkconv->dialogs.smiley);
3721 gtkconv->dialogs.smiley = NULL;
3625 } 3722 }
3626 3723
3627 void set_smiley(GtkWidget *w, char *face) 3724 void set_smiley(GtkWidget *w, char *face)
3628 { 3725 {
3629 current_smiley = face; 3726 current_smiley = face;
3639 smiley_array[smiley_type] = 1; 3736 smiley_array[smiley_type] = 1;
3640 3737
3641 return; 3738 return;
3642 } 3739 }
3643 3740
3644 void insert_smiley_text(GtkWidget *widget, struct conversation *c) 3741 void insert_smiley_text(GtkWidget *widget, struct gaim_conversation *c)
3645 { 3742 {
3646 gtk_text_buffer_insert_at_cursor(c->entry_buffer, 3743 struct gaim_gtk_conversation *gtkconv;
3647 current_smiley, -1); 3744
3745 gtkconv = GAIM_GTK_CONVERSATION(c);
3746
3747 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, current_smiley, -1);
3648 close_smiley_dialog(NULL, c); 3748 close_smiley_dialog(NULL, c);
3649 } 3749 }
3650 3750
3651 static void toolbar_add_smiley(struct conversation *c, GtkWidget *bar, char* path, char *filename, char *face) 3751 static void toolbar_add_smiley(struct gaim_conversation *c, GtkWidget *bar, char* path, char *filename, char *face)
3652 { 3752 {
3653 GtkWidget *image; 3753 GtkWidget *image;
3654 GtkWidget *button; 3754 GtkWidget *button;
3655 char *buf; 3755 char *buf;
3656 3756
3664 3764
3665 /* these look really weird with borders */ 3765 /* these look really weird with borders */
3666 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); 3766 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
3667 } 3767 }
3668 3768
3669 void show_smiley_dialog(struct conversation *c, GtkWidget *widget) 3769 void show_smiley_dialog(struct gaim_conversation *c, GtkWidget *widget)
3670 { 3770 {
3771 struct gaim_gtk_conversation *gtkconv;
3671 GtkWidget *dialog; 3772 GtkWidget *dialog;
3672 GtkWidget *vbox, *smiley_box = NULL; 3773 GtkWidget *vbox, *smiley_box = NULL;
3673 GtkWidget *win; 3774 GtkWidget *win;
3674 GtkWidget *bbox; 3775 GtkWidget *bbox;
3675 char *smiley_path = 0; 3776 char *smiley_path = 0;
3676 3777
3677 if (c->smiley_dialog) 3778 gtkconv = GAIM_GTK_CONVERSATION(c);
3779
3780 if (gtkconv->dialogs.smiley)
3678 return; 3781 return;
3679 3782
3680 win = c->window; 3783 win = GAIM_GTK_WINDOW(gaim_conversation_get_window(c))->window;
3681 3784
3682 GAIM_DIALOG(dialog); 3785 GAIM_DIALOG(dialog);
3683 gtk_window_set_policy(GTK_WINDOW(dialog), FALSE, FALSE, TRUE); 3786 gtk_window_set_policy(GTK_WINDOW(dialog), FALSE, FALSE, TRUE);
3684 gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog"); 3787 gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog");
3685 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); 3788 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE);
3728 gtk_container_add(GTK_CONTAINER(dialog), vbox); 3831 gtk_container_add(GTK_CONTAINER(dialog), vbox);
3729 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); 3832 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
3730 3833
3731 /* connect signals */ 3834 /* connect signals */
3732 gtk_object_set_user_data(GTK_OBJECT(dialog), "smiley dialog"); 3835 gtk_object_set_user_data(GTK_OBJECT(dialog), "smiley dialog");
3733 g_signal_connect(GTK_OBJECT(dialog), "delete_event", G_CALLBACK(delete_event_dialog), c); 3836 g_signal_connect(G_OBJECT(dialog), "delete_event",
3837 G_CALLBACK(delete_event_dialog), c);
3734 3838
3735 /* show everything */ 3839 /* show everything */
3736 gtk_window_set_title(GTK_WINDOW(dialog), _("Smile!")); 3840 gtk_window_set_title(GTK_WINDOW(dialog), _("Smile!"));
3737 gtk_widget_show_all(dialog); 3841 gtk_widget_show_all(dialog);
3738 3842
3739 c->smiley_dialog = dialog; 3843 gtkconv->dialogs.smiley = dialog;
3740 3844
3741 return; 3845 return;
3742 } 3846 }
3743 3847
3744 static void do_alias_bud(GtkWidget *w, struct buddy *b) 3848 static void do_alias_bud(GtkWidget *w, struct buddy *b)
4593 gtk_widget_show_all(bbox); 4697 gtk_widget_show_all(bbox);
4594 return button; 4698 return button;
4595 } 4699 }
4596 4700
4597 4701
4598 GtkWidget *gaim_pixbuf_button_from_stock(char *text, char *icon, GaimButtonStyle style) 4702 GtkWidget *
4703 gaim_pixbuf_button_from_stock(const char *text, const char *icon,
4704 GaimButtonStyle style)
4599 { 4705 {
4600 GtkWidget *button, *image, *label, *bbox; 4706 GtkWidget *button, *image, *label, *bbox;
4601 button = gtk_button_new(); 4707 button = gtk_button_new();
4602 4708
4603 if (style == GAIM_BUTTON_HORIZONTAL) 4709 if (style == GAIM_BUTTON_HORIZONTAL)
5289 5395
5290 5396
5291 /*------------------------------------------------------------------------*/ 5397 /*------------------------------------------------------------------------*/
5292 /* End dialog for setting v-card info */ 5398 /* End dialog for setting v-card info */
5293 /*------------------------------------------------------------------------*/ 5399 /*------------------------------------------------------------------------*/
5400