6 #include <gdk/gdkkeysyms.h>
11 GtkWidget
*main
; /* a GtkTextView */
13 GtkWidget
*bar
; /* a GtkEntry */
14 int arg
; /* command arg */
17 static void on_window_destroy(GtkWidget
*widget
, gpointer data
)
31 static void update_bar(struct txtwin
*tw
)
33 int val
= gtk_adjustment_get_value(tw
->adjst
) +
34 gtk_adjustment_get_page_size(tw
->adjst
);
35 int max
= gtk_adjustment_get_upper(tw
->adjst
);
37 sprintf(msg
, "%d%%", val
* 100 / max
);
38 gtk_entry_set_text(GTK_ENTRY(tw
->bar
), msg
);
41 static int get_arg(struct txtwin
*tw
, int def
)
43 return tw
->arg
== 0 ? def
: tw
->arg
;
46 static void scroll(struct txtwin
*tw
, enum location loc
, int n
)
48 int val
= gtk_adjustment_get_value(tw
->adjst
);
49 int page
= gtk_adjustment_get_page_size(tw
->adjst
);
50 int end
= gtk_adjustment_get_upper(tw
->adjst
);
55 val
+= n
* gtk_adjustment_get_page_increment(tw
->adjst
);
58 val
+= n
* gtk_adjustment_get_step_increment(tw
->adjst
);
61 val
= get_arg(tw
, 0) ? 0 : max
;
64 val
= get_arg(tw
, 0) * end
/ 100 - page
;
78 gtk_adjustment_set_value(tw
->adjst
, val
);
82 static gboolean
on_key_press(GtkWidget
*widget
, GdkEventKey
*event
,
85 struct txtwin
*tw
= data
;
86 int mod
= event
->state
& gtk_accelerator_get_default_mod_mask();
87 if (mod
== GDK_CONTROL_MASK
) {
88 switch(event
->keyval
) {
90 scroll(tw
, LOC_PAGE
, 1);
93 scroll(tw
, LOC_PAGE
, -1);
96 gtk_widget_queue_draw(tw
->main
);
99 scroll(tw
, LOC_STEP
, 1);
102 scroll(tw
, LOC_STEP
, -1);
109 switch(event
->keyval
) {
112 scroll(tw
, LOC_STEP
, 1);
116 scroll(tw
, LOC_STEP
, -1);
119 scroll(tw
, LOC_LINE
, 1);
122 scroll(tw
, LOC_END
, 1);
125 scroll(tw
, LOC_BEG
, 1);
129 scroll(tw
, LOC_PAGE
, 1);
133 scroll(tw
, LOC_PAGE
, -1);
139 scroll(tw
, LOC_PERCENT
, 1);
145 if (isdigit(event
->keyval
))
146 tw
->arg
= tw
->arg
* 10 + event
->keyval
- '0';
152 static void on_size_allocate(GtkWidget
*w
, GtkAllocation
*a
, gpointer tw
)
157 struct txtwin
*txtwin_alloc()
161 struct txtwin
*tw
= xmalloc(sizeof(struct txtwin
));
162 memset(tw
, 0, sizeof(*tw
));
163 window
= gtk_window_new(GTK_WINDOW_TOPLEVEL
);
164 gtk_window_set_title(GTK_WINDOW(window
), "CNOOR");
165 g_signal_connect(G_OBJECT(window
), "destroy",
166 G_CALLBACK(on_window_destroy
), NULL
);
168 vbox
= gtk_vbox_new(FALSE
, 2);
169 gtk_container_add(GTK_CONTAINER(window
), vbox
);
171 /* create the textview */
172 tw
->main
= gtk_text_view_new();
173 gtk_box_pack_start(GTK_BOX(vbox
), tw
->main
, 1, 1, 0);
174 gtk_signal_connect(GTK_OBJECT(tw
->main
), "key_press_event",
175 GTK_SIGNAL_FUNC(on_key_press
), tw
);
176 gtk_signal_connect(GTK_OBJECT(window
), "size_allocate",
177 GTK_SIGNAL_FUNC(on_size_allocate
), tw
);
178 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tw
->main
),
180 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(tw
->main
), FALSE
);
182 /* add the adjustment */
183 tw
->adjst
= GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 9, 10));
184 gtk_widget_set_scroll_adjustments(tw
->main
, NULL
, tw
->adjst
);
186 /* create the minibuffer */
187 tw
->bar
= gtk_entry_new();
188 gtk_box_pack_start(GTK_BOX(vbox
), tw
->bar
, 0, 0, 0);
189 gtk_signal_connect(GTK_OBJECT(tw
->bar
), "key_press_event",
190 GTK_SIGNAL_FUNC(on_key_press
), tw
);
193 gtk_widget_set_size_request(window
, 800, 600);
194 gtk_window_set_default_size(GTK_WINDOW(window
), 1024, 768);
195 gtk_widget_show_all(window
);
199 void txtwin_free(struct txtwin
*tw
)
204 void txtwin_loop(struct txtwin
*tw
)
209 void txtwin_gtk_init(int argc
, char **argv
)
211 gtk_init(&argc
, &argv
);
214 static GtkTextBuffer
*txtwin_buffer(struct txtwin
*tw
)
216 return gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw
->main
));
219 void txtwin_append(struct txtwin
*tw
, char *s
, char *tag
)
222 GtkTextBuffer
*buf
= txtwin_buffer(tw
);
223 gtk_text_buffer_get_end_iter(buf
, &iter
);
224 gtk_text_buffer_insert_with_tags_by_name(buf
, &iter
, s
, strlen(s
),
228 void txtwin_tag(struct txtwin
*tw
, char *name
, char *fg
, char *bg
, char *font
)
230 GtkTextBuffer
*buf
= txtwin_buffer(tw
);
231 gtk_text_buffer_create_tag(buf
, name
,