txtwin: show location in bar
[cnoor.git] / txtwin.c
blob7e1399bf877548148121b359a208b3ef4bebb1d4
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <gtk/gtk.h>
5 #include <gdk/gdkkeysyms.h>
6 #include "txtwin.h"
7 #include "util.h"
9 struct txtwin {
10 /* A GtkTextView */
11 GtkWidget *main;
12 /* A GtkEntry */
13 GtkWidget *bar;
14 GtkAdjustment *adjst;
17 static void on_window_destroy(GtkWidget *widget, gpointer data)
19 gtk_main_quit();
22 enum location {
23 LOC_PAGE,
24 LOC_STEP,
25 LOC_BEG,
26 LOC_END
29 static void update_bar(struct txtwin *tw)
31 int val = gtk_adjustment_get_value(tw->adjst);
32 int max = gtk_adjustment_get_upper(tw->adjst);
33 char msg[128];
34 sprintf(msg, "%d%%", val * 100 / max);
35 gtk_entry_set_text(GTK_ENTRY(tw->bar), msg);
38 static void scroll(struct txtwin *tw, enum location loc, int n)
40 int val = gtk_adjustment_get_value(tw->adjst);
41 int max = gtk_adjustment_get_upper(tw->adjst) -
42 gtk_adjustment_get_page_size(tw->adjst);
43 switch(loc) {
44 case LOC_PAGE:
45 val += n * gtk_adjustment_get_page_increment(tw->adjst);
46 break;
47 case LOC_STEP:
48 val += n * gtk_adjustment_get_step_increment(tw->adjst);
49 break;
50 case LOC_BEG:
51 val = 0;
52 break;
53 case LOC_END:
54 val = max;
55 break;
57 if (val > max)
58 val = max;
59 if (val < 0)
60 val = 0;
61 gtk_adjustment_set_value(tw->adjst, val);
62 update_bar(tw);
65 static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event,
66 gpointer data)
68 struct txtwin *tw = data;
69 int mod = event->state & gtk_accelerator_get_default_mod_mask();
70 if (mod == GDK_CONTROL_MASK) {
71 switch(event->keyval) {
72 case GDK_f:
73 scroll(tw, LOC_PAGE, 1);
74 break;
75 case GDK_b:
76 scroll(tw, LOC_PAGE, -1);
77 break;
78 default:
79 break;
81 return 1;
83 switch(event->keyval) {
84 case GDK_j:
85 scroll(tw, LOC_STEP, 1);
86 break;
87 case GDK_k:
88 scroll(tw, LOC_STEP, -1);
89 break;
90 case GDK_G:
91 scroll(tw, LOC_END, 1);
92 break;
93 case GDK_g:
94 scroll(tw, LOC_BEG, 1);
95 break;
96 case GDK_q:
97 gtk_main_quit();
98 break;
99 default:
100 break;
102 return 1;
105 struct txtwin *txtwin_alloc()
107 GtkWidget *window;
108 GtkWidget *vbox;
109 struct txtwin *tw = xmalloc(sizeof(struct txtwin));
110 memset(tw, 0, sizeof(*tw));
111 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
112 gtk_window_set_title(GTK_WINDOW(window), "CNOOR");
113 g_signal_connect(G_OBJECT(window), "destroy",
114 G_CALLBACK(on_window_destroy), NULL);
116 vbox = gtk_vbox_new(FALSE, 2);
117 gtk_container_add(GTK_CONTAINER(window), vbox);
119 /* create the textview */
120 tw->main = gtk_text_view_new();
121 gtk_box_pack_start(GTK_BOX(vbox), tw->main, 1, 1, 0);
122 gtk_signal_connect(GTK_OBJECT(tw->main), "key_press_event",
123 GTK_SIGNAL_FUNC(on_key_press), tw);
124 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tw->main),
125 GTK_WRAP_WORD);
126 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(tw->main), FALSE);
128 /* add the adjustment */
129 tw->adjst = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 9, 10));
130 gtk_widget_set_scroll_adjustments(tw->main, NULL, tw->adjst);
132 /* create the minibuffer */
133 tw->bar = gtk_entry_new();
134 gtk_box_pack_start(GTK_BOX(vbox), tw->bar, 0, 0, 0);
135 gtk_signal_connect(GTK_OBJECT(tw->bar), "key_press_event",
136 GTK_SIGNAL_FUNC(on_key_press), tw);
137 update_bar(tw);
139 gtk_widget_show_all(window);
140 return tw;
143 void txtwin_free(struct txtwin *tw)
145 free(tw);
148 void txtwin_loop(struct txtwin *tw)
150 gtk_main();
153 void txtwin_gtk_init(int argc, char **argv)
155 gtk_init(&argc, &argv);
158 static GtkTextBuffer *txtwin_buffer(struct txtwin *tw)
160 return gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->main));
163 void txtwin_append(struct txtwin *tw, char *s, char *tag)
165 GtkTextIter iter;
166 GtkTextBuffer *buf = txtwin_buffer(tw);
167 gtk_text_buffer_get_end_iter(buf, &iter);
168 gtk_text_buffer_insert_with_tags_by_name(buf, &iter, s, strlen(s),
169 tag, NULL);
172 void txtwin_tag(struct txtwin *tw, char *name, char *fg, char *bg, char *font)
174 GtkTextBuffer *buf = txtwin_buffer(tw);
175 gtk_text_buffer_create_tag(buf, name,
176 "foreground", fg,
177 "background", bg,
178 "font", font,
179 NULL);