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);