kopia lustrzana https://gitlab.com/sane-project/frontends
Merge branch '42-gtk3-port-issues' into 'master'
Draft: Resolve "GTK3 port issues" Closes #42 See merge request sane-project/frontends!16merge-requests/16/merge
commit
100a679908
130
src/gtkglue.c
130
src/gtkglue.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
119
src/xcam.c
119
src/xcam.c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue