Merge branch '42-gtk3-port-issues' into 'master'

Draft: Resolve "GTK3 port issues"

Closes #42

See merge request sane-project/frontends!16
merge-requests/16/merge
Ralph Little 2025-06-10 18:26:54 -07:00
commit 100a679908
5 zmienionych plików z 140 dodań i 154 usunięć

Wyświetl plik

@ -248,97 +248,89 @@ gsg_close_dialog_callback (GtkWidget * widget, gpointer data)
gsg_message_dialog_active = 0;
}
void
gsg_message (const gchar * title, const gchar * message)
{
GtkWidget *main_vbox, *label;
GtkWidget *button, *message_dialog;
if (gsg_message_dialog_active)
{
fprintf (stderr, "%s: %s\n", title, message);
return;
}
gsg_message_dialog_active = 1;
message_dialog = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_position (GTK_WINDOW (message_dialog), GTK_WIN_POS_MOUSE);
gtk_window_set_title (GTK_WINDOW (message_dialog), title);
/* create the main vbox */
main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
gtk_box_set_homogeneous (GTK_BOX (main_vbox), TRUE);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 5);
gtk_widget_show (main_vbox);
gtk_container_add (GTK_CONTAINER (message_dialog), main_vbox);
/* the message */
label = gtk_label_new (message);
gtk_container_add (GTK_CONTAINER (main_vbox), label);
gtk_widget_show (label);
/* the confirmation button */
button = gtk_button_new_with_label (_("OK"));
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (gsg_close_dialog_callback),
message_dialog);
gtk_container_add (GTK_CONTAINER (main_vbox), button);
gtk_widget_show (button);
gtk_widget_show (message_dialog);
}
void
gsg_error (const gchar * error)
{
gsg_message ("Error", error);
GtkWidget *dialog;
GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL;
dialog = gtk_message_dialog_new (GTK_WINDOW_TOPLEVEL,
flags,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"%s",
error);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
void
gsg_warning (const gchar * warning)
{
gsg_message ("Warning", warning);
GtkWidget *dialog;
GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL;
dialog = gtk_message_dialog_new (GTK_WINDOW_TOPLEVEL,
flags,
GTK_MESSAGE_WARNING,
GTK_BUTTONS_CLOSE,
"%s",
warning);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
/*
* Execute scan file name dialog.
*
* Return: -1 = cancel/error, 0 = filename selected.
*
*/
int
gsg_get_filename (const char *label, const char *default_name,
size_t max_len, char *filename)
gsg_get_filename (const char *label, const char *default_name, char **filename, SANE_Bool is_save)
{
int cancel = 0;
SANE_Bool cancel = SANE_TRUE;
GtkWidget *filesel;
GtkFileChooser *chooser;
filesel = gtk_file_chooser_dialog_new ((char*) label, NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
_("Ok"), GTK_RESPONSE_ACCEPT,
_("Cancel"), GTK_RESPONSE_CANCEL,
NULL);
DBG (DBG_debug, "gsg_get_filename start, default=[%s]\n", default_name);
gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
filesel = gtk_file_chooser_dialog_new (
label, NULL,
is_save ? GTK_FILE_CHOOSER_ACTION_SAVE : GTK_FILE_CHOOSER_ACTION_OPEN,
"Ok", GTK_RESPONSE_ACCEPT, "Cancel", GTK_RESPONSE_CANCEL,
NULL);
if (default_name)
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filesel),
(char *) default_name);
chooser = GTK_FILE_CHOOSER (filesel);
if (gtk_dialog_run (GTK_DIALOG (filesel)) == GTK_RESPONSE_ACCEPT)
if (is_save)
{
size_t len, cwd_len;
char *cwd;
gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE);
strncpy (filename,
gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filesel)),
max_len - 1);
filename[max_len - 1] = '\0';
if (default_name)
gtk_file_chooser_set_filename (chooser, default_name);
}
else
{
if (default_name)
gtk_file_chooser_set_current_name (chooser, default_name);
len = strlen (filename);
cwd = alloca (len + 2);
if (getcwd (cwd, len + 1) == NULL)
return -1;
cwd_len = strlen (cwd);
cwd[cwd_len++] = '/';
cwd[cwd_len] = '\0';
if (strncmp (filename, cwd, cwd_len) == 0)
memcpy (filename, filename + cwd_len, len - cwd_len + 1);
}
if (gtk_dialog_run (GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT)
{
*filename = strdup(gtk_file_chooser_get_filename (chooser));
if (!*filename)
{
DBG (DBG_error, "gsg_get_filename failed to allocate filename.\n");
}
cancel = SANE_FALSE;
}
gtk_widget_destroy (filesel);
DBG (DBG_debug, "gsg_get_filename exit\n");
return cancel ? -1 : 0;
}

