respect https prefix
[k8lowj.git] / src / imagelink.c
blobb0548691f630d9f26bcfde6fb233f891eb85619a
1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2000-2004 Evan Martin <evan@livejournal.com>
3 */
4 #include "gtk-all.h"
5 #include "util-gtk.h"
7 #include "conf.h"
8 #include "jamdoc.h"
9 #include "util.h"
12 typedef struct {
13 GtkWidget *dlg;
14 GtkWidget *url, *get, *width, *height;
15 } ImageDlg;
18 static void url_changed_cb (ImageDlg *idlg) {
19 const char *text = gtk_entry_get_text(GTK_ENTRY(idlg->url));
20 gtk_widget_set_sensitive(idlg->get, text && text[0]);
21 gtk_dialog_set_response_sensitive(GTK_DIALOG(idlg->dlg), GTK_RESPONSE_OK, text && text[0]);
25 static void size_cb (ImageDlg *idlg, gint width, gint height) {
26 char *text = g_strdup_printf("%d", width);
27 gtk_entry_set_text(GTK_ENTRY(idlg->width), text);
28 g_free(text);
29 text = g_strdup_printf("%d", height);
30 gtk_entry_set_text(GTK_ENTRY(idlg->height), text);
31 g_free(text);
35 static void get_url_cb (ImageDlg *idlg) {
36 GdkPixbufLoader *loader;
37 const char *url;
38 GString *img;
39 GError *err = NULL;
40 /* XXX suboptimal: we retrieve the entire image when we only need a few bytes. */
41 url = gtk_entry_get_text(GTK_ENTRY(idlg->url));
42 img = net_get_run(_("Retrieving Image..."), GTK_WINDOW(idlg->dlg), url);
43 if (!img) return;
44 loader = gdk_pixbuf_loader_new();
45 g_signal_connect_swapped(G_OBJECT(loader), "size-prepared", G_CALLBACK(size_cb), idlg);
46 if (!gdk_pixbuf_loader_write(loader, (unsigned char *)img->str, img->len, &err)) {
47 jam_warning(GTK_WINDOW(idlg->dlg), _("Error loading image: %s."), err->message);
48 g_error_free(err);
50 gdk_pixbuf_loader_close(loader, NULL);
51 g_object_unref(G_OBJECT(loader));
55 static void make_dialog (ImageDlg *idlg, GtkWindow *win) {
56 GtkWidget *vbox, *hbox, *dimbox;
57 GtkSizeGroup *sg;
59 idlg->dlg = gtk_dialog_new_with_buttons(_("Insert Image"),
60 win, GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
61 gtk_dialog_set_default_response(GTK_DIALOG(idlg->dlg), GTK_RESPONSE_OK);
62 g_signal_connect_swapped(G_OBJECT(idlg->dlg), "show", G_CALLBACK(url_changed_cb), idlg);
64 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
66 vbox = gtk_vbox_new(FALSE, 12);
68 idlg->url = gtk_entry_new();
69 g_signal_connect_swapped(G_OBJECT(idlg->url), "changed", G_CALLBACK(url_changed_cb), idlg);
70 gtk_box_pack_start(GTK_BOX(vbox), labelled_box_new_sg(_("_URL:"), idlg->url, sg), FALSE, FALSE, 0);
72 hbox = gtk_hbox_new(FALSE, 6);
74 dimbox = gtk_vbox_new(FALSE, 6);
75 idlg->width = gtk_entry_new();
76 gtk_entry_set_width_chars(GTK_ENTRY(idlg->width), 6);
77 gtk_box_pack_start(GTK_BOX(dimbox), labelled_box_new_sg(_("_Width:"), idlg->width, sg), FALSE, FALSE, 0);
79 idlg->height = gtk_entry_new();
80 gtk_entry_set_width_chars(GTK_ENTRY(idlg->height), 6);
81 gtk_box_pack_start(GTK_BOX(dimbox), labelled_box_new_sg(_("_Height:"), idlg->height, sg), FALSE, FALSE, 0);
83 gtk_box_pack_start(GTK_BOX(hbox), dimbox, FALSE, FALSE, 0);
85 dimbox = gtk_vbox_new(FALSE, 6);
86 idlg->get = gtk_button_new_with_mnemonic(_("_Retrieve Dimensions from Network"));
87 g_signal_connect_swapped(G_OBJECT(idlg->get), "clicked", G_CALLBACK(get_url_cb), idlg);
88 gtk_box_pack_start(GTK_BOX(dimbox), idlg->get, TRUE, FALSE, 0);
90 gtk_box_pack_end(GTK_BOX(hbox), dimbox, FALSE, FALSE, 0);
92 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
94 jam_dialog_set_contents(GTK_DIALOG(idlg->dlg), vbox);
98 static gboolean is_image_link (const char *str) {
99 if (!str) return FALSE;
100 return (g_str_has_prefix(str, "http://") || g_str_has_prefix(str, "https://") || g_str_has_prefix(str, "ftp://"));
104 void image_dialog_run (GtkWindow *win, JamDoc *doc) {
105 STACK(ImageDlg, idlg);
106 GtkTextBuffer *buffer;
107 GtkTextIter start, end;
108 char *sel = NULL, *url = NULL;
109 const char *data;
110 int width = -1, height = -1;
112 make_dialog(idlg, win);
114 buffer = jam_doc_get_text_buffer(doc);
115 if (gtk_text_buffer_get_selection_bounds(buffer, &start, &end)) {
116 sel = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
117 if (is_image_link(sel)) gtk_entry_set_text(GTK_ENTRY(idlg->url), sel);
118 } else {
119 char *clip;
120 clip = jam_clipboard_wait_for_text_timeout(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), 50/*ms*/);
121 if (is_image_link(clip)) gtk_entry_set_text(GTK_ENTRY(idlg->url), clip);
122 g_free(clip);
125 if (gtk_dialog_run(GTK_DIALOG(idlg->dlg)) == GTK_RESPONSE_OK) {
126 if (sel) gtk_text_buffer_delete(buffer, &start, &end);
127 else gtk_text_buffer_get_iter_at_mark(buffer, &start, gtk_text_buffer_get_insert(buffer));
129 url = g_strdup(gtk_entry_get_text(GTK_ENTRY(idlg->url)));
130 xml_escape(&url);
131 gtk_text_buffer_insert(buffer, &start, "<img src='", -1);
132 gtk_text_buffer_insert(buffer, &start, url, -1);
133 gtk_text_buffer_insert(buffer, &start, "'", -1);
134 g_free(url);
136 data = gtk_entry_get_text(GTK_ENTRY(idlg->width));
137 width = atoi(data);
139 data = gtk_entry_get_text(GTK_ENTRY(idlg->height));
140 height = atoi(data);
142 if (width > 0) {
143 char *data = g_strdup_printf(" width='%d'", width);
144 gtk_text_buffer_insert(buffer, &start, data, -1);
145 g_free(data);
147 if (height > 0) {
148 char *data = g_strdup_printf(" height='%d'", height);
149 gtk_text_buffer_insert(buffer, &start, data, -1);
150 g_free(data);
152 gtk_text_buffer_insert(buffer, &start, " />", -1);
155 g_free(sel);
157 gtk_widget_destroy(idlg->dlg);