1 /* -*- Mode: C; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 3 -*- */
2
3 /*
4 * GImageView
5 * Copyright (C) 2001 Takuro Ashie
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 *
21 * $Id: gtkutils.c,v 1.30 2004/10/03 14:53:55 makeinu Exp $
22 */
23
24 #ifdef HAVE_CONFIG_H
25 # include "config.h"
26 #endif
27
28 #include <stdio.h>
29 #include <string.h>
30 #include <unistd.h>
31 #include <sys/stat.h>
32 #include <gtk/gtk.h>
33 #include <gdk/gdkkeysyms.h>
34
35 #include "auto_completion.h"
36 #include "charset.h"
37 #include "fileutil.h"
38 #include "gtkutils.h"
39 #include "gimv_icon_stock.h"
40 #include "intl.h"
41 #include "prefs.h"
42
43 #ifndef BUF_SIZE
44 #define BUF_SIZE 4096
45 #endif
46
47 /* callback functions for confirm dialog */
48 static gint cb_dummy (GtkWidget *button,
49 gpointer data);
50 static void cb_confirm_yes (GtkWidget *button,
51 ConfirmType *type);
52 static void cb_confirm_yes_to_all (GtkWidget *button,
53 ConfirmType *type);
54 static void cb_confirm_no (GtkWidget *button,
55 ConfirmType *type);
56 static void cb_confirm_cancel (GtkWidget *button,
57 ConfirmType *type);
58
59 /* callback functions for message dialog */
60 static void cb_message_dialog_quit (GtkWidget *button,
61 gpointer data);
62
63 /* callback functions for progress bar window */
64 static void cb_progress_win_cancel (GtkWidget *button,
65 gboolean *cancel_pressed);
66
67 /* callback functions for text entry window */
68 static void cb_textpop_enter (GtkWidget *button,
69 gboolean *ok_pressd);
70 static void cb_textpop_ok_button (GtkWidget *button,
71 gboolean *ok_pressd);
72 static void cb_textpop_cancel_button (GtkWidget *button,
73 gboolean *ok_pressd);
74
75
76
77 /******************************************************************************
78 *
79 * misc
80 *
81 ******************************************************************************/
82 const gchar *
boolean_to_text(gboolean boolval)83 boolean_to_text (gboolean boolval)
84 {
85 if (boolval)
86 return "TRUE";
87 else
88 return "FALSE";
89 }
90
91
92 gboolean
text_to_boolean(gchar * text)93 text_to_boolean (gchar *text)
94 {
95 g_return_val_if_fail (text && *text, FALSE);
96
97 if (!g_strcasecmp (text, "TRUE") || !g_strcasecmp (text, "ENABLE"))
98 return TRUE;
99 else
100 return FALSE;
101 }
102
103
104 void
gtkutil_get_widget_area(GtkWidget * widget,GdkRectangle * area)105 gtkutil_get_widget_area (GtkWidget *widget,
106 GdkRectangle *area)
107 {
108 g_return_if_fail (widget);
109 g_return_if_fail (area);
110
111 area->x = widget->allocation.x;
112 area->y = widget->allocation.y;
113 area->width = widget->allocation.width;
114 area->height = widget->allocation.height;
115
116 /* FIXME? */
117 area->x = 0;
118 area->y = 0;
119 /* END FIXME? */
120 }
121
122
123 /*
124 * create_toggle_button:
125 * @ Create toggle button widget.
126 *
127 * label : Label text for toggle button.
128 * def_val : Default value.
129 * Return : Toggle button widget.
130 */
131 GtkWidget *
gtkutil_create_check_button(const gchar * label_text,gboolean def_val,gpointer func,gpointer data)132 gtkutil_create_check_button (const gchar *label_text, gboolean def_val,
133 gpointer func, gpointer data)
134 {
135 GtkWidget *toggle;
136
137 toggle = gtk_check_button_new_with_label (_(label_text));
138 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(toggle), def_val);
139
140 if (func)
141 gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
142 GTK_SIGNAL_FUNC (func), data);
143
144 return toggle;
145 }
146
147
148 GtkWidget *
gtkutil_create_toolbar(void)149 gtkutil_create_toolbar (void)
150 {
151 GtkWidget *toolbar;
152
153 #ifdef USE_GTK2
154 toolbar = gtk_toolbar_new ();
155 #else /* USE_GTK2 */
156 toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH);
157 gtk_toolbar_set_button_relief(GTK_TOOLBAR(toolbar), GTK_RELIEF_NONE);
158 gtk_toolbar_set_space_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_SPACE_LINE);
159 gtk_toolbar_set_space_size (GTK_TOOLBAR(toolbar), 16);
160 #endif /* USE_GTK2 */
161
162 return toolbar;
163 }
164
165
166 GtkWidget *
gtkutil_create_spin_button(GtkAdjustment * adj)167 gtkutil_create_spin_button (GtkAdjustment *adj)
168 {
169 GtkWidget *spinner = gtk_spin_button_new (adj, 0, 0);
170 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
171 #ifndef USE_GTK2
172 gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
173 GTK_SHADOW_NONE);
174 #endif /* USE_GTK2 */
175
176 return spinner;
177 }
178
179
180 GtkWidget *
gtkutil_option_menu_get_current(GtkWidget * option_menu)181 gtkutil_option_menu_get_current (GtkWidget *option_menu)
182 {
183 g_return_val_if_fail (GTK_IS_OPTION_MENU (option_menu), NULL);
184
185 #ifdef USE_GTK2
186 {
187 GtkWidget *menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (option_menu));
188 gint nth = gtk_option_menu_get_history (GTK_OPTION_MENU (option_menu));
189 GList *node = g_list_nth (GTK_MENU_SHELL (menu)->children, nth);
190 if (!node) return NULL;
191 return node->data;
192 }
193 #else /* USE_GTK2 */
194 return GTK_OPTION_MENU (option_menu)->menu_item;
195 #endif /* USE_GTK2 */
196 }
197
198
199 GList *
gtkutil_list_insert_sorted(GList * list,gpointer data,GCompareFunc func,gboolean reverse)200 gtkutil_list_insert_sorted (GList *list,
201 gpointer data,
202 GCompareFunc func,
203 gboolean reverse)
204 {
205 GList *tmp_list = list;
206 GList *new_list;
207 gint cmp;
208
209 g_return_val_if_fail (func != NULL, list);
210
211 if (!list) {
212 new_list = g_list_alloc();
213 new_list->data = data;
214 return new_list;
215 }
216
217 cmp = (*func) (data, tmp_list->data);
218
219 while ((tmp_list->next) &&
220 ((!reverse && cmp > 0) || (reverse && cmp <= 0)))
221 {
222 tmp_list = tmp_list->next;
223 cmp = (*func) (data, tmp_list->data);
224 }
225
226 new_list = g_list_alloc();
227 new_list->data = data;
228
229 if ((!tmp_list->next) && (cmp > 0)) {
230 tmp_list->next = new_list;
231 new_list->prev = tmp_list;
232 return list;
233 }
234
235 if (tmp_list->prev) {
236 tmp_list->prev->next = new_list;
237 new_list->prev = tmp_list->prev;
238 }
239 new_list->next = tmp_list;
240 tmp_list->prev = new_list;
241
242 if (tmp_list == list)
243 return new_list;
244 else
245 return list;
246 }
247
248
249
250 /******************************************************************************
251 *
252 * Confirm Dialog Window
253 *
254 ******************************************************************************/
255 static gint
cb_dummy(GtkWidget * button,gpointer data)256 cb_dummy (GtkWidget *button, gpointer data)
257 {
258 return TRUE;
259 }
260
261
262 static void
cb_confirm_yes(GtkWidget * button,ConfirmType * type)263 cb_confirm_yes (GtkWidget *button, ConfirmType *type)
264 {
265 *type = CONFIRM_YES;
266 gtk_main_quit ();
267 }
268
269
270 static void
cb_confirm_yes_to_all(GtkWidget * button,ConfirmType * type)271 cb_confirm_yes_to_all (GtkWidget *button, ConfirmType *type)
272 {
273 *type = CONFIRM_YES_TO_ALL;
274 gtk_main_quit ();
275 }
276
277
278 static void
cb_confirm_no(GtkWidget * button,ConfirmType * type)279 cb_confirm_no (GtkWidget *button, ConfirmType *type)
280 {
281 *type = CONFIRM_NO;
282 gtk_main_quit ();
283 }
284
285
286 static void
cb_confirm_no_to_all(GtkWidget * button,ConfirmType * type)287 cb_confirm_no_to_all (GtkWidget *button, ConfirmType *type)
288 {
289 *type = CONFIRM_NO_TO_ALL;
290 gtk_main_quit ();
291 }
292
293
294 static void
cb_confirm_cancel(GtkWidget * button,ConfirmType * type)295 cb_confirm_cancel (GtkWidget *button, ConfirmType *type)
296 {
297 *type = CONFIRM_CANCEL;
298 gtk_main_quit ();
299 }
300
301
302 ConfirmType
gtkutil_confirm_dialog(const gchar * title,const gchar * message,ConfirmDialogFlags flags,GtkWindow * parent)303 gtkutil_confirm_dialog (const gchar *title, const gchar *message,
304 ConfirmDialogFlags flags, GtkWindow *parent)
305 {
306 ConfirmType retval = CONFIRM_NO;
307 GtkWidget *window;
308 GtkWidget *vbox, *hbox, *button, *label;
309 GtkWidget *icon;
310
311 window = gtk_dialog_new ();
312 if (parent)
313 gtk_window_set_transient_for (GTK_WINDOW (window), parent);
314 gtk_window_set_title (GTK_WINDOW (window), title);
315 gtk_window_set_default_size (GTK_WINDOW (window), 300, 120);
316 /* gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (window)->vbox), 5); */
317 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
318 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
319 GTK_SIGNAL_FUNC (cb_dummy), NULL);
320
321 /* message area */
322 vbox = gtk_vbox_new (FALSE, 0);
323 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE, 0);
324 gtk_container_set_border_width (GTK_CONTAINER (vbox), 15);
325 gtk_widget_show (vbox);
326
327 hbox = gtk_hbox_new (FALSE, 0);
328 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
329 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
330 gtk_widget_show (hbox);
331
332 /* icon */
333 icon = gimv_icon_stock_get_widget ("question");
334 gtk_box_pack_start (GTK_BOX (hbox), icon, TRUE, TRUE, 0);
335 gtk_widget_show (icon);
336
337 /* message */
338 label = gtk_label_new (message);
339 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
340 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
341 gtk_widget_show (label);
342
343 /* buttons */
344 button = gtk_button_new_with_label (_("Yes"));
345 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
346 button, TRUE, TRUE, 0);
347 gtk_signal_connect (GTK_OBJECT (button), "clicked",
348 GTK_SIGNAL_FUNC (cb_confirm_yes),
349 &retval);
350 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
351 gtk_widget_show (button);
352 gtk_widget_grab_focus (button);
353
354 if (flags & ConfirmDialogMultipleFlag) {
355 button = gtk_button_new_with_label (_("Yes to All"));
356 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
357 button, TRUE, TRUE, 0);
358 gtk_signal_connect (GTK_OBJECT (button), "clicked",
359 GTK_SIGNAL_FUNC (cb_confirm_yes_to_all),
360 &retval);
361 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
362 gtk_widget_show (button);
363 }
364
365 button = gtk_button_new_with_label (_("No"));
366 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
367 button, TRUE, TRUE, 0);
368 gtk_signal_connect (GTK_OBJECT (button), "clicked",
369 GTK_SIGNAL_FUNC (cb_confirm_no),
370 &retval);
371 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
372 gtk_widget_show (button);
373
374 if (flags & ConfirmDialogMultipleFlag) {
375 button = gtk_button_new_with_label (_("Cancel"));
376 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
377 button, TRUE, TRUE, 0);
378 gtk_signal_connect (GTK_OBJECT (button), "clicked",
379 GTK_SIGNAL_FUNC (cb_confirm_cancel),
380 &retval);
381 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
382 gtk_widget_show (button);
383 }
384
385 gtk_widget_show (window);
386
387 gtk_grab_add (window);
388 gtk_main ();
389 gtk_grab_remove (window);
390 gtk_widget_destroy (window);
391
392 return retval;
393 }
394
395
396 #include "gimv_image_view.h"
397
398 typedef struct OverWriteDialog_Tag
399 {
400 GimvImageInfo *info1, *info2;
401 GtkWidget *window, *iv1, *iv2, *show_compare_button, *compare_area, *entry;
402 gchar *new_path;
403 gint new_path_len;
404 ConfirmType retval;
405 } OverWriteDialog;
406
407
408 static void
cb_show_compare(GtkButton * button,OverWriteDialog * dialog)409 cb_show_compare (GtkButton *button, OverWriteDialog *dialog)
410 {
411 gimv_image_view_change_image (GIMV_IMAGE_VIEW (dialog->iv1), dialog->info1);
412 gimv_image_view_change_image (GIMV_IMAGE_VIEW (dialog->iv2), dialog->info2);
413 }
414
415
416 static void
cb_show_image1(GtkButton * button,OverWriteDialog * dialog)417 cb_show_image1 (GtkButton *button, OverWriteDialog *dialog)
418 {
419 gimv_image_view_change_image (GIMV_IMAGE_VIEW (dialog->iv1), dialog->info1);
420 }
421
422
423
424 static void
cb_show_image2(GtkButton * button,OverWriteDialog * dialog)425 cb_show_image2 (GtkButton *button, OverWriteDialog *dialog)
426 {
427 gimv_image_view_change_image (GIMV_IMAGE_VIEW (dialog->iv2), dialog->info2);
428 }
429
430
431 static void
overwrite_confirm_rename(OverWriteDialog * dialog)432 overwrite_confirm_rename (OverWriteDialog *dialog)
433 {
434 const gchar *filename_internal
435 = g_basename (gtk_entry_get_text (GTK_ENTRY (dialog->entry)));
436 gchar *dirname, *filename;
437
438 if (!filename_internal && *filename_internal) return;
439 g_return_if_fail (dialog->new_path && dialog->new_path_len > 0);
440
441 dirname = g_dirname (gimv_image_info_get_path (dialog->info1));
442 g_return_if_fail (dirname);
443 if (!*dirname) g_free (dirname);
444 g_return_if_fail (*dirname);
445
446 filename = charset_internal_to_locale (filename_internal);
447 g_return_if_fail (filename);
448 if (!*filename) g_free (filename);
449 g_return_if_fail (*filename);
450
451 g_snprintf (dialog->new_path, dialog->new_path_len, "%s/%s",
452 dirname, filename);
453
454 /* check the new path */
455 if (file_exists (dialog->new_path)) {
456 gchar error_message[BUF_SIZE];
457 g_snprintf (error_message, BUF_SIZE,
458 _("The file exists : %s"),
459 dialog->new_path);
460 gtkutil_message_dialog (_("Error!!"), error_message,
461 GTK_WINDOW (dialog->window));
462 g_free (dirname);
463 g_free (filename);
464 return;
465 }
466
467 g_free (dirname);
468 g_free (filename);
469
470 dialog->retval = CONFIRM_NO;
471
472 gtk_main_quit ();
473 }
474
475
476 static void
cb_confirm_rename(GtkButton * button,OverWriteDialog * dialog)477 cb_confirm_rename (GtkButton *button, OverWriteDialog *dialog)
478 {
479 overwrite_confirm_rename (dialog);
480 }
481
482
483 static void
cb_confirm_rename_enter(GtkEntry * entry,OverWriteDialog * dialog)484 cb_confirm_rename_enter (GtkEntry *entry, OverWriteDialog *dialog)
485 {
486 overwrite_confirm_rename (dialog);
487 }
488
489
490 ConfirmType
gtkutil_overwrite_confirm_dialog(const gchar * title,const gchar * message,const gchar * dest_file,const gchar * src_file,gchar * new_path,gint new_path_len,ConfirmDialogFlags flags,GtkWindow * parent)491 gtkutil_overwrite_confirm_dialog (const gchar *title, const gchar *message,
492 const gchar *dest_file, const gchar *src_file,
493 gchar *new_path, gint new_path_len,
494 ConfirmDialogFlags flags,
495 GtkWindow *parent)
496 {
497 OverWriteDialog dialog;
498 GtkWidget *window;
499 GtkWidget *vbox, *hbox, *button, *label, *entry;
500 GtkWidget *icon;
501 GtkWidget *vbox2;
502 gchar *filename;
503
504 dialog.retval = CONFIRM_NO;
505 dialog.info1 = gimv_image_info_get (dest_file);
506 dialog.info2 = gimv_image_info_get (src_file);
507 dialog.new_path = new_path;
508 dialog.new_path_len = new_path_len;
509
510 dialog.window = window = gtk_dialog_new ();
511 if (parent)
512 gtk_window_set_transient_for (GTK_WINDOW (window), parent);
513 gtk_window_set_title (GTK_WINDOW (window), title);
514 gtk_window_set_default_size (GTK_WINDOW (window), 300, 120);
515 /* gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (window)->vbox), 5); */
516 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
517 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
518 GTK_SIGNAL_FUNC (cb_dummy), NULL);
519
520 /* message area */
521 vbox = gtk_vbox_new (FALSE, 0);
522 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE, 0);
523 gtk_container_set_border_width (GTK_CONTAINER (vbox), 15);
524 gtk_widget_show (vbox);
525
526 hbox = gtk_hbox_new (FALSE, 0);
527 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
528 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
529 gtk_widget_show (hbox);
530
531 /* icon */
532 icon = gimv_icon_stock_get_widget ("question");
533 gtk_box_pack_start (GTK_BOX (hbox), icon, TRUE, TRUE, 0);
534 gtk_widget_show (icon);
535
536 /* message */
537 label = gtk_label_new (message);
538 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
539 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
540 gtk_widget_show (label);
541
542 /* compare area */
543 {
544 /* show image buttons */
545 hbox = gtk_hbox_new (TRUE, 0);
546 gtk_box_pack_start (GTK_BOX (vbox),
547 hbox, FALSE, FALSE, 2);
548 gtk_widget_show (hbox);
549
550 label = gtk_button_new_with_label (_("Show destination"));
551 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 2);
552 gtk_signal_connect (GTK_OBJECT (label), "clicked",
553 GTK_SIGNAL_FUNC (cb_show_image1),
554 &dialog);
555 gtk_widget_show (label);
556
557 button = gtk_button_new_with_label (_("Show both images"));
558 dialog.show_compare_button = button;
559 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 2);
560 gtk_signal_connect (GTK_OBJECT (button), "clicked",
561 GTK_SIGNAL_FUNC (cb_show_compare),
562 &dialog);
563 gtk_widget_show (button);
564
565 label = gtk_button_new_with_label (_("Show source"));
566 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 2);
567 gtk_signal_connect (GTK_OBJECT (label), "clicked",
568 GTK_SIGNAL_FUNC (cb_show_image2),
569 &dialog);
570 gtk_widget_show (label);
571
572 /* view */
573 dialog.compare_area = hbox = gtk_hbox_new (TRUE, 0);
574 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
575 gtk_widget_show (hbox);
576
577 /* destination */
578 vbox2 = gtk_vbox_new (FALSE, 0);
579 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 2);
580 gtk_widget_show (vbox2);
581
582 dialog.iv1 = gimv_image_view_new (NULL);
583 gtk_object_set (GTK_OBJECT (dialog.iv1),
584 "default_zoom", 3,
585 "default_rotation", 0,
586 "keep_aspect", TRUE,
587 NULL);
588 gimv_image_view_hide_scrollbar (GIMV_IMAGE_VIEW (dialog.iv1));
589 gtk_widget_set_usize (dialog.iv1, -1, 150);
590 gtk_box_pack_start (GTK_BOX (vbox2), dialog.iv1, TRUE, TRUE, 0);
591 gtk_widget_show (dialog.iv1);
592
593 /* gimv_image_view_set_text (dialog.iv1, information) */
594
595
596 /* source */
597 vbox2 = gtk_vbox_new (FALSE, 0);
598 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 2);
599 gtk_widget_show (vbox2);
600
601 dialog.iv2 = gimv_image_view_new (NULL);
602 gtk_object_set (GTK_OBJECT (dialog.iv2),
603 "default_zoom", 3,
604 "default_rotation", 0,
605 "keep_aspect", TRUE,
606 NULL);
607 gimv_image_view_hide_scrollbar (GIMV_IMAGE_VIEW (dialog.iv2));
608 gtk_widget_set_usize (dialog.iv2, -1, 150);
609 gtk_box_pack_start (GTK_BOX (vbox2), dialog.iv2, TRUE, TRUE, 0);
610 gtk_widget_show (dialog.iv2);
611
612 /* gimv_image_view_set_text (dialog.iv2, information) */
613 }
614
615 vbox = gtk_vbox_new (FALSE, 0);
616 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
617 vbox, FALSE, FALSE, 0);
618 gtk_widget_show (vbox);
619
620 /* rename entry */
621 hbox = gtk_hbox_new (FALSE, 0);
622 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
623 gtk_widget_show (hbox);
624
625 dialog.entry = entry = gtk_entry_new ();
626 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
627 gtk_signal_connect (GTK_OBJECT (entry), "activate",
628 GTK_SIGNAL_FUNC (cb_confirm_rename_enter), &dialog);
629 filename = charset_to_internal (g_basename (src_file),
630 conf.charset_filename,
631 conf.charset_auto_detect_fn,
632 conf.charset_filename_mode);
633 gtk_entry_set_text (GTK_ENTRY (entry), filename);
634 g_free (filename);
635 filename = NULL;
636 gtk_widget_show (entry);
637
638 button = gtk_button_new_with_label (_("Rename"));
639 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
640 gtk_signal_connect (GTK_OBJECT (button), "clicked",
641 GTK_SIGNAL_FUNC (cb_confirm_rename),
642 &dialog);
643 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
644 gtk_widget_show (button);
645
646 /* buttons */
647 hbox = gtk_hbox_new (TRUE, 0);
648 gtk_box_pack_start (GTK_BOX (vbox),
649 hbox, TRUE, TRUE, 0);
650 gtk_widget_show (hbox);
651
652 button = gtk_button_new_with_label (_("Yes"));
653 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
654 gtk_signal_connect (GTK_OBJECT (button), "clicked",
655 GTK_SIGNAL_FUNC (cb_confirm_yes),
656 &dialog.retval);
657 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
658 gtk_widget_show (button);
659 gtk_widget_grab_focus (button);
660
661 if (flags & ConfirmDialogMultipleFlag) {
662 button = gtk_button_new_with_label (_("Yes to All"));
663 gtk_box_pack_start (GTK_BOX (hbox),button, TRUE, TRUE, 0);
664 gtk_signal_connect (GTK_OBJECT (button), "clicked",
665 GTK_SIGNAL_FUNC (cb_confirm_yes_to_all),
666 &dialog.retval);
667 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
668 gtk_widget_show (button);
669 }
670
671 button = gtk_button_new_with_label (_("Skip"));
672 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
673 gtk_signal_connect (GTK_OBJECT (button), "clicked",
674 GTK_SIGNAL_FUNC (cb_confirm_no),
675 &dialog.retval);
676 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
677 gtk_widget_show (button);
678
679 button = gtk_button_new_with_label (_("Skip all"));
680 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
681 gtk_signal_connect (GTK_OBJECT (button), "clicked",
682 GTK_SIGNAL_FUNC (cb_confirm_no_to_all),
683 &dialog.retval);
684 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
685 gtk_widget_show (button);
686
687 if (flags & ConfirmDialogMultipleFlag) {
688 button = gtk_button_new_with_label (_("Cancel"));
689 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
690 gtk_signal_connect (GTK_OBJECT (button), "clicked",
691 GTK_SIGNAL_FUNC (cb_confirm_cancel),
692 &dialog.retval);
693 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
694 gtk_widget_show (button);
695 }
696
697 gtk_widget_show (window);
698
699 gtk_grab_add (window);
700 gtk_main ();
701 gtk_grab_remove (window);
702 gtk_widget_destroy (window);
703
704 if (dialog.info1) gimv_image_info_unref (dialog.info1);
705 if (dialog.info2) gimv_image_info_unref (dialog.info2);
706
707 return dialog.retval;
708 }
709
710
711
712 /******************************************************************************
713 *
714 * Message Dialog Window
715 *
716 ******************************************************************************/
717 static void
cb_message_dialog_quit(GtkWidget * button,gpointer data)718 cb_message_dialog_quit (GtkWidget *button, gpointer data)
719 {
720 gtk_main_quit ();
721 }
722
723
724 void
gtkutil_message_dialog(const gchar * title,const gchar * message,GtkWindow * parent)725 gtkutil_message_dialog (const gchar *title, const gchar *message, GtkWindow *parent)
726 {
727 GtkWidget *window;
728 GtkWidget *button, *label, *vbox, *hbox;
729 GtkWidget *alert_icon;
730
731 window = gtk_dialog_new ();
732 if (parent)
733 gtk_window_set_transient_for (GTK_WINDOW (window), parent);
734 gtk_window_set_title (GTK_WINDOW (window), title);
735 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
736 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
737 GTK_SIGNAL_FUNC (cb_dummy), NULL);
738
739 /* message area */
740 vbox = gtk_vbox_new (FALSE, 0);
741 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
742 TRUE, TRUE, 0);
743 gtk_container_set_border_width (GTK_CONTAINER (vbox), 15);
744 gtk_widget_show (vbox);
745
746 hbox = gtk_hbox_new (FALSE, 0);
747 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
748 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
749 gtk_widget_show (hbox);
750
751 /* icon */
752 alert_icon = gimv_icon_stock_get_widget ("alert");
753 gtk_box_pack_start (GTK_BOX (hbox), alert_icon, TRUE, TRUE, 0);
754 gtk_widget_show (alert_icon);
755
756 /* message */
757 label = gtk_label_new (message);
758 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
759 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
760 gtk_widget_show (label);
761
762 /* button */
763 button = gtk_button_new_with_label (_("OK"));
764 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
765 button, TRUE, TRUE, 0);
766 gtk_signal_connect (GTK_OBJECT (button), "clicked",
767 GTK_SIGNAL_FUNC (cb_message_dialog_quit), NULL);
768 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
769 gtk_widget_show (button);
770
771 gtk_widget_grab_focus (button);
772
773 gtk_widget_show (window);
774
775 gtk_grab_add (window);
776 gtk_main ();
777 gtk_grab_remove (window);
778 gtk_widget_destroy (window);
779 }
780
781
782
783 /******************************************************************************
784 *
785 * Progress Bar Window
786 *
787 ******************************************************************************/
788 static void
cb_progress_win_cancel(GtkWidget * button,gboolean * cancel_pressed)789 cb_progress_win_cancel (GtkWidget *button, gboolean *cancel_pressed)
790 {
791 *cancel_pressed = TRUE;
792 }
793
794
795 void
gtkutil_progress_window_update(GtkWidget * window,gchar * title,gchar * message,gchar * progress_text,gfloat progress)796 gtkutil_progress_window_update (GtkWidget *window,
797 gchar *title, gchar *message,
798 gchar *progress_text, gfloat progress)
799 {
800 GtkWidget *label;
801 GtkWidget *progressbar;
802
803 g_return_if_fail (window);
804
805 label = gtk_object_get_data (GTK_OBJECT (window), "label");
806 progressbar = gtk_object_get_data (GTK_OBJECT (window), "progressbar");
807
808 g_return_if_fail (label && progressbar);
809
810 if (title)
811 gtk_window_set_title (GTK_WINDOW (window), _(title));
812 if (message)
813 gtk_label_set_text (GTK_LABEL (label), message);
814 if (progress_text)
815 gtk_progress_set_format_string(GTK_PROGRESS (progressbar),
816 progress_text);
817 if (progress > 0.0 && progress < 1.0)
818 gtk_progress_bar_update (GTK_PROGRESS_BAR (progressbar), progress);
819 }
820
821
822 GtkWidget *
gtkutil_create_progress_window(gchar * title,gchar * initial_message,gboolean * cancel_pressed,gint width,gint height,GtkWindow * parent)823 gtkutil_create_progress_window (gchar *title, gchar *initial_message,
824 gboolean *cancel_pressed,
825 gint width, gint height, GtkWindow *parent)
826 {
827 GtkWidget *window;
828 GtkWidget *vbox;
829 GtkWidget *label;
830 GtkWidget *progressbar;
831 GtkWidget *button;
832
833 g_return_val_if_fail (title && initial_message && cancel_pressed, NULL);
834
835 *cancel_pressed = FALSE;
836
837 /* create dialog window */
838 window = gtk_dialog_new ();
839 if (parent)
840 gtk_window_set_transient_for (GTK_WINDOW (window), parent);
841 gtk_container_border_width (GTK_CONTAINER (window), 3);
842 gtk_window_set_title (GTK_WINDOW (window), title);
843 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
844 gtk_window_set_default_size (GTK_WINDOW (window), width, height);
845 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
846 GTK_SIGNAL_FUNC (cb_dummy), NULL);
847
848 /* message area */
849 vbox = gtk_vbox_new (FALSE, 5);
850 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox,
851 TRUE, TRUE, 0);
852 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
853 gtk_widget_show (vbox);
854
855 /* label */
856 label = gtk_label_new (initial_message);
857 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
858
859 /* progress bar */
860 progressbar = gtk_progress_bar_new();
861 gtk_progress_set_show_text(GTK_PROGRESS(progressbar), TRUE);
862 gtk_box_pack_start (GTK_BOX (vbox), progressbar, FALSE, FALSE, 0);
863
864 /* cancel button */
865 button = gtk_button_new_with_label (_("Cancel"));
866 gtk_container_border_width (GTK_CONTAINER (button), 0);
867 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
868 TRUE, TRUE, 0);
869 gtk_signal_connect (GTK_OBJECT(button), "clicked",
870 GTK_SIGNAL_FUNC(cb_progress_win_cancel), cancel_pressed);
871 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
872
873 gtk_object_set_data (GTK_OBJECT (window), "label", label);
874 gtk_object_set_data (GTK_OBJECT (window), "progressbar", progressbar);
875
876 gtk_widget_show_all (window);
877
878 return window;
879 }
880
881
882
883 /******************************************************************************
884 *
885 * Text Entry Window
886 *
887 ******************************************************************************/
888 static void
cb_textpop_enter(GtkWidget * button,gboolean * ok_pressd)889 cb_textpop_enter (GtkWidget *button, gboolean *ok_pressd)
890 {
891 *ok_pressd = TRUE;
892 gtk_main_quit ();
893 }
894
895
896 static void
cb_textpop_ok_button(GtkWidget * button,gboolean * ok_pressd)897 cb_textpop_ok_button (GtkWidget *button, gboolean *ok_pressd)
898 {
899 *ok_pressd = TRUE;
900 gtk_main_quit ();
901 }
902
903
904 static void
cb_textpop_cancel_button(GtkWidget * button,gboolean * ok_pressd)905 cb_textpop_cancel_button (GtkWidget *button, gboolean *ok_pressd)
906 {
907 *ok_pressd = FALSE;
908 gtk_main_quit ();
909 }
910
911
912 static gint
cb_textpop_key_press(GtkWidget * widget,GdkEventKey * event,gboolean * ok_pressd)913 cb_textpop_key_press (GtkWidget *widget,
914 GdkEventKey *event,
915 gboolean *ok_pressd)
916 {
917 const gchar *path;
918 gchar *text;
919 gint n, len;
920 guint comp_key1, comp_key2;
921 GdkModifierType comp_mods1, comp_mods2;
922
923 if (akey.common_auto_completion1)
924 gtk_accelerator_parse (akey.common_auto_completion1,
925 &comp_key1, &comp_mods1);
926 if (akey.common_auto_completion2)
927 gtk_accelerator_parse (akey.common_auto_completion2,
928 &comp_key2, &comp_mods2);
929
930 if (event->keyval == GDK_Tab
931 || (event->keyval == comp_key1 && (!comp_mods1 || (event->state & comp_mods1)))
932 || (event->keyval == comp_key2 && (!comp_mods1 || (event->state & comp_mods2))))
933 {
934 path = gtk_entry_get_text (GTK_ENTRY (widget));
935 n = auto_compl_get_n_alternatives (path);
936
937 if (n < 1) return TRUE;
938
939 text = auto_compl_get_common_prefix ();
940
941 if (n == 1) {
942 auto_compl_hide_alternatives ();
943 gtk_entry_set_text (GTK_ENTRY (widget), text);
944 if (text[strlen(text) - 1] != '/')
945 gtk_entry_append_text (GTK_ENTRY (widget), "/");
946 } else {
947 gtk_entry_set_text (GTK_ENTRY (widget), text);
948 auto_compl_show_alternatives (widget);
949 }
950
951 if (text)
952 g_free (text);
953 return TRUE;
954
955 } else {
956 switch (event->keyval) {
957 case GDK_Return:
958 case GDK_KP_Enter:
959 path = gtk_entry_get_text (GTK_ENTRY (widget));
960
961 if (!isdir (path)) return FALSE;
962
963 len = strlen (path);
964 if (path[len - 1] != '/') {
965 text = g_strconcat (path, "/", NULL);
966 } else {
967 text = g_strdup (path);
968 }
969 g_free (text);
970 break;
971 case GDK_Right:
972 case GDK_Left:
973 case GDK_Up:
974 case GDK_Down:
975 break;
976 case GDK_Escape:
977 *ok_pressd = FALSE;
978 gtk_main_quit ();
979 break;
980 default:
981 break;
982 }
983 }
984
985 return FALSE;
986 }
987
988
989 gchar *
gtkutil_popup_textentry(const gchar * title,const gchar * label_text,const gchar * entry_text,GList * text_list,gint entry_width,TextEntryFlags flags,GtkWindow * parent)990 gtkutil_popup_textentry (const gchar *title,
991 const gchar *label_text,
992 const gchar *entry_text,
993 GList *text_list,
994 gint entry_width,
995 TextEntryFlags flags,
996 GtkWindow *parent)
997 {
998 GtkWidget *window, *box, *hbox, *vbox, *button, *label, *combo, *entry;
999 gboolean ok_pressed = FALSE;
1000 gchar *str = NULL;
1001
1002 /* dialog window */
1003 window = gtk_dialog_new ();
1004 if (parent)
1005 gtk_window_set_transient_for (GTK_WINDOW (window), parent);
1006 gtk_window_set_title (GTK_WINDOW (window), title);
1007 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
1008 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
1009 GTK_SIGNAL_FUNC (cb_dummy), NULL);
1010
1011 /* main area */
1012 vbox = gtk_vbox_new (FALSE, 0);
1013 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE, 0);
1014 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1015 gtk_widget_show (vbox);
1016
1017 hbox = gtk_hbox_new (FALSE, 0);
1018 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
1019 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
1020 gtk_widget_show (hbox);
1021
1022 /* label */
1023 label = gtk_label_new (label_text);
1024 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1025 gtk_widget_show (label);
1026
1027 /* entry */
1028 if (flags & TEXT_ENTRY_WRAP_ENTRY)
1029 box = vbox;
1030 else
1031 box = hbox;
1032
1033 combo = gtk_combo_new();
1034 entry = GTK_COMBO (combo)->entry;
1035
1036 if (text_list)
1037 gtk_combo_set_popdown_strings (GTK_COMBO (combo), text_list);
1038 else
1039 gtk_widget_hide (GTK_COMBO (combo)->button);
1040
1041 gtk_box_pack_start (GTK_BOX (box), combo, TRUE, TRUE, 0);
1042 gtk_signal_connect (GTK_OBJECT (entry), "activate",
1043 GTK_SIGNAL_FUNC (cb_textpop_enter), &ok_pressed);
1044 if (entry_text)
1045 gtk_entry_set_text (GTK_ENTRY (entry), entry_text);
1046 if (flags & TEXT_ENTRY_CURSOR_TOP)
1047 gtk_entry_set_position (GTK_ENTRY (entry), 0);
1048 if (entry_width > 0)
1049 gtk_widget_set_usize (combo, entry_width, -1);
1050 if (flags & TEXT_ENTRY_AUTOCOMP_PATH)
1051 gtk_signal_connect_after (GTK_OBJECT(entry), "key-press-event",
1052 GTK_SIGNAL_FUNC(cb_textpop_key_press),
1053 &ok_pressed);
1054 gtk_widget_show (combo);
1055
1056 if (flags & TEXT_ENTRY_NO_EDITABLE)
1057 gtk_entry_set_editable (GTK_ENTRY (entry), FALSE);
1058
1059 gtk_widget_grab_focus (entry);
1060
1061 /* button */
1062 button = gtk_button_new_with_label (_("OK"));
1063 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
1064 button, TRUE, TRUE, 0);
1065 gtk_signal_connect (GTK_OBJECT(button), "clicked",
1066 GTK_SIGNAL_FUNC(cb_textpop_ok_button), &ok_pressed);
1067 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
1068 gtk_widget_show (button);
1069
1070 button = gtk_button_new_with_label (_("Cancel"));
1071 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area),
1072 button, TRUE, TRUE, 0);
1073 gtk_signal_connect (GTK_OBJECT(button), "clicked",
1074 GTK_SIGNAL_FUNC(cb_textpop_cancel_button), &ok_pressed);
1075 GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
1076 gtk_widget_show (button);
1077
1078 gtk_widget_show (window);
1079
1080 gtk_grab_add (window);
1081 gtk_main ();
1082 gtk_grab_remove (window);
1083
1084 if (ok_pressed)
1085 str = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1086
1087 gtk_widget_destroy (window);
1088
1089 return str;
1090 }
1091
1092
1093 /******************************************************************************
1094 *
1095 * modal file dialog
1096 *
1097 ******************************************************************************/
1098 static void
cb_filesel_ok(GtkWidget * button,gboolean * retval)1099 cb_filesel_ok (GtkWidget *button, gboolean *retval)
1100 {
1101 *retval = TRUE;
1102 gtk_main_quit ();
1103 }
1104
1105
1106 static void
cb_filesel_cancel(GtkWidget * button,gboolean * retval)1107 cb_filesel_cancel (GtkWidget *button, gboolean *retval)
1108 {
1109 *retval = FALSE;
1110 gtk_main_quit ();
1111 }
1112
1113
1114 gchar *
gtkutil_modal_file_dialog(const gchar * title,const gchar * default_path,ModalFileDialogFlags flags,GtkWindow * parent)1115 gtkutil_modal_file_dialog (const gchar *title,
1116 const gchar *default_path,
1117 ModalFileDialogFlags flags,
1118 GtkWindow *parent)
1119 {
1120 GtkWidget *filesel = gtk_file_selection_new (title);
1121 GtkWidget *button;
1122 gchar *filename = NULL;
1123 gboolean retval = FALSE;
1124
1125 if (parent)
1126 gtk_window_set_transient_for (GTK_WINDOW (filesel), parent);
1127
1128 gtk_window_set_position (GTK_WINDOW (filesel), GTK_WIN_POS_CENTER);
1129 gtk_signal_connect (GTK_OBJECT (filesel), "delete_event",
1130 GTK_SIGNAL_FUNC (cb_dummy), NULL);
1131
1132 button = GTK_FILE_SELECTION (filesel)->ok_button;
1133 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1134 GTK_SIGNAL_FUNC (cb_filesel_ok),
1135 &retval);
1136 button = GTK_FILE_SELECTION (filesel)->cancel_button;
1137 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1138 GTK_SIGNAL_FUNC (cb_filesel_cancel),
1139 &retval);
1140
1141 if (default_path && *default_path)
1142 gtk_file_selection_set_filename (GTK_FILE_SELECTION (filesel),
1143 default_path);
1144
1145 if (flags & MODAL_FILE_DIALOG_DIR_ONLY)
1146 gtk_widget_hide (GTK_FILE_SELECTION (filesel)->file_list->parent);
1147
1148 if (flags & MODAL_FILE_DIALOG_HIDE_FILEOP)
1149 gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (filesel));
1150
1151 gtk_widget_show (filesel);
1152
1153 gtk_grab_add (filesel);
1154 gtk_main ();
1155
1156 if (retval) {
1157 const gchar *tmpstr;
1158 tmpstr = gtk_file_selection_get_filename (GTK_FILE_SELECTION (filesel));
1159 filename = g_strdup (tmpstr);
1160 }
1161
1162 gtk_grab_remove (filesel);
1163 gtk_widget_destroy (filesel);
1164
1165 return filename;
1166 }
1167
1168
1169
1170 /******************************************************************************
1171 *
1172 * Color selection button
1173 *
1174 ******************************************************************************/
1175 static void
cb_colorsel_ok(GtkWidget * button,gboolean * retval)1176 cb_colorsel_ok (GtkWidget *button, gboolean *retval)
1177 {
1178 *retval = TRUE;
1179 gtk_main_quit ();
1180 }
1181
1182
1183 static void
cb_colorsel_cancel(GtkWidget * button,gboolean * retval)1184 cb_colorsel_cancel (GtkWidget *button, gboolean *retval)
1185 {
1186 *retval = FALSE;
1187 gtk_main_quit ();
1188 }
1189
1190
1191 static void
cb_choose_color(GtkWidget * widget,gint color[3])1192 cb_choose_color (GtkWidget *widget, gint color[3])
1193 {
1194 GtkWidget *dialog, *button, *csel;
1195 gboolean retval = FALSE;
1196 gdouble selcol[4];
1197
1198 g_return_if_fail (color);
1199
1200 dialog = gtk_color_selection_dialog_new (_("Choose Color"));
1201 selcol[0] = (gdouble) color[0] / 0xffff;
1202 selcol[1] = (gdouble) color[1] / 0xffff;
1203 selcol[2] = (gdouble) color[2] / 0xffff;
1204 selcol[3] = 0.0;
1205 csel = GTK_COLOR_SELECTION_DIALOG (dialog)->colorsel;
1206 gtk_color_selection_set_color (GTK_COLOR_SELECTION (csel), selcol);
1207 gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
1208 GTK_SIGNAL_FUNC (cb_dummy), NULL);
1209
1210 button = GTK_COLOR_SELECTION_DIALOG (dialog)->ok_button;
1211 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1212 GTK_SIGNAL_FUNC (cb_colorsel_ok),
1213 &retval);
1214 button = GTK_COLOR_SELECTION_DIALOG (dialog)->cancel_button;
1215 gtk_signal_connect (GTK_OBJECT (button), "clicked",
1216 GTK_SIGNAL_FUNC (cb_colorsel_cancel),
1217 &retval);
1218 button = GTK_COLOR_SELECTION_DIALOG (dialog)->help_button;
1219 gtk_widget_hide (button);
1220 gtk_widget_show (dialog);
1221
1222 gtk_grab_add (dialog);
1223 gtk_main ();
1224 if (retval) {
1225 gtk_color_selection_get_color (GTK_COLOR_SELECTION (csel), selcol);
1226 color[0] = selcol[0] * 0xffff;
1227 color[1] = selcol[1] * 0xffff;
1228 color[2] = selcol[2] * 0xffff;
1229 }
1230 gtk_grab_remove (dialog);
1231 gtk_widget_destroy (dialog);
1232 }
1233
1234
1235 GtkWidget *
gtkutil_color_sel_button(const gchar * label,gint color[3])1236 gtkutil_color_sel_button (const gchar *label, gint color[3])
1237 {
1238 GtkWidget *button;
1239
1240 button = gtk_button_new_with_label (label);
1241 gtk_signal_connect (GTK_OBJECT (button),"clicked",
1242 GTK_SIGNAL_FUNC (cb_choose_color),
1243 color);
1244
1245 return button;
1246 }
1247
1248
1249 /******************************************************************************
1250 *
1251 * Compare functions
1252 *
1253 ******************************************************************************/
1254 gint
gtkutil_comp_spel(gconstpointer data1,gconstpointer data2)1255 gtkutil_comp_spel (gconstpointer data1, gconstpointer data2)
1256 {
1257 const gchar *str1 = data1;
1258 const gchar *str2 = data2;
1259
1260 return strcmp (str1, str2);
1261 }
1262
1263
1264 gint
gtkutil_comp_casespel(gconstpointer data1,gconstpointer data2)1265 gtkutil_comp_casespel (gconstpointer data1, gconstpointer data2)
1266 {
1267 const gchar *str1 = data1;
1268 const gchar *str2 = data2;
1269
1270 return g_strcasecmp (str1, str2);
1271 }
1272
1273
1274 /******************************************************************************
1275 *
1276 * simple callback functions
1277 *
1278 ******************************************************************************/
1279 void
gtkutil_get_data_from_toggle_cb(GtkWidget * toggle,gboolean * data)1280 gtkutil_get_data_from_toggle_cb (GtkWidget *toggle, gboolean *data)
1281 {
1282 g_return_if_fail (data);
1283
1284 *data = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(toggle));
1285 }
1286
1287
1288 void
gtkutil_get_data_from_toggle_negative_cb(GtkWidget * toggle,gboolean * data)1289 gtkutil_get_data_from_toggle_negative_cb (GtkWidget *toggle, gboolean *data)
1290 {
1291 g_return_if_fail (data);
1292
1293 *data = !(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(toggle)));
1294 }
1295
1296
1297 void
gtkutil_get_data_from_adjustment_by_int_cb(GtkWidget * widget,gint * data)1298 gtkutil_get_data_from_adjustment_by_int_cb (GtkWidget *widget, gint *data)
1299 {
1300 g_return_if_fail (data);
1301
1302 *data = GTK_ADJUSTMENT(widget)->value;
1303 }
1304
1305
1306 void
gtkutil_get_data_from_adjustment_by_float_cb(GtkWidget * widget,gfloat * data)1307 gtkutil_get_data_from_adjustment_by_float_cb (GtkWidget *widget, gfloat *data)
1308 {
1309 g_return_if_fail (data);
1310
1311 *data = GTK_ADJUSTMENT(widget)->value;
1312 }
1313