quran: handle \r in quran files
[cnoor.git] / txtwin.c
blobd381d4d0207c0f1d50fee21e010bc3777135c469
1 #include <string.h>
2 #include <stdlib.h>
3 #include <gtk/gtk.h>
4 #include <gdk/gdkkeysyms.h>
5 #include "txtwin.h"
6 #include "util.h"
8 struct txtwin {
9 /* A GtkTextView */
10 GtkWidget *main;
11 /* A GtkEntry */
12 GtkWidget *bar;
13 GtkAdjustment *adjst;
16 static void on_window_destroy(GtkWidget *widget, gpointer data)
18 gtk_main_quit();
21 static void scroll(struct txtwin *tw, int page, int count)
23 int val = gtk_adjustment_get_value(tw->adjst);
24 int max = gtk_adjustment_get_upper(tw->adjst) -
25 gtk_adjustment_get_page_size(tw->adjst);
26 int step = page ? gtk_adjustment_get_page_increment(tw->adjst) :
27 gtk_adjustment_get_step_increment(tw->adjst);
28 val += count * step;
29 if (val > max)
30 val = max;
31 if (val < 0)
32 val = 0;
33 gtk_adjustment_set_value(tw->adjst, val);
36 static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event,
37 gpointer data)
39 struct txtwin *tw = data;
40 int mod = event->state & gtk_accelerator_get_default_mod_mask();
41 if (mod == GDK_CONTROL_MASK) {
42 switch(event->keyval) {
43 case GDK_f:
44 scroll(tw, 1, 1);
45 break;
46 case GDK_b:
47 scroll(tw, 1, -1);
48 break;
49 default:
50 break;
52 return 1;
54 switch(event->keyval) {
55 case GDK_j:
56 scroll(tw, 0, 1);
57 break;
58 case GDK_k:
59 scroll(tw, 0, -1);
60 break;
61 case GDK_q:
62 gtk_main_quit();
63 break;
64 default:
65 break;
67 return 1;
70 struct txtwin *txtwin_alloc()
72 GtkWidget *window;
73 GtkWidget *vbox;
74 struct txtwin *tw = xmalloc(sizeof(struct txtwin));
75 memset(tw, 0, sizeof(*tw));
76 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
77 gtk_window_set_title(GTK_WINDOW(window), "CNOOR");
78 g_signal_connect(G_OBJECT(window), "destroy",
79 G_CALLBACK(on_window_destroy), NULL);
81 vbox = gtk_vbox_new(FALSE, 2);
82 gtk_container_add(GTK_CONTAINER(window), vbox);
84 /* create the textview */
85 tw->main = gtk_text_view_new();
86 gtk_box_pack_start(GTK_BOX(vbox), tw->main, 1, 1, 0);
87 gtk_signal_connect(GTK_OBJECT(tw->main), "key_press_event",
88 GTK_SIGNAL_FUNC(on_key_press), tw);
89 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tw->main),
90 GTK_WRAP_WORD);
91 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(tw->main), FALSE);
93 /* add the adjustment */
94 tw->adjst = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 9, 10));
95 gtk_widget_set_scroll_adjustments(tw->main, NULL, tw->adjst);
97 /* create the minibuffer */
98 tw->bar = gtk_entry_new();
99 gtk_box_pack_start(GTK_BOX(vbox), tw->bar, 0, 0, 0);
100 gtk_signal_connect(GTK_OBJECT(tw->bar), "key_press_event",
101 GTK_SIGNAL_FUNC(on_key_press), tw);
103 gtk_widget_show_all(window);
104 return tw;
107 void txtwin_free(struct txtwin *tw)
109 free(tw);
112 void txtwin_loop(struct txtwin *tw)
114 gtk_main();
117 void txtwin_gtk_init(int argc, char **argv)
119 gtk_init(&argc, &argv);
122 static GtkTextBuffer *txtwin_buffer(struct txtwin *tw)
124 return gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->main));
127 void txtwin_append(struct txtwin *tw, char *s, char *tag)
129 GtkTextIter iter;
130 GtkTextBuffer *buf = txtwin_buffer(tw);
131 gtk_text_buffer_get_end_iter(buf, &iter);
132 gtk_text_buffer_insert_with_tags_by_name(buf, &iter, s, strlen(s),
133 tag, NULL);
136 void txtwin_tag(struct txtwin *tw, char *name, char *fg, char *bg, char *font)
138 GtkTextBuffer *buf = txtwin_buffer(tw);
139 gtk_text_buffer_create_tag(buf, name,
140 "foreground", fg,
141 "background", bg,
142 "font", font,
143 NULL);