diff options
| -rw-r--r-- | dialog.c | 237 | ||||
| -rw-r--r-- | dialog.h | 61 | 
2 files changed, 298 insertions, 0 deletions
| diff --git a/dialog.c b/dialog.c new file mode 100644 index 0000000..005f42b --- /dev/null +++ b/dialog.c @@ -0,0 +1,237 @@ +/* + +    z80 - Z80 Emulation + +    Copyright (C) 2006  Ian Cowburn (ianc@noddybox.demon.co.uk) + +    This program is free software; you can redistribute it and/or modify +    it under the terms of the GNU General Public License as published by +    the Free Software Foundation; either version 2 of the License, or +    (at your option) any later version. + +    This program is distributed in the hope that it will be useful, +    but WITHOUT ANY WARRANTY; without even the implied warranty of +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +    GNU General Public License for more details. + +    You should have received a copy of the GNU General Public License +    along with this program; if not, write to the Free Software +    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + +    ------------------------------------------------------------------------- + +    Simple dialogs + +    $Id$ + +*/ + +/* ---------------------------------------- INCLUDES +*/ +#include <stdio.h> +#include <string.h> +#include <stdarg.h> + +#include "dialog.h" + + +/* ---------------------------------------- CONSTS +*/ + +/* ---------------------------------------- GLOBALS +*/ +static GtkWidget	*parent; +static GtkWidget	*dialog; + +static int		dial_done=FALSE; +static int		selected=FALSE; + +static char		saved_path[PATH_MAX+1]; + + +/* ---------------------------------------- CALLBACKS +*/ +static void Callback(GtkWidget *w, gpointer data) +{ +    dial_done=TRUE; +    selected=(int)data; +    gtk_widget_destroy(dialog); +} + + +static gint DestroyCB(GtkWidget *w, GdkEvent *ev, gpointer data) +{ +    Callback(w,data); +    return TRUE; +} + + +static gint NoDestroyCB(GtkWidget *w, GdkEvent *ev, gpointer data) +{ +    dial_done=TRUE; +    selected=(int)data; +    return TRUE; +} + + +static void FselCallback(GtkWidget *w, gpointer data) +{ +    dial_done=TRUE; +    selected=(int)data; + +    if (selected) +    	strcpy(saved_path, +	       gtk_file_selection_get_filename(GTK_FILE_SELECTION(dialog))); +} + + +/* ---------------------------------------- DialogParent() +*/ +void DialogParent(GtkWidget *w) +{ +    parent=w; +} + + +/* ---------------------------------------- DialogOK() +*/ +void DialogOK(const char *format, ...) +{ +    va_list va; +    char text[1024]; +    GtkWidget *button; +    GtkWidget *label; + +    va_start(va,format); +    vsnprintf(text,sizeof text,format,va); +    va_end(va); + +    dialog=gtk_dialog_new(); +    button=gtk_button_new_with_label("OK"); +    label=gtk_label_new(text); + +    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), +		       button,TRUE,TRUE,0); + +    gtk_container_set_border_width(GTK_CONTAINER(dialog),10); + +    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), +		       label,TRUE,TRUE,0); + +    gtk_signal_connect_object(GTK_OBJECT (button),"clicked", +			      GTK_SIGNAL_FUNC (gtk_widget_destroy), +			      GTK_OBJECT (dialog)); + +    gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(parent)); +    gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); +    gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_MOUSE); + +    gtk_widget_show(button); +    gtk_widget_show(label); +    gtk_widget_show(dialog); +} + + +/* ---------------------------------------- DialogYesNo() +*/ +int DialogYesNo(const char *format, ...) +{ +    va_list va; +    char text[1024]; +    GtkWidget *yes; +    GtkWidget *no; +    GtkWidget *label; + +    va_start(va,format); +    vsnprintf(text,sizeof text,format,va); +    va_end(va); + +    dialog=gtk_dialog_new(); +    yes=gtk_button_new_with_label("Yes"); +    no=gtk_button_new_with_label("No"); +    label=gtk_label_new(text); + +    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), +		       yes,TRUE,TRUE,0); + +    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), +		       no,TRUE,TRUE,0); + +    gtk_container_set_border_width(GTK_CONTAINER(dialog),10); + +    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), +		       label,TRUE,TRUE,0); + +    gtk_signal_connect(GTK_OBJECT (yes),"clicked", +		       GTK_SIGNAL_FUNC (Callback), +		       (gpointer)1); + +    gtk_signal_connect(GTK_OBJECT (no),"clicked", +		       GTK_SIGNAL_FUNC (Callback), +		       (gpointer)0); + +    gtk_signal_connect(GTK_OBJECT(dialog), "delete_event", +		       GTK_SIGNAL_FUNC(DestroyCB), (gpointer)0); + +    gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(parent)); +    gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); +    gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_MOUSE); +    /* gtk_object_set(GTK_OBJECT(dialog),"type",GTK_WINDOW_POPUP,NULL); */ + +    gtk_widget_show(yes); +    gtk_widget_show(no); +    gtk_widget_show(label); +    gtk_widget_show(dialog); + +    dial_done=FALSE; + +    while(!dial_done) +    	gtk_main_iteration(); + +    return selected; +} + + +/* ---------------------------------------- DialogFSelect() +*/ +int DialogFSelect(const char *title, char path[]) +{ +    dialog=gtk_file_selection_new(title); + +    if (path[0]) +	gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog),path); + +    gtk_signal_connect(GTK_OBJECT (GTK_FILE_SELECTION(dialog)->ok_button), +		       "clicked", +		       GTK_SIGNAL_FUNC (FselCallback), +		       (gpointer)1); + +    gtk_signal_connect(GTK_OBJECT (GTK_FILE_SELECTION(dialog)->cancel_button), +		       "clicked", +		       GTK_SIGNAL_FUNC (FselCallback), +		       (gpointer)0); + +    gtk_signal_connect(GTK_OBJECT(dialog), "delete_event", +		       GTK_SIGNAL_FUNC(NoDestroyCB), (gpointer)0); + +    gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(parent)); +    gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); +    gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_MOUSE); + +    gtk_widget_show(dialog); + +    dial_done=FALSE; + +    while(!dial_done) +    	gtk_main_iteration(); + +    if (selected) +    	strcpy(path,saved_path); + +    gtk_widget_destroy(dialog); + +    return selected; +} + + +/* END OF FILE */ diff --git a/dialog.h b/dialog.h new file mode 100644 index 0000000..a9ea88d --- /dev/null +++ b/dialog.h @@ -0,0 +1,61 @@ +/* + +    z80 - Z80 Emulation  + +    Copyright (C) 2006  Ian Cowburn (ianc@noddybox.demon.co.uk) + +    This program is free software; you can redistribute it and/or modify +    it under the terms of the GNU General Public License as published by +    the Free Software Foundation; either version 2 of the License, or +    (at your option) any later version. + +    This program is distributed in the hope that it will be useful, +    but WITHOUT ANY WARRANTY; without even the implied warranty of +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +    GNU General Public License for more details. + +    You should have received a copy of the GNU General Public License +    along with this program; if not, write to the Free Software +    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + +    ------------------------------------------------------------------------- + +    Dialogs + +    $Id$ + +*/ + +#ifndef GEMMA_DIALOG_H + +#include <gtk/gtk.h> + +#define GEMMA_DIALOG_H + + +/* Sets the parent widget for displayed dialogs +*/ +void	DialogParent(GtkWidget *parent); + + +/* Displays a simple dialog with the passed label and an OK button +*/ +void	DialogOK(const char *format, ...); + + +/* Displays a simple Yes/No dialog with the passed label. +   Returns TRUE if yes selected. +*/ +int	DialogYesNo(const char *format, ...); + + +/* Selects a file.  The current file is taken from path which should be +   MAX_PATH long.  If the user selects a file, TRUE is returned and the +   filename copied to path. +*/ +int	DialogFSelect(const char *title, char path[]); + + +#endif + +/* END OF FILE */ | 