Wyświetl plik

@ -95,11 +95,10 @@ extern int gsg_make_path (size_t max_len, char *filename_ret,
const char *prefix, const char *dev_name,
const char *postfix);
extern void gsg_message (const gchar *title, const gchar * message);
extern void gsg_error (const gchar * error_message);
extern void gsg_warning (const gchar * warning_message);
extern int gsg_get_filename (const char *label, const char *default_name,
size_t max_len, char *filename);
char **filename, SANE_Bool is_save);
extern GSGDialog *gsg_create_dialog (GtkWidget *window,
const char *device_name,

Wyświetl plik

@ -104,11 +104,6 @@ sane_strframe (SANE_Frame f)
(f) == SANE_FRAME_GREEN || \
(f) == SANE_FRAME_BLUE )
#ifndef HAVE_ATEXIT
# define atexit(func) on_exit(func, 0) /* works for SunOS, at least */
#endif
typedef struct
{
u_char *data;
@ -1403,8 +1398,6 @@ main (int argc, char **argv)
int startNum = 1, endNum = -1; /* start/end numbers of pages to scan */
int no_overwrite = 0;
atexit (sane_exit);
prog_name = strrchr (argv[0], '/');
if (prog_name)
++prog_name;
@ -1464,7 +1457,7 @@ main (int argc, char **argv)
case 'V':
printf ("%s (%s) %s\n", prog_name, PACKAGE, VERSION);
exit (0);
scanadf_exit (0);
default:
break; /* ignore device specific options for now */
@ -1726,5 +1719,5 @@ List of available devices:"), prog_name);
if (scriptWait)
while (wait(NULL) != -1);
return (status == SANE_STATUS_GOOD) ? 0 : 1;
scanadf_exit((status == SANE_STATUS_GOOD) ? 0 : 1);
}

Wyświetl plik

@ -66,10 +66,6 @@
#define MAX_LUM 64 /* how many graylevels for 8 bit displays */
#ifndef HAVE_ATEXIT
# define atexit(func) on_exit(func, 0) /* works for SunOS, at least */
#endif
typedef struct {
GtkWidget *dialog;
GtkWidget *spinner;
@ -89,7 +85,9 @@ Canvas;
static const char *prog_name;
static const SANE_Device **device;
static GSGDialog *dialog;
static char device_settings_filename[1024] = "device.rc";
static char *device_settings_filename = NULL;
#define DEFAULT_SETTINGS_FILE "device.rc"
#define DBG_fatal 0
#define DBG_error 1
@ -163,6 +161,8 @@ static void update_param (GSGDialog * dialog, void *arg);
static void load_defaults (int silent);
static void xcam_exit (void);
static struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
@ -689,7 +689,8 @@ exit_callback (GtkWidget * widget, gpointer data)
if (dialog)
gsg_destroy_dialog (dialog);
dialog = 0;
exit (0);
xcam_exit ();
exit(0);
}
static void
@ -711,20 +712,27 @@ load_defaults_callback (GtkWidget * widget, gpointer data)
static void
save_as_callback (GtkWidget * widget, gpointer data)
{
if (gsg_get_filename ("File to save settings to", device_settings_filename,
sizeof (device_settings_filename),
device_settings_filename) < 0)
if (gsg_get_filename (
"File to save settings to",
device_settings_filename ? device_settings_filename : DEFAULT_SETTINGS_FILE,
&device_settings_filename,
SANE_TRUE) < 0)
return;
save_settings (device_settings_filename);
}
static void
load_from_callback (GtkWidget * widget, gpointer data)
{
if (gsg_get_filename
("File to load settings from", device_settings_filename,
sizeof (device_settings_filename), device_settings_filename) < 0)
if (gsg_get_filename (
"File to load settings from",
device_settings_filename ? device_settings_filename : DEFAULT_SETTINGS_FILE,
&device_settings_filename,
SANE_FALSE) < 0)
return;
load_settings (device_settings_filename, 0);
}
@ -767,10 +775,6 @@ build_files_menu (void)
menu = gtk_menu_new ();
item = gtk_menu_item_new ();
gtk_container_add (GTK_CONTAINER (menu), item);
gtk_widget_show (item);
item = gtk_menu_item_new_with_label ("Exit");
gtk_container_add (GTK_CONTAINER (menu), item);
g_signal_connect (G_OBJECT (item), "activate",
@ -795,23 +799,6 @@ device_activate_callback (GtkWidget * widget, gpointer data)
g_idle_add (delayed_switch, data);
}
static void
xcam_exit (void)
{
static int active = 0;
DBG (DBG_debug, "xcam: xcam_exit: enter\n");
if (active)
return;
active = 1;
pref_xcam_save ();
sane_exit ();
/* this has the habit of calling exit itself: */
gtk_main_quit ();
DBG (DBG_debug, "xcam: xcam_exit: exit\n");
}
static gboolean on_scan_finished(gpointer data) {
ScanUI *ui = (ScanUI *)data;
GtkWidget *menu, *item;
@ -828,7 +815,7 @@ static gboolean on_scan_finished(gpointer data) {
gtk_widget_show (item);
}
item = gtk_menu_item_new ();
item = gtk_separator_menu_item_new ();
gtk_container_add (GTK_CONTAINER (ui->menu), item);
gtk_widget_show (item);
@ -990,7 +977,7 @@ build_preferences_menu (GSGDialog * dialog)
g_signal_connect (G_OBJECT (item), "toggled",
G_CALLBACK (pref_toggle_twocolumn), 0);
item = gtk_menu_item_new ();
item = gtk_separator_menu_item_new ();
gtk_container_add (GTK_CONTAINER (menu), item);
gtk_widget_show (item);
@ -1006,7 +993,7 @@ build_preferences_menu (GSGDialog * dialog)
G_CALLBACK (load_defaults_callback), 0);
gtk_widget_show (item);
item = gtk_menu_item_new ();
item = gtk_separator_menu_item_new ();
gtk_container_add (GTK_CONTAINER (menu), item);
gtk_widget_show (item);
@ -1650,6 +1637,26 @@ save_frame (void)
DBG (DBG_debug, "xcam: save_frame: exit\n");
}
static void
xcam_exit (void)
{
static int active = 0;
DBG (DBG_debug, "xcam: xcam_exit: enter\n");
if (active)
return;
active = 1;
pref_xcam_save ();
sane_exit ();
/* this has the habit of calling exit itself: */
gtk_main_quit ();
free(device_settings_filename);
DBG (DBG_debug, "xcam: xcam_exit: exit\n");
}
/* Invoked when window manager's "delete" (or "close") function is
invoked. */
static gint
@ -1662,23 +1669,22 @@ xcam_win_delete (GtkWidget * w, gpointer data)
static void
browse_filename_callback (GtkWidget * widget, gpointer data)
{
char filename[1024];
char *filename = NULL;
DBG (DBG_debug, "xcam: browse_filename_callback\n");
if (preferences.filename)
DBG (DBG_debug, "browse_filename_callback\n");
if (gsg_get_filename (
"Output Filename",
preferences.filename ? preferences.filename : OUTFILENAME, &filename,
SANE_TRUE) == 0)
{
strncpy (filename, preferences.filename, sizeof (filename));
filename[sizeof (filename) - 1] = '\0';
}
else
strcpy (filename, OUTFILENAME);
gsg_get_filename (_("Output Filename"), filename, sizeof (filename), filename);
gtk_entry_set_text (GTK_ENTRY (win.filename_entry), filename);
gtk_entry_set_text (GTK_ENTRY (win.filename_entry), filename);
if (preferences.filename)
free ((void *) preferences.filename);
preferences.filename = strdup (filename);
DBG (DBG_debug, "xcam: browse_filename_callback: exit\n");
if (preferences.filename)
free ((void *) preferences.filename);
preferences.filename = filename;
}
DBG (DBG_debug, "browse_filename_callback: finished\n");
}
static void
@ -1741,7 +1747,8 @@ main (int argc, char **argv)
{
DBG (DBG_fatal, "init: sane_main failed: %s\n",
sane_strstatus (status));
exit (1);
xcam_exit();
exit(1);
}
if (argc > 1)
@ -1753,15 +1760,18 @@ main (int argc, char **argv)
{
case 'V':
printf ("xcam (%s) %s\n", PACKAGE, VERSION);
exit (0);
xcam_exit();
exit(0);
case 'B':
win.buf_backend_size = 1024 * 1024;
break;
case 'h':
default:
usage ();
exit (0);
xcam_exit();
exit(0);
}
}
}
@ -1774,8 +1784,6 @@ main (int argc, char **argv)
gdk_set_show_events (0);
gtk_init (&argc, &argv);
atexit (xcam_exit);
win.gdk_input_tag = -1;
win.shell = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (win.shell), (char *) prog_name);
@ -1986,5 +1994,6 @@ main (int argc, char **argv)
pref_xcam_save ();
DBG (DBG_debug, "xcam main exit\n");
xcam_exit();
return 0;
}

