summaryrefslogtreecommitdiff
path: root/src/sourcewindow.c
diff options
context:
space:
mode:
authorSimeon Simeonov2018-02-26 11:23:00 +0100
committerSimeon Simeonov2018-02-26 11:23:00 +0100
commit0b3cbf57875fd692e4ba0b336fefa4bee1ed00dc (patch)
treeaf916a30553c78ce9d4f2d8658656a175c5b6921 /src/sourcewindow.c
Initial commit for sylpheed 3.7.0
Diffstat (limited to 'src/sourcewindow.c')
-rw-r--r--src/sourcewindow.c212
1 files changed, 212 insertions, 0 deletions
diff --git a/src/sourcewindow.c b/src/sourcewindow.c
new file mode 100644
index 0000000..b1926fe
--- /dev/null
+++ b/src/sourcewindow.c
@@ -0,0 +1,212 @@
1/*
2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2005 Hiroyuki Yamamoto
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20#include "defs.h"
21
22#include <glib.h>
23#include <glib/gi18n.h>
24#include <gdk/gdkkeysyms.h>
25#include <gtk/gtkwidget.h>
26#include <gtk/gtkwindow.h>
27#include <gtk/gtksignal.h>
28#include <gtk/gtkscrolledwindow.h>
29#include <gtk/gtktextview.h>
30#include <gtk/gtkstyle.h>
31#include <stdio.h>
32#include <stdlib.h>
33
34#include "sourcewindow.h"
35#include "procmsg.h"
36#include "codeconv.h"
37#include "utils.h"
38#include "gtkutils.h"
39#include "prefs_common.h"
40
41static void source_window_size_alloc_cb (GtkWidget *widget,
42 GtkAllocation *allocation);
43static gint source_window_delete_cb (GtkWidget *widget,
44 GdkEventAny *event,
45 SourceWindow *sourcewin);
46static gboolean key_pressed (GtkWidget *widget,
47 GdkEventKey *event,
48 SourceWindow *sourcewin);
49
50static void adj_value_changed (GtkAdjustment *adj,
51 SourceWindow *sourcewin);
52
53static void source_window_init()
54{
55}
56
57SourceWindow *source_window_create(void)
58{
59 SourceWindow *sourcewin;
60 GtkWidget *window;
61 GtkWidget *scrolledwin;
62 GtkWidget *text;
63 static PangoFontDescription *font_desc = NULL;
64
65 debug_print(_("Creating source window...\n"));
66 sourcewin = g_new0(SourceWindow, 1);
67
68 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
69 gtk_window_set_title(GTK_WINDOW(window), _("Source of the message"));
70 gtk_window_set_wmclass(GTK_WINDOW(window), "source_window", "Sylpheed");
71 gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
72 gtk_widget_set_size_request(window, prefs_common.sourcewin_width,
73 prefs_common.sourcewin_height);
74 g_signal_connect(G_OBJECT(window), "size_allocate",
75 G_CALLBACK(source_window_size_alloc_cb), sourcewin);
76 g_signal_connect(G_OBJECT(window), "delete_event",
77 G_CALLBACK(source_window_delete_cb), sourcewin);
78 g_signal_connect(G_OBJECT(window), "key_press_event",
79 G_CALLBACK(key_pressed), sourcewin);
80
81 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
82 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
83 GTK_POLICY_AUTOMATIC,
84 GTK_POLICY_ALWAYS);
85 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin),
86 GTK_SHADOW_IN);
87 gtk_container_add(GTK_CONTAINER(window), scrolledwin);
88 gtk_widget_show(scrolledwin);
89
90 text = gtk_text_view_new();
91 gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
92 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text), 6);
93 gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text), 6);
94 if (!font_desc && prefs_common.textfont)
95 font_desc = pango_font_description_from_string
96 (prefs_common.textfont);
97 if (font_desc)
98 gtk_widget_modify_font(text, font_desc);
99 gtk_container_add(GTK_CONTAINER(scrolledwin), text);
100 gtk_widget_show(text);
101
102 g_signal_connect(G_OBJECT(GTK_TEXT_VIEW(text)->vadjustment),
103 "value-changed",
104 G_CALLBACK(adj_value_changed), sourcewin);
105
106 sourcewin->window = window;
107 sourcewin->scrolledwin = scrolledwin;
108 sourcewin->text = text;
109
110 source_window_init();
111
112 return sourcewin;
113}
114
115void source_window_show(SourceWindow *sourcewin)
116{
117 gtk_widget_show_all(sourcewin->window);
118}
119
120void source_window_destroy(SourceWindow *sourcewin)
121{
122 gtk_widget_destroy(sourcewin->window);
123 g_free(sourcewin);
124}
125
126void source_window_show_msg(SourceWindow *sourcewin, MsgInfo *msginfo)
127{
128 gchar *file;
129 gchar *title;
130 FILE *fp;
131 gchar buf[BUFFSIZE];
132 GtkTextBuffer *buffer;
133 GtkTextIter iter;
134
135 g_return_if_fail(msginfo != NULL);
136
137 file = procmsg_get_message_file(msginfo);
138 g_return_if_fail(file != NULL);
139
140 if ((fp = g_fopen(file, "rb")) == NULL) {
141 FILE_OP_ERROR(file, "fopen");
142 g_free(file);
143 return;
144 }
145
146 debug_print(_("Displaying the source of %s ...\n"), file);
147
148 title = g_strdup_printf(_("%s - Source"), file);
149 gtk_window_set_title(GTK_WINDOW(sourcewin->window), title);
150 g_free(title);
151 g_free(file);
152
153 while (fgets(buf, sizeof(buf), fp) != NULL)
154 source_window_append(sourcewin, buf);
155
156 fclose(fp);
157
158 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sourcewin->text));
159 gtk_text_buffer_get_start_iter(buffer, &iter);
160 gtk_text_buffer_place_cursor(buffer, &iter);
161}
162
163void source_window_append(SourceWindow *sourcewin, const gchar *str)
164{
165 GtkTextView *text = GTK_TEXT_VIEW(sourcewin->text);
166 GtkTextBuffer *buffer;
167 GtkTextIter iter;
168 gchar *out;
169
170 buffer = gtk_text_view_get_buffer(text);
171
172 out = conv_utf8todisp(str, NULL);
173 gtk_text_buffer_get_iter_at_offset(buffer, &iter, -1);
174 gtk_text_buffer_insert(buffer, &iter, out, -1);
175 g_free(out);
176}
177
178static void source_window_size_alloc_cb(GtkWidget *widget,
179 GtkAllocation *allocation)
180{
181 g_return_if_fail(allocation != NULL);
182
183 prefs_common.sourcewin_width = allocation->width;
184 prefs_common.sourcewin_height = allocation->height;
185}
186
187static gint source_window_delete_cb(GtkWidget *widget, GdkEventAny *event,
188 SourceWindow *sourcewin)
189{
190 source_window_destroy(sourcewin);
191 return TRUE;
192}
193
194static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event,
195 SourceWindow *sourcewin)
196{
197 if (event && event->keyval == GDK_Escape) {
198 source_window_destroy(sourcewin);
199 return TRUE;
200 }
201 return FALSE;
202}
203
204static void adj_value_changed(GtkAdjustment *adj, SourceWindow *sourcewin)
205{
206 GtkTextBuffer *buffer;
207
208 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sourcewin->text));
209 if (gtk_text_buffer_get_selection_bounds(buffer, NULL, NULL))
210 return;
211 gtk_text_view_place_cursor_onscreen(GTK_TEXT_VIEW(sourcewin->text));
212}