Mercurial > geeqie
annotate src/ui_misc.c @ 1811:f405ec9b696b default tip
Some small logic mistakes
Use boolean operators for booleans and bitwise otherwise only.
author | mow |
---|---|
date | Mon, 10 May 2010 11:33:13 +0000 |
parents | c416d099a3dc |
children |
rev | line source |
---|---|
9 | 1 /* |
2 * (SLIK) SimpLIstic sKin functions | |
3 * (C) 2004 John Ellis | |
1802 | 4 * Copyright (C) 2008 - 2010 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 | |
1810 | 554 #if GTK_CHECK_VERSION(2,20,0) |
555 gtk_widget_set_sensitive(widget, gtk_widget_is_sensitive(watch)); | |
556 #else | |
9 | 557 gtk_widget_set_sensitive(widget, GTK_WIDGET_IS_SENSITIVE(watch)); |
1810 | 558 #endif |
9 | 559 } |
560 | |
561 void pref_link_sensitivity(GtkWidget *widget, GtkWidget *watch) | |
562 { | |
563 g_signal_connect(G_OBJECT(watch), "state_changed", | |
564 G_CALLBACK(pref_link_sensitivity_cb), widget); | |
565 } | |
566 | |
567 void pref_signal_block_data(GtkWidget *widget, gpointer data) | |
568 { | |
569 g_signal_handlers_block_matched(widget, G_SIGNAL_MATCH_DATA, | |
570 0, 0, NULL, NULL, data); | |
571 } | |
572 | |
573 void pref_signal_unblock_data(GtkWidget *widget, gpointer data) | |
574 { | |
575 g_signal_handlers_unblock_matched(widget, G_SIGNAL_MATCH_DATA, | |
576 0, 0, NULL, NULL, data); | |
577 } | |
578 | |
579 GtkWidget *pref_table_new(GtkWidget *parent_box, gint columns, gint rows, | |
1448 | 580 gboolean homogeneous, gboolean fill) |
9 | 581 { |
582 GtkWidget *table; | |
583 | |
1448 | 584 table = gtk_table_new(rows, columns, homogeneous); |
9 | 585 gtk_table_set_row_spacings(GTK_TABLE(table), PREF_PAD_GAP); |
586 gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_SPACE); | |
587 | |
588 if (parent_box) | |
589 { | |
590 gtk_box_pack_start(GTK_BOX(parent_box), table, fill, fill, 0); | |
591 gtk_widget_show(table); | |
592 } | |
593 | |
594 return table; | |
595 } | |
596 | |
597 GtkWidget *pref_table_box(GtkWidget *table, gint column, gint row, | |
598 GtkOrientation orientation, const gchar *text) | |
599 { | |
600 GtkWidget *box; | |
601 GtkWidget *shell; | |
602 | |
603 if (text) | |
604 { | |
605 shell = gtk_vbox_new(FALSE, 0); | |
606 box = pref_group_new(shell, TRUE, text, orientation); | |
607 } | |
608 else | |
609 { | |
610 if (orientation == GTK_ORIENTATION_HORIZONTAL) | |
611 { | |
612 box = gtk_hbox_new(FALSE, PREF_PAD_SPACE); | |
613 } | |
614 else | |
615 { | |
616 box = gtk_vbox_new(FALSE, PREF_PAD_GAP); | |
617 } | |
618 shell = box; | |
619 } | |
620 | |
621 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
|
622 GTK_EXPAND | GTK_FILL, 0, 0, 0); |
9 | 623 |
624 gtk_widget_show(shell); | |
625 | |
626 return box; | |
627 } | |
628 | |
629 GtkWidget *pref_table_label(GtkWidget *table, gint column, gint row, | |
630 const gchar *text, gfloat alignment) | |
631 { | |
632 GtkWidget *label; | |
633 GtkWidget *align; | |
634 | |
635 align = gtk_alignment_new(alignment, 0.50, 0.0, 0.0); | |
636 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
|
637 GTK_FILL, 0, 0, 0); |
9 | 638 gtk_widget_show(align); |
639 label = gtk_label_new(text); | |
640 gtk_container_add(GTK_CONTAINER(align), label); | |
641 gtk_widget_show(label); | |
642 | |
643 return label; | |
644 } | |
645 | |
646 GtkWidget *pref_table_button(GtkWidget *table, gint column, gint row, | |
1448 | 647 const gchar *stock_id, const gchar *text, gboolean hide_stock_text, |
9 | 648 GCallback func, gpointer data) |
649 { | |
650 GtkWidget *button; | |
651 | |
652 button = pref_button_new(NULL, stock_id, text, hide_stock_text, func, data); | |
653 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
|
654 GTK_FILL, 0, 0, 0); |
9 | 655 gtk_widget_show(button); |
656 | |
657 return button; | |
658 } | |
659 | |
660 #if 0 | |
661 static GtkWidget *pref_table_checkbox(GtkWidget *table, gint column, gint row, | |
662 const gchar *text, gint active, | |
663 GCallback func, gpointer data) | |
664 { | |
665 GtkWidget *button; | |
666 | |
667 button = gtk_check_button_new_with_label(text); | |
668 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), active); | |
669 if (func) g_signal_connect(G_OBJECT(button), "clicked", func, data); | |
670 | |
671 gtk_table_attach(GTK_TABLE(table), button, column, column + 1, row, row + 1, | |
672 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); | |
673 gtk_widget_show(button); | |
674 | |
675 return button; | |
676 } | |
677 #endif | |
678 | |
679 GtkWidget *pref_table_spin(GtkWidget *table, gint column, gint row, | |
680 const gchar *text, const gchar *suffix, | |
681 gdouble min, gdouble max, gdouble step, gint digits, | |
682 gdouble value, | |
683 GCallback func, gpointer data) | |
684 { | |
685 GtkWidget *spin; | |
686 GtkWidget *box; | |
687 GtkWidget *label; | |
688 | |
689 spin = gtk_spin_button_new_with_range(min, max, step); | |
690 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), digits); | |
691 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), value); | |
692 if (func) | |
693 { | |
694 g_signal_connect(G_OBJECT(spin), "value_changed", G_CALLBACK(func), data); | |
695 } | |
696 | |
697 if (text) | |
698 { | |
699 label = pref_table_label(table, column, row, text, 1.0); | |
700 pref_link_sensitivity(label, spin); | |
701 column++; | |
702 } | |
703 | |
704 if (suffix) | |
705 { | |
706 box = gtk_hbox_new(FALSE, PREF_PAD_SPACE); | |
707 gtk_box_pack_start(GTK_BOX(box), spin, FALSE, FALSE, 0); | |
708 gtk_widget_show(spin); | |
709 | |
710 label = pref_label_new(box, suffix); | |
711 pref_link_sensitivity(label, spin); | |
712 } | |
713 else | |
714 { | |
715 box = spin; | |
716 } | |
717 | |
718 gtk_table_attach(GTK_TABLE(table), box, column, column + 1, row, row + 1, | |
719 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); | |
720 gtk_widget_show(box); | |
721 | |
722 return spin; | |
723 } | |
724 | |
1043 | 725 #if ! GTK_CHECK_VERSION(2,12,0) |
726 | |
9 | 727 static void pref_toolbar_destroy_cb(GtkWidget *widget, gpointer data) |
728 { | |
729 GtkTooltips *tips = data; | |
730 | |
731 g_object_unref(G_OBJECT(tips)); | |
732 } | |
733 | |
1043 | 734 #endif |
735 | |
9 | 736 GtkWidget *pref_toolbar_new(GtkWidget *parent_box, GtkToolbarStyle style) |
737 { | |
738 GtkWidget *tbar; | |
1043 | 739 #if ! GTK_CHECK_VERSION(2,12,0) |
9 | 740 GtkTooltips *tips; |
1043 | 741 #endif |
742 | |
9 | 743 tbar = gtk_toolbar_new(); |
744 gtk_toolbar_set_style(GTK_TOOLBAR(tbar), style); | |
745 | |
746 if (parent_box) | |
747 { | |
748 gtk_box_pack_start(GTK_BOX(parent_box), tbar, FALSE, FALSE, 0); | |
749 gtk_widget_show(tbar); | |
750 } | |
751 | |
1043 | 752 #if ! GTK_CHECK_VERSION(2,12,0) |
9 | 753 tips = gtk_tooltips_new(); |
88
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
754 |
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
755 /* take ownership of tooltips */ |
1043 | 756 # ifdef GTK_OBJECT_FLOATING |
88
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
757 /* GTK+ < 2.10 */ |
9 | 758 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
|
759 gtk_object_sink(GTK_OBJECT(tips)); |
1043 | 760 # else |
88
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
761 /* GTK+ >= 2.10 */ |
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
762 g_object_ref_sink(G_OBJECT(tips)); |
1043 | 763 # endif |
88
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
64
diff
changeset
|
764 |
9 | 765 g_object_set_data(G_OBJECT(tbar), "tooltips", tips); |
766 g_signal_connect(G_OBJECT(tbar), "destroy", | |
767 G_CALLBACK(pref_toolbar_destroy_cb), tips); | |
768 | |
769 gtk_tooltips_enable(tips); | |
1043 | 770 #endif |
9 | 771 |
772 return tbar; | |
773 } | |
774 | |
41
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
775 GtkWidget *pref_toolbar_button(GtkWidget *toolbar, |
1448 | 776 const gchar *stock_id, const gchar *label, gboolean toggle, |
9 | 777 const gchar *description, |
778 GCallback func, gpointer data) | |
779 { | |
780 GtkWidget *item; | |
781 | |
41
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
782 if (toggle) |
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 if (stock_id) |
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_from_stock(stock_id)); |
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 else |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
789 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
790 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
|
791 } |
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 else |
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 if (stock_id) |
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_from_stock(stock_id)); |
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 else |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
800 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
801 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
|
802 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
803 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
804 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
|
805 |
9 | 806 if (label) gtk_tool_button_set_label(GTK_TOOL_BUTTON(item), label); |
807 | |
808 if (func) g_signal_connect(item, "clicked", func, data); | |
809 gtk_container_add(GTK_CONTAINER(toolbar), item); | |
810 gtk_widget_show(item); | |
811 | |
812 if (description) | |
813 { | |
1043 | 814 |
815 #if GTK_CHECK_VERSION(2,12,0) | |
816 | |
1044 | 817 gtk_widget_set_tooltip_text(item, description); |
1043 | 818 |
819 #else | |
9 | 820 GtkTooltips *tips; |
821 | |
822 tips = g_object_get_data(G_OBJECT(toolbar), "tooltips"); | |
823 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), tips, description, NULL); | |
1043 | 824 #endif |
825 } | |
9 | 826 |
827 return item; | |
828 } | |
829 | |
41
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
830 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
|
831 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
832 if (widget) |
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_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
|
835 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
836 else if (stock_id) |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
837 { |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
838 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
|
839 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
840 } |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
841 |
9 | 842 GtkWidget *pref_toolbar_spacer(GtkWidget *toolbar) |
843 { | |
844 GtkWidget *item; | |
845 | |
846 item = GTK_WIDGET(gtk_separator_tool_item_new()); | |
847 gtk_container_add(GTK_CONTAINER(toolbar), item); | |
848 gtk_widget_show(item); | |
849 | |
850 return item; | |
851 } | |
852 | |
853 | |
854 /* | |
855 *----------------------------------------------------------------------------- | |
856 * date selection entry | |
857 *----------------------------------------------------------------------------- | |
858 */ | |
859 | |
860 #define DATE_SELECION_KEY "date_selection_data" | |
861 | |
862 | |
863 typedef struct _DateSelection DateSelection; | |
864 struct _DateSelection | |
865 { | |
866 GtkWidget *box; | |
867 | |
868 GtkWidget *spin_d; | |
869 GtkWidget *spin_m; | |
870 GtkWidget *spin_y; | |
871 | |
872 GtkWidget *button; | |
873 | |
874 GtkWidget *window; | |
875 GtkWidget *calendar; | |
876 }; | |
877 | |
878 | |
879 static void date_selection_popup_hide(DateSelection *ds) | |
880 { | |
881 if (!ds->window) return; | |
882 | |
1810 | 883 #if GTK_CHECK_VERSION(2,20,0) |
884 if (gtk_widget_has_grab(ds->window)) | |
885 #else | |
9 | 886 if (GTK_WIDGET_HAS_GRAB(ds->window)) |
1810 | 887 #endif |
9 | 888 { |
889 gtk_grab_remove(ds->window); | |
890 gdk_keyboard_ungrab(GDK_CURRENT_TIME); | |
891 gdk_pointer_ungrab(GDK_CURRENT_TIME); | |
892 } | |
893 | |
894 gtk_widget_hide(ds->window); | |
895 | |
896 gtk_widget_destroy(ds->window); | |
897 ds->window = NULL; | |
898 ds->calendar = NULL; | |
899 | |
900 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ds->button), FALSE); | |
901 } | |
902 | |
1448 | 903 static gboolean date_selection_popup_release_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) |
9 | 904 { |
905 DateSelection *ds = data; | |
906 | |
907 date_selection_popup_hide(ds); | |
908 return TRUE; | |
909 } | |
910 | |
1448 | 911 static gboolean date_selection_popup_press_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) |
9 | 912 { |
913 DateSelection *ds = data; | |
914 gint x, y; | |
915 gint w, h; | |
916 gint xr, yr; | |
917 | |
918 xr = (gint)event->x_root; | |
919 yr = (gint)event->y_root; | |
920 | |
921 gdk_window_get_origin(ds->window->window, &x, &y); | |
922 gdk_drawable_get_size(ds->window->window, &w, &h); | |
923 | |
924 if (xr < x || yr < y || xr > x + w || yr > y + h) | |
925 { | |
926 g_signal_connect(G_OBJECT(ds->window), "button_release_event", | |
927 G_CALLBACK(date_selection_popup_release_cb), ds); | |
928 return TRUE; | |
929 } | |
930 | |
931 return FALSE; | |
932 } | |
933 | |
934 static void date_selection_popup_sync(DateSelection *ds) | |
935 { | |
64
04ff0df3ad2f
Mon Aug 15 17:13:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
936 guint day, month, year; |
9 | 937 |
938 gtk_calendar_get_date(GTK_CALENDAR(ds->calendar), &year, &month, &day); | |
939 date_selection_set(ds->box, day, month + 1, year); | |
940 } | |
941 | |
1448 | 942 static gboolean date_selection_popup_keypress_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) |
9 | 943 { |
944 DateSelection *ds = data; | |
945 | |
946 switch (event->keyval) | |
947 { | |
948 case GDK_Return: | |
949 case GDK_KP_Enter: | |
950 case GDK_Tab: | |
951 case GDK_ISO_Left_Tab: | |
952 date_selection_popup_sync(ds); | |
953 date_selection_popup_hide(ds); | |
954 break; | |
955 case GDK_Escape: | |
956 date_selection_popup_hide(ds); | |
957 break; | |
958 default: | |
959 break; | |
960 } | |
961 | |
962 return FALSE; | |
963 } | |
964 | |
965 static void date_selection_day_cb(GtkWidget *widget, gpointer data) | |
966 { | |
967 DateSelection *ds = data; | |
968 | |
969 date_selection_popup_sync(ds); | |
970 } | |
971 | |
972 static void date_selection_doubleclick_cb(GtkWidget *widget, gpointer data) | |
973 { | |
974 DateSelection *ds = data; | |
975 | |
976 date_selection_popup_hide(ds); | |
977 } | |
978 | |
979 static void date_selection_popup(DateSelection *ds) | |
980 { | |
981 gint x, y; | |
982 gint wx, wy; | |
983 gint day, month, year; | |
984 | |
985 if (ds->window) return; | |
986 | |
987 ds->window = gtk_window_new(GTK_WINDOW_POPUP); | |
988 gtk_window_set_resizable(GTK_WINDOW(ds->window), FALSE); | |
989 g_signal_connect(G_OBJECT(ds->window), "button_press_event", | |
990 G_CALLBACK(date_selection_popup_press_cb), ds); | |
991 g_signal_connect(G_OBJECT(ds->window), "key_press_event", | |
992 G_CALLBACK(date_selection_popup_keypress_cb), ds); | |
993 | |
994 ds->calendar = gtk_calendar_new(); | |
995 gtk_container_add(GTK_CONTAINER(ds->window), ds->calendar); | |
996 gtk_widget_show(ds->calendar); | |
997 | |
998 date_selection_get(ds->box, &day, &month, &year); | |
999 gtk_calendar_select_month(GTK_CALENDAR(ds->calendar), month - 1, year); | |
1000 gtk_calendar_select_day(GTK_CALENDAR(ds->calendar), day); | |
1001 | |
1002 g_signal_connect(G_OBJECT(ds->calendar), "day_selected", | |
1003 G_CALLBACK(date_selection_day_cb), ds); | |
1004 g_signal_connect(G_OBJECT(ds->calendar), "day_selected_double_click", | |
1005 G_CALLBACK(date_selection_doubleclick_cb), ds); | |
1006 | |
1007 gtk_widget_realize(ds->window); | |
1008 | |
1009 gdk_window_get_origin(ds->button->window, &wx, &wy); | |
1010 | |
1011 x = wx + ds->button->allocation.x + ds->button->allocation.width - ds->window->allocation.width; | |
1012 y = wy + ds->button->allocation.y + ds->button->allocation.height; | |
1013 | |
1014 if (y + ds->window->allocation.height > gdk_screen_height()) | |
1015 { | |
1016 y = wy + ds->button->allocation.y - ds->window->allocation.height; | |
1017 } | |
1018 if (x < 0) x = 0; | |
1019 if (y < 0) y = 0; | |
1020 | |
1021 gtk_window_move(GTK_WINDOW(ds->window), x, y); | |
1022 gtk_widget_show(ds->window); | |
1023 | |
1024 gtk_widget_grab_focus(ds->calendar); | |
1025 gdk_pointer_grab(ds->window->window, TRUE, | |
1026 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK, | |
1027 NULL, NULL, GDK_CURRENT_TIME); | |
1028 gdk_keyboard_grab(ds->window->window, TRUE, GDK_CURRENT_TIME); | |
1029 gtk_grab_add(ds->window); | |
1030 | |
1031 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ds->button), TRUE); | |
1032 } | |
1033 | |
1034 static void date_selection_button_cb(GtkWidget *widget, gpointer data) | |
1035 { | |
1036 DateSelection *ds = data; | |
1037 | |
1038 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ds->button)) == (!ds->window)) | |
1039 { | |
1040 date_selection_popup(ds); | |
1041 } | |
1042 } | |
1043 | |
1044 static void button_size_allocate_cb(GtkWidget *button, GtkAllocation *allocation, gpointer data) | |
1045 { | |
1046 GtkWidget *spin = data; | |
1047 | |
1048 if (allocation->height > spin->requisition.height) | |
1049 { | |
1050 GtkAllocation button_allocation; | |
1051 | |
1052 button_allocation = button->allocation; | |
1053 button_allocation.height = spin->requisition.height; | |
1054 button_allocation.y = spin->allocation.y + | |
1055 (spin->allocation.height - spin->requisition.height) / 2; | |
1056 gtk_widget_size_allocate(button, &button_allocation); | |
1057 } | |
1058 } | |
1059 | |
1060 static void spin_increase(GtkWidget *spin, gint value) | |
1061 { | |
1062 GtkRequisition req; | |
1063 | |
1064 gtk_widget_size_request(spin, &req); | |
1065 gtk_widget_set_size_request(spin, req.width + value, -1); | |
1066 } | |
1067 | |
1068 static void date_selection_destroy_cb(GtkWidget *widget, gpointer data) | |
1069 { | |
1070 DateSelection *ds = data; | |
1071 | |
1072 date_selection_popup_hide(ds); | |
1073 | |
1074 g_free(ds); | |
1075 } | |
1076 | |
1077 GtkWidget *date_selection_new(void) | |
1078 { | |
1079 DateSelection *ds; | |
1080 GtkWidget *arrow; | |
1081 | |
1082 ds = g_new0(DateSelection, 1); | |
1083 | |
1084 ds->box = gtk_hbox_new(FALSE, 2); | |
1085 g_signal_connect(G_OBJECT(ds->box), "destroy", | |
1086 G_CALLBACK(date_selection_destroy_cb), ds); | |
1087 | |
1088 /* FIXME: use option menu with text format of month instead of a spin button */ | |
1089 ds->spin_m = pref_spin_new(ds->box, NULL, NULL, 1, 12, 1, 0, 1, NULL, NULL); | |
1090 ds->spin_d = pref_spin_new(ds->box, NULL, NULL, 1, 31, 1, 0, 1, NULL, NULL); | |
1091 ds->spin_y = pref_spin_new(ds->box, NULL, NULL, 1900, 9999, 1, 0, 1900, NULL, NULL); | |
1092 spin_increase(ds->spin_y, 5); | |
1093 | |
1094 ds->button = gtk_toggle_button_new(); | |
1095 g_signal_connect(G_OBJECT(ds->button), "size_allocate", | |
1096 G_CALLBACK(button_size_allocate_cb), ds->spin_y); | |
1097 | |
1098 arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE); | |
1099 gtk_container_add(GTK_CONTAINER(ds->button), arrow); | |
1100 gtk_widget_show(arrow); | |
1101 | |
1102 gtk_box_pack_start(GTK_BOX(ds->box), ds->button, FALSE, FALSE, 0); | |
1103 g_signal_connect(G_OBJECT(ds->button), "clicked", | |
1104 G_CALLBACK(date_selection_button_cb), ds); | |
1105 gtk_widget_show(ds->button); | |
1106 | |
1107 g_object_set_data(G_OBJECT(ds->box), DATE_SELECION_KEY, ds); | |
1108 | |
1109 return ds->box; | |
1110 } | |
442 | 1111 |
9 | 1112 void date_selection_set(GtkWidget *widget, gint day, gint month, gint year) |
1113 { | |
1114 DateSelection *ds; | |
1115 | |
1116 ds = g_object_get_data(G_OBJECT(widget), DATE_SELECION_KEY); | |
1117 if (!ds) return; | |
1118 | |
1119 gtk_spin_button_set_value(GTK_SPIN_BUTTON(ds->spin_d), (gdouble)day); | |
1120 gtk_spin_button_set_value(GTK_SPIN_BUTTON(ds->spin_m), (gdouble)month); | |
1121 gtk_spin_button_set_value(GTK_SPIN_BUTTON(ds->spin_y), (gdouble)year); | |
1122 } | |
1123 | |
1124 | |
1125 void date_selection_get(GtkWidget *widget, gint *day, gint *month, gint *year) | |
1126 { | |
1127 DateSelection *ds; | |
1128 | |
1129 ds = g_object_get_data(G_OBJECT(widget), DATE_SELECION_KEY); | |
1130 if (!ds) return; | |
1131 | |
1132 if (day) *day = gtk_spin_button_get_value(GTK_SPIN_BUTTON(ds->spin_d)); | |
1133 if (month) *month = gtk_spin_button_get_value(GTK_SPIN_BUTTON(ds->spin_m)); | |
1134 if (year) *year = gtk_spin_button_get_value(GTK_SPIN_BUTTON(ds->spin_y)); | |
1135 } | |
442 | 1136 |
9 | 1137 void date_selection_time_set(GtkWidget *widget, time_t t) |
1138 { | |
1139 struct tm *lt; | |
1140 | |
1141 lt = localtime(&t); | |
1142 if (!lt) return; | |
1143 | |
1144 date_selection_set(widget, lt->tm_mday, lt->tm_mon + 1, lt->tm_year + 1900); | |
1145 } | |
1146 | |
1147 time_t date_selection_time_get(GtkWidget *widget) | |
1148 { | |
1149 struct tm lt; | |
1150 gint day = 0; | |
1151 gint month = 0; | |
1152 gint year = 0; | |
1153 | |
1154 date_selection_get(widget, &day, &month ,&year); | |
1155 | |
1156 lt.tm_sec = 0; | |
1157 lt.tm_min = 0; | |
1158 lt.tm_hour = 0; | |
1159 lt.tm_mday = day; | |
1160 lt.tm_mon = month - 1; | |
1161 lt.tm_year = year - 1900; | |
1162 lt.tm_isdst = 0; | |
1163 | |
1164 return mktime(<); | |
1165 } | |
1166 | |
1167 | |
1168 /* | |
1169 *----------------------------------------------------------------------------- | |
1170 * Sizer, without using a GtkPaned | |
1171 *----------------------------------------------------------------------------- | |
1172 */ | |
1173 | |
1174 #define SIZER_DATA_KEY "sizer_data" | |
1175 | |
1176 typedef struct _SizerData SizerData; | |
1177 struct _SizerData | |
1178 { | |
1179 GtkWidget *sizer; | |
1180 GtkWidget *parent; | |
1181 GtkWidget *bounding_widget; | |
1182 SizerPositionType position; | |
1183 | |
1184 gint hsize_min; | |
1185 gint hsize_max; | |
1186 gint vsize_min; | |
1187 gint vsize_max; | |
1188 | |
1448 | 1189 gboolean in_drag; |
9 | 1190 gint press_x; |
1191 gint press_y; | |
1192 gint press_width; | |
1193 gint press_height; | |
1194 | |
1448 | 1195 gboolean handle_prelit; |
9 | 1196 }; |
1197 | |
1198 | |
1199 static gint sizer_default_handle_size(void) | |
1200 { | |
1201 gint handle_size = 5; | |
1202 GtkWidget *paned; | |
1203 GtkStyle *style; | |
1204 | |
1205 paned = gtk_hpaned_new(); | |
1206 | |
1207 style = gtk_rc_get_style(paned); | |
1208 gtk_widget_set_style(paned, style); | |
1209 gtk_widget_style_get(paned, "handle_size", &handle_size, NULL); | |
1210 | |
1211 gtk_widget_destroy(paned); | |
1212 | |
1213 return handle_size; | |
1214 } | |
1215 | |
1448 | 1216 static gboolean sizer_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) |
9 | 1217 { |
1218 SizerData *sd = data; | |
1219 gint x, y; | |
1220 gint w, h; | |
1221 | |
1222 if (!sd->in_drag) return FALSE; | |
1223 | |
1224 x = sd->press_x - bevent->x_root; | |
1225 y = sd->press_y - bevent->y_root; | |
1226 | |
1227 w = sd->press_width; | |
1228 h = sd->press_height; | |
1229 | |
1230 if (sd->position & SIZER_POS_LEFT) | |
1231 { | |
1232 w += x; | |
1233 } | |
1234 else if (sd->position & SIZER_POS_RIGHT) | |
1235 { | |
1236 w -= x; | |
1237 } | |
1238 | |
1239 if (sd->position & SIZER_POS_TOP) | |
1240 { | |
1241 h += y; | |
1242 } | |
1243 else if (sd->position & SIZER_POS_BOTTOM) | |
1244 { | |
1245 h -= y; | |
1246 } | |
1247 | |
1248 if (sd->hsize_min >= 0) w = MAX(w, sd->hsize_min); | |
1249 if (sd->vsize_min >= 0) h = MAX(h, sd->vsize_min); | |
1250 | |
1251 if (sd->bounding_widget) | |
1252 { | |
1253 w = CLAMP(w, sd->sizer->allocation.width, sd->bounding_widget->allocation.width); | |
1254 h = CLAMP(h, sd->sizer->allocation.height, sd->bounding_widget->allocation.height); | |
1255 } | |
1256 else | |
1257 { | |
1258 if (w < sd->sizer->allocation.width) w = sd->sizer->allocation.width; | |
1259 if (h < sd->sizer->allocation.height) h = sd->sizer->allocation.height; | |
1260 } | |
1261 | |
1262 if (sd->hsize_max >= 0) w = MIN(w, sd->hsize_max); | |
1263 if (sd->vsize_max >= 0) h = MIN(h, sd->vsize_max); | |
1264 | |
1265 if (w == sd->parent->allocation.width) w = -1; | |
1266 if (h == sd->parent->allocation.height) h = -1; | |
1267 | |
1268 if (w > 0 || h > 0) gtk_widget_set_size_request(sd->parent, w, h); | |
1269 | |
1270 return TRUE; | |
1271 } | |
1272 | |
1448 | 1273 static gboolean sizer_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) |
9 | 1274 { |
1275 SizerData *sd = data; | |
1276 | |
448
a73cc0fa14d0
Use explicit names for mouse buttons instead of numbers.
zas_
parents:
442
diff
changeset
|
1277 if (bevent->button != MOUSE_BUTTON_LEFT) return FALSE; |
9 | 1278 |
1279 sd->in_drag = TRUE; | |
1280 sd->press_x = bevent->x_root; | |
1281 sd->press_y = bevent->y_root; | |
1282 | |
1283 sd->press_width = sd->parent->allocation.width; | |
1284 sd->press_height = sd->parent->allocation.height; | |
1285 | |
1286 gdk_pointer_grab(sd->sizer->window, FALSE, | |
1287 GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, | |
1288 NULL, NULL, bevent->time); | |
1289 gtk_grab_add(sd->sizer); | |
1290 | |
1291 return TRUE; | |
1292 } | |
1293 | |
1448 | 1294 static gboolean sizer_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) |
9 | 1295 { |
1296 SizerData *sd = data; | |
1297 | |
448
a73cc0fa14d0
Use explicit names for mouse buttons instead of numbers.
zas_
parents:
442
diff
changeset
|
1298 if (bevent->button != MOUSE_BUTTON_LEFT) return FALSE; |
9 | 1299 |
1810 | 1300 #if GTK_CHECK_VERSION(2,20,0) |
1301 if (gdk_pointer_is_grabbed() && gtk_widget_has_grab(sd->sizer)) | |
1302 #else | |
9 | 1303 if (gdk_pointer_is_grabbed() && GTK_WIDGET_HAS_GRAB(sd->sizer)) |
1810 | 1304 #endif |
9 | 1305 { |
1306 gtk_grab_remove(sd->sizer); | |
1307 gdk_pointer_ungrab(bevent->time); | |
1308 } | |
1309 | |
1310 sd->in_drag = FALSE; | |
1311 | |
1312 return TRUE; | |
1313 } | |
1314 | |
1448 | 1315 static void sizer_set_prelight(SizerData *sd, gboolean prelit) |
9 | 1316 { |
1317 sd->handle_prelit = prelit; | |
1318 gtk_widget_queue_draw_area(sd->sizer, 0, 0, | |
1319 sd->sizer->allocation.width, sd->sizer->allocation.height); | |
1320 } | |
1321 | |
1448 | 1322 static gboolean sizer_enter_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data) |
9 | 1323 { |
1324 SizerData *sd = data; | |
1325 | |
1326 sizer_set_prelight(sd, TRUE); | |
1327 return TRUE; | |
1328 } | |
1329 | |
1448 | 1330 static gboolean sizer_leave_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data) |
9 | 1331 { |
1332 SizerData *sd = data; | |
1333 | |
1334 sizer_set_prelight(sd, FALSE); | |
1335 return TRUE; | |
1336 } | |
1337 | |
1448 | 1338 static gboolean sizer_expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data) |
9 | 1339 { |
1340 SizerData *sd = data; | |
1341 GdkRectangle clip; | |
1342 GtkOrientation orientation; | |
1343 GtkStateType state; | |
1344 | |
1345 gdk_region_get_clipbox(event->region, &clip); | |
1346 | |
1347 if (sd->position & SIZER_POS_LEFT || sd->position & SIZER_POS_RIGHT) | |
1348 { | |
1349 orientation = GTK_ORIENTATION_VERTICAL; | |
1350 } | |
1351 else | |
1352 { | |
1353 orientation = GTK_ORIENTATION_HORIZONTAL; | |
1354 } | |
1355 | |
1356 if (sd->handle_prelit) | |
1357 { | |
1358 state = GTK_STATE_PRELIGHT; | |
1359 } | |
1360 else | |
1361 { | |
1362 state = widget->state; | |
1363 } | |
1364 | |
1365 gtk_paint_handle(widget->style, widget->window, state, | |
1366 GTK_SHADOW_NONE, &clip, widget, "paned", | |
1367 0, 0, | |
1368 widget->allocation.width, widget->allocation.height, | |
1369 orientation); | |
1370 | |
1371 return TRUE; | |
1372 } | |
1373 | |
1374 static void sizer_realize_cb(GtkWidget *widget, gpointer data) | |
1375 { | |
1376 SizerData *sd = data; | |
1377 GdkCursorType n; | |
1378 | |
1379 n = 0; | |
1380 if (sd->position & SIZER_POS_TOP || sd->position & SIZER_POS_BOTTOM) | |
1381 { | |
1382 n = GDK_SB_V_DOUBLE_ARROW; | |
1383 } | |
1384 if (sd->position & SIZER_POS_LEFT || sd->position & SIZER_POS_RIGHT) | |
1385 { | |
1386 n = (n != 0) ? GDK_FLEUR : GDK_SB_H_DOUBLE_ARROW; | |
1387 } | |
1388 | |
1389 if (n != 0 && widget->window) | |
1390 { | |
1391 GdkCursor *cursor; | |
1392 cursor = gdk_cursor_new(n); | |
1393 gdk_window_set_cursor(widget->window, cursor); | |
1394 gdk_cursor_unref(cursor); | |
1395 } | |
1396 } | |
1397 | |
1398 static void sizer_destroy_cb(GtkWidget *widget, gpointer data) | |
1399 { | |
1400 SizerData *sd = data; | |
1401 | |
1402 g_free(sd); | |
1403 } | |
1404 | |
1405 GtkWidget *sizer_new(GtkWidget *parent, GtkWidget *bounding_widget, | |
1406 SizerPositionType position) | |
1407 { | |
1408 SizerData *sd; | |
1409 gint handle_size; | |
1410 | |
1411 sd = g_new0(SizerData, 1); | |
1412 | |
1413 sd->sizer = gtk_event_box_new(); | |
1414 sd->parent = parent; | |
1415 sd->bounding_widget = bounding_widget; | |
1416 sd->position = position; | |
1417 sd->hsize_min = -1; | |
1418 sd->hsize_max = -1; | |
1419 sd->vsize_min = -1; | |
1420 sd->vsize_max = -1; | |
1421 | |
1422 sd->in_drag = FALSE; | |
1423 sd->handle_prelit = FALSE; | |
1424 | |
1425 g_signal_connect(G_OBJECT(sd->sizer), "destroy", | |
1426 G_CALLBACK(sizer_destroy_cb), sd); | |
1427 | |
1428 g_signal_connect(G_OBJECT(sd->sizer), "motion_notify_event", | |
1429 G_CALLBACK(sizer_motion_cb), sd); | |
1430 g_signal_connect(G_OBJECT(sd->sizer), "button_press_event", | |
1431 G_CALLBACK(sizer_press_cb), sd); | |
1432 g_signal_connect(G_OBJECT(sd->sizer), "button_release_event", | |
1433 G_CALLBACK(sizer_release_cb), sd); | |
1434 | |
1435 g_signal_connect(G_OBJECT(sd->sizer), "enter_notify_event", | |
1436 G_CALLBACK(sizer_enter_cb), sd); | |
1437 g_signal_connect(G_OBJECT(sd->sizer), "leave_notify_event", | |
1438 G_CALLBACK(sizer_leave_cb), sd); | |
1439 | |
1440 gtk_widget_set_events(sd->sizer, GDK_POINTER_MOTION_MASK | | |
1441 GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | | |
1442 GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); | |
1443 | |
1444 g_signal_connect(sd->sizer, "realize", | |
1445 G_CALLBACK(sizer_realize_cb), sd); | |
1446 g_signal_connect(sd->sizer, "expose_event", | |
1447 G_CALLBACK(sizer_expose_cb), sd); | |
1448 | |
1449 handle_size = sizer_default_handle_size(); | |
1450 | |
1451 gtk_widget_set_size_request(sd->sizer, handle_size, handle_size); | |
1452 #if 0 | |
1453 /* use this if you add a shadow border to the handle */ | |
1454 gtk_widget_set_size_request(sd->sizer, handle_size + sd->sizer->style->xthickness * 2, | |
1455 handle_size + sd->sizer->style->ythickness * 2); | |
1456 #endif | |
1457 | |
1458 g_object_set_data(G_OBJECT(sd->sizer), SIZER_DATA_KEY,sd); | |
1459 | |
1460 return sd->sizer; | |
1461 } | |
1462 | |
1463 void sizer_set_limits(GtkWidget *sizer, | |
1464 gint hsize_min, gint hsize_max, | |
1465 gint vsize_min, gint vsize_max) | |
1466 { | |
1467 SizerData *sd; | |
1468 | |
1469 sd = g_object_get_data(G_OBJECT(sizer), SIZER_DATA_KEY); | |
1470 if (!sd) return; | |
1471 | |
1472 sd->hsize_min = hsize_min; | |
1473 sd->hsize_max = hsize_max; | |
1474 sd->vsize_min = vsize_min; | |
1475 sd->vsize_max = vsize_max; | |
1476 } | |
1477 | |
1478 | |
1479 /* | |
1480 *----------------------------------------------------------------------------- | |
1481 * storing data in a history list with key,data pairs | |
1482 *----------------------------------------------------------------------------- | |
1483 */ | |
1484 | |
1485 #define PREF_LIST_MARKER_INT "[INT]:" | |
1486 #define PREF_LIST_MARKER_DOUBLE "[DOUBLE]:" | |
1487 #define PREF_LIST_MARKER_STRING "[STRING]:" | |
1488 | |
1489 static GList *pref_list_find(const gchar *group, const gchar *token) | |
1490 { | |
1491 GList *work; | |
1492 gint l; | |
1493 | |
1494 l = strlen(token); | |
1495 | |
1496 work = history_list_get_by_key(group); | |
1497 while (work) | |
1498 { | |
1499 const gchar *text = work->data; | |
1500 | |
1501 if (strncmp(text, token, l) == 0) return work; | |
1502 | |
1503 work = work->next; | |
1504 } | |
1505 | |
1506 return NULL; | |
1507 } | |
1508 | |
1448 | 1509 static gboolean pref_list_get(const gchar *group, const gchar *key, const gchar *marker, const gchar **result) |
9 | 1510 { |
1511 gchar *token; | |
1512 GList *work; | |
1448 | 1513 gboolean ret; |
9 | 1514 |
1515 if (!group || !key || !marker) | |
1516 { | |
1517 *result = NULL; | |
1518 return FALSE; | |
1519 } | |
1520 | |
1521 token = g_strconcat(key, marker, NULL); | |
1522 | |
1523 work = pref_list_find(group, token); | |
1524 if (work) | |
1525 { | |
1526 *result = (const gchar *)work->data + strlen(token); | |
1527 if (strlen(*result) == 0) *result = NULL; | |
1528 ret = TRUE; | |
1529 } | |
1530 else | |
1531 { | |
1532 *result = NULL; | |
1533 ret = FALSE; | |
1534 } | |
1535 | |
1536 g_free(token); | |
1537 | |
442 | 1538 return ret; |
9 | 1539 } |
1540 | |
1541 static void pref_list_set(const gchar *group, const gchar *key, const gchar *marker, const gchar *text) | |
1542 { | |
1543 gchar *token; | |
1544 gchar *path; | |
1545 GList *work; | |
1546 | |
1547 if (!group || !key || !marker) return; | |
1548 | |
1549 token = g_strconcat(key, marker, NULL); | |
1550 path = g_strconcat(token, text, NULL); | |
1551 | |
1552 work = pref_list_find(group, token); | |
1553 if (work) | |
1554 { | |
1555 gchar *old_path = work->data; | |
1556 | |
1557 if (text) | |
1558 { | |
1559 work->data = path; | |
1560 path = NULL; | |
1561 | |
1562 g_free(old_path); | |
1563 } | |
1564 else | |
1565 { | |
1566 history_list_item_remove(group, old_path); | |
1567 } | |
1568 } | |
1569 else if (text) | |
1570 { | |
1571 history_list_add_to_key(group, path, 0); | |
1572 } | |
1573 | |
1574 g_free(path); | |
1575 g_free(token); | |
1576 } | |
1577 | |
1578 void pref_list_int_set(const gchar *group, const gchar *key, gint value) | |
1579 { | |
1580 gchar *text; | |
1581 | |
1582 text = g_strdup_printf("%d", value); | |
1583 pref_list_set(group, key, PREF_LIST_MARKER_INT, text); | |
1584 g_free(text); | |
1585 } | |
1586 | |
1448 | 1587 gboolean pref_list_int_get(const gchar *group, const gchar *key, gint *result) |
9 | 1588 { |
1589 const gchar *text; | |
1590 | |
1591 if (!group || !key) | |
1592 { | |
1593 *result = 0; | |
1594 return FALSE; | |
1595 } | |
1596 | |
1597 if (pref_list_get(group, key, PREF_LIST_MARKER_INT, &text) && text) | |
1598 { | |
1599 *result = (gint)strtol(text, NULL, 10); | |
1600 return TRUE; | |
1601 } | |
1602 | |
1603 *result = 0; | |
1604 return FALSE; | |
1605 } | |
1606 | |
1607 void pref_list_double_set(const gchar *group, const gchar *key, gdouble value) | |
1608 { | |
1609 gchar text[G_ASCII_DTOSTR_BUF_SIZE]; | |
1610 | |
1611 g_ascii_dtostr(text, sizeof(text), value); | |
1612 pref_list_set(group, key, PREF_LIST_MARKER_DOUBLE, text); | |
1613 } | |
1614 | |
1448 | 1615 gboolean pref_list_double_get(const gchar *group, const gchar *key, gdouble *result) |
9 | 1616 { |
1617 const gchar *text; | |
1618 | |
1619 if (!group || !key) | |
1620 { | |
1621 *result = 0; | |
1622 return FALSE; | |
1623 } | |
1624 | |
1625 if (pref_list_get(group, key, PREF_LIST_MARKER_DOUBLE, &text) && text) | |
1626 { | |
1627 *result = g_ascii_strtod(text, NULL); | |
1628 return TRUE; | |
1629 } | |
1630 | |
1631 *result = 0; | |
1632 return FALSE; | |
1633 } | |
1634 | |
1635 void pref_list_string_set(const gchar *group, const gchar *key, const gchar *value) | |
1636 { | |
1637 pref_list_set(group, key, PREF_LIST_MARKER_STRING, value); | |
1638 } | |
1639 | |
1448 | 1640 gboolean pref_list_string_get(const gchar *group, const gchar *key, const gchar **result) |
9 | 1641 { |
1642 return pref_list_get(group, key, PREF_LIST_MARKER_STRING, result); | |
1643 } | |
1644 | |
1645 | |
339
de1c2cd06fce
Rename user_specified_window_background and window_background_color
zas_
parents:
208
diff
changeset
|
1646 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
|
1647 { |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1648 GdkColor *color = data; |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1649 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1650 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
|
1651 } |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1652 |
339
de1c2cd06fce
Rename user_specified_window_background and window_background_color
zas_
parents:
208
diff
changeset
|
1653 GtkWidget *pref_color_button_new(GtkWidget *parent_box, |
de1c2cd06fce
Rename user_specified_window_background and window_background_color
zas_
parents:
208
diff
changeset
|
1654 const gchar *title, const GdkColor *color, |
de1c2cd06fce
Rename user_specified_window_background and window_background_color
zas_
parents:
208
diff
changeset
|
1655 GCallback func, gpointer data) |
208
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1656 { |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1657 GtkWidget *button; |
442 | 1658 |
208
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1659 if (color) |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1660 { |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1661 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
|
1662 } |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1663 else |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1664 { |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1665 button = gtk_color_button_new(); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1666 } |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1667 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1668 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
|
1669 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1670 if (title) |
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 GtkWidget *label; |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1673 GtkWidget *hbox; |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1674 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1675 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
|
1676 label = gtk_label_new(title); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1677 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1678 hbox = gtk_hbox_new(TRUE, 0); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1679 gtk_box_pack_start(GTK_BOX(parent_box), hbox, TRUE, TRUE, 0); |
442 | 1680 |
208
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1681 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
|
1682 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
|
1683 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1684 gtk_widget_show_all(hbox); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1685 } |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1686 else |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1687 { |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1688 gtk_widget_show(button); |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1689 } |
442 | 1690 |
208
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1691 return button; |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
113
diff
changeset
|
1692 } |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1693 |
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 *----------------------------------------------------------------------------- |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1696 * text widget |
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 */ |
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 gchar *text_widget_text_pull(GtkWidget *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 if (GTK_IS_TEXT_VIEW(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 GtkTextBuffer *buffer; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1705 GtkTextIter start, end; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1706 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1707 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
|
1708 gtk_text_buffer_get_bounds(buffer, &start, &end); |
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 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
|
1711 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1712 else if (GTK_IS_ENTRY(text_widget)) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1713 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1714 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
|
1715 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1716 else |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1717 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1718 return NULL; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1719 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1720 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1721 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
1284
diff
changeset
|
1722 |
1055
1646720364cf
Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents:
1044
diff
changeset
|
1723 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ |