quran: add quran parsing support
[cnoor.git] / txtwin.c
blob618ea30030aa5b8bfbf3cbd9ab72c0e68f2098c3
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;
15 static void on_window_destroy(GtkWidget *widget, gpointer data)
17 gtk_main_quit();
20 static void scroll(GtkTextView *view, float amount)
22 GdkRectangle rect;
23 GtkTextIter iter;
24 GtkTextBuffer *buffer;
25 int y;
26 buffer = gtk_text_view_get_buffer(view);
27 gtk_text_view_get_visible_rect(view, &rect);
28 y = rect.y + amount * rect.height;
29 gtk_text_view_get_iter_at_location(view, &iter, 0, y);
30 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(view), &iter,
31 0.0, TRUE, 0, 0);
34 static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event,
35 gpointer data)
37 struct txtwin *tw = data;
38 switch(event->keyval) {
39 case GDK_j:
40 scroll(GTK_TEXT_VIEW(tw->main), 0.05);
41 break;
42 case GDK_k:
43 scroll(GTK_TEXT_VIEW(tw->main), -0.05);
44 break;
45 case GDK_q:
46 gtk_main_quit();
47 break;
48 default:
49 break;
51 return 1;
54 struct txtwin *txtwin_alloc()
56 GtkWidget *window;
57 GtkWidget *vbox;
58 GtkTextBuffer *buffer;
59 struct txtwin *tw = xmalloc(sizeof(struct txtwin));
60 memset(tw, 0, sizeof(*tw));
61 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
62 gtk_window_set_title(GTK_WINDOW(window), "CNOOR");
63 g_signal_connect(G_OBJECT(window), "destroy",
64 G_CALLBACK(on_window_destroy), NULL);
66 vbox = gtk_vbox_new(FALSE, 2);
67 gtk_container_add(GTK_CONTAINER(window), vbox);
69 /* create the textview */
70 tw->main = gtk_text_view_new();
71 gtk_box_pack_start(GTK_BOX(vbox), tw->main, 1, 1, 0);
72 gtk_signal_connect(GTK_OBJECT(tw->main), "key_press_event",
73 GTK_SIGNAL_FUNC(on_key_press), tw);
74 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tw->main),
75 GTK_WRAP_WORD);
76 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(tw->main), FALSE);
78 /* write something */
79 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->main));
81 /* create the minibuffer */
82 tw->bar = gtk_entry_new();
83 gtk_box_pack_start(GTK_BOX(vbox), tw->bar, 0, 0, 0);
84 gtk_signal_connect(GTK_OBJECT(tw->bar), "key_press_event",
85 GTK_SIGNAL_FUNC(on_key_press), tw);
87 gtk_widget_show_all(window);
88 return tw;
91 void txtwin_free(struct txtwin *tw)
93 free(tw);
96 void txtwin_loop(struct txtwin *tw)
98 gtk_main();
101 void txtwin_gtk_init(int argc, char **argv)
103 gtk_init(&argc, &argv);
106 static GtkTextBuffer *txtwin_buffer(struct txtwin *tw)
108 return gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->main));
111 void txtwin_append(struct txtwin *tw, char *s)
113 GtkTextBuffer *buf = txtwin_buffer(tw);
114 gtk_text_buffer_insert_at_cursor(buf, s, strlen(s));