Mercurial > geeqie
annotate src/ui_misc.c @ 1781:95a013ade7e2
Fix bug 2917164.
g_utf8_collate_key_for_filename() don't give sort order one
may expect. Using g_utf8_collate_key() make things closer
to many other programs output (ie. ls and gqview).
Thanks to Michael pointing this out.
author | zas_ |
---|---|
date | Sat, 19 Dec 2009 12:53:20 +0000 |
parents | 89dedc61b1bd |
children | 956aab097ea7 |
rev | line source |
---|---|
9 | 1 /* |
2 * (SLIK) SimpLIstic sKin functions | |
3 * (C) 2004 John Ellis | |
1284 | 4 * Copyright (C) 2008 - 2009 The Geeqie Team |
9 | 5 * |
6 * Author: John Ellis | |
7 * | |
8 * This software is released under the GNU General Public License (GNU GPL). | |
9 * Please read the included file COPYING for more information. | |
10 * This software comes with no warranty of any kind, use at your own risk! | |
11 */ | |
12 | |
13 #ifdef HAVE_CONFIG_H | |
14 # include "config.h" | |
15 #endif | |
16 #include "intl.h" | |
17 | |
18 #include <stdio.h> | |
19 #include <stdlib.h> | |
20 #include <string.h> | |
21 | |
22 #include <gtk/gtk.h> | |
23 #include <gdk/gdkkeysyms.h> | |
24 | |
448
a73cc0fa14d0
Use explicit names for mouse buttons instead of numbers.
zas_
parents:
442
diff
changeset
|
25 #include "main.h" |
9 | 26 #include "ui_misc.h" |
27 | |
902 | 28 #include "history_list.h" |
9 | 29 |
30 | |
31 /* | |
32 *----------------------------------------------------------------------------- | |
33 * widget and layout utilities | |
34 *----------------------------------------------------------------------------- | |
35 */ | |
36 | |
1448 | 37 GtkWidget *pref_box_new(GtkWidget *parent_box, gboolean fill, |
38 GtkOrientation orientation, gboolean padding) | |
9 | 39 { |
40 GtkWidget *box; | |
41 | |
42 if (orientation == GTK_ORIENTATION_HORIZONTAL) | |
43 { | |
44 box = gtk_hbox_new(FALSE, padding); | |
45 } | |
46 else | |
47 { | |
48 box = gtk_vbox_new(FALSE, padding); | |
49 } | |
50 | |
51 gtk_box_pack_start(GTK_BOX(parent_box), box, fill, fill, 0); | |
52 gtk_widget_show(box); | |
53 | |
54 return box; | |
55 } | |
56 | |
1448 | 57 GtkWidget *pref_group_new(GtkWidget *parent_box, gboolean fill, |
9 | 58 const gchar *text, GtkOrientation orientation) |
59 { | |
60 GtkWidget *box; | |
61 GtkWidget *vbox; | |
62 GtkWidget *hbox; | |
63 GtkWidget *label; | |
64 | |
65 vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP); | |
66 | |
67 /* add additional spacing if necessary */ | |
68 if (GTK_IS_VBOX(parent_box) && GTK_BOX(parent_box)->children != NULL) | |
69 { | |
70 pref_spacer(vbox, PREF_PAD_GROUP - PREF_PAD_GAP); | |
71 } | |
72 | |
73 gtk_box_pack_start(GTK_BOX(parent_box), vbox, fill, fill, 0); | |
74 gtk_widget_show(vbox); | |
75 | |
76 label = gtk_label_new(text); | |
77 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); | |
78 pref_label_bold(label, TRUE, FALSE); | |
79 | |
80 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
81 gtk_widget_show(label); | |
82 | |
83 hbox = gtk_hbox_new(FALSE, PREF_PAD_INDENT); | |
84 gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); | |
85 gtk_widget_show(hbox); | |
86 | |
87 /* indent using empty box */ | |
88 pref_spacer(hbox, 0); | |
89 | |
90 if (orientation == GTK_ORIENTATION_HORIZONTAL) | |
91 { | |
92 box = gtk_hbox_new(FALSE, PREF_PAD_SPACE); | |
93 } | |
94 else | |
95 { | |
96 box = gtk_vbox_new(FALSE, PREF_PAD_GAP); | |
97 } | |
98 gtk_box_pack_start(GTK_BOX(hbox), box, TRUE, TRUE, 0); | |
99 gtk_widget_show(box); | |
100 | |
101 g_object_set_data(G_OBJECT(box), "pref_group", vbox); | |
102 | |
103 return box; | |
104 } | |
105 | |
106 GtkWidget *pref_group_parent(GtkWidget *child) | |
107 { | |
108 GtkWidget *parent; | |
109 | |
110 parent = child; | |
111 while (parent) | |
112 { | |
113 GtkWidget *group; | |
114 | |
115 group = g_object_get_data(G_OBJECT(parent), "pref_group"); | |
116 if (group && GTK_IS_WIDGET(group)) return group; | |
117 | |
118 parent = gtk_widget_get_parent(parent); | |
119 } | |
120 | |
121 return child; | |
122 } | |
123 | |
1448 | 124 GtkWidget *pref_frame_new(GtkWidget *parent_box, gboolean fill, |
9 | 125 const gchar *text, |
1448 | 126 GtkOrientation orientation, gboolean padding) |
9 | 127 { |
128 GtkWidget *box; | |
129 GtkWidget *frame = NULL; | |
130 | |
131 frame = gtk_frame_new(text); | |
132 gtk_box_pack_start(GTK_BOX(parent_box), frame, fill, fill, 0); | |
133 gtk_widget_show(frame); | |
134 | |
135 if (orientation == GTK_ORIENTATION_HORIZONTAL) | |
136 { | |
137 box = gtk_hbox_new(FALSE, padding); | |
138 } | |
139 else | |
140 { | |
141 box = gtk_vbox_new(FALSE, padding); | |
142 } | |
143 gtk_container_add(GTK_CONTAINER(frame), box); | |
144 gtk_container_set_border_width(GTK_CONTAINER(box), PREF_PAD_BORDER); | |
145 gtk_widget_show(box); | |
146 | |
147 return box; | |
148 } | |
149 | |
1448 | 150 GtkWidget *pref_spacer(GtkWidget *parent_box, gboolean padding) |
9 | 151 { |
152 GtkWidget *spacer; | |
153 | |
154 spacer = gtk_hbox_new(FALSE, 0); | |
155 gtk_box_pack_start(GTK_BOX(parent_box), spacer, FALSE, FALSE, padding / 2); | |
156 gtk_widget_show(spacer); | |
157 | |
158 return spacer; | |
159 } | |
160 | |
1448 | 161 GtkWidget *pref_line(GtkWidget *parent_box, gboolean padding) |
9 | 162 { |
163 GtkWidget *spacer; | |
164 | |
165 if (GTK_IS_HBOX(parent_box)) | |
166 { | |
167 spacer = gtk_vseparator_new(); | |
168 } | |
169 else | |
170 { | |
171 spacer = gtk_hseparator_new(); | |
172 } | |
173 | |
174 gtk_box_pack_start(GTK_BOX(parent_box), spacer, FALSE, FALSE, padding / 2); | |
175 gtk_widget_show(spacer); | |
176 | |
177 return spacer; | |
178 } | |
179 | |
180 GtkWidget *pref_label_new(GtkWidget *parent_box, const gchar *text) | |
181 { | |
182 GtkWidget *label; | |
183 | |
184 label = gtk_label_new(text); | |
185 gtk_box_pack_start(GTK_BOX(parent_box), label, FALSE, FALSE, 0); | |
186 gtk_widget_show(label); | |
187 | |
188 return label; | |
189 } | |
190 | |
191 GtkWidget *pref_label_new_mnemonic(GtkWidget *parent_box, const gchar *text, GtkWidget *widget) | |
192 { | |
193 GtkWidget *label; | |
194 | |
195 label = gtk_label_new_with_mnemonic(text); | |
196 gtk_label_set_mnemonic_widget(GTK_LABEL(label), widget); | |
197 gtk_box_pack_start(GTK_BOX(parent_box), label, FALSE, FALSE, 0); | |
198 gtk_widget_show(label); | |
199 | |
200 return label; | |
201 } | |
202 | |
1448 | 203 void pref_label_bold(GtkWidget *label, gboolean bold, gboolean increase_size) |
9 | 204 { |
205 PangoAttrList *pal; | |
206 PangoAttribute *pa; | |
207 | |
208 if (!bold && !increase_size) return; | |
209 | |
210 pal = pango_attr_list_new(); | |
211 | |
212 if (bold) | |
213 { | |
214 pa = pango_attr_weight_new(PANGO_WEIGHT_BOLD); | |
215 pa->start_index = 0; | |
216 pa->end_index = G_MAXINT; | |
217 pango_attr_list_insert(pal, pa); | |
218 } | |
219 | |
220 if (increase_size) | |
221 { | |
222 pa = pango_attr_scale_new(PANGO_SCALE_LARGE); | |
223 pa->start_index = 0; | |
224 pa->end_index = G_MAXINT; | |
225 pango_attr_list_insert(pal, pa); | |
226 } | |
227 | |
228 gtk_label_set_attributes(GTK_LABEL(label), pal); | |
229 pango_attr_list_unref(pal); | |
230 } | |
231 | |
232 GtkWidget *pref_button_new(GtkWidget *parent_box, const gchar *stock_id, | |
1448 | 233 const gchar *text, gboolean hide_stock_text, |
9 | 234 GCallback func, gpointer data) |
235 { | |
236 GtkWidget *button; | |
237 | |
238 if (stock_id && !text && !hide_stock_text) | |
239 { | |
240 button = gtk_button_new_from_stock(stock_id); | |
241 } | |
242 else | |
243 { | |
244 GtkWidget *image = NULL; | |
245 GtkWidget *label = NULL; | |
246 | |
247 button = gtk_button_new(); | |
248 | |
249 if (stock_id) image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_BUTTON); | |
250 if (text) | |
251 { | |
252 label = gtk_label_new_with_mnemonic(text); | |
253 gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5); | |
254 gtk_label_set_mnemonic_widget(GTK_LABEL(label), button); | |
255 } | |
256 | |
257 if (image && label) | |
258 { | |
259 GtkWidget *align; | |
260 GtkWidget *hbox; | |
261 | |
513
985fdfebd89e
Remove whitespace between function name and first parenthesis for the sake of consistency. (pass 2)
zas_
parents:
475
diff
changeset
|
262 hbox = gtk_hbox_new(FALSE, PREF_PAD_BUTTON_ICON_GAP); |
9 | 263 |
264 align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0); | |
265 gtk_container_add(GTK_CONTAINER(button), align); | |
266 gtk_widget_show(align); | |
267 | |
268 gtk_container_add(GTK_CONTAINER(align), hbox); | |
269 gtk_widget_show(hbox); | |
270 | |
271 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); | |
272 gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
273 } | |
274 else | |
275 { | |
276 if (image) | |
277 { | |
278 gtk_container_add(GTK_CONTAINER(button), image); | |
279 } | |
280 else if (label) | |
281 { | |
282 gtk_container_add(GTK_CONTAINER(button), label); | |
283 } | |
284 } | |
285 | |
286 if (image) gtk_widget_show(image); | |
287 if (label) gtk_widget_show(label); | |
288 } | |
289 | |
290 if (func) g_signal_connect(G_OBJECT(button), "clicked", func, data); | |
291 | |
292 if (parent_box) | |
293 { | |
294 gtk_box_pack_start(GTK_BOX(parent_box), button, FALSE, FALSE, 0); | |
295 gtk_widget_show(button); | |
296 } | |
297 | |
298 return button; | |
299 } | |
300 | |
1448 | 301 static GtkWidget *real_pref_checkbox_new(GtkWidget *parent_box, const gchar *text, gboolean mnemonic_text, |
302 gboolean active, GCallback func, gpointer data) | |
9 | 303 { |
304 GtkWidget *button; | |
305 | |
306 if (mnemonic_text) | |
307 { | |
308 button = gtk_check_button_new_with_mnemonic(text); | |
309 } | |
310 else | |
311 { | |
312 button = gtk_check_button_new_with_label(text); | |
313 } | |
314 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), active); | |
315 if (func) g_signal_connect(G_OBJECT(button), "clicked", func, data); | |
316 | |
317 gtk_box_pack_start(GTK_BOX(parent_box), button, FALSE, FALSE, 0); | |
318 gtk_widget_show(button); | |
319 | |
320 return button; | |
321 } | |
322 | |
1448 | 323 GtkWidget *pref_checkbox_new(GtkWidget *parent_box, const gchar *text, gboolean active, |
9 | 324 GCallback func, gpointer data) |
325 { | |
326 return real_pref_checkbox_new(parent_box, text, FALSE, active, func, data); | |
327 } | |
328 | |
1448 | 329 GtkWidget *pref_checkbox_new_mnemonic(GtkWidget *parent_box, const gchar *text, gboolean active, |
9 | 330 GCallback func, gpointer data) |
331 { | |
332 return real_pref_checkbox_new(parent_box, text, TRUE, active, func, data); | |
333 } | |
334 | |
335 static void pref_checkbox_int_cb(GtkWidget *widget, gpointer data) | |
336 { | |
1448 | 337 gboolean *result = data; |
9 | 338 |
339 *result = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); | |
340 } | |
341 | |
1448 | 342 GtkWidget *pref_checkbox_new_int(GtkWidget *parent_box, const gchar *text, gboolean active, |
343 gboolean *result) | |
9 | 344 { |
345 GtkWidget *button; | |
346 | |
347 button = pref_checkbox_new(parent_box, text, active, | |
348 G_CALLBACK(pref_checkbox_int_cb), result); | |
349 *result = active; | |
350 | |
351 return button; | |
352 } | |
353 | |
354 static void pref_checkbox_link_sensitivity_cb(GtkWidget *button, gpointer data) | |
355 { | |
356 GtkWidget *widget = data; | |
357 | |
358 gtk_widget_set_sensitive(widget, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); | |
359 } | |
360 | |
361 void pref_checkbox_link_sensitivity(GtkWidget *button, GtkWidget *widget) | |
362 { | |
363 g_signal_connect(G_OBJECT(button), "toggled", | |
364 G_CALLBACK(pref_checkbox_link_sensitivity_cb), widget); | |
365 | |
366 pref_checkbox_link_sensitivity_cb(button, widget); | |
367 } | |
368 | |
369 static void pref_checkbox_link_sensitivity_swap_cb(GtkWidget *button, gpointer data) | |
370 { | |
371 GtkWidget *widget = data; | |
372 | |
373 gtk_widget_set_sensitive(widget, !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); | |
374 } | |
375 | |
376 void pref_checkbox_link_sensitivity_swap(GtkWidget *button, GtkWidget *widget) | |
377 { | |
378 g_signal_connect(G_OBJECT(button), "toggled", | |
379 G_CALLBACK(pref_checkbox_link_sensitivity_swap_cb), widget); | |
380 | |
381 pref_checkbox_link_sensitivity_swap_cb(button, widget); | |
382 } | |
383 | |
384 static GtkWidget *real_pref_radiobutton_new(GtkWidget *parent_box, GtkWidget *sibling, | |
1448 | 385 const gchar *text, gboolean mnemonic_text, gboolean active, |
9 | 386 GCallback func, gpointer data) |
387 { | |
388 GtkWidget *button; | |
1001 | 389 GSList *group; |
9 | 390 |
391 if (sibling) | |
392 { | |
393 group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(sibling)); | |
394 } | |
395 else | |
396 { | |
397 group = NULL; | |
398 } | |
399 | |
400 if (mnemonic_text) | |
401 { | |
402 button = gtk_radio_button_new_with_mnemonic(group, text); | |
403 } | |
404 else | |
405 { | |
406 button = gtk_radio_button_new_with_label(group, text); | |
407 } | |
408 | |
409 if (active) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), active); | |
410 if (func) g_signal_connect(G_OBJECT(button), "clicked", func, data); | |
411 | |
412 gtk_box_pack_start(GTK_BOX(parent_box), button, FALSE, FALSE, 0); | |
413 gtk_widget_show(button); | |
414 | |
415 return button; | |
416 } | |
417 | |
418 GtkWidget *pref_radiobutton_new(GtkWidget *parent_box, GtkWidget *sibling, | |
1448 | 419 const gchar *text, gboolean active, |
9 | 420 GCallback func, gpointer data) |
421 { | |
422 return real_pref_radiobutton_new(parent_box, sibling, text, FALSE, active, func, data); | |
423 } | |
424 | |
425 GtkWidget *pref_radiobutton_new_mnemonic(GtkWidget *parent_box, GtkWidget *sibling, | |
1448 | 426 const gchar *text, gboolean active, |
9 | 427 GCallback func, gpointer data) |
428 { | |
429 return real_pref_radiobutton_new(parent_box, sibling, text, TRUE, active, func, data); | |
430 } | |
431 | |
432 #define PREF_RADIO_VALUE_KEY "pref_radio_value" | |
433 | |
434 static void pref_radiobutton_int_cb(GtkWidget *widget, gpointer data) | |
435 { | |
1448 | 436 gboolean *result = data; |
9 | 437 |
438 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) | |
439 { | |
440 *result = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), PREF_RADIO_VALUE_KEY)); | |
441 } | |
442 } | |
443 | |
444 GtkWidget *pref_radiobutton_new_int(GtkWidget *parent_box, GtkWidget *sibling, | |
1448 | 445 const gchar *text, gboolean active, |
446 gboolean *result, gboolean value, | |
9 | 447 GCallback func, gpointer data) |
448 { | |
449 GtkWidget *button; | |
450 | |
451 button = pref_radiobutton_new(parent_box, sibling, text, active, | |
452 G_CALLBACK(pref_radiobutton_int_cb), result); | |
453 g_object_set_data(G_OBJECT(button), PREF_RADIO_VALUE_KEY, GINT_TO_POINTER(value)); | |
454 if (active) *result = value; | |
455 | |
456 return button; | |
457 } | |
458 | |
459 static GtkWidget *real_pref_spin_new(GtkWidget *parent_box, const gchar *text, const gchar *suffix, | |
1448 | 460 gboolean mnemonic_text, |
9 | 461 gdouble min, gdouble max, gdouble step, gint digits, |
462 gdouble value, | |
463 GCallback func, gpointer data) | |
464 { | |
465 GtkWidget *spin; | |
466 GtkWidget *box; | |
467 GtkWidget *label; | |
468 | |
469 box = pref_box_new(parent_box, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE); | |
470 | |
471 spin = gtk_spin_button_new_with_range(min, max, step); | |
472 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), digits); | |
473 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), value); | |
474 | |
475 if (func) | |
476 { | |
477 g_signal_connect(G_OBJECT(spin), "value_changed", G_CALLBACK(func), data); | |
478 } | |
479 | |
480 if (text) | |
481 { | |
482 if (mnemonic_text) | |
483 { | |
484 label = pref_label_new_mnemonic(box, text, spin); | |
485 } | |
486 else | |
487 { | |
488 label = pref_label_new(box, text); | |
489 } | |
490 pref_link_sensitivity(label, spin); | |
491 } | |
492 | |
493 gtk_box_pack_start(GTK_BOX(box), spin, FALSE, FALSE, 0); | |
494 gtk_widget_show(spin); | |
495 | |
496 /* perhaps this should only be PREF_PAD_GAP distance from spinbutton ? */ | |
497 if (suffix) | |
498 { | |
499 label = pref_label_new(box, suffix); | |
500 pref_link_sensitivity(label, spin); | |
501 } | |
502 | |
503 return spin; | |
504 } | |
505 | |
506 GtkWidget *pref_spin_new(GtkWidget *parent_box, const gchar *text, const gchar *suffix, | |
507 gdouble min, gdouble max, gdouble step, gint digits, | |
508 gdouble value, | |
509 GCallback func, gpointer data) | |
510 { | |
511 return real_pref_spin_new(parent_box, text, suffix, FALSE, | |
512 min, max, step, digits, value, func, data); | |
513 } | |
514 | |
515 GtkWidget *pref_spin_new_mnemonic(GtkWidget *parent_box, const gchar *text, const gchar *suffix, | |
516 gdouble min, gdouble max, gdouble step, gint digits, | |
517 gdouble value, | |
518 GCallback func, gpointer data) | |
519 { | |
520 return real_pref_spin_new(parent_box, text, suffix, TRUE, | |
521 min, max, step, digits, value, func, data); | |
522 } | |
523 | |
524 static void pref_spin_int_cb(GtkWidget *widget, gpointer data) | |
525 { | |
526 gint *var = data; | |
527 *var = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); | |
528 } | |
529 | |
530 GtkWidget *pref_spin_new_int(GtkWidget *parent_box, const gchar *text, const gchar *suffix, | |
531 gint min, gint max, gint step, | |
532 gint value, gint *value_var) | |
533 { | |
534 *value_var = value; | |
535 return pref_spin_new(parent_box, text, suffix, | |
536 (gdouble)min, (gdouble)max, (gdouble)step, 0, | |
537 value, | |
538 G_CALLBACK(pref_spin_int_cb), value_var); | |
539 } | |
540 | |
541 #if 0 | |
542 void pref_spin_set_blocking(GtkWidget *spin, gdouble value, gpointer block_data) | |
543 { | |
544 g_signal_handlers_block_matched(G_OBJECT(spin), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, block_data); | |
545 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), value); | |
546 g_signal_handlers_unblock_matched(G_OBJECT(spin), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, block_data); | |
547 } | |
548 #endif | |
549 | |
550 static void pref_link_sensitivity_cb(GtkWidget *watch, GtkStateType prev_state, gpointer data) | |
551 { | |
552 GtkWidget *widget = data; | |
553 | |
554 gtk_widget_set_sensitive(widget, GTK_WIDGET_IS_SENSITIVE(watch)); | |
555 } | |
556 | |
557 void pref_link_sensitivity(GtkWidget *widget, GtkWidget *watch) | |
558 { | |
559 g_signal_connect(G_OBJECT(watch), "state_changed", | |
560 G_CALLBACK(pref_link_sensitivity_cb), widget); | |
561 } | |
562 | |
563 void pref_signal_block_data(GtkWidget *widget, gpointer data) | |
564 { | |
565 g_signal_handlers_block_matched(widget, G_SIGNAL_MATCH_DATA, | |
566 0, 0, NULL, NULL, data); | |
567 } | |
568 | |
569 void pref_signal_unblock_data(GtkWidget *widget, gpointer data) | |
570 { | |
571 g_signal_handlers_unblock_matched(widget, G_SIGNAL_MATCH_DATA, | |
572 0, 0, NULL, NULL, data); | |
573 } | |
574 | |
575 GtkWidget *pref_table_new(GtkWidget *parent_box, gint columns, gint rows, | |
1448 | 576 gboolean homogeneous, gboolean fill) |
9 | 577 { |
578 GtkWidget *table; | |
579 | |
1448 | 580 table = gtk_table_new(rows, columns, homogeneous); |
9 | 581 gtk_table_set_row_spacings(GTK_TABLE(table), PREF_PAD_GAP); |
582 gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_SPACE); | |
583 | |
584 if (parent_box) | |
585 { | |
586 gtk_box_pack_start(GTK_BOX(parent_box), table, fill, fill, 0); | |
587 gtk_widget_show(table); | |
588 } | |
589 | |
590 return table; | |
591 } | |
592 | |
593 GtkWidget *pref_table_box(GtkWidget *table, gint column, gint row, | |
594 GtkOrientation orientation, const gchar *text) | |
595 { | |
596 GtkWidget *box; | |
597 GtkWidget *shell; | |
598 | |
599 if (text) | |
600 { | |
601 shell = gtk_vbox_new(FALSE, 0); | |
602 box = pref_group_new(shell, TRUE, text, orientation); | |
603 } | |
604 else | |
605 { | |
606 if (orientation == GTK_ORIENTATION_HORIZONTAL) | |
607 { | |
608 box = gtk_hbox_new(FALSE, PREF_PAD_SPACE); | |
609 } | |
610 else | |
611 { | |
612 box = gtk_vbox_new(FALSE, PREF_PAD_GAP); | |
613 } | |
614 shell = box; | |
615 } | |
616 | |
617 gtk_table_attach(GTK_TABLE(table), shell, column, column + 1, row, row + 1, | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
88
diff
changeset
|
618 GTK_EXPAND | GTK_FILL, 0, 0, 0); |
9 | 619 |
620 gtk_widget_show(shell); | |
621 | |
622 return box; | |
623 } | |
624 | |
625 GtkWidget *pref_table_label(GtkWidget *table, gint column, gint row, | |
626 const gchar *text, gfloat alignment) | |
627 { | |
628 GtkWidget *label; | |
629 GtkWidget *align; | |
630 | |
631 align = gtk_alignment_new(alignment, 0.50, 0.0, 0.0); | |
632 gtk_table_attach(GTK_TABLE(table), align, column, column + 1, row, row + 1, | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
88
diff
changeset
|
633 GTK_FILL, 0, 0, 0); |
9 | 634 gtk_widget_show(align); |
635 label = gtk_label_new(text); | |
636 gtk_container_add(GTK_CONTAINER(align), label); | |
637 gtk_widget_show(label); | |
638 | |
639 return label; | |
640 } | |
641 | |
642 GtkWidget *pref_table_button(GtkWidget *table, gint column, gint row, | |
1448 | 643 const gchar *stock_id, const gchar *text, gboolean hide_stock_text, |
9 | 644 GCallback func, gpointer data) |
645 { | |
646 GtkWidget *button; | |
647 | |
648 button = pref_button_new(NULL, stock_id, text, hide_stock_text, func, data); | |
649 gtk_table_attach(GTK_TABLE(table), button, column, column + 1, row, row + 1, | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
88
diff
changeset
|
650 GTK_FILL, 0, 0, 0); |
9 | 651 gtk_widget_show(button); |
652 | |
653 return button; | |
654 } | |
655 | |
656 #if 0 | |
657 static GtkWidget *pref_table_checkbox(GtkWidget *table, gint column, gint row, | |
658 const gchar *text, gint active, | |
659 GCallback func, gpointer data) | |
660 { | |
661 GtkWidget *button; | |
662 | |
663 button = gtk_check_button_new_with_label(text); | |
664 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), active); | |
665 if (func) g_signal_connect(G_OBJECT(button), "clicked", func, data); | |
666 | |
667 gtk_table_attach(GTK_TABLE(table), button, column, column + 1, row, row + 1, | |
668 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); | |
669 gtk_widget_show(button); | |
670 | |
671 return button; | |
672 } | |
673 #endif | |
674 | |
675 GtkWidget *pref_table_spin(GtkWidget *table, gint column, gint row, | |
676 const gchar *text, const gchar *suffix, | |
677 gdouble min, gdouble max, gdouble step, gint digits, | |
678 gdouble value, | |
679 GCallback func, gpointer data) | |
680 { | |
681 GtkWidget *spin; | |
682 GtkWidget *box; | |
683 GtkWidget *label; | |
684 | |
685 spin = gtk_spin_button_new_with_range(min, max, step); | |
686 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), digits); | |
687 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), value); | |
688 if (func) | |
689 { | |
690 g_signal_connect(G_OBJECT(spin), "value_changed", G_CALLBACK(func), data); | |
691 } | |
692 | |
693 if (text) | |
694 { | |
695 label = pref_table_label(table, column, row, text, 1.0); | |
696 pref_link_sensitivity(label, spin); | |
697 column++; | |
698 } | |
699 | |
700 if (suffix) | |
701 { | |
702 box = gtk_hbox_new(FALSE, PREF_PAD_SPACE); | |
703 gtk_box_pack_start(GTK_BOX(box), spin, FALSE, FALSE, 0); | |
704 gtk_widget_show(spin); | |
705 | |
706 label = pref_label_new(box, suffix); | |
707 pref_link_sensitivity(label, spin); | |
708 } | |
709 else | |
710 { | |
711 box = spin; | |
712 } | |
713 | |
714 gtk_table_attach(GTK_TABLE(table), box, column, column + 1, row, row + 1, | |
715 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); | |
716 gtk_widget_show(box); | |
717 | |
718 return spin; | |
719 } | |
720 | |
1043 | 721 #if ! GTK_CHECK_VERSION(2,12,0) |
722 | |
9 | 723 static void pref_toolbar_destroy_cb(GtkWidget *widget, gpointer data) |
724 { | |
725 GtkTooltips *tips = data; | |
726 | |
727 g_object_unref(G_OBJECT(tips)); | |
728 } | |
729 | |
1043 | 730 #endif |
731 | |
9 | 732 GtkWidget *pref_toolbar_new(GtkWidget *parent_box, GtkToolbarStyle style) |
733 { | |
734 GtkWidget *tbar; | |
1043 | 735 #if ! GTK_CHECK_VERSION(2,12,0) |
9 | 736 GtkTooltips *tips; |
1043 | 737 #endif |
738 | |
9 | 739 tbar = gtk_toolbar_new(); |
740 gtk_toolbar_set_style(GTK_TOOLBAR(tbar), style); | |
741 | |
742 if (parent_box) | |
743 { | |
744 gtk_box_pack_start(GTK_BOX(parent_box), tbar, FALSE, FALSE, 0); | |
745 gtk_widget_show(tbar); | |
746 } | |
747 | |
1043 | 748 #if ! GTK_CHECK_VERSION(2,12,0) |
9 | 749 tips = gtk_tooltips_new(); |
88
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
750 |
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
751 /* take ownership of tooltips */ |
1043 | 752 # ifdef GTK_OBJECT_FLOATING |
88
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
753 /* GTK+ < 2.10 */ |
9 | 754 g_object_ref(G_OBJECT(tips)); |
88
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
755 gtk_object_sink(GTK_OBJECT(tips)); |
1043 | 756 # else |
88
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
757 /* GTK+ >= 2.10 */ |
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
758 g_object_ref_sink(G_OBJECT(tips)); |
1043 | 759 # endif |
88
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
760 |
9 | 761 g_object_set_data(G_OBJECT(tbar), "tooltips", tips); |
762 g_signal_connect(G_OBJECT(tbar), "destroy", | |
763 G_CALLBACK(pref_toolbar_destroy_cb), tips); | |
764 | |
765 gtk_tooltips_enable(tips); | |
1043 | 766 #endif |
9 | 767 |
768 return tbar; | |
769 } | |
770 | |
41
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
771 GtkWidget *pref_toolbar_button(GtkWidget *toolbar, |
1448 | 772 const gchar *stock_id, const gchar *label, gboolean toggle, |
9 | 773 const gchar *description, |
774 GCallback func, gpointer data) | |
775 { | |
776 GtkWidget *item; | |
777 | |
41
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
778 if (toggle) |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
779 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
780 if (stock_id) |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
781 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
782 item = GTK_WIDGET(gtk_toggle_tool_button_new_from_stock(stock_id)); |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
783 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
784 else |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
785 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
786 item = GTK_WIDGET(gtk_toggle_tool_button_new()); |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
787 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
788 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
789 else |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
790 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
791 if (stock_id) |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
792 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
793 item = GTK_WIDGET(gtk_tool_button_new_from_stock(stock_id)); |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
794 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
795 else |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
796 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
797 item = GTK_WIDGET(gtk_tool_button_new(NULL, NULL)); |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
798 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
799 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
800 gtk_tool_button_set_use_underline(GTK_TOOL_BUTTON(item), TRUE); |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
801 |
9 | 802 if (label) gtk_tool_button_set_label(GTK_TOOL_BUTTON(item), label); |
803 | |
804 if (func) g_signal_connect(item, "clicked", func, data); | |
805 gtk_container_add(GTK_CONTAINER(toolbar), item); | |
806 gtk_widget_show(item); | |
807 | |
808 if (description) | |
809 { | |
1043 | 810 |
811 #if GTK_CHECK_VERSION(2,12,0) | |
812 | |
1044 | 813 gtk_widget_set_tooltip_text(item, description); |
1043 | 814 |
815 #else | |
9 | 816 GtkTooltips *tips; |
817 | |
818 tips = g_object_get_data(G_OBJECT(toolbar), "tooltips"); | |
819 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), tips, description, NULL); | |
1043 | 820 #endif |
821 } | |
9 | 822 |
823 return item; | |
824 } | |
825 | |
41
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
826 void pref_toolbar_button_set_icon(GtkWidget *button, GtkWidget *widget, const gchar *stock_id) |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
827 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
828 if (widget) |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
829 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
830 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(button), widget); |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
831 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
832 else if (stock_id) |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
833 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
834 gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(button), stock_id); |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
835 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
836 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
837 |
9 | 838 GtkWidget *pref_toolbar_spacer(GtkWidget *toolbar) |
839 { | |
840 GtkWidget *item; | |
841 | |
842 item = GTK_WIDGET(gtk_separator_tool_item_new()); | |
843 gtk_container_add(GTK_CONTAINER(toolbar), item); | |
844 gtk_widget_show(item); | |
845 | |
846 return item; | |
847 } | |
848 | |
849 | |
850 /* | |
851 *----------------------------------------------------------------------------- | |
852 * date selection entry | |
853 *----------------------------------------------------------------------------- | |
854 */ | |
855 | |
856 #define DATE_SELECION_KEY "date_selection_data" | |
857 | |
858 | |
859 typedef struct _DateSelection DateSelection; | |
860 struct _DateSelection | |
861 { | |
862 GtkWidget *box; | |
863 | |
864 GtkWidget *spin_d; | |
865 GtkWidget *spin_m; | |
866 GtkWidget *spin_y; | |
867 | |
868 GtkWidget *button; | |
869 | |
870 GtkWidget *window; | |
871 GtkWidget *calendar; | |
872 }; | |
873 | |
874 | |
875 static void date_selection_popup_hide(DateSelection *ds) | |
876 { | |
877 if (!ds->window) return; | |
878 | |
879 if (GTK_WIDGET_HAS_GRAB(ds->window)) | |
880 { | |
881 gtk_grab_remove(ds->window); | |
882 gdk_keyboard_ungrab(GDK_CURRENT_TIME); | |
883 gdk_pointer_ungrab(GDK_CURRENT_TIME); | |
884 } | |
885 | |
886 gtk_widget_hide(ds->window); | |
887 | |
888 gtk_widget_destroy(ds->window); | |
889 ds->window = NULL; | |
890 ds->calendar = NULL; | |
891 | |
892 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ds->button), FALSE); | |
893 } | |
894 | |
1448 | 895 static gboolean date_selection_popup_release_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) |
9 | 896 { |
897 DateSelection *ds = data; | |
898 | |
899 date_selection_popup_hide(ds); | |
900 return TRUE; | |
901 } | |
902 | |
1448 | 903 static gboolean date_selection_popup_press_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) |
9 | 904 { |
905 DateSelection *ds = data; | |
906 gint x, y; | |
907 gint w, h; | |
908 gint xr, yr; | |
909 | |
910 xr = (gint)event->x_root; | |
911 yr = (gint)event->y_root; | |
912 | |
913 gdk_window_get_origin(ds->window->window, &x, &y); | |
914 gdk_drawable_get_size(ds->window->window, &w, &h); | |
915 | |
916 if (xr < x || yr < y || xr > x + w || yr > y + h) | |
917 { | |
918 g_signal_connect(G_OBJECT(ds->window), "button_release_event", | |
919 G_CALLBACK(date_selection_popup_release_cb), ds); | |
920 return TRUE; | |
921 } | |
922 | |
923 return FALSE; | |
924 } | |
925 | |
926 static void date_selection_popup_sync(DateSelection *ds) | |
927 { | |
64
04ff0df3ad2f
Mon Aug 15 17:13:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
928 guint day, month, year; |
9 | 929 |
930 gtk_calendar_get_date(GTK_CALENDAR(ds->calendar), &year, &month, &day); | |
931 date_selection_set(ds->box, day, month + 1, year); | |
932 } | |
933 | |
1448 | 934 static gboolean date_selection_popup_keypress_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) |
9 | 935 { |
936 DateSelection *ds = data; | |
937 | |
938 switch (event->keyval) | |
939 { | |
940 case GDK_Return: | |
941 case GDK_KP_Enter: | |
942 case GDK_Tab: | |
943 case GDK_ISO_Left_Tab: | |
944 date_selection_popup_sync(ds); | |
945 date_selection_popup_hide(ds); | |
946 break; | |
947 case GDK_Escape: | |
948 date_selection_popup_hide(ds); | |
949 break; | |
950 default: | |
951 break; | |
952 } | |
953 | |
954 return FALSE; | |
955 } | |
956 | |
957 static void date_selection_day_cb(GtkWidget *widget, gpointer data) | |
958 { | |
959 DateSelection *ds = data; | |
960 | |
961 date_selection_popup_sync(ds); | |
962 } | |
963 | |
964 static void date_selection_doubleclick_cb(GtkWidget *widget, gpointer data) | |
965 { | |
966 DateSelection *ds = data; | |
967 | |
968 date_selection_popup_hide(ds); | |
969 } | |
970 | |
971 static void date_selection_popup(DateSelection *ds) | |
972 { | |
973 gint x, y; | |
974 gint wx, wy; | |
975 gint day, month, year; | |
976 | |
977 if (ds->window) return; | |
978 | |
979 ds->window = gtk_window_new(GTK_WINDOW_POPUP); | |
980 gtk_window_set_resizable(GTK_WINDOW(ds->window), FALSE); | |
981 g_signal_connect(G_OBJECT(ds->window), "button_press_event", | |
982 G_CALLBACK(date_selection_popup_press_cb), ds); | |
983 g_signal_connect(G_OBJECT(ds->window), "key_press_event", | |
984 G_CALLBACK(date_selection_popup_keypress_cb), ds); | |
985 | |
986 ds->calendar = gtk_calendar_new(); | |
987 gtk_container_add(GTK_CONTAINER(ds->window), ds->calendar); | |
988 gtk_widget_show(ds->calendar); | |
989 | |
990 date_selection_get(ds->box, &day, &month, &year); | |
991 gtk_calendar_select_month(GTK_CALENDAR(ds->calendar), month - 1, year); | |
992 gtk_calendar_select_day(GTK_CALENDAR(ds->calendar), day); | |
993 | |
994 g_signal_connect(G_OBJECT(ds->calendar), "day_selected", | |
995 G_CALLBACK(date_selection_day_cb), ds); | |
996 g_signal_connect(G_OBJECT(ds->calendar), "day_selected_double_click", | |
997 G_CALLBACK(date_selection_doubleclick_cb), ds); | |
998 | |
999 gtk_widget_realize(ds->window); | |
1000 | |
1001 gdk_window_get_origin(ds->button->window, &wx, &wy); | |
1002 | |
1003 x = wx + ds->button->allocation.x + ds->button->allocation.width - ds->window->allocation.width; | |
1004 y = wy + ds->button->allocation.y + ds->button->allocation.height; | |
1005 | |
1006 if (y + ds->window->allocation.height > gdk_screen_height()) | |
1007 { | |
1008 y = wy + ds->button->allocation.y - ds->window->allocation.height; | |
1009 } | |
1010 if (x < 0) x = 0; | |
1011 if (y < 0) y = 0; | |
1012 | |
1013 gtk_window_move(GTK_WINDOW(ds->window), x, y); | |
1014 gtk_widget_show(ds->window); | |
1015 | |
1016 gtk_widget_grab_focus(ds->calendar); | |
1017 gdk_pointer_grab(ds->window->window, TRUE, | |
1018 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK, | |
1019 NULL, NULL, GDK_CURRENT_TIME); | |
1020 gdk_keyboard_grab(ds->window->window, TRUE, GDK_CURRENT_TIME); | |
1021 gtk_grab_add(ds->window); | |
1022 | |
1023 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ds->button), TRUE); | |
1024 } | |
1025 | |
1026 static void date_selection_button_cb(GtkWidget *widget, gpointer data) | |
1027 { | |
1028 DateSelection *ds = data; | |
1029 | |
1030 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ds->button)) == (!ds->window)) | |
1031 { | |
1032 date_selection_popup(ds); | |
1033 } | |
1034 } | |
1035 | |
1036 static void button_size_allocate_cb(GtkWidget *button, GtkAllocation *allocation, gpointer data) | |
1037 { | |
1038 GtkWidget *spin = data; | |
1039 | |
1040 if (allocation->height > spin->requisition.height) | |
1041 { | |
1042 GtkAllocation button_allocation; | |
1043 | |
1044 button_allocation = button->allocation; | |
1045 button_allocation.height = spin->requisition.height; | |
1046 button_allocation.y = spin->allocation.y + | |
1047 (spin->allocation.height - spin->requisition.height) / 2; | |
1048 gtk_widget_size_allocate(button, &button_allocation); | |
1049 } | |
1050 } | |
1051 | |
1052 static void spin_increase(GtkWidget *spin, gint value) | |
1053 { | |
1054 GtkRequisition req; | |
1055 | |
1056 gtk_widget_size_request(spin, &req); | |
1057 gtk_widget_set_size_request(spin, req.width + value, -1); | |
1058 } | |
1059 | |
1060 static void date_selection_destroy_cb(GtkWidget *widget, gpointer data) | |
1061 { | |
1062 DateSelection *ds = data; | |
1063 | |
1064 date_selection_popup_hide(ds); | |
1065 | |
1066 g_free(ds); | |
1067 } | |
1068 | |
1069 GtkWidget *date_selection_new(void) | |
1070 { | |
1071 DateSelection *ds; | |
1072 GtkWidget *arrow; | |
1073 | |
1074 ds = g_new0(DateSelection, 1); | |
1075 | |
1076 ds->box = gtk_hbox_new(FALSE, 2); | |
1077 g_signal_connect(G_OBJECT(ds->box), "destroy", | |
1078 G_CALLBACK(date_selection_destroy_cb), ds); | |
1079 | |
1080 /* FIXME: use option menu with text format of month instead of a spin button */ | |
1081 ds->spin_m = pref_spin_new(ds->box, NULL, NULL, 1, 12, 1, 0, 1, NULL, NULL); | |
1082 ds->spin_d = pref_spin_new(ds->box, NULL, NULL, 1, 31, 1, 0, 1, NULL, NULL); | |
1083 ds->spin_y = pref_spin_new(ds->box, NULL, NULL, 1900, 9999, 1, 0, 1900, NULL, NULL); | |
1084 spin_increase(ds->spin_y, 5); | |
1085 | |
1086 ds->button = gtk_toggle_button_new(); | |
1087 g_signal_connect(G_OBJECT(ds->button), "size_allocate", | |
1088 G_CALLBACK(button_size_allocate_cb), ds->spin_y); | |
1089 | |
1090 arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE); | |
1091 gtk_container_add(GTK_CONTAINER(ds->button), arrow); | |
1092 gtk_widget_show(arrow); | |
1093 | |
1094 gtk_box_pack_start(GTK_BOX(ds->box), ds->button, FALSE, FALSE, 0); | |
1095 g_signal_connect(G_OBJECT(ds->button), "clicked", | |
1096 G_CALLBACK(date_selection_button_cb), ds); | |
1097 gtk_widget_show(ds->button); | |
1098 | |
1099 g_object_set_data(G_OBJECT(ds->box), DATE_SELECION_KEY, ds); | |
1100 | |
1101 return ds->box; | |
1102 } | |
442 | 1103 |
9 | 1104 void date_selection_set(GtkWidget *widget, gint day, gint month, gint year) |
1105 { | |
1106 DateSelection *ds; | |
1107 | |
1108 ds = g_object_get_data(G_OBJECT(widget), DATE_SELECION_KEY); | |
1109 if (!ds) return; | |
1110 | |
1111 gtk_spin_button_set_value(GTK_SPIN_BUTTON(ds->spin_d), (gdouble)day); | |
1112 gtk_spin_button_set_value(GTK_SPIN_BUTTON(ds->spin_m), (gdouble)month); | |
1113 gtk_spin_button_set_value(GTK_SPIN_BUTTON(ds->spin_y), (gdouble)year); | |
1114 } | |
1115 | |
1116 | |
1117 void date_selection_get(GtkWidget *widget, gint *day, gint *month, gint *year) | |
1118 { | |
1119 DateSelection *ds; | |
1120 | |
1121 ds = g_object_get_data(G_OBJECT(widget), DATE_SELECION_KEY); | |
1122 if (!ds) return; | |
1123 | |
1124 if (day) *day = gtk_spin_button_get_value(GTK_SPIN_BUTTON(ds->spin_d)); | |
1125 if (month) *month = gtk_spin_button_get_value(GTK_SPIN_BUTTON(ds->spin_m)); | |
1126 if (year) *year = gtk_spin_button_get_value(GTK_SPIN_BUTTON(ds->spin_y)); | |
1127 } | |
442 | 1128 |
9 | 1129 void date_selection_time_set(GtkWidget *widget, time_t t) |
1130 { | |
1131 struct tm *lt; | |
1132 | |
1133 lt = localtime(&t); | |
1134 if (!lt) return; | |
1135 | |
1136 date_selection_set(widget, lt->tm_mday, lt->tm_mon + 1, lt->tm_year + 1900); | |
1137 } | |
1138 | |
1139 time_t date_selection_time_get(GtkWidget *widget) | |
1140 { | |
1141 struct tm lt; | |
1142 gint day = 0; | |
1143 gint month = 0; | |
1144 gint year = 0; | |
1145 | |
1146 date_selection_get(widget, &day, &month ,&year); | |
1147 | |
1148 lt.tm_sec = 0; | |
1149 lt.tm_min = 0; | |
1150 lt.tm_hour = 0; | |
1151 lt.tm_mday = day; | |
1152 lt.tm_mon = month - 1; | |
1153 lt.tm_year = year - 1900; | |
1154 lt.tm_isdst = 0; | |
1155 | |
1156 return mktime(<); | |
1157 } | |
1158 | |
1159 | |
1160 /* | |
1161 *----------------------------------------------------------------------------- | |
1162 * Sizer, without using a GtkPaned | |
1163 *----------------------------------------------------------------------------- | |
1164 */ | |
1165 | |
1166 #define SIZER_DATA_KEY "sizer_data" | |
1167 | |
1168 typedef struct _SizerData SizerData; | |
1169 struct _SizerData | |
1170 { | |
1171 GtkWidget *sizer; | |
1172 GtkWidget *parent; | |
1173 GtkWidget *bounding_widget; | |
1174 SizerPositionType position; | |
1175 | |
1176 gint hsize_min; | |
1177 gint hsize_max; | |
1178 gint vsize_min; | |
1179 gint vsize_max; | |
1180 | |
1448 | 1181 gboolean in_drag; |
9 | 1182 gint press_x; |
1183 gint press_y; | |
1184 gint press_width; | |
1185 gint press_height; | |
1186 | |
1448 | 1187 gboolean handle_prelit; |
9 | 1188 }; |
1189 | |
1190 | |
1191 static gint sizer_default_handle_size(void) | |
1192 { | |
1193 gint handle_size = 5; | |
1194 GtkWidget *paned; | |
1195 GtkStyle *style; | |
1196 | |
1197 paned = gtk_hpaned_new(); | |
1198 | |
1199 style = gtk_rc_get_style(paned); | |
1200 gtk_widget_set_style(paned, style); | |
1201 gtk_widget_style_get(paned, "handle_size", &handle_size, NULL); | |
1202 | |
1203 gtk_widget_destroy(paned); | |
1204 | |
1205 return handle_size; | |
1206 } | |
1207 | |
1448 | 1208 static gboolean sizer_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) |
9 | 1209 { |
1210 SizerData *sd = data; | |
1211 gint x, y; | |
1212 gint w, h; | |
1213 | |
1214 if (!sd->in_drag) return FALSE; | |
1215 | |
1216 x = sd->press_x - bevent->x_root; | |
1217 y = sd->press_y - bevent->y_root; | |
1218 | |
1219 w = sd->press_width; | |
1220 h = sd->press_height; | |
1221 | |
1222 if (sd->position & SIZER_POS_LEFT) | |
1223 { | |
1224 w += x; | |
1225 } | |
1226 else if (sd->position & SIZER_POS_RIGHT) | |
1227 { | |
1228 w -= x; | |
1229 } | |
1230 | |
1231 if (sd->position & SIZER_POS_TOP) | |
1232 { | |
1233 h += y; | |
1234 } | |
1235 else if (sd->position & SIZER_POS_BOTTOM) | |
1236 { | |
1237 h -= y; | |
1238 } | |
1239 | |
1240 if (sd->hsize_min >= 0) w = MAX(w, sd->hsize_min); | |
1241 if (sd->vsize_min >= 0) h = MAX(h, sd->vsize_min); | |
1242 | |
1243 if (sd->bounding_widget) | |
1244 { | |
1245 w = CLAMP(w, sd->sizer->allocation.width, sd->bounding_widget->allocation.width); | |
1246 h = CLAMP(h, sd->sizer->allocation.height, sd->bounding_widget->allocation.height); | |
1247 } | |
1248 else | |
1249 { | |
1250 if (w < sd->sizer->allocation.width) w = sd->sizer->allocation.width; | |
1251 if (h < sd->sizer->allocation.height) h = sd->sizer->allocation.height; | |
1252 } | |
1253 | |
1254 if (sd->hsize_max >= 0) w = MIN(w, sd->hsize_max); | |
1255 if (sd->vsize_max >= 0) h = MIN(h, sd->vsize_max); | |
1256 | |
1257 if (w == sd->parent->allocation.width) w = -1; | |
1258 if (h == sd->parent->allocation.height) h = -1; | |
1259 | |
1260 if (w > 0 || h > 0) gtk_widget_set_size_request(sd->parent, w, h); | |
1261 | |
1262 return TRUE; | |
1263 } | |
1264 | |
1448 | 1265 static gboolean sizer_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) |
9 | 1266 { |
1267 SizerData *sd = data; | |
1268 | |
448
a73cc0fa14d0
Use explicit names for mouse buttons instead of numbers.
zas_
parents:
442
diff
changeset
|
1269 if (bevent->button != MOUSE_BUTTON_LEFT) return FALSE; |
9 | 1270 |
1271 sd->in_drag = TRUE; | |
1272 sd->press_x = bevent->x_root; | |
1273 sd->press_y = bevent->y_root; | |
1274 | |
1275 sd->press_width = sd->parent->allocation.width; | |
1276 sd->press_height = sd->parent->allocation.height; | |
1277 | |
1278 gdk_pointer_grab(sd->sizer->window, FALSE, | |
1279 GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, | |
1280 NULL, NULL, bevent->time); | |
1281 gtk_grab_add(sd->sizer); | |
1282 | |
1283 return TRUE; | |
1284 } | |
1285 | |
1448 | 1286 static gboolean sizer_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) |
9 | 1287 { |
1288 SizerData *sd = data; | |
1289 | |
448
a73cc0fa14d0
Use explicit names for mouse buttons instead of numbers.
zas_
parents:
442
diff
changeset
|
1290 if (bevent->button != MOUSE_BUTTON_LEFT) return FALSE; |
9 | 1291 |
1292 if (gdk_pointer_is_grabbed() && GTK_WIDGET_HAS_GRAB(sd->sizer)) | |
1293 { | |
1294 gtk_grab_remove(sd->sizer); | |
1295 gdk_pointer_ungrab(bevent->time); | |
1296 } | |
1297 | |
1298 sd->in_drag = FALSE; | |
1299 | |
1300 return TRUE; | |
1301 } | |
1302 | |
1448 | 1303 static void sizer_set_prelight(SizerData *sd, gboolean prelit) |
9 | 1304 { |
1305 sd->handle_prelit = prelit; | |
1306 gtk_widget_queue_draw_area(sd->sizer, 0, 0, | |
1307 sd->sizer->allocation.width, sd->sizer->allocation.height); | |
1308 } | |
1309 | |
1448 | 1310 static gboolean sizer_enter_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data) |
9 | 1311 { |
1312 SizerData *sd = data; | |
1313 | |
1314 sizer_set_prelight(sd, TRUE); | |
1315 return TRUE; | |
1316 } | |
1317 | |
1448 | 1318 static gboolean sizer_leave_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data) |
9 | 1319 { |
1320 SizerData *sd = data; | |
1321 | |
1322 sizer_set_prelight(sd, FALSE); | |
1323 return TRUE; | |
1324 } | |
1325 | |
1448 | 1326 static gboolean sizer_expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data) |
9 | 1327 { |
1328 SizerData *sd = data; | |
1329 GdkRectangle clip; | |
1330 GtkOrientation orientation; | |
1331 GtkStateType state; | |
1332 | |
1333 gdk_region_get_clipbox(event->region, &clip); | |
1334 | |
1335 if (sd->position & SIZER_POS_LEFT || sd->position & SIZER_POS_RIGHT) | |
1336 { | |
1337 orientation = GTK_ORIENTATION_VERTICAL; | |
1338 } | |
1339 else | |
1340 { | |
1341 orientation = GTK_ORIENTATION_HORIZONTAL; | |
1342 } | |
1343 | |
1344 if (sd->handle_prelit) | |
1345 { | |
1346 state = GTK_STATE_PRELIGHT; | |
1347 } | |
1348 else | |
1349 { | |
1350 state = widget->state; | |
1351 } | |
1352 | |
1353 gtk_paint_handle(widget->style, widget->window, state, | |
1354 GTK_SHADOW_NONE, &clip, widget, "paned", | |
1355 0, 0, | |
1356 widget->allocation.width, widget->allocation.height, | |
1357 orientation); | |
1358 | |
1359 return TRUE; | |
1360 } | |
1361 | |
1362 static void sizer_realize_cb(GtkWidget *widget, gpointer data) | |
1363 { | |
1364 SizerData *sd = data; | |
1365 GdkCursorType n; | |
1366 | |
1367 n = 0; | |
1368 if (sd->position & SIZER_POS_TOP || sd->position & SIZER_POS_BOTTOM) | |
1369 { | |
1370 n = GDK_SB_V_DOUBLE_ARROW; | |
1371 } | |
1372 if (sd->position & SIZER_POS_LEFT || sd->position & SIZER_POS_RIGHT) | |
1373 { | |
1374 n = (n != 0) ? GDK_FLEUR : GDK_SB_H_DOUBLE_ARROW; | |
1375 } | |
1376 | |
1377 if (n != 0 && widget->window) | |
1378 { | |
1379 GdkCursor *cursor; | |
1380 cursor = gdk_cursor_new(n); | |
1381 gdk_window_set_cursor(widget->window, cursor); | |
1382 gdk_cursor_unref(cursor); | |
1383 } | |
1384 } | |
1385 | |
1386 static void sizer_destroy_cb(GtkWidget *widget, gpointer data) | |
1387 { | |
1388 SizerData *sd = data; | |
1389 | |
1390 g_free(sd); | |
1391 } | |
1392 | |
1393 GtkWidget *sizer_new(GtkWidget *parent, GtkWidget *bounding_widget, | |
1394 SizerPositionType position) | |
1395 { | |
1396 SizerData *sd; | |
1397 gint handle_size; | |
1398 | |
1399 sd = g_new0(SizerData, 1); | |
1400 | |
1401 sd->sizer = gtk_event_box_new(); | |
1402 sd->parent = parent; | |
1403 sd->bounding_widget = bounding_widget; | |
1404 sd->position = position; | |
1405 sd->hsize_min = -1; | |
1406 sd->hsize_max = -1; | |
1407 sd->vsize_min = -1; | |
1408 sd->vsize_max = -1; | |
1409 | |
1410 sd->in_drag = FALSE; | |
1411 sd->handle_prelit = FALSE; | |
1412 | |
1413 g_signal_connect(G_OBJECT(sd->sizer), "destroy", | |
1414 G_CALLBACK(sizer_destroy_cb), sd); | |
1415 | |
1416 g_signal_connect(G_OBJECT(sd->sizer), "motion_notify_event", | |
1417 G_CALLBACK(sizer_motion_cb), sd); | |
1418 g_signal_connect(G_OBJECT(sd->sizer), "button_press_event", | |
1419 G_CALLBACK(sizer_press_cb), sd); | |
1420 g_signal_connect(G_OBJECT(sd->sizer), "button_release_event", | |
1421 G_CALLBACK(sizer_release_cb), sd); | |
1422 | |
1423 g_signal_connect(G_OBJECT(sd->sizer), "enter_notify_event", | |
1424 G_CALLBACK(sizer_enter_cb), sd); | |
1425 g_signal_connect(G_OBJECT(sd->sizer), "leave_notify_event", | |
1426 G_CALLBACK(sizer_leave_cb), sd); | |
1427 | |
1428 gtk_widget_set_events(sd->sizer, GDK_POINTER_MOTION_MASK | | |
1429 GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | | |
1430 GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); | |
1431 | |
1432 g_signal_connect(sd->sizer, "realize", | |
1433 G_CALLBACK(sizer_realize_cb), sd); | |
1434 g_signal_connect(sd->sizer, "expose_event", | |
1435 G_CALLBACK(sizer_expose_cb), sd); | |
1436 | |
1437 handle_size = sizer_default_handle_size(); | |
1438 | |
1439 gtk_widget_set_size_request(sd->sizer, handle_size, handle_size); | |
1440 #if 0 | |
1441 /* use this if you add a shadow border to the handle */ | |
1442 gtk_widget_set_size_request(sd->sizer, handle_size + sd->sizer->style->xthickness * 2, | |
1443 handle_size + sd->sizer->style->ythickness * 2); | |
1444 #endif | |
1445 | |
1446 g_object_set_data(G_OBJECT(sd->sizer), SIZER_DATA_KEY,sd); | |
1447 | |
1448 return sd->sizer; | |
1449 } | |
1450 | |
1451 void sizer_set_limits(GtkWidget *sizer, | |
1452 gint hsize_min, gint hsize_max, | |
1453 gint vsize_min, gint vsize_max) | |
1454 { | |
1455 SizerData *sd; | |
1456 | |
1457 sd = g_object_get_data(G_OBJECT(sizer), SIZER_DATA_KEY); | |
1458 if (!sd) return; | |
1459 | |
1460 sd->hsize_min = hsize_min; | |
1461 sd->hsize_max = hsize_max; | |
1462 sd->vsize_min = vsize_min; | |
1463 sd->vsize_max = vsize_max; | |
1464 } | |
1465 | |
1466 | |
1467 /* | |
1468 *----------------------------------------------------------------------------- | |
1469 * storing data in a history list with key,data pairs | |
1470 *----------------------------------------------------------------------------- | |
1471 */ | |
1472 | |
1473 #define PREF_LIST_MARKER_INT "[INT]:" | |
1474 #define PREF_LIST_MARKER_DOUBLE "[DOUBLE]:" | |
1475 #define PREF_LIST_MARKER_STRING "[STRING]:" | |
1476 | |
1477 static GList *pref_list_find(const gchar *group, const gchar *token) | |
1478 { | |
1479 GList *work; | |
1480 gint l; | |
1481 | |
1482 l = strlen(token); | |
1483 | |
1484 work = history_list_get_by_key(group); | |
1485 while (work) | |
1486 { | |
1487 const gchar *text = work->data; | |
1488 | |
1489 if (strncmp(text, token, l) == 0) return work; | |
1490 | |
1491 work = work->next; | |
1492 } | |
1493 | |
1494 return NULL; | |
1495 } | |
1496 | |
1448 | 1497 static gboolean pref_list_get(const gchar *group, const gchar *key, const gchar *marker, const gchar **result) |
9 | 1498 { |
1499 gchar *token; | |
1500 GList *work; | |
1448 | 1501 gboolean ret; |
9 | 1502 |
1503 if (!group || !key || !marker) | |
1504 { | |
1505 *result = NULL; | |
1506 return FALSE; | |
1507 } | |
1508 | |
1509 token = g_strconcat(key, marker, NULL); | |
1510 | |
1511 work = pref_list_find(group, token); | |
1512 if (work) | |
1513 { | |
1514 *result = (const gchar *)work->data + strlen(token); | |
1515 if (strlen(*result) == 0) *result = NULL; | |
1516 ret = TRUE; | |
1517 } | |
1518 else | |
1519 { | |
1520 *result = NULL; | |
1521 ret = FALSE; | |
1522 } | |
1523 | |
1524 g_free(token); | |
1525 | |
442 | 1526 return ret; |
9 | 1527 } |
1528 | |
1529 static void pref_list_set(const gchar *group, const gchar *key, const gchar *marker, const gchar *text) | |
1530 { | |
1531 gchar *token; | |
1532 gchar *path; | |
1533 GList *work; | |
1534 | |
1535 if (!group || !key || !marker) return; | |
1536 | |
1537 token = g_strconcat(key, marker, NULL); | |
1538 path = g_strconcat(token, text, NULL); | |
1539 | |
1540 work = pref_list_find(group, token); | |
1541 if (work) | |
1542 { | |
1543 gchar *old_path = work->data; | |
1544 | |
1545 if (text) | |
1546 { | |
1547 work->data = path; | |
1548 path = NULL; | |
1549 | |
1550 g_free(old_path); | |
1551 } | |
1552 else | |
1553 { | |
1554 history_list_item_remove(group, old_path); | |
1555 } | |
1556 } | |
1557 else if (text) | |
1558 { | |
1559 history_list_add_to_key(group, path, 0); | |
1560 } | |
1561 | |
1562 g_free(path); | |
1563 g_free(token); | |
1564 } | |
1565 | |
1566 void pref_list_int_set(const gchar *group, const gchar *key, gint value) | |
1567 { | |
1568 gchar *text; | |
1569 | |
1570 text = g_strdup_printf("%d", value); | |
1571 pref_list_set(group, key, PREF_LIST_MARKER_INT, text); | |
1572 g_free(text); | |
1573 } | |
1574 | |
1448 | 1575 gboolean pref_list_int_get(const gchar *group, const gchar *key, gint *result) |
9 | 1576 { |
1577 const gchar *text; | |
1578 | |
1579 if (!group || !key) | |
1580 { | |
1581 *result = 0; | |
1582 return FALSE; | |
1583 } | |
1584 | |
1585 if (pref_list_get(group, key, PREF_LIST_MARKER_INT, &text) && text) | |
1586 { | |
1587 *result = (gint)strtol(text, NULL, 10); | |
1588 return TRUE; | |
1589 } | |
1590 | |
1591 *result = 0; | |
1592 return FALSE; | |
1593 } | |
1594 | |
1595 void pref_list_double_set(const gchar *group, const gchar *key, gdouble value) | |
1596 { | |
1597 gchar text[G_ASCII_DTOSTR_BUF_SIZE]; | |
1598 | |
1599 g_ascii_dtostr(text, sizeof(text), value); | |
1600 pref_list_set(group, key, PREF_LIST_MARKER_DOUBLE, text); | |
1601 } | |
1602 | |
1448 | 1603 gboolean pref_list_double_get(const gchar *group, const gchar *key, gdouble *result) |
9 | 1604 { |
1605 const gchar *text; | |
1606 | |
1607 if (!group || !key) | |
1608 { | |
1609 *result = 0; | |
1610 return FALSE; | |
1611 } | |
1612 | |
1613 if (pref_list_get(group, key, PREF_LIST_MARKER_DOUBLE, &text) && text) | |
1614 { | |
1615 *result = g_ascii_strtod(text, NULL); | |
1616 return TRUE; | |
1617 } | |
1618 | |
1619 *result = 0; | |
1620 return FALSE; | |
1621 } | |
1622 | |
1623 void pref_list_string_set(const gchar *group, const gchar *key, const gchar *value) | |
1624 { | |
1625 pref_list_set(group, key, PREF_LIST_MARKER_STRING, value); | |
1626 } | |
1627 | |
1448 | 1628 gboolean pref_list_string_get(const gchar *group, const gchar *key, const gchar **result) |
9 | 1629 { |
1630 return pref_list_get(group, key, PREF_LIST_MARKER_STRING, result); | |
1631 } | |
1632 | |
1633 | |
339
de1c2cd06fce
Rename user_specified_window_background and window_background_color
zas_
parents:
208
diff
changeset
|
1634 void pref_color_button_set_cb(GtkWidget *widget, gpointer data) |
208
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1635 { |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1636 GdkColor *color = data; |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1637 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1638 gtk_color_button_get_color(GTK_COLOR_BUTTON(widget), color); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1639 } |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1640 |
339
de1c2cd06fce
Rename user_specified_window_background and window_background_color
zas_
parents:
208
diff
changeset
|
1641 GtkWidget *pref_color_button_new(GtkWidget *parent_box, |
de1c2cd06fce
Rename user_specified_window_background and window_background_color
zas_
parents:
208
diff
changeset
|
1642 const gchar *title, const GdkColor *color, |
de1c2cd06fce
Rename user_specified_window_background and window_background_color
zas_
parents:
208
diff
changeset
|
1643 GCallback func, gpointer data) |
208
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1644 { |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1645 GtkWidget *button; |
442 | 1646 |
208
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1647 if (color) |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1648 { |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1649 button = gtk_color_button_new_with_color(color); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1650 } |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1651 else |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1652 { |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1653 button = gtk_color_button_new(); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1654 } |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1655 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1656 if (func) g_signal_connect(G_OBJECT(button), "color-set", func, data); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1657 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1658 if (title) |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1659 { |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1660 GtkWidget *label; |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1661 GtkWidget *hbox; |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1662 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1663 gtk_color_button_set_title(GTK_COLOR_BUTTON(button), title); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1664 label = gtk_label_new(title); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1665 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1666 hbox = gtk_hbox_new(TRUE, 0); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1667 gtk_box_pack_start(GTK_BOX(parent_box), hbox, TRUE, TRUE, 0); |
442 | 1668 |
208
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1669 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1670 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1671 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1672 gtk_widget_show_all(hbox); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1673 } |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1674 else |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1675 { |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1676 gtk_widget_show(button); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1677 } |
442 | 1678 |
208
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1679 return button; |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1680 } |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1681 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1682 /* |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1683 *----------------------------------------------------------------------------- |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1684 * text widget |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1685 *----------------------------------------------------------------------------- |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1686 */ |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1687 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1688 gchar *text_widget_text_pull(GtkWidget *text_widget) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1689 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1690 if (GTK_IS_TEXT_VIEW(text_widget)) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1691 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1692 GtkTextBuffer *buffer; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1693 GtkTextIter start, end; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1694 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1695 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_widget)); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1696 gtk_text_buffer_get_bounds(buffer, &start, &end); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1697 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1698 return gtk_text_buffer_get_text(buffer, &start, &end, FALSE); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1699 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1700 else if (GTK_IS_ENTRY(text_widget)) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1701 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1702 return g_strdup(gtk_entry_get_text(GTK_ENTRY(text_widget))); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1703 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1704 else |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1705 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1706 return NULL; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1707 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1708 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1709 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1710 |
1055
1646720364cf
Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents:
1044
diff
changeset
|
1711 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ |