From afb72fcba6d167d9760110365f8211b51cdea41f Mon Sep 17 00:00:00 2001 From: Ordissimo Date: Fri, 25 Oct 2024 19:20:45 +0200 Subject: [PATCH] Readd previous functions and fix device search --- src/xscanimage.c | 217 ++++++++++++++++++++++++++++------------------- 1 file changed, 129 insertions(+), 88 deletions(-) diff --git a/src/xscanimage.c b/src/xscanimage.c index 67c9792..3113c08 100644 --- a/src/xscanimage.c +++ b/src/xscanimage.c @@ -52,6 +52,7 @@ #include "progress.h" #include "preferences.h" #include "preview.h" +#include "../libgtk/utils-gtk.h" #ifndef PATH_MAX # define PATH_MAX 1024 @@ -87,6 +88,8 @@ # endif /* ENABLE_GIMP_1_2 */ # endif +static GtkApplication *app = NULL; + static void query (void); #ifndef ENABLE_GIMP_1_2 static void run (const gchar * name, gint nparams, const GimpParam * param, @@ -119,7 +122,7 @@ enum struct scan_win_t { GtkWidget *shell; - GtkWidget *menubar; + GMenu *menubar; GtkWidget *hruler; GtkWidget *vruler; GtkWidget *info_label; @@ -154,7 +157,7 @@ struct scan_win_t scan_win; static const char *prog_name; -static GtkWidget *choose_device_dialog; +static GtkWidget *choose_device_dialog = NULL; static GSGDialog *dialog; static const SANE_Device **devlist; static gint seldev = -1; /* The selected device */ @@ -1013,7 +1016,8 @@ scan_done (void) if (scan_win.preview) gtk_widget_set_sensitive (scan_win.preview->preview, TRUE); gtk_widget_set_sensitive (scan_win.scan_button, TRUE); - gtk_widget_set_sensitive (scan_win.menubar, TRUE); + // gtk_widget_set_sensitive (scan_win.menubar, TRUE); + if (scan_win.input_tag >= 0) { @@ -1091,7 +1095,7 @@ scan_start (void) if (scan_win.preview) gtk_widget_set_sensitive (scan_win.preview->preview, FALSE); gtk_widget_set_sensitive (scan_win.scan_button, FALSE); - gtk_widget_set_sensitive (scan_win.menubar, FALSE); + // gtk_widget_set_sensitive (scan_win.menubar, FALSE); #ifdef HAVE_LIBGIMP_GIMP_H if (scan_win.mode == SANE_GIMP_EXTENSION && scan_win.tile) @@ -1450,24 +1454,29 @@ files_exit_callback (GtkWidget * widget, gpointer data) quit_xscanimage (); } -static GtkWidget * +static GMenu * files_build_menu (void) { - GtkWidget *menu; //, *item; + GMenu *menu; //, *item; + GMenu *section; + GMenuItem *menu_item_quit; 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); + // GSimpleAction *act_quit = g_simple_action_new ("quit", NULL); + // g_signal_connect_swapped (act_quit, "activate", G_CALLBACK (files_exit_callback), NULL); + // g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (act_quit)); - 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); - gtk_widget_show (item); -*/ + menu = g_menu_new (); + + section = g_menu_new (); + menu_item_quit = g_menu_item_new ("Exit", "app.quit"); + + g_menu_append_item (section, menu_item_quit); + g_object_unref (menu_item_quit); + + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + + g_object_unref (menu_item_quit); DBG (DBG_debug, "files_build_menu: finished\n"); return menu; } @@ -1575,14 +1584,14 @@ preview_options_dialog (GtkWidget * widget, gpointer data) hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE); - gtk_box_append (GTK_BOX (vbox), hbox); + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2); button = gtk_check_button_new_with_label ("Preserve preview image"); g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (update_int_callback), &preferences.preserve_preview); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), + gtk_check_button_set_active(GTK_CHECK_BUTTON(button), preferences.preserve_preview); - gtk_box_append (GTK_BOX (hbox), button); + gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 2); gtk_widget_show (button); gtk_widget_show (hbox); @@ -1591,14 +1600,14 @@ preview_options_dialog (GtkWidget * widget, gpointer data) hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE); - gtk_box_append (GTK_BOX (vbox), hbox); + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2); button = gtk_check_button_new_with_label ("Use private colormap"); g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (update_int_callback), &preferences.preview_own_cmap); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), + gtk_check_button_set_active(GTK_CHECK_BUTTON (button), preferences.preview_own_cmap); - gtk_box_append (GTK_BOX (hbox), button); + gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 2); gtk_widget_show (button); gtk_widget_show (hbox); @@ -1607,18 +1616,17 @@ preview_options_dialog (GtkWidget * widget, gpointer data) hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE); - gtk_box_append (GTK_BOX (vbox), hbox); + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2); gtk_widget_show (hbox); label = gtk_label_new ("Gamma correction value"); - gtk_box_append (GTK_BOX (hbox), label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2); gtk_widget_show (label); sprintf (buf, "%g", preferences.preview_gamma); text = gtk_entry_new (); gtk_editable_set_text (GTK_EDITABLE (text), buf); - - gtk_box_append (GTK_BOX (hbox), text); + gtk_box_pack_start (GTK_BOX (hbox), text, TRUE, TRUE, 2); g_signal_connect (G_OBJECT (text), "changed", G_CALLBACK (update_double_callback), &preferences.preview_gamma); @@ -1716,10 +1724,16 @@ pref_toggle_twocolumn (GtkWidget * widget, gpointer data) */ } -static GtkWidget * +static GMenu * pref_build_menu (void) { - GtkWidget *menu; // , *item, *submenu; + GMenu *menu; // , *item, *submenu; + + DBG (DBG_debug, "pref_build_menu\n"); + menu = g_menu_new (); + // g_object_unref (section); + + return menu; /* GtkWidget *unit_mm, *unit_cm, *unit_in; GSList *units_group = NULL; @@ -1867,7 +1881,6 @@ device_dialog (void) devname = devlist[seldev]->name; /* create the dialog box */ - scan_win.shell = gtk_dialog_new (); gtk_window_set_title (GTK_WINDOW (scan_win.shell), (char *) devname); gtk_window_set_resizable (GTK_WINDOW (scan_win.shell), TRUE); gtk_window_set_default_size (GTK_WINDOW (scan_win.shell), 400, 400); @@ -1875,12 +1888,12 @@ device_dialog (void) G_CALLBACK (scan_win_delete), NULL); /* create the main vbox */ - vbox = gtk_dialog_get_content_area(GTK_DIALOG (scan_win.shell)); - - /* create the menubar */ - - // scan_win.menubar = gtk_menu_bar_new (); - gtk_box_append (GTK_BOX (vbox), scan_win.menubar); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); + if (GTK_IS_WINDOW(scan_win.shell)) + gtk_window_set_child(GTK_WINDOW(scan_win.shell), vbox); + else + g_message("%d) %s\n", __LINE__, __FUNCTION__); + /* "Files" submenu: */ /* @@ -1890,6 +1903,7 @@ device_dialog (void) files_build_menu ()); gtk_widget_show (menubar_item); */ + g_menu_append_submenu (scan_win.menubar, "File", G_MENU_MODEL (files_build_menu ())); /* "Preferences" submenu: */ /* @@ -1899,6 +1913,7 @@ device_dialog (void) pref_build_menu ()); gtk_widget_show (menubar_item); */ + g_menu_append_submenu (scan_win.menubar, "Preferences", G_MENU_MODEL (pref_build_menu ())); // gtk_widget_show (scan_win.menubar); @@ -1907,7 +1922,7 @@ device_dialog (void) { frame = gtk_frame_new ("Output"); // gtk_container_set_border_width (GTK_CONTAINER (frame), 4); - gtk_box_append (GTK_BOX (vbox), frame); + gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE); @@ -1915,18 +1930,18 @@ device_dialog (void) gtk_frame_set_child (GTK_FRAME (frame), hbox); label = gtk_label_new ("Filename"); - gtk_box_append (GTK_BOX (hbox), label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2); text = gtk_entry_new (); gtk_editable_set_text (GTK_EDITABLE (text), (char *) preferences.filename); - gtk_box_append (GTK_BOX (hbox), text); + gtk_box_pack_start (GTK_BOX (hbox), text, TRUE, TRUE, 2); g_signal_connect (G_OBJECT (text), "changed", G_CALLBACK (filename_changed_callback), 0); scan_win.filename_entry = text; button = gtk_button_new_with_label ("Browse"); - gtk_box_append (GTK_BOX (hbox), button); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 2); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (browse_filename_callback), 0); @@ -1945,9 +1960,9 @@ device_dialog (void) GTK_CORNER_TOP_RIGHT); dialog_window = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_set_homogeneous (GTK_BOX (dialog_window), FALSE); - gtk_window_set_child(GTK_WINDOW (scrolled_window), dialog_window); + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW (scrolled_window), dialog_window); - gtk_box_append (GTK_BOX (vbox), scrolled_window); + gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0); gtk_widget_show (scrolled_window); gtk_widget_show (dialog_window); @@ -1959,35 +1974,39 @@ device_dialog (void) /* The info row */ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3); gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE); - // gtk_container_set_border_width (GTK_CONTAINER (hbox), 3); - gtk_box_append (GTK_BOX (vbox), hbox); + gtk_container_set_border_width (GTK_WIDGET (hbox), 3); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); frame = gtk_frame_new (NULL); - gtk_box_append (GTK_BOX (hbox), frame); + gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0); gtk_widget_show (frame); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE); - // gtk_container_set_border_width (GTK_CONTAINER (hbox), 2); - gtk_frame_set_child(GTK_FRAME (frame), hbox); + gtk_container_set_border_width (GTK_WIDGET (hbox), 2); + gtk_frame_set_child (GTK_FRAME (frame), hbox); gtk_widget_show (hbox); scan_win.info_label = gtk_label_new ("0x0: 0KB"); - gtk_box_append (GTK_BOX (hbox), scan_win.info_label); + gtk_box_pack_start (GTK_BOX (hbox), scan_win.info_label, FALSE, FALSE, 0); gtk_widget_show (scan_win.info_label); update_param (dialog, 0); + GtkWidget *bbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3); + gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, TRUE, 0); /* The Scan button */ - scan_win.scan_button = gtk_dialog_add_button (GTK_DIALOG (scan_win.shell), "Scan", GTK_RESPONSE_OK); + scan_win.scan_button = gtk_button_new_with_label("Scan"); + gtk_box_pack_start (GTK_BOX (bbox), scan_win.scan_button, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (scan_win.scan_button), "clicked", G_CALLBACK (scan_dialog), scan_win.shell); gtk_widget_show (scan_win.scan_button); /* The Preview button */ - scan_win.preview_button = gtk_dialog_add_button (GTK_DIALOG (scan_win.shell), "Preview Window", GTK_RESPONSE_ACCEPT); + scan_win.preview_button = gtk_button_new_with_label("Preview Window"); + gtk_box_pack_start (GTK_BOX (bbox), scan_win.preview_button, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (scan_win.preview_button), "clicked", G_CALLBACK (scan_preview), scan_win.shell); gtk_widget_show (scan_win.preview_button); @@ -2007,14 +2026,14 @@ device_dialog (void) #endif pref_device_restore (); /* restore device-settings */ - gtk_widget_show (scan_win.shell); + gtk_window_present(GTK_WINDOW(scan_win.shell)); DBG (DBG_debug, "device_dialog: finished\n"); } static void ok_choose_dialog_callback (void) { - gtk_window_destroy (GTK_WINDOW(choose_device_dialog)); + gtk_widget_hide (GTK_WIDGET(choose_device_dialog)); device_dialog (); } @@ -2025,83 +2044,88 @@ select_device_callback (GtkWidget * widget, gpointer data) } static void -group_change_callback (GtkToggleButton* button, gpointer data) +group_change_callback (GtkCheckButton* button, gpointer data) { - if (gtk_toggle_button_get_active(button)) + if (gtk_check_button_get_active(button)) { seldev = (long) data; } } -static gint32 +static gint choose_device (void) { - GtkWidget *main_vbox, *vbox, *button, *group = NULL; + GtkWidget *main_vbox, *vbox, *bbox, *button, *group = NULL; const SANE_Device *adev; gint i; DBG (DBG_debug, "choose_device\n"); - choose_device_dialog = gtk_dialog_new (); + choose_device_dialog = scan_win.shell; gtk_window_set_title (GTK_WINDOW (choose_device_dialog), "Select device"); - g_signal_connect (G_OBJECT (choose_device_dialog), "delete_event", - G_CALLBACK (files_exit_callback), NULL); - - main_vbox = gtk_dialog_get_content_area(GTK_DIALOG (choose_device_dialog)); + gtk_window_set_modal (GTK_WINDOW (choose_device_dialog), TRUE); + // g_signal_connect (G_OBJECT (choose_device_dialog), "delete_event", G_CALLBACK (files_exit_callback), NULL); + main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); + if (GTK_IS_WINDOW(choose_device_dialog)) + gtk_window_set_child (GTK_WINDOW (choose_device_dialog), main_vbox); + else + g_message("%d) %s\n", __LINE__, __FUNCTION__); /* The list of drivers */ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); gtk_box_set_homogeneous (GTK_BOX (vbox), FALSE); - // gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); - gtk_box_append (GTK_BOX (main_vbox), vbox); + gtk_container_set_border_width (GTK_WIDGET (vbox), 3); + gtk_box_pack_start (GTK_BOX (main_vbox), vbox, TRUE, TRUE, 0); gtk_widget_show (vbox); /* The radio buttons */ button = NULL; + group = NULL; for (i = 0; i < ndevs; i++) { adev = devlist[i]; - - if (button == NULL) + button = gtk_check_button_new_with_label ((char *) adev->name); + if (group == NULL) { - button = gtk_check_button_new_with_label ((char *) adev->name); group = button; } - /* else { - gtk_check_button_set_label( GTK_CHECK_BUTTON(button), adev->name ); - group = button; - }*/ + gtk_check_button_set_group (GTK_CHECK_BUTTON (button), GTK_CHECK_BUTTON (group)); + } +/* g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (select_device_callback), (void *) (long) i); +*/ g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (group_change_callback), (void *) (long) i); - gtk_box_append (GTK_BOX (vbox), button); + gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); gtk_widget_show (button); if (i == defdev) { - gtk_check_button_set_group (GTK_CHECK_BUTTON (button), GTK_CHECK_BUTTON (group)); - gtk_check_button_set_active (GTK_CHECK_BUTTON (group), TRUE); + gtk_check_button_set_active(GTK_CHECK_BUTTON(button), TRUE); } } + bbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); + gtk_box_pack_start (GTK_BOX (main_vbox), bbox, FALSE, TRUE, 0); /* The OK button */ - button = gtk_dialog_add_button (GTK_DIALOG (choose_device_dialog), "OK", GTK_RESPONSE_OK); + button = gtk_button_new_with_label ("Ok"); gtk_window_set_default_widget (GTK_WINDOW (choose_device_dialog), button); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (ok_choose_dialog_callback), NULL); - gtk_widget_show (button); + gtk_box_pack_start (GTK_BOX (bbox), button, TRUE, TRUE, 0); /* The Cancel button */ - button = gtk_dialog_add_button (GTK_DIALOG (choose_device_dialog), "Cancel", GTK_RESPONSE_OK); + button = gtk_button_new_with_label ("Cancel"); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (files_exit_callback), NULL); gtk_widget_show (button); + gtk_box_pack_start (GTK_BOX (bbox), button, TRUE, TRUE, 0); - gtk_widget_show (choose_device_dialog); + gtk_window_present(GTK_WINDOW(choose_device_dialog)); DBG (DBG_debug, "choose_device: finished\n"); return 0; } @@ -2124,11 +2148,11 @@ init (int argc, char **argv) //char filename[PATH_MAX]; //struct stat st; SANE_Status status; + scan_win.info_label = NULL; DBG_INIT (); DBG (DBG_debug, "init\n"); - gtk_init (); /* #ifdef HAVE_LIBGIMP_GIMP_H gtk_rc_parse (gimp_gtkrc ()); @@ -2228,13 +2252,8 @@ init (int argc, char **argv) } static void -interface (int argc, char **argv) +interface_app (void) { - scan_win.info_label = NULL; - - DBG (DBG_debug, "interface\n"); - init (argc, argv); - for (ndevs = 0; devlist[ndevs]; ++ndevs); if (seldev >= 0) @@ -2282,6 +2301,25 @@ interface (int argc, char **argv) DBG (DBG_debug, "interface: finished\n"); } +static void +interface (int argc, char **argv) +{ + + DBG (DBG_debug, "interface\n"); + init (argc, argv); + interface_app (); +} + +static void +activate(GApplication *app, gpointer *data) { + /* create the menubar */ + scan_win.menubar = g_menu_new (); + scan_win.shell = gtk_application_window_new(GTK_APPLICATION(app)); + interface_app (); + gtk_application_set_menubar (GTK_APPLICATION (app), G_MENU_MODEL (scan_win.menubar)); + gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(gtk_application_window_new(GTK_APPLICATION(app))), TRUE); +} + int main (int argc, char **argv) { @@ -2323,12 +2361,15 @@ main (int argc, char **argv) # endif /* !ENABLE_GIMP_1_2 */ g_set_print_handler (old_print_func); g_set_printerr_handler (old_printerr_func); - if (result) - interface (argc, argv); + if (!result) + exit(-1); } -#else - interface (argc, argv); #endif /* HAVE_LIBGIMP_GIMP_H */ + init (argc, argv); + app = gtk_application_new("com.scan2vcard", G_APPLICATION_FLAGS_NONE); + g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); + g_application_run(G_APPLICATION(app), argc, argv); + g_object_unref(app); DBG (DBG_debug, "main: finished\n"); return 0; }