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