Mercurial > pidgin.yaz
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 |