Logo Search packages:      
Sourcecode: libjsw version File versions  Download package

cdialog.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>

#include "../include/fio.h"

#include "guiutils.h"
#include "cdialog.h"
#include "config.h"


/* Message Icons */
#include "images/icon_info_32x32.xpm"
#include "images/icon_warning_32x32.xpm"
#include "images/icon_error_32x32.xpm"
#include "images/icon_question_32x32.xpm"
#include "images/icon_help_32x32.xpm"
#include "images/icon_wand_32x32.xpm"
#include "images/icon_search_32x32.xpm"
#include "images/icon_security_32x32.xpm"
#include "images/icon_print_32x32.xpm"
#include "images/icon_sound_32x32.xpm"
#include "images/icon_bulb_32x32.xpm"
#include "images/icon_power_32x32.xpm"
#if defined(__linux__)
# include "images/icon_linux_32x32.xpm"
#else
# include "images/icon_linux_32x32.xpm"
#endif
#include "images/icon_terminal_32x32.xpm"
#include "images/icon_tuning_32x32.xpm"
#include "images/icon_tools_32x32.xpm"
#include "images/icon_monitor_32x32.xpm"
#include "images/icon_clipboard_32x32.xpm"
#include "images/icon_clipboard_empty_32x32.xpm"
#include "images/icon_install_32x32.xpm"
#include "images/icon_uninstall_32x32.xpm"
#include "images/icon_cpu_32x32.xpm"

#include "images/icon_file_32x32.xpm"
#include "images/icon_folder_closed_32x32.xpm"
#include "images/icon_folder_opened_32x32.xpm"
#include "images/icon_link2_32x32.xpm"
#include "images/icon_pipe_32x32.xpm"
#include "images/icon_device_misc_32x32.xpm"
#include "images/icon_device_block_32x32.xpm"
#include "images/icon_device_character_32x32.xpm"
#include "images/icon_socket_32x32.xpm"

#if 0
/* TODO */
#include "images/icon_move_file_32x32.xpm"
#include "images/icon_copy_file_32x32.xpm"
#endif

#include "images/icon_planet_32x32.xpm"
#include "images/icon_ftp_32x32.xpm"
#include "images/icon_chat_32x32.xpm"
#include "images/icon_file_www_32x32.xpm"


/* Button icons */
#include "images/icon_ok_20x20.xpm"
#include "images/icon_cancel_20x20.xpm"
#include "images/icon_help_20x20.xpm"


/*
 *    Confirmation Dialog:
 */
typedef struct _CDlg                CDlg;
struct _CDlg {

      GtkWidget   *toplevel;
      GtkAccelGroup     *accelgrp;

      GtkWidget   *main_vbox,
                  *label_hbox,
                  *icon_pm,
                  *label,
                  *help_vbox,
                  *help_icon_pm,
                  *help_label,
                  *button_hbox;

      GtkWidget   *ok_btn,
                  *yes_btn,
                  *yes_to_all_btn,
                  *no_btn,
                  *cancel_btn,
                  *ignore_btn,
                  *retry_btn,
                  *abort_btn,
                  *help_btn;

      GtkWidget   *last_transient_for;    /* Do not reference */
      cdialog_icon      last_icon_code;

      gint        response_code;
      gint        block_loop_level;

};
#define CDLG(p)         ((CDlg *)(p))


/* Callbacks */
static gint CDialogCloseCB(
      GtkWidget *widget, GdkEvent *event, gpointer data
);
static void CDialogButtonCB(GtkWidget *widget, gpointer data);

static guint8 **CDialogGetMessageIconDataFromCode(cdialog_icon icon_code);
static void CDialogLoadIcon(CDlg *d, guint8 **icon_data);

/* Front Ends */
gint CDialogInit(void);
void CDialogSetStyle(GtkRcStyle *rc_style);
void CDialogSetTransientFor(GtkWidget *w);
gboolean CDialogIsQuery(void);
void CDialogBreakQuery(void);
GtkWidget *CDialogGetToplevel(void);
static void CDialogRemapButtons(
      CDlg *d,
      cdialog_btn_flags show_buttons,           /* Any of CDIALOG_BTNFLAG_* */
      cdialog_btn_flags default_button    /* One of CDIALOG_BTNFLAG_* */
);
gint CDialogGetResponse(
      const gchar *title,
      const gchar *message,
      const gchar *explaination,
      cdialog_icon icon_code,
      cdialog_btn_flags show_buttons,           /* Any of CDIALOG_BTNFLAG_* */
      cdialog_btn_flags default_button    /* One of CDIALOG_BTNFLAG_* */
);
gint CDialogGetResponseIconData(
      const gchar *title,
      const gchar *message,
      const gchar *explaination,
      guint8 **icon_data,
      cdialog_btn_flags show_buttons,           /* Any of CDIALOG_BTNFLAG_* */
      cdialog_btn_flags default_button    /* One of CDIALOG_BTNFLAG_* */
);
gint CDialogGetResponseFile(
      const gchar *title,
      const gchar *filename,
      const gchar *explaination,
      cdialog_icon icon_code,
      cdialog_btn_flags show_buttons,           /* Any of CDIALOG_BTNFLAG_* */
      cdialog_btn_flags default_button    /* One of CDIALOG_BTNFLAG_* */
);

void CDialogMap(void);
void CDialogUnmap(void);
void CDialogShutdown(void);


#define ATOI(s)         (((s) != NULL) ? atoi(s) : 0)
#define ATOL(s)         (((s) != NULL) ? atol(s) : 0)
#define ATOF(s)         (((s) != NULL) ? atof(s) : 0.0f)
#define STRDUP(s)       (((s) != NULL) ? g_strdup(s) : NULL)

#define MAX(a,b)        (((a) > (b)) ? (a) : (b))
#define MIN(a,b)        (((a) < (b)) ? (a) : (b))
#define CLIP(a,l,h)     (MIN(MAX((a),(l)),(h)))
#define STRLEN(s)       (((s) != NULL) ? strlen(s) : 0)
#define STRISEMPTY(s)   (((s) != NULL) ? (*(s) == '\0') : TRUE)


#if defined(PROG_LANGUAGE_SPANISH)
# define CDIALOG_DEF_TITLE    "El Mensaje"
#elif defined(PROG_LANGUAGE_FRENCH)
# define CDIALOG_DEF_TITLE    "Message"
#elif defined(PROG_LANGUAGE_GERMAN)
# define CDIALOG_DEF_TITLE    "Nachricht"
#elif defined(PROG_LANGUAGE_ITALIAN)
# define CDIALOG_DEF_TITLE    "Il Messaggio"
#elif defined(PROG_LANGUAGE_DUTCH)
# define CDIALOG_DEF_TITLE    "Bericht"
#elif defined(PROG_LANGUAGE_PORTUGUESE)
# define CDIALOG_DEF_TITLE    "A Mensagem"
#elif defined(PROG_LANGUAGE_NORWEGIAN)
# define CDIALOG_DEF_TITLE    "Budskap"
#else
# define CDIALOG_DEF_TITLE    "Message"
#endif

