Mercurial > pidgin.yaz
comparison src/gtkconv.c @ 7695:557f72040bdf
[gaim-migrate @ 8340]
Committing this now so that I don't accidentally destroy it again.
We're going WYSIWYG, folks. This is the beginning of it. Don't bother
trying to tell me what doesn't work yet. This is just a sneak-peek.
Bold, Italics, and Underline work fairly well. The toggle buttons in the
tooltips won't necessarily be accurate yet, and things will get screwed up
if you say, start typing, make something bold, then go back to before where
you started typing and type there. It'll all be fixed eventually.
NOTE: I am not liable for any sexual arousal caused by using this code
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Tue, 02 Dec 2003 07:33:43 +0000 |
parents | 6a9acef3b867 |
children | 8a40952f5f67 |
comparison
equal
deleted
inserted
replaced
7694:6a9acef3b867 | 7695:557f72040bdf |
---|---|
115 | 115 |
116 } InviteBuddyInfo; | 116 } InviteBuddyInfo; |
117 | 117 |
118 static GtkWidget *invite_dialog = NULL; | 118 static GtkWidget *invite_dialog = NULL; |
119 | 119 |
120 enum { | |
121 TARGET_XURL=0, | |
122 TARGET_URI_LIST, | |
123 TARGET_BLIST_NODE, | |
124 TARGET_STRING, | |
125 TARGET_NETSCAPE_URL, | |
126 TARGET_PLAIN_TEXT | |
127 }; | |
128 | |
129 /* Prototypes. <-- because Paco-Paco hates this comment. */ | 120 /* Prototypes. <-- because Paco-Paco hates this comment. */ |
130 static void check_everything(GtkTextBuffer *buffer); | 121 static void check_everything(GtkTextBuffer *buffer); |
131 static void set_toggle(GtkWidget *tb, gboolean active); | 122 static void set_toggle(GtkWidget *tb, gboolean active); |
132 static void move_next_tab(GaimConversation *conv); | 123 static void move_next_tab(GaimConversation *conv); |
133 static void do_bold(GtkWidget *bold, GaimGtkConversation *gtkconv); | 124 static void do_bold(GtkWidget *bold, GaimGtkConversation *gtkconv); |
380 static void | 371 static void |
381 send_cb(GtkWidget *widget, GaimConversation *conv) | 372 send_cb(GtkWidget *widget, GaimConversation *conv) |
382 { | 373 { |
383 GaimGtkConversation *gtkconv; | 374 GaimGtkConversation *gtkconv; |
384 char *buf, *buf2; | 375 char *buf, *buf2; |
385 GtkTextIter start_iter, end_iter; | |
386 int limit; | 376 int limit; |
387 GaimConnection *gc = gaim_conversation_get_gc(conv); | 377 GaimConnection *gc = gaim_conversation_get_gc(conv); |
388 | 378 |
389 gtkconv = GAIM_GTK_CONVERSATION(conv); | 379 gtkconv = GAIM_GTK_CONVERSATION(conv); |
390 | 380 |
391 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, &start_iter); | 381 buf2 = gtk_imhtml_get_markup(GTK_IMHTML(gtkconv->entry)); |
392 gtk_text_buffer_get_end_iter(gtkconv->entry_buffer, &end_iter); | 382 |
393 buf2 = gtk_text_buffer_get_text(gtkconv->entry_buffer, | 383 /* set_toggle(gtkconv->toolbar.bold, FALSE); |
394 &start_iter, &end_iter, FALSE); | |
395 | |
396 set_toggle(gtkconv->toolbar.bold, FALSE); | |
397 set_toggle(gtkconv->toolbar.italic, FALSE); | 384 set_toggle(gtkconv->toolbar.italic, FALSE); |
398 set_toggle(gtkconv->toolbar.underline, FALSE); | 385 set_toggle(gtkconv->toolbar.underline, FALSE); |
399 set_toggle(gtkconv->toolbar.larger_size, FALSE); | 386 set_toggle(gtkconv->toolbar.larger_size, FALSE); |
400 set_toggle(gtkconv->toolbar.normal_size, FALSE); | 387 set_toggle(gtkconv->toolbar.normal_size, FALSE); |
401 set_toggle(gtkconv->toolbar.smaller_size,FALSE); | 388 set_toggle(gtkconv->toolbar.smaller_size,FALSE); |
402 set_toggle(gtkconv->toolbar.font, FALSE); | 389 set_toggle(gtkconv->toolbar.font, FALSE); |
403 set_toggle(gtkconv->toolbar.fgcolor, FALSE); | 390 set_toggle(gtkconv->toolbar.fgcolor, FALSE); |
404 set_toggle(gtkconv->toolbar.bgcolor, FALSE); | 391 set_toggle(gtkconv->toolbar.bgcolor, FALSE); |
405 set_toggle(gtkconv->toolbar.link, FALSE); | 392 set_toggle(gtkconv->toolbar.link, FALSE); |
406 | 393 */ |
407 gtk_widget_grab_focus(gtkconv->entry); | 394 gtk_widget_grab_focus(gtkconv->entry); |
408 | 395 |
409 limit = 32 * 1024; /* This will be done again in gaim_conv_im_send. *shrug* */ | 396 limit = 32 * 1024; /* This will be done again in gaim_conv_im_send. *shrug* */ |
410 | 397 |
411 buf = g_malloc(limit); | 398 buf = g_malloc(limit); |
487 if (gaim_prefs_get_bool("/gaim/gtk/conversations/im/hide_on_send")) | 474 if (gaim_prefs_get_bool("/gaim/gtk/conversations/im/hide_on_send")) |
488 gaim_conv_window_hide(gaim_conversation_get_window(conv)); | 475 gaim_conv_window_hide(gaim_conversation_get_window(conv)); |
489 | 476 |
490 g_free(buf); | 477 g_free(buf); |
491 | 478 |
492 gtk_text_buffer_set_text(gtkconv->entry_buffer, "", -1); | 479 gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); |
493 } | 480 } |
494 | 481 |
495 static void | 482 static void |
496 add_cb(GtkWidget *widget, GaimConversation *conv) | 483 add_cb(GtkWidget *widget, GaimConversation *conv) |
497 { | 484 { |
2192 * Utility functions | 2179 * Utility functions |
2193 **************************************************************************/ | 2180 **************************************************************************/ |
2194 static void | 2181 static void |
2195 do_bold(GtkWidget *bold, GaimGtkConversation *gtkconv) | 2182 do_bold(GtkWidget *bold, GaimGtkConversation *gtkconv) |
2196 { | 2183 { |
2197 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bold))) | 2184 gtk_imhtml_toggle_bold(GTK_IMHTML(gtkconv->entry)); |
2198 gaim_gtk_surround(gtkconv, "<B>", "</B>"); | |
2199 else | |
2200 gaim_gtk_advance_past(gtkconv, "<B>", "</B>"); | |
2201 | |
2202 gtk_widget_grab_focus(gtkconv->entry); | 2185 gtk_widget_grab_focus(gtkconv->entry); |
2203 } | 2186 } |
2204 | 2187 |
2205 static void | 2188 static void |
2206 do_italic(GtkWidget *italic, GaimGtkConversation *gtkconv) | 2189 do_italic(GtkWidget *italic, GaimGtkConversation *gtkconv) |
2207 { | 2190 { |
2208 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(italic))) | 2191 gtk_imhtml_toggle_italic(GTK_IMHTML(gtkconv->entry)); |
2209 gaim_gtk_surround(gtkconv, "<I>", "</I>"); | |
2210 else | |
2211 gaim_gtk_advance_past(gtkconv, "<I>", "</I>"); | |
2212 | |
2213 gtk_widget_grab_focus(gtkconv->entry); | 2192 gtk_widget_grab_focus(gtkconv->entry); |
2214 } | 2193 } |
2215 | 2194 |
2216 static void | 2195 static void |
2217 do_underline(GtkWidget *underline, GaimGtkConversation *gtkconv) | 2196 do_underline(GtkWidget *underline, GaimGtkConversation *gtkconv) |
2218 { | 2197 { |
2219 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(underline))) | 2198 gtk_imhtml_toggle_underline(GTK_IMHTML(gtkconv->entry)); |
2220 gaim_gtk_surround(gtkconv, "<U>", "</U>"); | |
2221 else | |
2222 gaim_gtk_advance_past(gtkconv, "<U>", "</U>"); | |
2223 | |
2224 gtk_widget_grab_focus(gtkconv->entry); | 2199 gtk_widget_grab_focus(gtkconv->entry); |
2225 } | 2200 } |
2226 | 2201 |
2227 static void | 2202 static void |
2228 do_small(GtkWidget *smalltb, GaimGtkConversation *gtkconv) | 2203 do_small(GtkWidget *smalltb, GaimGtkConversation *gtkconv) |
3701 frame = gtk_frame_new(NULL); | 3676 frame = gtk_frame_new(NULL); |
3702 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); | 3677 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); |
3703 gtk_box_pack_start(GTK_BOX(vbox2), frame, TRUE, TRUE, 0); | 3678 gtk_box_pack_start(GTK_BOX(vbox2), frame, TRUE, TRUE, 0); |
3704 gtk_widget_show(frame); | 3679 gtk_widget_show(frame); |
3705 | 3680 |
3706 gtkconv->entry_buffer = gtk_text_buffer_new(NULL); | 3681 gtkconv->entry = gtk_imhtml_new(NULL, NULL); |
3682 gtk_imhtml_set_editable(GTK_IMHTML(gtkconv->entry), TRUE); | |
3683 gtkconv->entry_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); | |
3707 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", conv); | 3684 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", conv); |
3708 gtkconv->entry = gtk_text_view_new_with_buffer(gtkconv->entry_buffer); | |
3709 | |
3710 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), GTK_WRAP_WORD_CHAR); | 3685 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), GTK_WRAP_WORD_CHAR); |
3711 gtk_widget_set_size_request(gtkconv->entry, -1, | 3686 gtk_widget_set_size_request(gtkconv->entry, -1, |
3712 MAX(gaim_prefs_get_int("/gaim/gtk/conversations/im/entry_height"), | 3687 MAX(gaim_prefs_get_int("/gaim/gtk/conversations/im/entry_height"), |
3713 25)); | 3688 25)); |
3714 | 3689 |
3799 GtkSelectionData *sd, guint info, guint t, | 3774 GtkSelectionData *sd, guint info, guint t, |
3800 GaimConversation *conv) | 3775 GaimConversation *conv) |
3801 { | 3776 { |
3802 GaimConvWindow *win = conv->window; | 3777 GaimConvWindow *win = conv->window; |
3803 GaimConversation *c; | 3778 GaimConversation *c; |
3804 gchar* uri; | |
3805 | 3779 |
3806 if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) { | 3780 if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) { |
3807 GaimBlistNode *n = NULL; | 3781 GaimBlistNode *n = NULL; |
3808 GaimBuddy *b; | 3782 GaimBuddy *b; |
3809 memcpy(&n, sd->data, sizeof(n)); | 3783 memcpy(&n, sd->data, sizeof(n)); |
3816 return; | 3790 return; |
3817 | 3791 |
3818 c = gaim_conversation_new(GAIM_CONV_IM, b->account, b->name); | 3792 c = gaim_conversation_new(GAIM_CONV_IM, b->account, b->name); |
3819 | 3793 |
3820 gaim_conv_window_add_conversation(win, c); | 3794 gaim_conv_window_add_conversation(win, c); |
3821 } | |
3822 if (info == TARGET_NETSCAPE_URL) | |
3823 { | |
3824 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3825 gchar* p=(gchar*) sd->data; | |
3826 gchar* q; | |
3827 gchar* link; | |
3828 | |
3829 if (p==NULL) | |
3830 return; | |
3831 g_strchomp(p); | |
3832 q = strchr(p,'\n'); | |
3833 if (q==NULL) | |
3834 { | |
3835 link=g_strconcat("<a href=\"",p,"\">",p,"</a>",NULL); | |
3836 } | |
3837 else | |
3838 { | |
3839 uri = g_strndup(p,q-p); | |
3840 q++; | |
3841 link=g_strconcat("<a href=\"",uri,"\">",q,"</a>",NULL); | |
3842 g_free(uri); | |
3843 } | |
3844 gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER(gtkconv->entry_buffer), link, -1); | |
3845 g_free(link); | |
3846 } | |
3847 if (info == TARGET_XURL) | |
3848 { | |
3849 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3850 gchar* link; | |
3851 uri=g_strdup((gchar*) sd->data); | |
3852 g_strstrip(uri); | |
3853 link=g_strconcat("<a href=\"",uri,"\">",uri,"</a>",NULL); | |
3854 g_free(uri); | |
3855 gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER(gtkconv->entry_buffer), link, -1); | |
3856 g_free(link); | |
3857 } | |
3858 if (info == TARGET_URI_LIST && (gchar*)sd->data != NULL | |
3859 && g_ascii_strncasecmp((gchar*)sd->data,"file:",5)!=0) | |
3860 { | |
3861 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3862 gchar *p, *q, *link; | |
3863 q=g_strdup((gchar*) sd->data); | |
3864 g_strstrip(q); | |
3865 p=strchr(q,'\n'); | |
3866 if (p==NULL) | |
3867 { | |
3868 uri=g_strdup(q); /* strdup'ing this to make it match the else */ | |
3869 } | |
3870 else | |
3871 { | |
3872 uri=g_strndup(q,q-p); | |
3873 } | |
3874 g_free(q); | |
3875 link=g_strconcat("<a href=\"",uri,"\">",uri,"</a>",NULL); | |
3876 g_free(uri); | |
3877 gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER(gtkconv->entry_buffer), link, -1); | |
3878 g_free(link); | |
3879 } | 3795 } |
3880 } | 3796 } |
3881 | 3797 |
3882 /************************************************************************** | 3798 /************************************************************************** |
3883 * GTK+ window ops | 3799 * GTK+ window ops |
4023 gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkwin->notebook), index); | 3939 gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkwin->notebook), index); |
4024 } | 3940 } |
4025 | 3941 |
4026 static const GtkTargetEntry te[] = | 3942 static const GtkTargetEntry te[] = |
4027 { | 3943 { |
4028 {"x-url/ftp", 0, TARGET_XURL}, | 3944 {"text/plain", 0, 0}, |
4029 {"x-url/http", 0, TARGET_XURL}, | 3945 {"text/uri-list", 0, 1}, |
4030 {"text/uri-list", 0, TARGET_URI_LIST}, | 3946 {"GAIM_BLIST_NODE", 0, 2}, |
4031 {"GAIM_BLIST_NODE", 0, TARGET_BLIST_NODE}, | 3947 {"STRING", 0, 3} |
4032 {"STRING", 0, TARGET_STRING}, | |
4033 {"_NETSCAPE_URL", 0, TARGET_NETSCAPE_URL}, | |
4034 {"text/plain", 0, TARGET_PLAIN_TEXT} | |
4035 }; | 3948 }; |
4036 | 3949 |
4037 static void | 3950 static void |
4038 gaim_gtk_add_conversation(GaimConvWindow *win, GaimConversation *conv) | 3951 gaim_gtk_add_conversation(GaimConvWindow *win, GaimConversation *conv) |
4039 { | 3952 { |
4103 gtk_drag_dest_set(gtkconv->imhtml, | 4016 gtk_drag_dest_set(gtkconv->imhtml, |
4104 GTK_DEST_DEFAULT_MOTION | | 4017 GTK_DEST_DEFAULT_MOTION | |
4105 GTK_DEST_DEFAULT_DROP, | 4018 GTK_DEST_DEFAULT_DROP, |
4106 te, sizeof(te) / sizeof(GtkTargetEntry), | 4019 te, sizeof(te) / sizeof(GtkTargetEntry), |
4107 GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE); | 4020 GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE); |
4108 gtk_drag_dest_set(gtkconv->entry, 0, | 4021 gtk_drag_dest_set(gtkconv->entry, |
4109 te, sizeof(te) / sizeof(GtkTargetEntry), | 4022 GTK_DEST_DEFAULT_MOTION | |
4110 GDK_ACTION_COPY); | 4023 GTK_DEST_DEFAULT_DROP, |
4024 te, sizeof(te) / sizeof(GtkTargetEntry), | |
4025 GDK_ACTION_COPY); | |
4026 | |
4111 g_signal_connect(G_OBJECT(pane), "drag_data_received", | 4027 g_signal_connect(G_OBJECT(pane), "drag_data_received", |
4112 G_CALLBACK(conv_dnd_recv), conv); | 4028 G_CALLBACK(conv_dnd_recv), conv); |
4113 g_signal_connect(G_OBJECT(gtkconv->imhtml), "drag_data_received", | 4029 g_signal_connect(G_OBJECT(gtkconv->imhtml), "drag_data_received", |
4114 G_CALLBACK(conv_dnd_recv), conv); | 4030 G_CALLBACK(conv_dnd_recv), conv); |
4031 #if 0 | |
4115 g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received", | 4032 g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received", |
4116 G_CALLBACK(conv_dnd_recv), conv); | 4033 G_CALLBACK(conv_dnd_recv), conv); |
4034 #endif | |
4117 | 4035 |
4118 /* Setup the container for the tab. */ | 4036 /* Setup the container for the tab. */ |
4119 gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, 5); | 4037 gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, 5); |
4120 gtk_container_set_border_width(GTK_CONTAINER(tab_cont), 5); | 4038 gtk_container_set_border_width(GTK_CONTAINER(tab_cont), 5); |
4121 gtk_container_add(GTK_CONTAINER(tab_cont), pane); | 4039 gtk_container_add(GTK_CONTAINER(tab_cont), pane); |