Wyświetl plik

@ -1205,6 +1205,7 @@ scan_start (void)
snprintf (buf, sizeof (buf), _("Failed to start scanner: %s"),
sane_strstatus (status));
gsg_error (buf);
scan_done ();
return;
}
@ -1473,11 +1474,7 @@ files_build_menu (void)
DBG (DBG_debug, "files_build_menu\n");
menu = gtk_menu_new ();
item = gtk_menu_item_new ();
gtk_container_add (GTK_CONTAINER (menu), item);
gtk_widget_show (item);
item = gtk_menu_item_new_with_label (_("Exit"));
item = gtk_menu_item_new_with_label ("Exit");
gtk_container_add (GTK_CONTAINER (menu), item);
g_signal_connect (G_OBJECT (item), "activate",
G_CALLBACK (files_exit_callback), 0);
@ -1815,7 +1812,7 @@ pref_build_menu (void)
gtk_widget_show (item);
/* insert separator: */
item = gtk_menu_item_new ();
item = gtk_separator_menu_item_new ();
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show (item);
@ -1838,22 +1835,18 @@ pref_build_menu (void)
static void
browse_filename_callback (GtkWidget * widget, gpointer data)
{
char filename[1024];
char *filename = NULL;
DBG (DBG_debug, "browse_filename_callback\n");
if (preferences.filename)
{
strncpy (filename, preferences.filename, sizeof (filename));
filename[sizeof (filename) - 1] = '\0';
}
else
strcpy (filename, OUTFILENAME);
gsg_get_filename ("Output Filename", filename, sizeof (filename), filename);
gtk_entry_set_text (GTK_ENTRY (scan_win.filename_entry), filename);
if (preferences.filename)
free ((void *) preferences.filename);
preferences.filename = strdup (filename);
if (gsg_get_filename ("Output Filename", preferences.filename? preferences.filename: OUTFILENAME, &filename, SANE_TRUE) == 0)
{
gtk_entry_set_text (GTK_ENTRY (scan_win.filename_entry), filename);
if (preferences.filename)
free ((void *) preferences.filename);
preferences.filename = filename;
}
DBG (DBG_debug, "browse_filename_callback: finished\n");
}