#if defined(PROG_LANGUAGE_SPANISH)
# define CDIALOG_MESG_NO_HELP_AVAILABLE   "Ninguna ayuda disponible."
#elif defined(PROG_LANGUAGE_FRENCH)
# define CDIALOG_MESG_NO_HELP_AVAILABLE   "Aucune aide disponible."
#elif defined(PROG_LANGUAGE_GERMAN)
# define CDIALOG_MESG_NO_HELP_AVAILABLE   "Keine hilfe verfügbar."
#elif defined(PROG_LANGUAGE_ITALIAN)
# define CDIALOG_MESG_NO_HELP_AVAILABLE   "Nessuno aiuto disponibile."
#elif defined(PROG_LANGUAGE_DUTCH)
# define CDIALOG_MESG_NO_HELP_AVAILABLE   "Geen hulp verkrijgbaar."
#elif defined(PROG_LANGUAGE_PORTUGUESE)
# define CDIALOG_MESG_NO_HELP_AVAILABLE   "A nenhuma ajuda disponível."
#elif defined(PROG_LANGUAGE_NORWEGIAN)
# define CDIALOG_MESG_NO_HELP_AVAILABLE   "Ingen hjelp tilgjengelig."
#else
# define CDIALOG_MESG_NO_HELP_AVAILABLE   "No help available."
#endif


static CDlg       *cdlg;


/*
 *    GtkWindow "delete_event" signal callback.
 */
static gint CDialogCloseCB(GtkWidget *widget, GdkEvent *event, gpointer data)
{
      CDlg *d = CDLG(data);
      if((widget == NULL) || (d == NULL))
          return(FALSE);

      d->response_code = CDIALOG_RESPONSE_CANCEL;

      /* Break out of one main loop level */
      gtk_main_quit();
      d->block_loop_level--;

      return(TRUE);
}

/*
 *    Dialog GtkButton "clicked" signal callback.
 */
static void CDialogButtonCB(GtkWidget *widget, gpointer data)
{
      GtkWidget *w;
      CDlg *d = CDLG(data);
      if((widget == NULL) || (d == NULL))
          return;

      /* Check if button is not shown, which implies this signal
       * was received synthetically or from an keyboard accelerator.
       * in which case we should ignore it
       */
      if(!GTK_WIDGET_MAPPED(widget))
          return;

      /* Check which button was pressed */
      if(widget == d->ok_btn)
          d->response_code = CDIALOG_RESPONSE_OK;
      else if(widget == d->yes_btn)
          d->response_code = CDIALOG_RESPONSE_YES;
      else if(widget == d->yes_to_all_btn)
          d->response_code = CDIALOG_RESPONSE_YES_TO_ALL;
      else if(widget == d->no_btn)
          d->response_code = CDIALOG_RESPONSE_NO;
      else if(widget == d->cancel_btn)
          d->response_code = CDIALOG_RESPONSE_CANCEL;
      else if(widget == d->help_btn)
      {
          d->response_code = CDIALOG_RESPONSE_HELP;
          w = d->help_vbox;
          if(w != NULL)
            gtk_widget_show(w);
          w = d->help_btn;
          if(w != NULL)
            gtk_widget_hide(w);

          return; /* Return, do not break out of block loop */
      }

      /* Break out of one main loop level */
      gtk_main_quit();
      d->block_loop_level--;
}


/*
 *    Returns the icon data that corresponds to the specified
 *    icon_code.
 *
 *    The returned pointer must not be modified or deleted.
 */
static guint8 **CDialogGetMessageIconDataFromCode(cdialog_icon icon_code)
{
      guint8 **d = (guint8 **)icon_info_32x32_xpm;

      switch(icon_code)
      {
        case CDIALOG_ICON_INFO:
          d = (guint8 **)icon_info_32x32_xpm;
          break;
        case CDIALOG_ICON_WARNING:
          d = (guint8 **)icon_warning_32x32_xpm;
          break;
        case CDIALOG_ICON_ERROR:
          d = (guint8 **)icon_error_32x32_xpm;
          break;
        case CDIALOG_ICON_QUESTION:
          d = (guint8 **)icon_question_32x32_xpm;
          break;
        case CDIALOG_ICON_HELP:
          d = (guint8 **)icon_help_32x32_xpm;
          break;
        case CDIALOG_ICON_WIZARD:
          d = (guint8 **)icon_wand_32x32_xpm;
          break;
        case CDIALOG_ICON_SEARCH:
          d = (guint8 **)icon_search_32x32_xpm;
          break;
        case CDIALOG_ICON_SECURITY:
          d = (guint8 **)icon_security_32x32_xpm;
          break;
        case CDIALOG_ICON_PRINTER:
          d = (guint8 **)icon_print_32x32_xpm;
          break;
        case CDIALOG_ICON_SPEAKER:
          d = (guint8 **)icon_sound_32x32_xpm;
          break;
        case CDIALOG_ICON_BULB:
          d = (guint8 **)icon_bulb_32x32_xpm;
          break;
        case CDIALOG_ICON_POWER:
          d = (guint8 **)icon_power_32x32_xpm;
          break;
        case CDIALOG_ICON_OS:
#if defined(__linux__)
          d = (guint8 **)icon_linux_32x32_xpm;
#else
          d = (guint8 **)icon_linux_32x32_xpm;
#endif
          break;
        case CDIALOG_ICON_TERMINAL:
          d = (guint8 **)icon_terminal_32x32_xpm;
          break;
        case CDIALOG_ICON_SETTINGS:
          d = (guint8 **)icon_tuning_32x32_xpm;
          break;
        case CDIALOG_ICON_TOOLS:
          d = (guint8 **)icon_tools_32x32_xpm;
          break;
        case CDIALOG_ICON_MONITOR:
          d = (guint8 **)icon_monitor_32x32_xpm;
          break;
        case CDIALOG_ICON_CLIPBOARD_EMPTY:
          d = (guint8 **)icon_clipboard_empty_32x32_xpm;
          break;
        case CDIALOG_ICON_CLIPBOARD_FULL:
          d = (guint8 **)icon_clipboard_32x32_xpm;
          break;
        case CDIALOG_ICON_INSTALL:
          d = (guint8 **)icon_install_32x32_xpm;
          break;
        case CDIALOG_ICON_UNINSTALL:
          d = (guint8 **)icon_uninstall_32x32_xpm;
          break;
        case CDIALOG_ICON_CPU:
          d = (guint8 **)icon_cpu_32x32_xpm;
          break;

        case CDIALOG_ICON_FILE:
          d = (guint8 **)icon_file_32x32_xpm;
          break;
        case CDIALOG_ICON_FOLDER_CLOSER:
          d = (guint8 **)icon_folder_closed_32x32_xpm;
          break;
        case CDIALOG_ICON_FOLDER_OPENED:
          d = (guint8 **)icon_folder_opened_32x32_xpm;
          break;
        case CDIALOG_ICON_LINK:
          d = (guint8 **)icon_link2_32x32_xpm;
          break;
        case CDIALOG_ICON_PIPE:
          d = (guint8 **)icon_pipe_32x32_xpm;
          break;
        case CDIALOG_ICON_DEVICE:
          d = (guint8 **)icon_device_misc_32x32_xpm;
          break;
        case CDIALOG_ICON_DEVICE_BLOCK:
          d = (guint8 **)icon_device_block_32x32_xpm;
          break;
        case CDIALOG_ICON_DEVICE_CHARACTER:
          d = (guint8 **)icon_device_character_32x32_xpm;
          break;
        case CDIALOG_ICON_SOCKET:
          d = (guint8 **)icon_socket_32x32_xpm;
          break;

        case CDIALOG_ICON_FILE_MOVE:
          d = (guint8 **)icon_file_32x32_xpm;
          break;
        case CDIALOG_ICON_FILE_COPY:
          d = (guint8 **)icon_file_32x32_xpm;
          break;

        case CDIALOG_ICON_PLANET:
          d = (guint8 **)icon_planet_32x32_xpm;
          break;
        case CDIALOG_ICON_FTP:
          d = (guint8 **)icon_ftp_32x32_xpm;
          break;
        case CDIALOG_ICON_CHAT:
          d = (guint8 **)icon_chat_32x32_xpm;
          break;
        case CDIALOG_ICON_FILE_WWW:
          d = (guint8 **)icon_file_www_32x32_xpm;
          break;

        case CDIALOG_ICON_USER_DEFINED:
          break;
      }
      return(d);
}

