comparison src/gtkconv.c @ 7694:6a9acef3b867

[gaim-migrate @ 8339] 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:42 +0000
parents 1d0314b99747
children 557f72040bdf
comparison
equal deleted inserted replaced
7693:1d0314b99747 7694:6a9acef3b867
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
120 /* Prototypes. <-- because Paco-Paco hates this comment. */ 129 /* Prototypes. <-- because Paco-Paco hates this comment. */
121 static void check_everything(GtkTextBuffer *buffer); 130 static void check_everything(GtkTextBuffer *buffer);
122 static void set_toggle(GtkWidget *tb, gboolean active); 131 static void set_toggle(GtkWidget *tb, gboolean active);
123 static void move_next_tab(GaimConversation *conv); 132 static void move_next_tab(GaimConversation *conv);
124 static void do_bold(GtkWidget *bold, GaimGtkConversation *gtkconv); 133 static void do_bold(GtkWidget *bold, GaimGtkConversation *gtkconv);
3790 GtkSelectionData *sd, guint info, guint t, 3799 GtkSelectionData *sd, guint info, guint t,
3791 GaimConversation *conv) 3800 GaimConversation *conv)
3792 { 3801 {
3793 GaimConvWindow *win = conv->window; 3802 GaimConvWindow *win = conv->window;
3794 GaimConversation *c; 3803 GaimConversation *c;
3804 gchar* uri;
3795 3805
3796 if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) { 3806 if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) {
3797 GaimBlistNode *n = NULL; 3807 GaimBlistNode *n = NULL;
3798 GaimBuddy *b; 3808 GaimBuddy *b;
3799 memcpy(&n, sd->data, sizeof(n)); 3809 memcpy(&n, sd->data, sizeof(n));
3806 return; 3816 return;
3807 3817
3808 c = gaim_conversation_new(GAIM_CONV_IM, b->account, b->name); 3818 c = gaim_conversation_new(GAIM_CONV_IM, b->account, b->name);
3809 3819
3810 gaim_conv_window_add_conversation(win, c); 3820 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);
3811 } 3879 }
3812 } 3880 }
3813 3881
3814 /************************************************************************** 3882 /**************************************************************************
3815 * GTK+ window ops 3883 * GTK+ window ops
3955 gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkwin->notebook), index); 4023 gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkwin->notebook), index);
3956 } 4024 }
3957 4025
3958 static const GtkTargetEntry te[] = 4026 static const GtkTargetEntry te[] =
3959 { 4027 {
3960 {"text/plain", 0, 0}, 4028 {"x-url/ftp", 0, TARGET_XURL},
3961 {"text/uri-list", 0, 1}, 4029 {"x-url/http", 0, TARGET_XURL},
3962 {"GAIM_BLIST_NODE", 0, 2}, 4030 {"text/uri-list", 0, TARGET_URI_LIST},
3963 {"STRING", 0, 3} 4031 {"GAIM_BLIST_NODE", 0, TARGET_BLIST_NODE},
4032 {"STRING", 0, TARGET_STRING},
4033 {"_NETSCAPE_URL", 0, TARGET_NETSCAPE_URL},
4034 {"text/plain", 0, TARGET_PLAIN_TEXT}
3964 }; 4035 };
3965 4036
3966 static void 4037 static void
3967 gaim_gtk_add_conversation(GaimConvWindow *win, GaimConversation *conv) 4038 gaim_gtk_add_conversation(GaimConvWindow *win, GaimConversation *conv)
3968 { 4039 {
4032 gtk_drag_dest_set(gtkconv->imhtml, 4103 gtk_drag_dest_set(gtkconv->imhtml,
4033 GTK_DEST_DEFAULT_MOTION | 4104 GTK_DEST_DEFAULT_MOTION |
4034 GTK_DEST_DEFAULT_DROP, 4105 GTK_DEST_DEFAULT_DROP,
4035 te, sizeof(te) / sizeof(GtkTargetEntry), 4106 te, sizeof(te) / sizeof(GtkTargetEntry),
4036 GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE); 4107 GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE);
4037 gtk_drag_dest_set(gtkconv->entry, 4108 gtk_drag_dest_set(gtkconv->entry, 0,
4038 GTK_DEST_DEFAULT_MOTION | 4109 te, sizeof(te) / sizeof(GtkTargetEntry),
4039 GTK_DEST_DEFAULT_DROP, 4110 GDK_ACTION_COPY);
4040 te, sizeof(te) / sizeof(GtkTargetEntry),
4041 GDK_ACTION_COPY);
4042
4043 g_signal_connect(G_OBJECT(pane), "drag_data_received", 4111 g_signal_connect(G_OBJECT(pane), "drag_data_received",
4044 G_CALLBACK(conv_dnd_recv), conv); 4112 G_CALLBACK(conv_dnd_recv), conv);
4045 g_signal_connect(G_OBJECT(gtkconv->imhtml), "drag_data_received", 4113 g_signal_connect(G_OBJECT(gtkconv->imhtml), "drag_data_received",
4046 G_CALLBACK(conv_dnd_recv), conv); 4114 G_CALLBACK(conv_dnd_recv), conv);
4047 #if 0
4048 g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received", 4115 g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received",
4049 G_CALLBACK(conv_dnd_recv), conv); 4116 G_CALLBACK(conv_dnd_recv), conv);
4050 #endif
4051 4117
4052 /* Setup the container for the tab. */ 4118 /* Setup the container for the tab. */
4053 gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, 5); 4119 gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, 5);
4054 gtk_container_set_border_width(GTK_CONTAINER(tab_cont), 5); 4120 gtk_container_set_border_width(GTK_CONTAINER(tab_cont), 5);
4055 gtk_container_add(GTK_CONTAINER(tab_cont), pane); 4121 gtk_container_add(GTK_CONTAINER(tab_cont), pane);