quran: use parens around assignment
[cnoor.git] / txtwin.c
blobd9dd4bc4d6255cdbac360d10e23b5800b12f196b
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 enum location {
22 LOC_PAGE,
23 LOC_STEP,
24 LOC_BEG,
25 LOC_END
28 static void scroll(struct txtwin *tw, enum location loc, int n)
30 int val = gtk_adjustment_get_value(tw->adjst);
31 int max = gtk_adjustment_get_upper(tw->adjst) -
32 gtk_adjustment_get_page_size(tw->adjst);
33 switch(loc) {
34 case LOC_PAGE:
35 val += n * gtk_adjustment_get_page_increment(tw->adjst);
36 break;
37 case LOC_STEP:
38 val += n * gtk_adjustment_get_step_increment(tw->adjst);
39 break;
40 case LOC_BEG:
41 val = 0;
42 break;
43 case LOC_END:
44 val = max;
45 break;
47 if (val > max)
48 val = max;
49 if (val < 0)
50 val = 0;
51 gtk_adjustment_set_value(tw->adjst, val);
54 static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event,
55 gpointer data)
57 struct txtwin *tw = data;
58 int mod = event->state & gtk_accelerator_get_default_mod_mask();
59 if (mod == GDK_CONTROL_MASK) {
60 switch(event->keyval) {
61 case GDK_f:
62 scroll(tw, LOC_PAGE, 1);
63 break;
64 case GDK_b:
65 scroll(tw, LOC_PAGE, -1);
66 break;
67 default:
68 break;
70 return 1;
72 switch(event->keyval) {
73 case GDK_j:
74 scroll(tw, LOC_STEP, 1);
75 break;
76 case GDK_k:
77 scroll(tw, LOC_STEP, -1);
78 break;
79 case GDK_G:
80 scroll(tw, LOC_END, 1);
81 break;
82 case GDK_g:
83 scroll(tw, LOC_BEG, 1);
84 break;
85 case GDK_q:
86 gtk_main_quit();
87 break;
88 default:
89 break;
91 return 1;
94 struct txtwin *txtwin_alloc()
96 GtkWidget *window;
97 GtkWidget *vbox;
98 struct txtwin *tw = xmalloc(sizeof(struct txtwin));
99 memset(tw, 0, sizeof(*tw));
100 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
101 gtk_window_set_title(GTK_WINDOW(window), "CNOOR");
102 g_signal_connect(G_OBJECT(window), "destroy",
103 G_CALLBACK(on_window_destroy), NULL);
105 vbox = gtk_vbox_new(FALSE, 2);
106 gtk_container_add(GTK_CONTAINER(window), vbox);
108 /* create the textview */
109 tw->main = gtk_text_view_new();
110 gtk_box_pack_start(GTK_BOX(vbox), tw->main, 1, 1, 0);
111 gtk_signal_connect(GTK_OBJECT(tw->main), "key_press_event",
112 GTK_SIGNAL_FUNC(on_key_press), tw);
113 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tw->main),
114 GTK_WRAP_WORD);
115 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(tw->main), FALSE);
117 /* add the adjustment */
118 tw->adjst = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 9, 10));
119 gtk_widget_set_scroll_adjustments(tw->main, NULL, tw->adjst);
121 /* create the minibuffer */
122 tw->bar = gtk_entry_new();
123 gtk_box_pack_start(GTK_BOX(vbox), tw->bar, 0, 0, 0);
124 gtk_signal_connect(GTK_OBJECT(tw->bar), "key_press_event",
125 GTK_SIGNAL_FUNC(on_key_press), tw);
127 gtk_widget_show_all(window);
128 return tw;
131 void txtwin_free(struct txtwin *tw)
133 free(tw);
136 void txtwin_loop(struct txtwin *tw)
138 gtk_main();
141 void txtwin_gtk_init(int argc, char **argv)
143 gtk_init(&argc, &argv);
146 static GtkTextBuffer *txtwin_buffer(struct txtwin *tw)
148 return gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->main));
151 void txtwin_append(struct txtwin *tw, char *s, char *tag)
153 GtkTextIter iter;
154 GtkTextBuffer *buf = txtwin_buffer(tw);
155 gtk_text_buffer_get_end_iter(buf, &iter);
156 gtk_text_buffer_insert_with_tags_by_name(buf, &iter, s, strlen(s),
157 tag, NULL);
160 void txtwin_tag(struct txtwin *tw, char *name, char *fg, char *bg, char *font)
162 GtkTextBuffer *buf = txtwin_buffer(tw);
163 gtk_text_buffer_create_tag(buf, name,
164 "foreground", fg,
165 "background", bg,
166 "font", font,
167 NULL);