/*
 *    Updates the CDialog's icons.
 */
static void CDialogLoadIcon(CDlg *d, guint8 **icon_data)
{
      gint width, height;
      GdkBitmap *mask;
      GdkPixmap *pixmap;
      GtkWidget *w = (d != NULL) ? d->icon_pm : NULL;
      if((w == NULL) || (icon_data == NULL))
          return;

      /* Load new pixmap for icon */
      pixmap = GDK_PIXMAP_NEW_FROM_XPM_DATA(&mask, icon_data);
      if(pixmap == NULL)
          return;

      gdk_window_get_size(pixmap, &width, &height);

      /* Set icon GtkPixmap */
      gtk_pixmap_set(GTK_PIXMAP(w), pixmap, mask);
      gtk_widget_set_usize(w, width, height);

      GDK_PIXMAP_UNREF(pixmap)
      GDK_BITMAP_UNREF(mask)

      /* Toplevel needs to be resized since new icon size may be
       * different from the previous one
       */
      w = d->toplevel;
      gtk_widget_queue_resize(w);

      /* Set WM icon based on the icon data */
      GUISetWMIcon(w->window, icon_data);
}


/*
 *    Initializes the CDialog.
 */
gint CDialogInit(void)
{
      const gint border_major = 5;
      GtkStateType state;
      GdkBitmap *mask;
      GdkPixmap *pixmap;
      GdkWindow *window;
      GtkAccelGroup *accelgrp;
      GtkRcStyle *rcstyle;
      GtkStyle *style;
      GtkWidget *w, *parent, *parent2, *parent3, *parent4, *parent5;
      CDlg *d;

      /* Already initialized? */
      if(cdlg != NULL)
          return(0);

      /* Create new Dialog */
      cdlg = d = CDLG(g_malloc0(sizeof(CDlg)));
      if(d == NULL)
          return(-3);

      /* Reset globals */
      d->last_transient_for = NULL;
      d->last_icon_code = CDIALOG_ICON_INFO;
      d->response_code = CDIALOG_RESPONSE_NOT_AVAILABLE;
      d->block_loop_level = 0;

      /* Keyboard accelerator group */
      d->accelgrp = accelgrp = gtk_accel_group_new();


      /* Toplevel */
      d->toplevel = w = gtk_window_new(GTK_WINDOW_DIALOG);
      gtk_window_set_title(GTK_WINDOW(w), CDIALOG_DEF_TITLE);
#ifdef PROG_NAME
      gtk_window_set_wmclass(
          GTK_WINDOW(w),
          "dialog",
          PROG_NAME
      );
#endif
      gtk_widget_realize(w);
      window = w->window;
      if(window != NULL)
      {
          GdkGeometry geo;

          gdk_window_set_decorations(
            window,
            GDK_DECOR_BORDER | GDK_DECOR_TITLE | GDK_DECOR_MENU |
            GDK_DECOR_MINIMIZE
          );
          gdk_window_set_functions(
            window,
            GDK_FUNC_MOVE | GDK_FUNC_MINIMIZE | GDK_FUNC_CLOSE
          );

          geo.min_width = 100;
          geo.min_height = 70;
          geo.max_width = gdk_screen_width() - 10;
          geo.max_height = gdk_screen_height() - 10;
          geo.base_width = 0;
          geo.base_height = 0;
          geo.width_inc = 1;
          geo.height_inc = 1;
          geo.min_aspect = 1.3f;
          geo.max_aspect = 1.3f;
          gdk_window_set_geometry_hints(
            window, &geo,
            GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE |
            GDK_HINT_BASE_SIZE | GDK_HINT_RESIZE_INC
          );
      }
      gtk_signal_connect(
          GTK_OBJECT(w), "delete_event",
          GTK_SIGNAL_FUNC(CDialogCloseCB), d
      );
      gtk_window_add_accel_group(GTK_WINDOW(w), accelgrp);
      style = gtk_widget_get_style(w);
      parent = w;


      /* Main vbox */
      d->main_vbox = w = gtk_vbox_new(FALSE, 0);
      gtk_container_add(GTK_CONTAINER(parent), w);
      gtk_widget_show(w);
      parent = w;


      /* Hbox to hold icon and message label */
      d->label_hbox = w = gtk_hbox_new(FALSE, 0);
      gtk_box_pack_start(GTK_BOX(parent), w, TRUE, TRUE, border_major);
      gtk_widget_show(w);
      parent2 = w;

      /* Vbox for icon */
      w = gtk_vbox_new(TRUE, 0);
      gtk_box_pack_start(GTK_BOX(parent2), w, FALSE, FALSE, border_major);
      gtk_widget_show(w);
      parent3 = w;
      /* Icon */
      pixmap = GDK_PIXMAP_NEW_FROM_XPM_DATA(
          &mask, (guint8 **)icon_info_32x32_xpm
      );
      if(pixmap != NULL)
      {
          gint width, height;
          gdk_window_get_size(pixmap, &width, &height);
          d->icon_pm = w = gtk_pixmap_new(pixmap, mask);
          gtk_widget_set_usize(w, width, height);
          gtk_box_pack_start(GTK_BOX(parent3), w, TRUE, FALSE, 0);
          gtk_widget_show(w);
          GDK_PIXMAP_UNREF(pixmap)
          GDK_BITMAP_UNREF(mask)
      }

      /* Hbox for message label */
      w = gtk_hbox_new(FALSE, 0);
      gtk_box_pack_start(GTK_BOX(parent2), w, TRUE, TRUE, border_major);
      gtk_widget_show(w);
      parent3 = w;
      /* Label */
      d->label = w = gtk_label_new("");
      gtk_label_set_justify(GTK_LABEL(w), GTK_JUSTIFY_LEFT);
      gtk_box_pack_start(GTK_BOX(parent3), w, FALSE, FALSE, 0);
      gtk_widget_show(w);


      /* Help widgets RC style */
      rcstyle = gtk_rc_style_new();
      state = GTK_STATE_NORMAL;
      rcstyle->color_flags[state] = GTK_RC_FG | GTK_RC_BG |
          GTK_RC_TEXT | GTK_RC_BASE;
      GDK_COLOR_SET_COEFF(
          &rcstyle->fg[state],
          0.0f, 0.0f, 0.0f
      )
      GDK_COLOR_SET_COEFF(
          &rcstyle->bg[state],
          1.0f, 1.0f, 0.8f
      )
      GDK_COLOR_SET_COEFF(
          &rcstyle->text[state],
          0.0f, 0.0f, 0.0f
      )
      GDK_COLOR_SET_COEFF(
          &rcstyle->base[state],
          1.0f, 1.0f, 0.8f
      )
      state = GTK_STATE_INSENSITIVE;
      rcstyle->color_flags[state] = GTK_RC_FG | GTK_RC_BG |
          GTK_RC_TEXT | GTK_RC_BASE;
      GDK_COLOR_SET_COEFF(
          &rcstyle->fg[state],
          0.25f, 0.25f, 0.25f
      )
      GDK_COLOR_SET_COEFF(
          &rcstyle->bg[state],
          1.0f, 1.0f, 0.8f
      )
      GDK_COLOR_SET_COEFF(
          &rcstyle->text[state],
          0.25f, 0.25f, 0.25f
      )
      GDK_COLOR_SET_COEFF(
          &rcstyle->base[state],
          1.0f, 1.0f, 0.8f
      )

      /* Vbox for help widgets */
      d->help_vbox = w = gtk_vbox_new(FALSE, 0);      
      gtk_box_pack_start(GTK_BOX(parent), w, FALSE, FALSE, border_major);
      parent2 = w;
      w = gtk_hbox_new(FALSE, 0);
      gtk_box_pack_start(GTK_BOX(parent2), w, FALSE, FALSE, 0);
      gtk_widget_show(w);
      parent3 = w;

      /* Help frame, event box, and label */
      w = gtk_frame_new(NULL);
      gtk_frame_set_shadow_type(GTK_FRAME(w), GTK_SHADOW_IN);
      gtk_box_pack_start(GTK_BOX(parent3), w, TRUE, TRUE, border_major);
      gtk_widget_show(w);
      parent4 = w;
      /* Event box for a help-colored background */
      w = gtk_event_box_new();
      gtk_container_add(GTK_CONTAINER(parent4), w);
      gtk_widget_modify_style(w, rcstyle);
      gtk_widget_show(w);
      parent4 = w;

      /* Hbox inside help frame */
      w = gtk_hbox_new(FALSE, border_major);
      gtk_container_border_width(GTK_CONTAINER(w), border_major);
      gtk_container_add(GTK_CONTAINER(parent4), w);
      gtk_widget_show(w);
      parent4 = w;

      /* Vbox for help icon */
      w = gtk_vbox_new(TRUE, 0);
      gtk_box_pack_start(GTK_BOX(parent4), w, FALSE, FALSE, 0);
      gtk_widget_show(w);
      parent5 = w;
      /* Help icon pixmap */
      pixmap = GDK_PIXMAP_NEW_FROM_XPM_DATA(
          &mask, (guint8 **)icon_help_32x32_xpm
      );
      if(pixmap != NULL)
      {
          gint width, height;
          gdk_window_get_size(pixmap, &width, &height);
          d->help_icon_pm = w = gtk_pixmap_new(pixmap, mask);
          gtk_box_pack_start(GTK_BOX(parent5), w, TRUE, FALSE, 0);
          gtk_widget_modify_style(w, rcstyle);         
          gtk_widget_show(w);
          GDK_PIXMAP_UNREF(pixmap)
          GDK_BITMAP_UNREF(mask)
      }

      /* Hbox for help label */
      w = gtk_hbox_new(FALSE, 0);
      gtk_box_pack_start(GTK_BOX(parent4), w, TRUE, TRUE, 0);
      gtk_widget_show(w);
      parent5 = w;
      /* Help label */
      d->help_label = w = gtk_label_new(
          CDIALOG_MESG_NO_HELP_AVAILABLE
      );
      gtk_label_set_justify(GTK_LABEL(w), GTK_JUSTIFY_LEFT);
      gtk_box_pack_start(GTK_BOX(parent5), w, FALSE, FALSE, 0);
      gtk_widget_modify_style(w, rcstyle);
      gtk_widget_show(w);

      GTK_RC_STYLE_UNREF(rcstyle)

      /* Separator */
      w = gtk_hseparator_new();
      gtk_box_pack_start(GTK_BOX(parent), w, FALSE, FALSE, 0);
      gtk_widget_show(w);


      /* Hbox for buttons */
      w = gtk_hbox_new(TRUE, 0);
      gtk_box_pack_start(GTK_BOX(parent), w, FALSE, FALSE, border_major);
      gtk_widget_show(w);
      parent2 = w;

      /* OK button */
      d->ok_btn = w = GUIButtonPixmapLabelH(
          (guint8 **)icon_ok_20x20_xpm, "OK", NULL
      );
      GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT);
      gtk_widget_set_usize(
          w,
          GUI_BUTTON_HLABEL_WIDTH_DEF, GUI_BUTTON_HLABEL_HEIGHT_DEF
      );
      gtk_box_pack_start(GTK_BOX(parent2), w, TRUE, FALSE, 0);
      gtk_signal_connect(
          GTK_OBJECT(w), "clicked",
          GTK_SIGNAL_FUNC(CDialogButtonCB), d
      );
      gtk_accel_group_add(
          accelgrp, GDK_o, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      /* Let the default/focus grabbed button receive the
       * GDK_space and GDK_Return keys
       */
      GUIButtonLabelUnderline(w, GDK_o);

      /* Yes button */
      d->yes_btn = w = GUIButtonPixmapLabelH(
          (guint8 **)icon_ok_20x20_xpm,
#if defined(PROG_LANGUAGE_SPANISH)
"Si"
#elif defined(PROG_LANGUAGE_FRENCH)
"Oui"
#elif defined(PROG_LANGUAGE_GERMAN)
"Ja"
#elif defined(PROG_LANGUAGE_ITALIAN)
"Sì"
#elif defined(PROG_LANGUAGE_DUTCH)
"Ja"
#elif defined(PROG_LANGUAGE_PORTUGUESE)
"Sim"
#elif defined(PROG_LANGUAGE_NORWEGIAN)
"Ja"
#else
"Yes"
#endif
          , NULL
      );
      GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT);
      gtk_widget_set_usize(
          w,
          GUI_BUTTON_HLABEL_WIDTH_DEF, GUI_BUTTON_HLABEL_HEIGHT_DEF
      );
      gtk_box_pack_start(GTK_BOX(parent2), w, TRUE, FALSE, 0);
      gtk_signal_connect(
          GTK_OBJECT(w), "clicked",
          GTK_SIGNAL_FUNC(CDialogButtonCB), d
      );
      gtk_accel_group_add(
          accelgrp, GDK_y, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      GUIButtonLabelUnderline(w, GDK_y);


      /* Yes to all button */
      d->yes_to_all_btn = w = GUIButtonPixmapLabelH(
          (guint8 **)icon_ok_20x20_xpm,
#if defined(PROG_LANGUAGE_SPANISH)
"Si A Todo"
#elif defined(PROG_LANGUAGE_FRENCH)
"Oui à Tout"
#elif defined(PROG_LANGUAGE_GERMAN)
"Ja Allen"
#elif defined(PROG_LANGUAGE_ITALIAN)
"Sì A Tutto"
#elif defined(PROG_LANGUAGE_DUTCH)
"Ja Aan Alle"
#elif defined(PROG_LANGUAGE_PORTUGUESE)
"Sim A Todo"
#elif defined(PROG_LANGUAGE_NORWEGIAN)
"Ja Til All"
#else
"Yes To All"
#endif
           , NULL
      );
      GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT);
      gtk_widget_set_usize(
          w,
          GUI_BUTTON_HLABEL_WIDTH_DEF, GUI_BUTTON_HLABEL_HEIGHT_DEF
      );
      gtk_box_pack_start(GTK_BOX(parent2), w, TRUE, FALSE, 0);
      gtk_signal_connect(
          GTK_OBJECT(w), "clicked",
          GTK_SIGNAL_FUNC(CDialogButtonCB), d
      );
      gtk_accel_group_add(
          accelgrp, GDK_a, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      GUIButtonLabelUnderline(w, GDK_a);

      /* No button */  
      d->no_btn = w = GUIButtonPixmapLabelH(
          (guint8 **)icon_cancel_20x20_xpm,
#if defined(PROG_LANGUAGE_SPANISH)
"No"
#elif defined(PROG_LANGUAGE_FRENCH)
"Non"
#elif defined(PROG_LANGUAGE_GERMAN)
"Nein"
#elif defined(PROG_LANGUAGE_ITALIAN)
"No"
#elif defined(PROG_LANGUAGE_DUTCH)
"Geen"
#elif defined(PROG_LANGUAGE_PORTUGUESE)
"Não"
#elif defined(PROG_LANGUAGE_NORWEGIAN)
"Ingen"
#else
"No"
#endif
          , NULL
      );
      GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT);
      gtk_widget_set_usize(
          w,
          GUI_BUTTON_HLABEL_WIDTH_DEF, GUI_BUTTON_HLABEL_HEIGHT_DEF
      );
      gtk_box_pack_start(GTK_BOX(parent2), w, TRUE, FALSE, 0);
      gtk_signal_connect(
          GTK_OBJECT(w), "clicked",
          GTK_SIGNAL_FUNC(CDialogButtonCB), d
      );
      gtk_accel_group_add(
          accelgrp, GDK_n, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      GUIButtonLabelUnderline(w, GDK_n);


      /* Cancel button */
      d->cancel_btn = w = GUIButtonPixmapLabelH(
          (guint8 **)icon_cancel_20x20_xpm,
#if defined(PROG_LANGUAGE_SPANISH)
"Cancela"
#elif defined(PROG_LANGUAGE_FRENCH)
"Annuler"
#elif defined(PROG_LANGUAGE_GERMAN)
"Heben"
#elif defined(PROG_LANGUAGE_ITALIAN)
"Annulla"
#elif defined(PROG_LANGUAGE_DUTCH)
"Annuleer"
#elif defined(PROG_LANGUAGE_PORTUGUESE)
"Cancelamento"
#elif defined(PROG_LANGUAGE_NORWEGIAN)
"Kanseller"
#else
"Cancel"
#endif
          , NULL
      );
      GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT);
      gtk_widget_set_usize(
          w,
          GUI_BUTTON_HLABEL_WIDTH_DEF, GUI_BUTTON_HLABEL_HEIGHT_DEF
      );
      gtk_box_pack_start(GTK_BOX(parent2), w, TRUE, FALSE, 0);
      gtk_signal_connect(
          GTK_OBJECT(w), "clicked",
          GTK_SIGNAL_FUNC(CDialogButtonCB), d
      );
      gtk_accel_group_add(
          accelgrp, GDK_c, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      gtk_accel_group_add(
          accelgrp, GDK_Escape, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      GUIButtonLabelUnderline(w, GDK_c);

      /* Ignore button */
      d->ignore_btn = w = GUIButtonPixmapLabelH(
          (guint8 **)icon_cancel_20x20_xpm,
#if defined(PROG_LANGUAGE_SPANISH)
"Ignore"
#elif defined(PROG_LANGUAGE_FRENCH)
"Négliger"
#elif defined(PROG_LANGUAGE_GERMAN)
"Ignorieren"
#elif defined(PROG_LANGUAGE_ITALIAN)
"Ignorare"
#elif defined(PROG_LANGUAGE_DUTCH)
"Negeer"
#elif defined(PROG_LANGUAGE_PORTUGUESE)
"Ignore"
#elif defined(PROG_LANGUAGE_NORWEGIAN)
"Ignorer"
#else
"Ignore"
#endif
          , NULL
      );
      GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT);
      gtk_widget_set_usize(
          w,
          GUI_BUTTON_HLABEL_WIDTH_DEF, GUI_BUTTON_HLABEL_HEIGHT_DEF
      );
      gtk_box_pack_start(GTK_BOX(parent2), w, TRUE, FALSE, 0);
      gtk_signal_connect(
          GTK_OBJECT(w), "clicked",
          GTK_SIGNAL_FUNC(CDialogButtonCB), d
      );
      gtk_accel_group_add(
          accelgrp, GDK_i, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      GUIButtonLabelUnderline(w, GDK_i);

      /* Retry button */
      d->retry_btn = w = GUIButtonPixmapLabelH(
          (guint8 **)icon_ok_20x20_xpm,
#if defined(PROG_LANGUAGE_SPANISH)
"Otra Vez"
#elif defined(PROG_LANGUAGE_FRENCH)
"Juger"
#elif defined(PROG_LANGUAGE_GERMAN)
"Wiederholen"
#elif defined(PROG_LANGUAGE_ITALIAN)
"Ritentare"
#elif defined(PROG_LANGUAGE_DUTCH)
"Probeer"
#elif defined(PROG_LANGUAGE_PORTUGUESE)
"Novamente"
#elif defined(PROG_LANGUAGE_NORWEGIAN)
"Omprøving"
#else
"Retry"
#endif
          , NULL
      );
      GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT);
      gtk_widget_set_usize(
          w,
          GUI_BUTTON_HLABEL_WIDTH_DEF, GUI_BUTTON_HLABEL_HEIGHT_DEF
      );
      gtk_box_pack_start(GTK_BOX(parent2), w, TRUE, FALSE, 0);
      gtk_signal_connect(
          GTK_OBJECT(w), "clicked",
          GTK_SIGNAL_FUNC(CDialogButtonCB), d
      );
      gtk_accel_group_add(
          accelgrp, GDK_r, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      GUIButtonLabelUnderline(w, GDK_r);

      /* Abort button */
      d->abort_btn = w = GUIButtonPixmapLabelH(
          (guint8 **)icon_cancel_20x20_xpm,
#if defined(PROG_LANGUAGE_SPANISH)
"Aborte"
#elif defined(PROG_LANGUAGE_FRENCH)
"Avorter"
#elif defined(PROG_LANGUAGE_GERMAN)
"Brechen"
#elif defined(PROG_LANGUAGE_ITALIAN)
"Abortire"
#elif defined(PROG_LANGUAGE_DUTCH)
"Breek"
#elif defined(PROG_LANGUAGE_PORTUGUESE)
"Aborte"
#elif defined(PROG_LANGUAGE_NORWEGIAN)
"Aborter"
#else
"Abort"
#endif
          , NULL
      );
      GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT);
      gtk_widget_set_usize(
          w,
          GUI_BUTTON_HLABEL_WIDTH_DEF, GUI_BUTTON_HLABEL_HEIGHT_DEF
      );
      gtk_box_pack_start(GTK_BOX(parent2), w, TRUE, FALSE, 0);
      gtk_signal_connect(
          GTK_OBJECT(w), "clicked",
          GTK_SIGNAL_FUNC(CDialogButtonCB), d
      );
      /* Use 'b' as the keyboard accel key for "Abort", since 'a' is
       * taken by "Yes To All"
       */
      gtk_accel_group_add(
          accelgrp, GDK_b, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      GUIButtonLabelUnderline(w, GDK_b);

      /* Help button */
      d->help_btn = w = GUIButtonPixmapLabelH(
          (guint8 **)icon_help_20x20_xpm,
#if defined(PROG_LANGUAGE_SPANISH)
"Ayuda"
#elif defined(PROG_LANGUAGE_FRENCH)
"Aide"
#elif defined(PROG_LANGUAGE_GERMAN)
"Hilfe"
#elif defined(PROG_LANGUAGE_ITALIAN)
"L'Aiuto"
#elif defined(PROG_LANGUAGE_NORWEGIAN)
"Hulp"
#elif defined(PROG_LANGUAGE_PORTUGUESE)
"Ajuda"
#elif defined(PROG_LANGUAGE_NORWEGIAN)
"Hjelp"
#else
"Help"
#endif
          , NULL
      );
      GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT);
      gtk_widget_set_usize(
          w,
          GUI_BUTTON_HLABEL_WIDTH_DEF, GUI_BUTTON_HLABEL_HEIGHT_DEF
      );
      gtk_box_pack_start(GTK_BOX(parent2), w, TRUE, FALSE, 0);
      gtk_signal_connect(
          GTK_OBJECT(w), "clicked",
          GTK_SIGNAL_FUNC(CDialogButtonCB), d
      );
      gtk_accel_group_add(
          accelgrp, GDK_h, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      gtk_accel_group_add(
          accelgrp, GDK_question, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      gtk_accel_group_add(
          accelgrp, GDK_questiondown, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      gtk_accel_group_add(
          accelgrp, GDK_Arabic_question_mark, 0, GTK_ACCEL_VISIBLE,
          GTK_OBJECT(w), "clicked"
      );
      GUIButtonLabelUnderline(w, GDK_h);

      return(0);
}

/*
 *    Sets the Dialog's style.
 */
void CDialogSetStyle(GtkRcStyle *rc_style)
{
      GtkWidget *w;
      CDlg *d = cdlg;
      if(d == NULL)
          return;

      w = d->toplevel;
      if(w != NULL)
      {
          if(rc_style != NULL)
          {
            gtk_widget_modify_style_recursive(w, rc_style);
          }
          else
          {
            rc_style = gtk_rc_style_new();
            gtk_widget_modify_style_recursive(w, rc_style);
            GTK_RC_STYLE_UNREF(rc_style)
          }
      }
}

/*
 *    Sets the Dialog to be a transient for the given GtkWindow w.
 *
 *    If w is NULL then transient for will be unset.
 */
void CDialogSetTransientFor(GtkWidget *w)
{
      CDlg *d = cdlg;
      if(d == NULL)
          return;

      if(d->toplevel != NULL)
      {
          if(w != NULL)
          {
            if(!GTK_IS_WINDOW(GTK_OBJECT(w)))
                return;

            if(GTK_WINDOW(w)->modal)
                gtk_window_set_modal(GTK_WINDOW(w), FALSE);

            gtk_window_set_modal(
                GTK_WINDOW(d->toplevel), TRUE
            );
            gtk_window_set_transient_for(
                GTK_WINDOW(d->toplevel), GTK_WINDOW(w)
            );
            d->last_transient_for = w;
          }
          else
          {
            gtk_window_set_modal(
                GTK_WINDOW(d->toplevel), FALSE
            );
            gtk_window_set_transient_for(
                GTK_WINDOW(d->toplevel), NULL
            );
            d->last_transient_for = NULL;
          }
      }
}

/*
 *    Checks if the CDialog is currently waiting for user input.
 */
gboolean CDialogIsQuery(void)
{
      CDlg *d = cdlg;
      if(d == NULL)
          return(FALSE);

      return((d->block_loop_level > 0) ? TRUE : FALSE);
}

/*
 *    Breaks user query (if any) and causes the querying function to
 *    return CDIALOG_RESPONSE_NOT_AVAILABLE.
 */
void CDialogBreakQuery(void)
{
      CDlg *d = cdlg;
      if(d == NULL)
          return;

      d->response_code = CDIALOG_RESPONSE_NOT_AVAILABLE;

      /* Break out of all main loops */
      while(d->block_loop_level > 0)
      {
          gtk_main_quit();
          d->block_loop_level--;
      }
      d->block_loop_level = 0;
}

/*
 *    Returns the CDialog's toplevel GtkWindow.
 */
GtkWidget *CDialogGetToplevel(void)
{
      CDlg *d = cdlg;
      return((d != NULL) ? d->toplevel : NULL);
}


/*
 *    Maps or unmaps the CDialog's buttons with respect to the
 *    specified button flags.
 *
 *    The button in default_button will be grabbed and set as default.
 */
static void CDialogRemapButtons(
      CDlg *d,
      cdialog_btn_flags show_buttons,           /* Any of CDIALOG_BTNFLAG_* */
      cdialog_btn_flags default_button    /* One of CDIALOG_BTNFLAG_* */
)
{
      GtkWidget *w;

      if(d == NULL)
          return;

#define DO_MAP_BUTTON(w)      \
{ if((w) != NULL) { gtk_widget_show(w); } }
#define DO_UNMAP_BUTTON(w)    \
{ if((w) != NULL) { gtk_widget_hide(w); } }
#define DO_DEFAULT_BUTTON(w)  \
{ if((w) != NULL) {           \
  gtk_widget_grab_focus(w);   \
  gtk_widget_grab_default(w); \
} }
#define DO_UNDEFAULT_BUTTON(w)      \
{ if((w) != NULL) {           \
/*  GTK_WIDGET_UNSET_FLAGS(w, GTK_HAS_DEFAULT); \
  GTK_WIDGET_UNSET_FLAGS(w, GTK_RECEIVES_DEFAULT);  */ \
} }

      /* Begin mapping or unmapping buttons */

      /* OK Button */
      w = d->ok_btn;
      if(show_buttons & CDIALOG_BTNFLAG_OK)
          DO_MAP_BUTTON(w)
      else
          DO_UNMAP_BUTTON(w)
      if(default_button & CDIALOG_BTNFLAG_OK)
          DO_DEFAULT_BUTTON(w)
      else
          DO_UNDEFAULT_BUTTON(w)

      /* Yes Button */
      w = d->yes_btn;
      if(show_buttons & CDIALOG_BTNFLAG_YES)
          DO_MAP_BUTTON(w)
      else
          DO_UNMAP_BUTTON(w)
      if(default_button & CDIALOG_BTNFLAG_YES)
          DO_DEFAULT_BUTTON(w)
      else
          DO_UNDEFAULT_BUTTON(w)

      /* Yes To All Button */
      w = d->yes_to_all_btn;
      if(show_buttons & CDIALOG_BTNFLAG_YES_TO_ALL)
          DO_MAP_BUTTON(w)
      else
          DO_UNMAP_BUTTON(w)
      if(default_button & CDIALOG_BTNFLAG_YES_TO_ALL)
          DO_DEFAULT_BUTTON(w)
      else
          DO_UNDEFAULT_BUTTON(w)

      /* No Button */
      w = d->no_btn;
      if(show_buttons & CDIALOG_BTNFLAG_NO)
          DO_MAP_BUTTON(w)
      else
          DO_UNMAP_BUTTON(w)
      if(default_button & CDIALOG_BTNFLAG_NO)
          DO_DEFAULT_BUTTON(w)
      else
          DO_UNDEFAULT_BUTTON(w)

      /* Cancel Button */
      w = d->cancel_btn;
      if(show_buttons & CDIALOG_BTNFLAG_CANCEL)
          DO_MAP_BUTTON(w)
      else
          DO_UNMAP_BUTTON(w)
      if(default_button & CDIALOG_BTNFLAG_CANCEL)
          DO_DEFAULT_BUTTON(w)
      else
          DO_UNDEFAULT_BUTTON(w)

      /* Ignore Button */
      w = d->ignore_btn;
      if(show_buttons & CDIALOG_BTNFLAG_IGNORE)
          DO_MAP_BUTTON(w)
      else
          DO_UNMAP_BUTTON(w)
      if(default_button & CDIALOG_BTNFLAG_IGNORE)
          DO_DEFAULT_BUTTON(w)
      else
          DO_UNDEFAULT_BUTTON(w)

      /* Retry Button */
      w = d->retry_btn;
      if(show_buttons & CDIALOG_BTNFLAG_RETRY)
          DO_MAP_BUTTON(w)
      else
          DO_UNMAP_BUTTON(w)
      if(default_button & CDIALOG_BTNFLAG_RETRY)
          DO_DEFAULT_BUTTON(w)
      else
          DO_UNDEFAULT_BUTTON(w)

      /* Abort Button */
      w = d->abort_btn;
      if(show_buttons & CDIALOG_BTNFLAG_ABORT)
          DO_MAP_BUTTON(w)
      else
          DO_UNMAP_BUTTON(w)
      if(default_button & CDIALOG_BTNFLAG_ABORT)
          DO_DEFAULT_BUTTON(w)
      else
          DO_UNDEFAULT_BUTTON(w)

      /* Help Button */
      w = d->help_btn;
      if(show_buttons & CDIALOG_BTNFLAG_HELP)
          DO_MAP_BUTTON(w)
      else
          DO_UNMAP_BUTTON(w)
      if(default_button & CDIALOG_BTNFLAG_HELP)
          DO_DEFAULT_BUTTON(w)
      else
          DO_UNDEFAULT_BUTTON(w)

#undef DO_MAP_BUTTON
#undef DO_UNMAP_BUTTON
#undef DO_DEFAULT_BUTTON
#undef DO_UNDEFAULT_BUTTON
}

/*
 *    Maps the CDialog and blocks input until a user response is
 *    received.
 *
 *    Returns one of CDIALOG_RESPONSE_*.
 */
gint CDialogGetResponse(
      const gchar *title,
      const gchar *message,
      const gchar *explaination,
      cdialog_icon icon_code,
      cdialog_btn_flags show_buttons,           /* Any of CDIALOG_BTNFLAG_* */
      cdialog_btn_flags default_button    /* One of CDIALOG_BTNFLAG_* */
)
{
      GtkWidget *w, *toplevel;
      CDlg *d = cdlg;
      if(d == NULL)
          return(CDIALOG_RESPONSE_NOT_AVAILABLE);

      /* Already waiting for user response? */
      if(d->block_loop_level > 0)
          return(CDIALOG_RESPONSE_NOT_AVAILABLE);

      /* Reset values */
      d->response_code = CDIALOG_RESPONSE_NOT_AVAILABLE;
      d->block_loop_level = 0;

      toplevel = d->toplevel;

      /* Set title */
      if(title != NULL)
      {
          w = toplevel;
          if(w != NULL)
            gtk_window_set_title(GTK_WINDOW(w), title);
      }

      /* Set message */
      if(message != NULL)
      {
          w = d->label;
          if(w != NULL)
            gtk_label_set_text(GTK_LABEL(w), message);
      }

      /* Set help message */
      w = d->help_label;
      if(w != NULL)
          gtk_label_set_text(
            GTK_LABEL(w),
            (explaination != NULL) ?
                explaination : CDIALOG_MESG_NO_HELP_AVAILABLE
          );

      /* Set icon */
      if(icon_code != d->last_icon_code)
      {
          guint8 **icon_data = CDialogGetMessageIconDataFromCode(icon_code);
          d->last_icon_code = icon_code;
          CDialogLoadIcon(d, icon_data);
      }

      /* Remap buttons */
      CDialogRemapButtons(d, show_buttons, default_button);

      /* Unmap help vbox initially */
      w = d->help_vbox;
      if(w != NULL)
          gtk_widget_hide(w);

      /* Since new values have been set and widgets have been
       * mapped/unmapped we need to resize the CDialog
       */
      if(toplevel != NULL)
          gtk_widget_queue_resize(toplevel);

#if 0
      /* Center toplevel if not transient for */
/* GTK_WIN_POS_NONE does not seem to work in "resetting" the position */
      w = d->toplevel;
      if((w != NULL) ? GTK_IS_WINDOW(w) : FALSE)
          gtk_window_set_position(
            GTK_WINDOW(w),
            (d->last_transient_for != NULL) ?
                GTK_WIN_POS_NONE : GTK_WIN_POS_CENTER
          );
#endif

      /* Map the CDialog */
      CDialogMap();

      /* Block until user response */
      d->block_loop_level++;
      gtk_main();

      /* Unmap the CDialog */
      CDialogUnmap();

      /* Break out of all main loops */
      while(d->block_loop_level > 0)
      {
          gtk_main_quit();
          d->block_loop_level--;
      }
      d->block_loop_level = 0;

      return(d->response_code);
}

/*
 *      Same as CDialogGetResponse() except that the icon is set by
 *    the specified icon data.
 */
gint CDialogGetResponseIconData(
      const gchar *title,
      const gchar *message,
      const gchar *explaination,
      guint8 **icon_data,
      cdialog_btn_flags show_buttons,           /* Any of CDIALOG_BTNFLAG_* */
      cdialog_btn_flags default_button    /* One of CDIALOG_BTNFLAG_* */
)
{
      GtkWidget *w, *toplevel;
      CDlg *d = cdlg;
      if(d == NULL)
          return(CDIALOG_RESPONSE_NOT_AVAILABLE);

      /* Already waiting for user response? */
      if(d->block_loop_level > 0)
          return(CDIALOG_RESPONSE_NOT_AVAILABLE);

      /* Reset values */
      d->response_code = CDIALOG_RESPONSE_NOT_AVAILABLE;
      d->block_loop_level = 0;

      toplevel = d->toplevel;

      /* Set title */
      if(title != NULL)
      {
          w = toplevel;
          if(w != NULL)
            gtk_window_set_title(GTK_WINDOW(w), title);
      }

      /* Set message */
      if(message != NULL)
      {
          w = d->label;
          if(w != NULL)
            gtk_label_set_text(GTK_LABEL(w), message);
      }

      /* Set help message */
      w = d->help_label;
      if(w != NULL)
          gtk_label_set_text(
            GTK_LABEL(w),
            (explaination != NULL) ?
                explaination : CDIALOG_MESG_NO_HELP_AVAILABLE
          );

      /* Set icon */
      if(icon_data != NULL)
      {
          d->last_icon_code = CDIALOG_ICON_USER_DEFINED;
          CDialogLoadIcon(d, icon_data);
      }

      /* Remap buttons */
      CDialogRemapButtons(d, show_buttons, default_button);

      /* Unmap help vbox initially */
      w = d->help_vbox;
      if(w != NULL)
          gtk_widget_hide(w);

      /* Since new values have been set and widgets have been
       * mapped/unmapped we need to resize the CDialog
       */
      if(toplevel != NULL)
          gtk_widget_queue_resize(toplevel);

#if 0
      /* Center toplevel if not transient for */
      w = d->toplevel;
      if((w != NULL) ? GTK_IS_WINDOW(w) : FALSE)
          gtk_window_set_position(
            GTK_WINDOW(w),
            (d->last_transient_for != NULL) ?
                GTK_WIN_POS_NONE : GTK_WIN_POS_CENTER
          );
#endif

      /* Map the CDialog */
      CDialogMap();

      /* Block until user response */
      d->block_loop_level++;
      gtk_main();

      /* Unmap the CDialog */
      CDialogUnmap();

      /* Break out of all main loops */
      while(d->block_loop_level > 0)
      {
          gtk_main_quit();
          d->block_loop_level--;
      }
      d->block_loop_level = 0;

      return(d->response_code);
}

/*
 *    Similar to CDialogGetResponse() except that it displays a
 *    message from the file specified by message_path.
 */
gint CDialogGetResponseFile(
      const gchar *title,
      const gchar *filename,
      const gchar *explaination,
      cdialog_icon icon_code,
      cdialog_btn_flags show_buttons,           /* Any of CDIALOG_BTNFLAG_* */
      cdialog_btn_flags default_button    /* One of CDIALOG_BTNFLAG_* */
)
{
      gint response;
      gchar *buf;
      FILE *fp = !STRISEMPTY(filename) ?
          FOpen((const char *)filename, "rb") : NULL;
      if(fp == NULL)
      {
          /* Failed to open file */
          if(!STRISEMPTY(filename))
            buf = g_strdup_printf(
"Unable to open file:\n\
\n\
    %s\n",
                filename
            );
          else
            buf = STRDUP("No file specified");
      }
      else
      {
          gint    buf_len = 2048,
                  bytes_read;

          buf = (gchar *)g_malloc(buf_len * sizeof(gchar));
          if(buf != NULL)
            bytes_read = (gint)fread(buf, sizeof(gchar), (size_t)buf_len, fp);
          else
            bytes_read = 0;
          if(bytes_read < 0)
            bytes_read = 0;
          else if(bytes_read >= buf_len)
            bytes_read = buf_len - 1;
          buf[bytes_read] = '\0';

          FClose(fp);
      }

      /* Map the CDialog using the message loaded from the file
       * and wait until user response
       */
      response = CDialogGetResponse(
          title,              /* Title */
          buf,                /* Message */
          explaination,       /* Help Message */
          icon_code,                /* Icon Code */
          show_buttons,       /* Buttons */
          default_button            /* Default Button */
      );

      g_free(buf);

      return(response);
}

/*
 *    Maps the CDialog.
 */
void CDialogMap(void)
{
      CDlg *d = cdlg;
      GtkWidget *w = (d != NULL) ? d->toplevel : NULL;
      if(w == NULL)
          return;

      gtk_widget_show_raise(w);
}

/*
 *    Unmaps the CDialog.
 */
void CDialogUnmap(void)
{
      CDlg *d = cdlg;
      GtkWidget *w = (d != NULL) ? d->toplevel : NULL;
      if(w == NULL)
          return;

      gtk_widget_hide(w);
}

/*
 *    Shuts down the CDialog.
 */
void CDialogShutdown(void)
{
      CDlg *d = cdlg;
      if(d == NULL)
          return;

      d->response_code = CDIALOG_RESPONSE_NOT_AVAILABLE;

      /* Break out of all main loops */
      while(d->block_loop_level > 0)
      {
          gtk_main_quit();
          d->block_loop_level--;
      }
      d->block_loop_level = 0;

      /* Unmap Dialog */
      CDialogUnmap();

      /* Begin destroying widgets */
      GTK_WIDGET_DESTROY(d->icon_pm)
      GTK_WIDGET_DESTROY(d->label)
      GTK_WIDGET_DESTROY(d->label_hbox)
      GTK_WIDGET_DESTROY(d->help_icon_pm)
      GTK_WIDGET_DESTROY(d->help_label)
      GTK_WIDGET_DESTROY(d->help_vbox)

      GTK_WIDGET_DESTROY(d->ok_btn)
      GTK_WIDGET_DESTROY(d->yes_btn)
      GTK_WIDGET_DESTROY(d->yes_to_all_btn)
      GTK_WIDGET_DESTROY(d->no_btn)
      GTK_WIDGET_DESTROY(d->cancel_btn)
      GTK_WIDGET_DESTROY(d->ignore_btn)
      GTK_WIDGET_DESTROY(d->retry_btn)
      GTK_WIDGET_DESTROY(d->abort_btn)
      GTK_WIDGET_DESTROY(d->help_btn)

      GTK_WIDGET_DESTROY(d->button_hbox)
      GTK_WIDGET_DESTROY(d->main_vbox)
      GTK_WIDGET_DESTROY(d->toplevel)

      GTK_ACCEL_GROUP_UNREF(d->accelgrp)

      cdlg = NULL;
      g_free(d);
}

Generated by  Doxygen 1.6.0   Back to index