16
#include <glib-object.h>
12
19
#include <stdlib.h>
13
20
#include <string.h>
14
#include <glib/gi18n.h>
16
#include <gconf/gconf-client.h>
21
#include <glib/gi18n-lib.h>
22
#include <glib/gstdio.h>
18
#include <unistd.h> // TEMP: Needed for close() in get_temporary_filename()
21
#include "book-view.h"
24
#define DEFAULT_TEXT_DPI 150
25
#define DEFAULT_PHOTO_DPI 300
35
static guint signals[LAST_SIGNAL] = { 0, };
38
struct SimpleScanPrivate
44
GtkWidget *window, *main_vbox;
45
GtkWidget *info_bar, *info_bar_image, *info_bar_label;
46
GtkWidget *info_bar_close_button, *info_bar_change_scanner_button;
47
GtkWidget *page_move_left_menuitem, *page_move_right_menuitem;
48
GtkWidget *page_delete_menuitem, *crop_rotate_menuitem;
49
GtkWidget *save_menuitem, *save_as_menuitem, *save_toolbutton;
50
GtkWidget *stop_menuitem, *stop_toolbutton;
52
GtkWidget *text_toolbar_menuitem, *text_menu_menuitem;
53
GtkWidget *photo_toolbar_menuitem, *photo_menu_menuitem;
55
GtkWidget *authorize_dialog;
56
GtkWidget *authorize_label;
57
GtkWidget *username_entry, *password_entry;
59
GtkWidget *preferences_dialog;
60
GtkWidget *device_combo, *text_dpi_combo, *photo_dpi_combo, *page_side_combo, *paper_size_combo;
61
GtkTreeModel *device_model, *text_dpi_model, *photo_dpi_model, *page_side_model, *paper_size_model;
62
gboolean setting_devices, user_selected_device;
65
gchar *error_title, *error_text;
66
gboolean error_change_scanner_hint;
72
gboolean updating_page_menu;
73
gint default_page_width, default_page_height, default_page_dpi;
74
ScanDirection default_page_scan_direction;
78
gchar *default_file_name;
81
gint window_width, window_height;
82
gboolean window_is_maximized;
85
G_DEFINE_TYPE (SimpleScan, ui, G_TYPE_OBJECT);
90
ScanDirection scan_direction;
91
} scan_direction_keys[] =
93
{ "top-to-bottom", TOP_TO_BOTTOM },
94
{ "bottom-to-top", BOTTOM_TO_TOP },
95
{ "left-to-right", LEFT_TO_RIGHT },
96
{ "right-to-left", RIGHT_TO_LEFT },
102
find_scan_device (SimpleScan *ui, const char *device, GtkTreeIter *iter)
104
gboolean have_iter = FALSE;
106
if (gtk_tree_model_get_iter_first (ui->priv->device_model, iter)) {
109
gtk_tree_model_get (ui->priv->device_model, iter, 0, &d, -1);
110
if (strcmp (d, device) == 0)
113
} while (!have_iter && gtk_tree_model_iter_next (ui->priv->device_model, iter));
121
show_error_dialog (SimpleScan *ui, const char *error_title, const char *error_text)
125
dialog = gtk_message_dialog_new (GTK_WINDOW (ui->priv->window),
130
gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CLOSE, 0);
131
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", error_text);
132
gtk_widget_destroy (dialog);
137
ui_set_default_file_name (SimpleScan *ui, const gchar *default_file_name)
139
g_free (ui->priv->default_file_name);
140
ui->priv->default_file_name = g_strdup (default_file_name);
145
ui_authorize (SimpleScan *ui, const gchar *resource, gchar **username, gchar **password)
147
GString *description;
149
description = g_string_new ("");
150
g_string_printf (description,
151
/* Label in authorization dialog. '%s' is replaced with the name of the resource requesting authorization */
152
_("Username and password required to access '%s'"),
155
gtk_entry_set_text (GTK_ENTRY (ui->priv->username_entry), *username ? *username : "");
156
gtk_entry_set_text (GTK_ENTRY (ui->priv->password_entry), "");
157
gtk_label_set_text (GTK_LABEL (ui->priv->authorize_label), description->str);
158
g_string_free (description, TRUE);
160
gtk_widget_show (ui->priv->authorize_dialog);
161
gtk_dialog_run (GTK_DIALOG (ui->priv->authorize_dialog));
162
gtk_widget_hide (ui->priv->authorize_dialog);
164
*username = g_strdup (gtk_entry_get_text (GTK_ENTRY (ui->priv->username_entry)));
165
*password = g_strdup (gtk_entry_get_text (GTK_ENTRY (ui->priv->password_entry)));
169
void device_combo_changed_cb (GtkWidget *widget, SimpleScan *ui);
172
device_combo_changed_cb (GtkWidget *widget, SimpleScan *ui)
174
if (ui->priv->setting_devices)
176
ui->priv->user_selected_device = TRUE;
181
update_info_bar (SimpleScan *ui)
184
const gchar *title, *text, *image_id;
186
gboolean show_close_button = FALSE;
187
gboolean show_change_scanner_button = FALSE;
189
if (ui->priv->have_error) {
190
type = GTK_MESSAGE_ERROR;
191
image_id = GTK_STOCK_DIALOG_ERROR;
192
title = ui->priv->error_title;
193
text = ui->priv->error_text;
194
show_close_button = TRUE;
195
show_change_scanner_button = ui->priv->error_change_scanner_hint;
197
else if (gtk_tree_model_iter_n_children (ui->priv->device_model, NULL) == 0) {
198
type = GTK_MESSAGE_WARNING;
199
image_id = GTK_STOCK_DIALOG_WARNING;
200
/* Warning displayed when no scanners are detected */
201
title = _("No scanners detected");
202
/* Hint to user on why there are no scanners detected */
203
text = _("Please check your scanner is connected and powered on");
206
gtk_widget_hide (ui->priv->info_bar);
210
gtk_info_bar_set_message_type (GTK_INFO_BAR (ui->priv->info_bar), type);
211
gtk_image_set_from_stock (GTK_IMAGE (ui->priv->info_bar_image), image_id, GTK_ICON_SIZE_DIALOG);
212
message = g_strdup_printf ("<big><b>%s</b></big>\n\n%s", title, text);
213
gtk_label_set_markup (GTK_LABEL (ui->priv->info_bar_label), message);
215
gtk_widget_set_visible (ui->priv->info_bar_close_button, show_close_button);
216
gtk_widget_set_visible (ui->priv->info_bar_change_scanner_button, show_change_scanner_button);
217
gtk_widget_show (ui->priv->info_bar);
222
ui_set_scan_devices (SimpleScan *ui, GList *devices)
225
gboolean have_selection = FALSE;
229
ui->priv->setting_devices = TRUE;
231
/* If the user hasn't chosen a scanner choose the best available one */
232
if (ui->priv->user_selected_device)
233
have_selection = gtk_combo_box_get_active (GTK_COMBO_BOX (ui->priv->device_combo)) >= 0;
235
/* Add new devices */
237
for (d = devices; d; d = d->next) {
238
ScanDevice *device = (ScanDevice *) d->data;
241
/* Find if already exists */
242
if (gtk_tree_model_iter_nth_child (ui->priv->device_model, &iter, NULL, index)) {
248
gtk_tree_model_get (ui->priv->device_model, &iter, 0, &name, -1);
249
matched = strcmp (name, device->name) == 0;
257
} while (gtk_tree_model_iter_next (ui->priv->device_model, &iter));
260
/* If exists, remove elements up to this one */
265
gtk_list_store_set (GTK_LIST_STORE (ui->priv->device_model), &iter, 1, device->label, -1);
267
for (i = 0; i < n_delete; i++) {
268
gtk_tree_model_iter_nth_child (ui->priv->device_model, &iter, NULL, index);
269
gtk_list_store_remove (GTK_LIST_STORE (ui->priv->device_model), &iter);
273
gtk_list_store_insert (GTK_LIST_STORE (ui->priv->device_model), &iter, index);
274
gtk_list_store_set (GTK_LIST_STORE (ui->priv->device_model), &iter, 0, device->name, 1, device->label, -1);
279
/* Remove any remaining devices */
280
while (gtk_tree_model_iter_nth_child (ui->priv->device_model, &iter, NULL, index))
281
gtk_list_store_remove (GTK_LIST_STORE (ui->priv->device_model), &iter);
283
/* Select the first available device */
284
if (!have_selection && devices != NULL)
285
gtk_combo_box_set_active (GTK_COMBO_BOX (ui->priv->device_combo), 0);
287
ui->priv->setting_devices = FALSE;
289
update_info_bar (ui);
294
get_selected_device (SimpleScan *ui)
298
if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (ui->priv->device_combo), &iter)) {
300
gtk_tree_model_get (ui->priv->device_model, &iter, 0, &device, -1);
309
ui_set_selected_device (SimpleScan *ui, const gchar *device)
313
if (!find_scan_device (ui, device, &iter))
316
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (ui->priv->device_combo), &iter);
317
ui->priv->user_selected_device = TRUE;
322
add_default_page (SimpleScan *ui)
326
page = book_append_page (ui->priv->book,
327
ui->priv->default_page_width,
328
ui->priv->default_page_height,
329
ui->priv->default_page_dpi,
330
ui->priv->default_page_scan_direction);
331
book_view_select_page (ui->priv->book_view, page);
336
on_file_type_changed (GtkTreeSelection *selection, GtkWidget *dialog)
340
gchar *path, *filename, *extension, *new_filename;
342
if (!gtk_tree_selection_get_selected (selection, &model, &iter))
345
gtk_tree_model_get (model, &iter, 1, &extension, -1);
346
path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
347
filename = g_path_get_basename (path);
349
/* Replace extension */
350
if (g_strrstr (filename, "."))
351
new_filename = g_strdup_printf ("%.*s%s", (int)(g_strrstr (filename, ".") - filename), filename, extension);
353
new_filename = g_strdup_printf ("%s%s", filename, extension);
354
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), new_filename);
358
g_free (new_filename);
364
choose_file_location (SimpleScan *ui)
368
GtkFileFilter *filter;
369
GtkWidget *expander, *file_type_view;
370
GtkListStore *file_type_store;
372
GtkTreeViewColumn *column;
373
const gchar *extension;
374
gchar *directory, *uri = NULL;
379
gchar *label, *extension;
382
/* Save dialog: Label for saving in PDF format */
383
{ _("PDF (multi-page document)"), ".pdf" },
384
/* Save dialog: Label for saving in JPEG format */
385
{ _("JPEG (compressed)"), ".jpg" },
386
/* Save dialog: Label for saving in PNG format */
387
{ _("PNG (lossless)"), ".png" },
391
/* Get directory to save to */
392
directory = gconf_client_get_string (ui->priv->client, GCONF_DIR "/save_directory", NULL);
393
if (!directory || directory[0] == '\0') {
395
directory = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS));
398
dialog = gtk_file_chooser_dialog_new (/* Save dialog: Dialog title */
400
GTK_WINDOW (ui->priv->window),
401
GTK_FILE_CHOOSER_ACTION_SAVE,
402
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
403
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
405
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
406
gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), FALSE);
407
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), directory);
408
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), ui->priv->default_file_name);
411
/* Filter to only show images by default */
412
filter = gtk_file_filter_new ();
413
gtk_file_filter_set_name (filter,
414
/* Save dialog: Filter name to show only image files */
416
gtk_file_filter_add_pixbuf_formats (filter);
417
gtk_file_filter_add_mime_type (filter, "application/pdf");
418
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
419
filter = gtk_file_filter_new ();
420
gtk_file_filter_set_name (filter,
421
/* Save dialog: Filter name to show all files */
423
gtk_file_filter_add_pattern (filter, "*");
424
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
426
expander = gtk_expander_new_with_mnemonic (/* */
427
_("Select File _Type"));
428
gtk_expander_set_spacing (GTK_EXPANDER (expander), 5);
429
gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dialog), expander);
431
extension = strstr (ui->priv->default_file_name, ".");
435
file_type_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
436
for (i = 0; file_types[i].label; i++) {
437
gtk_list_store_append (file_type_store, &iter);
438
gtk_list_store_set (file_type_store, &iter, 0, file_types[i].label, 1, file_types[i].extension, -1);
441
file_type_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (file_type_store));
442
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (file_type_view), FALSE);
443
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (file_type_view), TRUE);
444
column = gtk_tree_view_column_new_with_attributes ("",
445
gtk_cell_renderer_text_new (),
447
gtk_tree_view_append_column (GTK_TREE_VIEW (file_type_view), column);
448
gtk_container_add (GTK_CONTAINER (expander), file_type_view);
450
if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (file_type_store), &iter)) {
453
gtk_tree_model_get (GTK_TREE_MODEL (file_type_store), &iter, 1, &e, -1);
454
if (strcmp (extension, e) == 0)
455
gtk_tree_selection_select_iter (gtk_tree_view_get_selection (GTK_TREE_VIEW (file_type_view)), &iter);
457
} while (gtk_tree_model_iter_next (GTK_TREE_MODEL (file_type_store), &iter));
459
g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (file_type_view)),
461
G_CALLBACK (on_file_type_changed),
464
gtk_widget_show_all (expander);
466
response = gtk_dialog_run (GTK_DIALOG (dialog));
468
if (response == GTK_RESPONSE_ACCEPT)
469
uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog));
471
gconf_client_set_string (ui->priv->client, GCONF_DIR "/save_directory",
472
gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog)),
475
gtk_widget_destroy (dialog);
482
save_document (SimpleScan *ui, gboolean force_choose_location)
485
gchar *uri, *uri_lower;
486
GError *error = NULL;
489
if (ui->priv->book_uri && !force_choose_location)
490
uri = g_strdup (ui->priv->book_uri);
492
uri = choose_file_location (ui);
496
file = g_file_new_for_uri (uri);
498
g_debug ("Saving to '%s'", uri);
500
uri_lower = g_utf8_strdown (uri, -1);
501
if (g_str_has_suffix (uri_lower, ".pdf"))
502
result = book_save (ui->priv->book, "pdf", file, &error);
503
else if (g_str_has_suffix (uri_lower, ".ps"))
504
result = book_save (ui->priv->book, "ps", file, &error);
505
else if (g_str_has_suffix (uri_lower, ".png"))
506
result = book_save (ui->priv->book, "png", file, &error);
507
else if (g_str_has_suffix (uri_lower, ".tif") || g_str_has_suffix (uri_lower, ".tiff"))
508
result = book_save (ui->priv->book, "tiff", file, &error);
510
result = book_save (ui->priv->book, "jpeg", file, &error);
515
g_free (ui->priv->book_uri);
516
ui->priv->book_uri = uri;
517
book_set_needs_saving (ui->priv->book, FALSE);
522
g_warning ("Error saving file: %s", error->message);
524
/* Title of error dialog when save failed */
525
_("Failed to save file"),
528
g_clear_error (&error);
531
g_object_unref (file);
538
prompt_to_save (SimpleScan *ui, const gchar *title, const gchar *discard_label)
543
if (!book_get_needs_saving (ui->priv->book))
546
dialog = gtk_message_dialog_new (GTK_WINDOW (ui->priv->window),
551
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s",
552
/* Text in dialog warning when a document is about to be lost*/
553
_("If you don't save, changes will be permanently lost."));
554
gtk_dialog_add_button (GTK_DIALOG (dialog), discard_label, GTK_RESPONSE_NO);
555
gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
556
gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_SAVE, GTK_RESPONSE_YES);
558
response = gtk_dialog_run (GTK_DIALOG (dialog));
559
gtk_widget_destroy (dialog);
562
case GTK_RESPONSE_YES:
563
if (save_document (ui, FALSE))
567
case GTK_RESPONSE_CANCEL:
569
case GTK_RESPONSE_NO:
577
clear_document (SimpleScan *ui)
579
book_clear (ui->priv->book);
580
add_default_page (ui);
581
g_free (ui->priv->book_uri);
582
ui->priv->book_uri = NULL;
583
book_set_needs_saving (ui->priv->book, FALSE);
584
gtk_widget_set_sensitive (ui->priv->save_as_menuitem, FALSE);
588
void new_button_clicked_cb (GtkWidget *widget, SimpleScan *ui);
591
new_button_clicked_cb (GtkWidget *widget, SimpleScan *ui)
593
if (!prompt_to_save (ui,
594
/* Text in dialog warning when a document is about to be lost */
595
_("Save current document?"),
596
/* Button in dialog to create new document and discard unsaved document */
597
_("Discard Changes")))
605
set_document_hint (SimpleScan *ui, const gchar *document_hint)
607
g_free (ui->priv->document_hint);
608
ui->priv->document_hint = g_strdup (document_hint);
610
if (strcmp (document_hint, "text") == 0) {
611
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (ui->priv->text_toolbar_menuitem), TRUE);
612
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (ui->priv->text_menu_menuitem), TRUE);
614
else if (strcmp (document_hint, "photo") == 0) {
615
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (ui->priv->photo_toolbar_menuitem), TRUE);
616
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (ui->priv->photo_menu_menuitem), TRUE);
621
void text_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui);
624
text_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui)
626
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
627
set_document_hint (ui, "text");
631
void photo_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui);
634
photo_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui)
636
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
637
set_document_hint (ui, "photo");
642
set_page_side (SimpleScan *ui, const gchar *document_hint)
646
if (gtk_tree_model_get_iter_first (ui->priv->page_side_model, &iter)) {
651
gtk_tree_model_get (ui->priv->page_side_model, &iter, 0, &d, -1);
652
have_match = strcmp (d, document_hint) == 0;
656
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (ui->priv->page_side_combo), &iter);
659
} while (gtk_tree_model_iter_next (ui->priv->page_side_model, &iter));
665
set_paper_size (SimpleScan *ui, gint width, gint height)
670
for (have_iter = gtk_tree_model_get_iter_first (ui->priv->paper_size_model, &iter);
672
have_iter = gtk_tree_model_iter_next (ui->priv->paper_size_model, &iter)) {
675
gtk_tree_model_get (ui->priv->paper_size_model, &iter, 0, &w, 1, &h, -1);
676
if (w == width && h == height)
681
have_iter = gtk_tree_model_get_iter_first (ui->priv->paper_size_model, &iter);
683
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (ui->priv->paper_size_combo), &iter);
688
get_text_dpi (SimpleScan *ui)
691
gint dpi = DEFAULT_TEXT_DPI;
693
if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (ui->priv->text_dpi_combo), &iter))
694
gtk_tree_model_get (ui->priv->text_dpi_model, &iter, 0, &dpi, -1);
701
get_photo_dpi (SimpleScan *ui)
704
gint dpi = DEFAULT_PHOTO_DPI;
706
if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (ui->priv->photo_dpi_combo), &iter))
707
gtk_tree_model_get (ui->priv->photo_dpi_model, &iter, 0, &dpi, -1);
714
get_page_side (SimpleScan *ui)
719
if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (ui->priv->page_side_combo), &iter))
720
gtk_tree_model_get (ui->priv->page_side_model, &iter, 0, &mode, -1);
727
get_paper_size (SimpleScan *ui, gint *width, gint *height)
731
if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (ui->priv->paper_size_combo), &iter)) {
732
gtk_tree_model_get (ui->priv->paper_size_model, &iter, 0, width, 1, height, -1);
741
get_scan_options (SimpleScan *ui)
749
{ "text", SCAN_MODE_GRAY, 2 },
750
{ "photo", SCAN_MODE_COLOR, 8 },
751
{ NULL, SCAN_MODE_COLOR, 8 }
754
ScanOptions *options;
756
/* Find this profile */
757
// FIXME: Move this into scan-profile.c
758
for (i = 0; profiles[i].name && strcmp (profiles[i].name, ui->priv->document_hint) != 0; i++);
760
options = g_malloc0 (sizeof (ScanOptions));
761
options->scan_mode = profiles[i].mode;
762
options->depth = profiles[i].depth;
763
if (options->scan_mode == SCAN_MODE_COLOR)
764
options->dpi = get_photo_dpi (ui);
766
options->dpi = get_text_dpi (ui);
767
get_paper_size (ui, &options->paper_width, &options->paper_height);
773
void scan_button_clicked_cb (GtkWidget *widget, SimpleScan *ui);
776
scan_button_clicked_cb (GtkWidget *widget, SimpleScan *ui)
779
ScanOptions *options;
781
device = get_selected_device (ui);
783
options = get_scan_options (ui);
784
options->type = SCAN_SINGLE;
785
g_signal_emit (G_OBJECT (ui), signals[START_SCAN], 0, device, options);
791
void stop_scan_button_clicked_cb (GtkWidget *widget, SimpleScan *ui);
794
stop_scan_button_clicked_cb (GtkWidget *widget, SimpleScan *ui)
796
g_signal_emit (G_OBJECT (ui), signals[STOP_SCAN], 0);
800
void continuous_scan_button_clicked_cb (GtkWidget *widget, SimpleScan *ui);
803
continuous_scan_button_clicked_cb (GtkWidget *widget, SimpleScan *ui)
805
if (ui->priv->scanning) {
806
g_signal_emit (G_OBJECT (ui), signals[STOP_SCAN], 0);
808
gchar *device, *side;
809
ScanOptions *options;
811
device = get_selected_device (ui);
812
options = get_scan_options (ui);
813
side = get_page_side (ui);
814
if (strcmp (side, "front") == 0)
815
options->type = SCAN_ADF_FRONT;
816
else if (strcmp (side, "back") == 0)
817
options->type = SCAN_ADF_BACK;
819
options->type = SCAN_ADF_BOTH;
821
g_signal_emit (G_OBJECT (ui), signals[START_SCAN], 0, device, options);
829
void preferences_button_clicked_cb (GtkWidget *widget, SimpleScan *ui);
832
preferences_button_clicked_cb (GtkWidget *widget, SimpleScan *ui)
834
gtk_window_present (GTK_WINDOW (ui->priv->preferences_dialog));
838
gboolean preferences_dialog_delete_event_cb (GtkWidget *widget, SimpleScan *ui);
841
preferences_dialog_delete_event_cb (GtkWidget *widget, SimpleScan *ui)
847
void preferences_dialog_response_cb (GtkWidget *widget, gint response_id, SimpleScan *ui);
850
preferences_dialog_response_cb (GtkWidget *widget, gint response_id, SimpleScan *ui)
852
gtk_widget_hide (ui->priv->preferences_dialog);
857
update_page_menu (SimpleScan *ui)
862
book = book_view_get_book (ui->priv->book_view);
863
index = book_get_page_index (book, book_view_get_selected (ui->priv->book_view));
864
gtk_widget_set_sensitive (ui->priv->page_move_left_menuitem, index > 0);
865
gtk_widget_set_sensitive (ui->priv->page_move_right_menuitem, index < book_get_n_pages (book) - 1);
870
page_selected_cb (BookView *view, Page *page, SimpleScan *ui)
877
ui->priv->updating_page_menu = TRUE;
879
update_page_menu (ui);
881
if (page_has_crop (page)) {
884
// FIXME: Make more generic, move into page-size.c and reuse
885
crop_name = page_get_named_crop (page);
887
if (strcmp (crop_name, "A4") == 0)
888
name = "a4_menuitem";
889
else if (strcmp (crop_name, "A5") == 0)
890
name = "a5_menuitem";
891
else if (strcmp (crop_name, "A6") == 0)
892
name = "a6_menuitem";
893
else if (strcmp (crop_name, "letter") == 0)
894
name = "letter_menuitem";
895
else if (strcmp (crop_name, "legal") == 0)
896
name = "legal_menuitem";
897
else if (strcmp (crop_name, "4x6") == 0)
898
name = "4x6_menuitem";
902
name = "custom_crop_menuitem";
905
name = "no_crop_menuitem";
907
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (ui->priv->builder, name)), TRUE);
908
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (gtk_builder_get_object (ui->priv->builder, "crop_toolbutton")), page_has_crop (page));
910
ui->priv->updating_page_menu = FALSE;
914
// FIXME: Duplicated from simple-scan.c
916
get_temporary_filename (const gchar *prefix, const gchar *extension)
919
gchar *filename, *path;
920
GError *error = NULL;
922
/* NOTE: I'm not sure if this is a 100% safe strategy to use g_file_open_tmp(), close and
923
* use the filename but it appears to work in practise */
925
filename = g_strdup_printf ("%s-XXXXXX.%s", prefix, extension);
926
fd = g_file_open_tmp (filename, &path, &error);
929
g_warning ("Error saving page for viewing: %s", error->message);
930
g_clear_error (&error);
940
show_page_cb (BookView *view, Page *page, SimpleScan *ui)
945
GError *error = NULL;
947
path = get_temporary_filename ("scanned-page", "tiff");
950
file = g_file_new_for_path (path);
953
screen = gtk_widget_get_screen (GTK_WIDGET (ui->priv->window));
955
if (page_save (page, "tiff", file, &error)) {
956
gchar *uri = g_file_get_uri (file);
957
gtk_show_uri (screen, uri, gtk_get_current_event_time (), &error);
961
g_object_unref (file);
964
show_error_dialog (ui,
965
/* Error message display when unable to preview image */
966
_("Unable to open image preview application"),
968
g_clear_error (&error);
974
show_page_menu_cb (BookView *view, SimpleScan *ui)
976
gtk_menu_popup (GTK_MENU (gtk_builder_get_object (ui->priv->builder, "page_menu")), NULL, NULL, NULL, NULL,
977
3, gtk_get_current_event_time());
981
void rotate_left_button_clicked_cb (GtkWidget *widget, SimpleScan *ui);
984
rotate_left_button_clicked_cb (GtkWidget *widget, SimpleScan *ui)
988
if (ui->priv->updating_page_menu)
990
page = book_view_get_selected (ui->priv->book_view);
991
page_rotate_left (page);
995
void rotate_right_button_clicked_cb (GtkWidget *widget, SimpleScan *ui);
998
rotate_right_button_clicked_cb (GtkWidget *widget, SimpleScan *ui)
1002
if (ui->priv->updating_page_menu)
1004
page = book_view_get_selected (ui->priv->book_view);
1005
page_rotate_right (page);
1010
set_crop (SimpleScan *ui, const gchar *crop_name)
1014
gtk_widget_set_sensitive (ui->priv->crop_rotate_menuitem, crop_name != NULL);
1016
if (ui->priv->updating_page_menu)
1019
page = book_view_get_selected (ui->priv->book_view);
1024
page_set_no_crop (page);
1028
if (strcmp (crop_name, "custom") == 0) {
1029
gint width, height, crop_width, crop_height;
1031
width = page_get_width (page);
1032
height = page_get_height (page);
1034
crop_width = (int) (width * 0.8 + 0.5);
1035
crop_height = (int) (height * 0.8 + 0.5);
1036
page_set_custom_crop (page, crop_width, crop_height);
1037
page_move_crop (page, (width - crop_width) / 2, (height - crop_height) / 2);
1042
page_set_named_crop (page, crop_name);
1046
void no_crop_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui);
1049
no_crop_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui)
1051
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
1052
set_crop (ui, NULL);
1056
void custom_crop_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui);
1059
custom_crop_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui)
1061
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
1062
set_crop (ui, "custom");
1065
void crop_toolbutton_toggled_cb (GtkWidget *widget, SimpleScan *ui);
1068
crop_toolbutton_toggled_cb (GtkWidget *widget, SimpleScan *ui)
1070
if (ui->priv->updating_page_menu)
1073
if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (widget)))
1074
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (ui->priv->builder, "custom_crop_menuitem")), TRUE);
1076
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (ui->priv->builder, "no_crop_menuitem")), TRUE);
1080
void four_by_six_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui);
1083
four_by_six_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui)
1085
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
1086
set_crop (ui, "4x6");
1090
void legal_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui);
1093
legal_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui)
1095
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
1096
set_crop (ui, "legal");
1100
void letter_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui);
1103
letter_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui)
1105
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
1106
set_crop (ui, "letter");
1110
void a6_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui);
1113
a6_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui)
1115
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
1116
set_crop (ui, "A6");
1120
void a5_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui);
1123
a5_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui)
1125
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
1126
set_crop (ui, "A5");
1130
void a4_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui);
1133
a4_menuitem_toggled_cb (GtkWidget *widget, SimpleScan *ui)
1135
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)))
1136
set_crop (ui, "A4");
1140
void crop_rotate_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui);
1143
crop_rotate_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui)
1147
page = book_view_get_selected (ui->priv->book_view);
1151
page_rotate_crop (page);
1155
void page_move_left_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui);
1158
page_move_left_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui)
1160
Book *book = book_view_get_book (ui->priv->book_view);
1161
Page *page = book_view_get_selected (ui->priv->book_view);
1164
index = book_get_page_index (book, page);
1166
book_move_page (book, page, index - 1);
1168
update_page_menu (ui);
1172
void page_move_right_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui);
1175
page_move_right_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui)
1177
Book *book = book_view_get_book (ui->priv->book_view);
1178
Page *page = book_view_get_selected (ui->priv->book_view);
1181
index = book_get_page_index (book, page);
1182
if (index < book_get_n_pages (book) - 1)
1183
book_move_page (book, page, book_get_page_index (book, page) + 1);
1185
update_page_menu (ui);
1189
void page_delete_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui);
1192
page_delete_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui)
1194
book_delete_page (book_view_get_book (ui->priv->book_view),
1195
book_view_get_selected (ui->priv->book_view));
1199
void save_file_button_clicked_cb (GtkWidget *widget, SimpleScan *ui);
1202
save_file_button_clicked_cb (GtkWidget *widget, SimpleScan *ui)
1204
save_document (ui, FALSE);
1208
void save_as_file_button_clicked_cb (GtkWidget *widget, SimpleScan *ui);
1211
save_as_file_button_clicked_cb (GtkWidget *widget, SimpleScan *ui)
1213
save_document (ui, TRUE);
1218
draw_page (GtkPrintOperation *operation,
1219
GtkPrintContext *print_context,
1226
gboolean is_landscape = FALSE;
1228
context = gtk_print_context_get_cairo_context (print_context);
1230
page = book_get_page (ui->priv->book, page_number);
1232
/* Rotate to same aspect */
1233
if (gtk_print_context_get_width (print_context) > gtk_print_context_get_height (print_context))
1234
is_landscape = TRUE;
1235
if (page_is_landscape (page) != is_landscape) {
1236
cairo_translate (context, gtk_print_context_get_width (print_context), 0);
1237
cairo_rotate (context, M_PI_2);
1240
cairo_scale (context,
1241
gtk_print_context_get_dpi_x (print_context) / page_get_dpi (page),
1242
gtk_print_context_get_dpi_y (print_context) / page_get_dpi (page));
1244
image = page_get_image (page, TRUE);
1245
gdk_cairo_set_source_pixbuf (context, image, 0, 0);
1246
cairo_paint (context);
1248
g_object_unref (image);
1252
void email_button_clicked_cb (GtkWidget *widget, SimpleScan *ui);
1255
email_button_clicked_cb (GtkWidget *widget, SimpleScan *ui)
1257
g_signal_emit (G_OBJECT (ui), signals[EMAIL], 0, ui->priv->document_hint);
1261
void print_button_clicked_cb (GtkWidget *widget, SimpleScan *ui);
1264
print_button_clicked_cb (GtkWidget *widget, SimpleScan *ui)
1266
GtkPrintOperation *print;
1267
GtkPrintOperationResult result;
1268
GError *error = NULL;
1270
print = gtk_print_operation_new ();
1271
gtk_print_operation_set_n_pages (print, book_get_n_pages (ui->priv->book));
1272
g_signal_connect (print, "draw-page", G_CALLBACK (draw_page), ui);
1274
result = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
1275
GTK_WINDOW (ui->priv->window), &error);
1277
g_object_unref (print);
1281
void help_contents_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui);
1284
help_contents_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui)
1287
GError *error = NULL;
1289
screen = gtk_widget_get_screen (GTK_WIDGET (ui->priv->window));
1290
gtk_show_uri (screen, "ghelp:simple-scan", gtk_get_current_event_time (), &error);
1294
show_error_dialog (ui,
1295
/* Error message displayed when unable to launch help browser */
1296
_("Unable to open help file"),
1298
g_clear_error (&error);
1303
void about_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui);
1306
about_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui)
1308
const gchar *authors[] = { "Robert Ancell <robert.ancell@canonical.com>", NULL };
1310
/* The license this software is under (GPL3+) */
1311
const char *license = _("This program is free software: you can redistribute it and/or modify\n"
1312
"it under the terms of the GNU General Public License as published by\n"
1313
"the Free Software Foundation, either version 3 of the License, or\n"
1314
"(at your option) any later version.\n"
1316
"This program is distributed in the hope that it will be useful,\n"
1317
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1318
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
1319
"GNU General Public License for more details.\n"
1321
"You should have received a copy of the GNU General Public License\n"
1322
"along with this program. If not, see <http://www.gnu.org/licenses/>.");
1324
/* Title of about dialog */
1325
const char *title = _("About Simple Scan");
1327
/* Description of program */
1328
const char *description = _("Simple document scanning tool");
1330
gtk_show_about_dialog (GTK_WINDOW (ui->priv->window),
1332
"program-name", "Simple Scan",
1334
"comments", description,
1335
"logo-icon-name", "scanner",
1337
"translator-credits", _("translator-credits"),
1338
"website", "https://launchpad.net/simple-scan",
1339
"copyright", "Copyright © 2009 Canonical Ltd.",
1341
"wrap-license", TRUE,
1347
quit (SimpleScan *ui)
1350
gint paper_width = 0, paper_height = 0;
1353
if (!prompt_to_save (ui,
1354
/* Text in dialog warning when a document is about to be lost */
1355
_("Save document before quitting?"),
1356
/* Button in dialog to quit and discard unsaved document */
1357
_("Quit without Saving")))
1360
device = get_selected_device (ui);
1362
gconf_client_set_string(ui->priv->client, GCONF_DIR "/selected_device", device, NULL);
1366
gconf_client_set_string (ui->priv->client, GCONF_DIR "/document_type", ui->priv->document_hint, NULL);
1367
gconf_client_set_int (ui->priv->client, GCONF_DIR "/text_dpi", get_text_dpi (ui), NULL);
1368
gconf_client_set_int (ui->priv->client, GCONF_DIR "/photo_dpi", get_photo_dpi (ui), NULL);
1369
gconf_client_set_string (ui->priv->client, GCONF_DIR "/page_side", get_page_side (ui), NULL);
1370
get_paper_size (ui, &paper_width, &paper_height);
1371
gconf_client_set_int (ui->priv->client, GCONF_DIR "/paper_width", paper_width, NULL);
1372
gconf_client_set_int (ui->priv->client, GCONF_DIR "/paper_height", paper_height, NULL);
1374
gconf_client_set_int(ui->priv->client, GCONF_DIR "/window_width", ui->priv->window_width, NULL);
1375
gconf_client_set_int(ui->priv->client, GCONF_DIR "/window_height", ui->priv->window_height, NULL);
1376
gconf_client_set_bool(ui->priv->client, GCONF_DIR "/window_is_maximized", ui->priv->window_is_maximized, NULL);
1378
for (i = 0; scan_direction_keys[i].key != NULL && scan_direction_keys[i].scan_direction != ui->priv->default_page_scan_direction; i++);
1379
if (scan_direction_keys[i].key != NULL)
1380
gconf_client_set_string(ui->priv->client, GCONF_DIR "/scan_direction", scan_direction_keys[i].key, NULL);
1381
gconf_client_set_int (ui->priv->client, GCONF_DIR "/page_width", ui->priv->default_page_width, NULL);
1382
gconf_client_set_int (ui->priv->client, GCONF_DIR "/page_height", ui->priv->default_page_height, NULL);
1383
gconf_client_set_int (ui->priv->client, GCONF_DIR "/page_dpi", ui->priv->default_page_dpi, NULL);
1385
g_signal_emit (G_OBJECT (ui), signals[QUIT], 0);
1391
void quit_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui);
1394
quit_menuitem_activate_cb (GtkWidget *widget, SimpleScan *ui)
1400
gboolean simple_scan_window_configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, SimpleScan *ui);
1403
simple_scan_window_configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, SimpleScan *ui)
1405
if (!ui->priv->window_is_maximized) {
1406
ui->priv->window_width = event->width;
1407
ui->priv->window_height = event->height;
1415
info_bar_response_cb (GtkWidget *widget, gint response_id, SimpleScan *ui)
1417
if (response_id == 1) {
1418
gtk_widget_grab_focus (ui->priv->device_combo);
1419
gtk_window_present (GTK_WINDOW (ui->priv->preferences_dialog));
1422
ui->priv->have_error = FALSE;
1423
g_free (ui->priv->error_title);
1424
ui->priv->error_title = NULL;
1425
g_free (ui->priv->error_text);
1426
ui->priv->error_text = NULL;
1427
update_info_bar (ui);
1432
gboolean simple_scan_window_window_state_event_cb (GtkWidget *widget, GdkEventWindowState *event, SimpleScan *ui);
1435
simple_scan_window_window_state_event_cb (GtkWidget *widget, GdkEventWindowState *event, SimpleScan *ui)
1437
if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED)
1438
ui->priv->window_is_maximized = (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0;
1443
gboolean window_delete_event_cb (GtkWidget *widget, GdkEvent *event, SimpleScan *ui);
1446
window_delete_event_cb (GtkWidget *widget, GdkEvent *event, SimpleScan *ui)
1453
page_size_changed_cb (Page *page, SimpleScan *ui)
1455
ui->priv->default_page_width = page_get_width (page);
1456
ui->priv->default_page_height = page_get_height (page);
1457
ui->priv->default_page_dpi = page_get_dpi (page);
1462
page_scan_direction_changed_cb (Page *page, SimpleScan *ui)
1464
ui->priv->default_page_scan_direction = page_get_scan_direction (page);
1469
page_added_cb (Book *book, Page *page, SimpleScan *ui)
1471
ui->priv->default_page_width = page_get_width (page);
1472
ui->priv->default_page_height = page_get_height (page);
1473
ui->priv->default_page_dpi = page_get_dpi (page);
1474
ui->priv->default_page_scan_direction = page_get_scan_direction (page);
1475
g_signal_connect (page, "size-changed", G_CALLBACK (page_size_changed_cb), ui);
1476
g_signal_connect (page, "scan-direction-changed", G_CALLBACK (page_scan_direction_changed_cb), ui);
1478
update_page_menu (ui);
1483
page_removed_cb (Book *book, Page *page, SimpleScan *ui)
1485
/* If this is the last page add a new blank one */
1486
if (book_get_n_pages (ui->priv->book) == 1)
1487
add_default_page (ui);
1489
update_page_menu (ui);
1494
set_dpi_combo (GtkWidget *combo, gint default_dpi, gint current_dpi)
1500
} scan_resolutions[] =
1502
/* Preferences dialog: Label for minimum resolution in resolution list */
1503
{ 75, _("%d dpi (draft)") },
1504
/* Preferences dialog: Label for resolution value in resolution list (dpi = dots per inch) */
1505
{ 150, _("%d dpi") },
1506
{ 300, _("%d dpi") },
1507
{ 600, _("%d dpi") },
1508
/* Preferences dialog: Label for maximum resolution in resolution list */
1509
{ 1200, _("%d dpi (high resolution)") },
1510
{ 2400, _("%d dpi") },
1513
GtkCellRenderer *renderer;
1514
GtkTreeModel *model;
1517
renderer = gtk_cell_renderer_text_new();
1518
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
1519
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo), renderer, "text", 1);
1521
model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
1522
for (i = 0; scan_resolutions[i].dpi > 0; i++)
1528
dpi = scan_resolutions[i].dpi;
1530
if (dpi == default_dpi)
1531
label = g_strdup_printf (/* Preferences dialog: Label for default resolution in resolution list */
1532
_("%d dpi (default)"), dpi);
1534
label = g_strdup_printf (scan_resolutions[i].label, dpi);
1536
gtk_list_store_append (GTK_LIST_STORE (model), &iter);
1537
gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, dpi, 1, label, -1);
1539
if (dpi == current_dpi)
1540
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), &iter);
1548
needs_saving_cb (Book *book, GParamSpec *param, SimpleScan *ui)
1550
gtk_widget_set_sensitive (ui->priv->save_menuitem, book_get_needs_saving (book));
1551
gtk_widget_set_sensitive (ui->priv->save_toolbutton, book_get_needs_saving (book));
1552
if (book_get_needs_saving (book))
1553
gtk_widget_set_sensitive (ui->priv->save_as_menuitem, TRUE);
1558
ui_load (SimpleScan *ui)
1560
GtkBuilder *builder;
1561
GError *error = NULL;
1563
GtkCellRenderer *renderer;
1564
gchar *device, *document_type, *scan_direction, *page_side;
1565
gint dpi, paper_width, paper_height;
1567
gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (), ICON_DIR);
1569
gtk_window_set_default_icon_name ("scanner");
1571
builder = ui->priv->builder = gtk_builder_new ();
1572
gtk_builder_add_from_file (builder, UI_DIR "simple-scan.ui", &error);
1574
g_critical ("Unable to load UI: %s\n", error->message);
1575
show_error_dialog (ui,
1576
/* Title of dialog when cannot load required files */
1578
/* Description in dialog when cannot load required files */
1579
_("Please check your installation"));
1582
gtk_builder_connect_signals (builder, ui);
1584
ui->priv->window = GTK_WIDGET (gtk_builder_get_object (builder, "simple_scan_window"));
1585
ui->priv->main_vbox = GTK_WIDGET (gtk_builder_get_object (builder, "main_vbox"));
1586
ui->priv->page_move_left_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "page_move_left_menuitem"));
1587
ui->priv->page_move_right_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "page_move_right_menuitem"));
1588
ui->priv->page_delete_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "page_delete_menuitem"));
1589
ui->priv->crop_rotate_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "crop_rotate_menuitem"));
1590
ui->priv->save_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "save_menuitem"));
1591
ui->priv->save_as_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "save_as_menuitem"));
1592
ui->priv->save_toolbutton = GTK_WIDGET (gtk_builder_get_object (builder, "save_toolbutton"));
1593
ui->priv->stop_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "stop_scan_menuitem"));
1594
ui->priv->stop_toolbutton = GTK_WIDGET (gtk_builder_get_object (builder, "stop_toolbutton"));
1596
ui->priv->text_toolbar_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "text_toolbutton_menuitem"));
1597
ui->priv->text_menu_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "text_menuitem"));
1598
ui->priv->photo_toolbar_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "photo_toolbutton_menuitem"));
1599
ui->priv->photo_menu_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "photo_menuitem"));
1601
ui->priv->authorize_dialog = GTK_WIDGET (gtk_builder_get_object (builder, "authorize_dialog"));
1602
ui->priv->authorize_label = GTK_WIDGET (gtk_builder_get_object (builder, "authorize_label"));
1603
ui->priv->username_entry = GTK_WIDGET (gtk_builder_get_object (builder, "username_entry"));
1604
ui->priv->password_entry = GTK_WIDGET (gtk_builder_get_object (builder, "password_entry"));
1606
ui->priv->preferences_dialog = GTK_WIDGET (gtk_builder_get_object (builder, "preferences_dialog"));
1607
ui->priv->device_combo = GTK_WIDGET (gtk_builder_get_object (builder, "device_combo"));
1608
ui->priv->device_model = gtk_combo_box_get_model (GTK_COMBO_BOX (ui->priv->device_combo));
1609
ui->priv->text_dpi_combo = GTK_WIDGET (gtk_builder_get_object (builder, "text_dpi_combo"));
1610
ui->priv->text_dpi_model = gtk_combo_box_get_model (GTK_COMBO_BOX (ui->priv->text_dpi_combo));
1611
ui->priv->photo_dpi_combo = GTK_WIDGET (gtk_builder_get_object (builder, "photo_dpi_combo"));
1612
ui->priv->photo_dpi_model = gtk_combo_box_get_model (GTK_COMBO_BOX (ui->priv->photo_dpi_combo));
1613
ui->priv->page_side_combo = GTK_WIDGET (gtk_builder_get_object (builder, "page_side_combo"));
1614
ui->priv->page_side_model = gtk_combo_box_get_model (GTK_COMBO_BOX (ui->priv->page_side_combo));
1615
ui->priv->paper_size_combo = GTK_WIDGET (gtk_builder_get_object (builder, "paper_size_combo"));
1616
ui->priv->paper_size_model = gtk_combo_box_get_model (GTK_COMBO_BOX (ui->priv->paper_size_combo));
1618
/* Add InfoBar (not supported in Glade) */
1619
ui->priv->info_bar = gtk_info_bar_new ();
1620
g_signal_connect (ui->priv->info_bar, "response", G_CALLBACK (info_bar_response_cb), ui);
1621
gtk_box_pack_start (GTK_BOX(ui->priv->main_vbox), ui->priv->info_bar, FALSE, TRUE, 0);
1622
hbox = gtk_hbox_new (FALSE, 12);
1623
gtk_container_add (GTK_CONTAINER (gtk_info_bar_get_content_area (GTK_INFO_BAR (ui->priv->info_bar))), hbox);
1624
gtk_widget_show (hbox);
1626
ui->priv->info_bar_image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
1627
gtk_box_pack_start (GTK_BOX(hbox), ui->priv->info_bar_image, FALSE, TRUE, 0);
1628
gtk_widget_show (ui->priv->info_bar_image);
1630
ui->priv->info_bar_label = gtk_label_new (NULL);
1631
gtk_misc_set_alignment (GTK_MISC (ui->priv->info_bar_label), 0.0, 0.5);
1632
gtk_box_pack_start (GTK_BOX(hbox), ui->priv->info_bar_label, TRUE, TRUE, 0);
1633
gtk_widget_show (ui->priv->info_bar_label);
1635
ui->priv->info_bar_close_button = gtk_info_bar_add_button (GTK_INFO_BAR (ui->priv->info_bar), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
1636
ui->priv->info_bar_change_scanner_button = gtk_info_bar_add_button (GTK_INFO_BAR (ui->priv->info_bar),
1637
/* Button in error infobar to open preferences dialog and change scanner */
1638
_("Change _Scanner"), 1);
1641
gtk_list_store_append (GTK_LIST_STORE (ui->priv->paper_size_model), &iter);
1642
gtk_list_store_set (GTK_LIST_STORE (ui->priv->paper_size_model), &iter, 0, 0, 1, 0, 2,
1643
/* Combo box value for automatic paper size */
1644
_("Automatic"), -1);
1645
gtk_list_store_append (GTK_LIST_STORE (ui->priv->paper_size_model), &iter);
1646
gtk_list_store_set (GTK_LIST_STORE (ui->priv->paper_size_model), &iter, 0, 1050, 1, 1480, 2, "A6", -1);
1647
gtk_list_store_append (GTK_LIST_STORE (ui->priv->paper_size_model), &iter);
1648
gtk_list_store_set (GTK_LIST_STORE (ui->priv->paper_size_model), &iter, 0, 1480, 1, 2100, 2, "A5", -1);
1649
gtk_list_store_append (GTK_LIST_STORE (ui->priv->paper_size_model), &iter);
1650
gtk_list_store_set (GTK_LIST_STORE (ui->priv->paper_size_model), &iter, 0, 2100, 1, 2970, 2, "A4", -1);
1651
gtk_list_store_append (GTK_LIST_STORE (ui->priv->paper_size_model), &iter);
1652
gtk_list_store_set (GTK_LIST_STORE (ui->priv->paper_size_model), &iter, 0, 2159, 1, 2794, 2, "Letter", -1);
1653
gtk_list_store_append (GTK_LIST_STORE (ui->priv->paper_size_model), &iter);
1654
gtk_list_store_set (GTK_LIST_STORE (ui->priv->paper_size_model), &iter, 0, 2159, 1, 3556, 2, "Legal", -1);
1655
gtk_list_store_append (GTK_LIST_STORE (ui->priv->paper_size_model), &iter);
1656
gtk_list_store_set (GTK_LIST_STORE (ui->priv->paper_size_model), &iter, 0, 1016, 1, 1524, 2, "4×6", -1);
1658
dpi = gconf_client_get_int (ui->priv->client, GCONF_DIR "/text_dpi", NULL);
1660
dpi = DEFAULT_TEXT_DPI;
1661
set_dpi_combo (ui->priv->text_dpi_combo, DEFAULT_TEXT_DPI, dpi);
1662
dpi = gconf_client_get_int (ui->priv->client, GCONF_DIR "/photo_dpi", NULL);
1664
dpi = DEFAULT_PHOTO_DPI;
1665
set_dpi_combo (ui->priv->photo_dpi_combo, DEFAULT_PHOTO_DPI, dpi);
1667
renderer = gtk_cell_renderer_text_new();
1668
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (ui->priv->device_combo), renderer, TRUE);
1669
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (ui->priv->device_combo), renderer, "text", 1);
1671
renderer = gtk_cell_renderer_text_new();
1672
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (ui->priv->page_side_combo), renderer, TRUE);
1673
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (ui->priv->page_side_combo), renderer, "text", 1);
1674
page_side = gconf_client_get_string (ui->priv->client, GCONF_DIR "/page_side", NULL);
1676
set_page_side (ui, page_side);
1680
renderer = gtk_cell_renderer_text_new();
1681
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (ui->priv->paper_size_combo), renderer, TRUE);
1682
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (ui->priv->paper_size_combo), renderer, "text", 2);
1683
paper_width = gconf_client_get_int (ui->priv->client, GCONF_DIR "/paper_width", NULL);
1684
paper_height = gconf_client_get_int (ui->priv->client, GCONF_DIR "/paper_height", NULL);
1685
set_paper_size (ui, paper_width, paper_height);
1687
device = gconf_client_get_string (ui->priv->client, GCONF_DIR "/selected_device", NULL);
1690
if (find_scan_device (ui, device, &iter))
1691
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (ui->priv->device_combo), &iter);
1695
document_type = gconf_client_get_string (ui->priv->client, GCONF_DIR "/document_type", NULL);
1696
if (document_type) {
1697
set_document_hint (ui, document_type);
1698
g_free (document_type);
1701
ui->priv->book_view = book_view_new (ui->priv->book);
1702
gtk_container_set_border_width (GTK_CONTAINER (ui->priv->book_view), 18);
1703
gtk_box_pack_end (GTK_BOX (ui->priv->main_vbox), GTK_WIDGET (ui->priv->book_view), TRUE, TRUE, 0);
1704
g_signal_connect (ui->priv->book_view, "page-selected", G_CALLBACK (page_selected_cb), ui);
1705
g_signal_connect (ui->priv->book_view, "show-page", G_CALLBACK (show_page_cb), ui);
1706
g_signal_connect (ui->priv->book_view, "show-menu", G_CALLBACK (show_page_menu_cb), ui);
1707
gtk_widget_show (GTK_WIDGET (ui->priv->book_view));
1709
/* Find default page details */
1710
scan_direction = gconf_client_get_string(ui->priv->client, GCONF_DIR "/scan_direction", NULL);
1711
ui->priv->default_page_scan_direction = TOP_TO_BOTTOM;
1712
if (scan_direction) {
1714
for (i = 0; scan_direction_keys[i].key != NULL && strcmp (scan_direction_keys[i].key, scan_direction) != 0; i++);
1715
if (scan_direction_keys[i].key != NULL)
1716
ui->priv->default_page_scan_direction = scan_direction_keys[i].scan_direction;
1717
g_free (scan_direction);
1719
ui->priv->default_page_width = gconf_client_get_int (ui->priv->client, GCONF_DIR "/page_width", NULL);
1720
if (ui->priv->default_page_width <= 0)
1721
ui->priv->default_page_width = 595;
1722
ui->priv->default_page_height = gconf_client_get_int (ui->priv->client, GCONF_DIR "/page_height", NULL);
1723
if (ui->priv->default_page_height <= 0)
1724
ui->priv->default_page_height = 842;
1725
ui->priv->default_page_dpi = gconf_client_get_int (ui->priv->client, GCONF_DIR "/page_dpi", NULL);
1726
if (ui->priv->default_page_dpi <= 0)
1727
ui->priv->default_page_dpi = 72;
1729
/* Restore window size */
1730
ui->priv->window_width = gconf_client_get_int (ui->priv->client, GCONF_DIR "/window_width", NULL);
1731
if (ui->priv->window_width <= 0)
1732
ui->priv->window_width = 600;
1733
ui->priv->window_height = gconf_client_get_int (ui->priv->client, GCONF_DIR "/window_height", NULL);
1734
if (ui->priv->window_height <= 0)
1735
ui->priv->window_height = 400;
1736
g_debug ("Restoring window to %dx%d pixels", ui->priv->window_width, ui->priv->window_height);
1737
gtk_window_set_default_size (GTK_WINDOW (ui->priv->window), ui->priv->window_width, ui->priv->window_height);
1738
ui->priv->window_is_maximized = gconf_client_get_bool (ui->priv->client, GCONF_DIR "/window_is_maximized", NULL);
1739
if (ui->priv->window_is_maximized) {
1740
g_debug ("Restoring window to maximized");
1741
gtk_window_maximize (GTK_WINDOW (ui->priv->window));
1744
if (book_get_n_pages (ui->priv->book) == 0)
1745
add_default_page (ui);
1746
book_set_needs_saving (ui->priv->book, FALSE);
1747
g_signal_connect (ui->priv->book, "notify::needs-saving", G_CALLBACK (needs_saving_cb), ui);
1754
return g_object_new (SIMPLE_SCAN_TYPE, NULL);
1759
ui_get_book (SimpleScan *ui)
1761
return g_object_ref (ui->priv->book);
1766
ui_set_selected_page (SimpleScan *ui, Page *page)
1768
book_view_select_page (ui->priv->book_view, page);
1773
ui_get_selected_page (SimpleScan *ui)
1775
return book_view_get_selected (ui->priv->book_view);
1780
ui_set_scanning (SimpleScan *ui, gboolean scanning)
1782
ui->priv->scanning = scanning;
1783
gtk_widget_set_sensitive (ui->priv->page_delete_menuitem, !scanning);
1784
gtk_widget_set_sensitive (ui->priv->stop_menuitem, scanning);
1785
gtk_widget_set_sensitive (ui->priv->stop_toolbutton, scanning);
1790
ui_show_error (SimpleScan *ui, const gchar *error_title, const gchar *error_text, gboolean change_scanner_hint)
1792
ui->priv->have_error = TRUE;
1793
g_free (ui->priv->error_title);
1794
ui->priv->error_title = g_strdup (error_title);
1795
g_free (ui->priv->error_text);
1796
ui->priv->error_text = g_strdup (error_text);
1797
ui->priv->error_change_scanner_hint = change_scanner_hint;
1798
update_info_bar (ui);
1803
ui_start (SimpleScan *ui)
1805
gtk_widget_show (ui->priv->window);
1809
/* Generated with glib-genmarshal */
1811
g_cclosure_user_marshal_VOID__STRING_POINTER (GClosure *closure,
1812
GValue *return_value G_GNUC_UNUSED,
1813
guint n_param_values,
1814
const GValue *param_values,
1815
gpointer invocation_hint G_GNUC_UNUSED,
1816
gpointer marshal_data)
1818
typedef void (*GMarshalFunc_VOID__STRING_POINTER) (gpointer data1,
1819
gconstpointer arg_1,
1820
gconstpointer arg_2,
1822
register GMarshalFunc_VOID__STRING_POINTER callback;
1823
register GCClosure *cc = (GCClosure*) closure;
1824
register gpointer data1, data2;
1826
g_return_if_fail (n_param_values == 3);
1828
if (G_CCLOSURE_SWAP_DATA (closure))
1830
data1 = closure->data;
1831
data2 = g_value_peek_pointer (param_values + 0);
1835
data1 = g_value_peek_pointer (param_values + 0);
1836
data2 = closure->data;
1838
callback = (GMarshalFunc_VOID__STRING_POINTER) (marshal_data ? marshal_data : cc->callback);
1841
g_value_get_string (param_values + 1),
1842
g_value_get_pointer (param_values + 2),
1848
ui_finalize (GObject *object)
1850
SimpleScan *ui = SIMPLE_SCAN (object);
1852
g_object_unref (ui->priv->client);
1853
ui->priv->client = NULL;
1854
g_object_unref (ui->priv->builder);
1855
ui->priv->builder = NULL;
1856
g_object_unref (ui->priv->book);
1857
ui->priv->book = NULL;
1858
gtk_widget_destroy (GTK_WIDGET (ui->priv->book_view));
1859
ui->priv->book_view = NULL;
1861
G_OBJECT_CLASS (ui_parent_class)->finalize (object);
1866
ui_class_init (SimpleScanClass *klass)
1868
GObjectClass *object_class = G_OBJECT_CLASS (klass);
1870
object_class->finalize = ui_finalize;
1872
signals[START_SCAN] =
1873
g_signal_new ("start-scan",
1874
G_TYPE_FROM_CLASS (klass),
1876
G_STRUCT_OFFSET (SimpleScanClass, start_scan),
1878
g_cclosure_user_marshal_VOID__STRING_POINTER,
1879
G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_POINTER);
1880
signals[STOP_SCAN] =
1881
g_signal_new ("stop-scan",
1882
G_TYPE_FROM_CLASS (klass),
1884
G_STRUCT_OFFSET (SimpleScanClass, stop_scan),
1886
g_cclosure_marshal_VOID__VOID,
1889
g_signal_new ("email",
1890
G_TYPE_FROM_CLASS (klass),
1892
G_STRUCT_OFFSET (SimpleScanClass, email),
1894
g_cclosure_marshal_VOID__STRING,
1895
G_TYPE_NONE, 1, G_TYPE_STRING);
1897
g_signal_new ("quit",
1898
G_TYPE_FROM_CLASS (klass),
1900
G_STRUCT_OFFSET (SimpleScanClass, quit),
1902
g_cclosure_marshal_VOID__VOID,
1905
g_type_class_add_private (klass, sizeof (SimpleScanPrivate));
1910
ui_init (SimpleScan *ui)
1912
ui->priv = G_TYPE_INSTANCE_GET_PRIVATE (ui, SIMPLE_SCAN_TYPE, SimpleScanPrivate);
1914
ui->priv->book = book_new ();
1915
g_signal_connect (ui->priv->book, "page-removed", G_CALLBACK (page_removed_cb), ui);
1916
g_signal_connect (ui->priv->book, "page-added", G_CALLBACK (page_added_cb), ui);
1918
ui->priv->client = gconf_client_get_default();
1919
gconf_client_add_dir(ui->priv->client, GCONF_DIR, GCONF_CLIENT_PRELOAD_NONE, NULL);
1921
ui->priv->document_hint = g_strdup ("photo");
1922
ui->priv->default_file_name = g_strdup (_("Scanned Document.pdf"));
1923
ui->priv->scanning = FALSE;
27
#include <gdk-pixbuf/gdk-pixdata.h>
30
#include <gobject/gvaluecollector.h>
33
#define TYPE_SIMPLE_SCAN (simple_scan_get_type ())
34
#define SIMPLE_SCAN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SIMPLE_SCAN, SimpleScan))
35
#define SIMPLE_SCAN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SIMPLE_SCAN, SimpleScanClass))
36
#define IS_SIMPLE_SCAN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SIMPLE_SCAN))
37
#define IS_SIMPLE_SCAN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SIMPLE_SCAN))
38
#define SIMPLE_SCAN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SIMPLE_SCAN, SimpleScanClass))
40
typedef struct _SimpleScan SimpleScan;
41
typedef struct _SimpleScanClass SimpleScanClass;
42
typedef struct _SimpleScanPrivate SimpleScanPrivate;
44
#define TYPE_BOOK (book_get_type ())
45
#define BOOK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_BOOK, Book))
46
#define BOOK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_BOOK, BookClass))
47
#define IS_BOOK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_BOOK))
48
#define IS_BOOK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_BOOK))
49
#define BOOK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_BOOK, BookClass))
51
typedef struct _Book Book;
52
typedef struct _BookClass BookClass;
54
#define TYPE_BOOK_VIEW (book_view_get_type ())
55
#define BOOK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_BOOK_VIEW, BookView))
56
#define BOOK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_BOOK_VIEW, BookViewClass))
57
#define IS_BOOK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_BOOK_VIEW))
58
#define IS_BOOK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_BOOK_VIEW))
59
#define BOOK_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_BOOK_VIEW, BookViewClass))
61
typedef struct _BookView BookView;
62
typedef struct _BookViewClass BookViewClass;
64
#define TYPE_SCAN_DIRECTION (scan_direction_get_type ())
65
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
66
#define _g_free0(var) (var = (g_free (var), NULL))
67
#define _book_unref0(var) ((var == NULL) ? NULL : (var = (book_unref (var), NULL)))
69
#define TYPE_PAGE (page_get_type ())
70
#define PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PAGE, Page))
71
#define PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_PAGE, PageClass))
72
#define IS_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_PAGE))
73
#define IS_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_PAGE))
74
#define PAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_PAGE, PageClass))
76
typedef struct _Page Page;
77
typedef struct _PageClass PageClass;
79
#define TYPE_SCAN_DEVICE (scan_device_get_type ())
80
#define SCAN_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SCAN_DEVICE, ScanDevice))
81
#define SCAN_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SCAN_DEVICE, ScanDeviceClass))
82
#define IS_SCAN_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SCAN_DEVICE))
83
#define IS_SCAN_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SCAN_DEVICE))
84
#define SCAN_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SCAN_DEVICE, ScanDeviceClass))
86
typedef struct _ScanDevice ScanDevice;
87
typedef struct _ScanDeviceClass ScanDeviceClass;
88
typedef struct _ScanDevicePrivate ScanDevicePrivate;
89
#define _scan_device_unref0(var) ((var == NULL) ? NULL : (var = (scan_device_unref (var), NULL)))
90
#define _page_unref0(var) ((var == NULL) ? NULL : (var = (page_unref (var), NULL)))
91
#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
93
#define TYPE_SCAN_TYPE (scan_type_get_type ())
95
#define TYPE_SCAN_OPTIONS (scan_options_get_type ())
96
#define SCAN_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SCAN_OPTIONS, ScanOptions))
97
#define SCAN_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SCAN_OPTIONS, ScanOptionsClass))
98
#define IS_SCAN_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SCAN_OPTIONS))
99
#define IS_SCAN_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SCAN_OPTIONS))
100
#define SCAN_OPTIONS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SCAN_OPTIONS, ScanOptionsClass))
102
typedef struct _ScanOptions ScanOptions;
103
typedef struct _ScanOptionsClass ScanOptionsClass;
105
#define TYPE_SCAN_MODE (scan_mode_get_type ())
106
typedef struct _ScanOptionsPrivate ScanOptionsPrivate;
107
#define _scan_options_unref0(var) ((var == NULL) ? NULL : (var = (scan_options_unref (var), NULL)))
108
#define _cairo_destroy0(var) ((var == NULL) ? NULL : (var = (cairo_destroy (var), NULL)))
109
typedef struct _ParamSpecSimpleScan ParamSpecSimpleScan;
112
GTypeInstance parent_instance;
113
volatile int ref_count;
114
SimpleScanPrivate * priv;
117
struct _SimpleScanClass {
118
GTypeClass parent_class;
119
void (*finalize) (SimpleScan *self);
123
SCAN_DIRECTION_TOP_TO_BOTTOM,
124
SCAN_DIRECTION_LEFT_TO_RIGHT,
125
SCAN_DIRECTION_BOTTOM_TO_TOP,
126
SCAN_DIRECTION_RIGHT_TO_LEFT
129
struct _SimpleScanPrivate {
134
GtkInfoBar* info_bar;
135
GtkImage* info_bar_image;
136
GtkLabel* info_bar_label;
137
GtkButton* info_bar_close_button;
138
GtkButton* info_bar_change_scanner_button;
139
GtkMenuItem* page_move_left_menuitem;
140
GtkMenuItem* page_move_right_menuitem;
141
GtkMenuItem* page_delete_menuitem;
142
GtkMenuItem* crop_rotate_menuitem;
143
GtkMenuItem* save_menuitem;
144
GtkMenuItem* save_as_menuitem;
145
GtkToolButton* save_toolbutton;
146
GtkMenuItem* stop_menuitem;
147
GtkToolButton* stop_toolbutton;
148
GtkRadioMenuItem* text_toolbar_menuitem;
149
GtkRadioMenuItem* text_menu_menuitem;
150
GtkRadioMenuItem* photo_toolbar_menuitem;
151
GtkRadioMenuItem* photo_menu_menuitem;
152
GtkDialog* authorize_dialog;
153
GtkLabel* authorize_label;
154
GtkEntry* username_entry;
155
GtkEntry* password_entry;
156
GtkDialog* preferences_dialog;
157
GtkComboBox* device_combo;
158
GtkComboBox* text_dpi_combo;
159
GtkComboBox* photo_dpi_combo;
160
GtkComboBox* page_side_combo;
161
GtkComboBox* paper_size_combo;
162
GtkListStore* device_model;
163
GtkListStore* text_dpi_model;
164
GtkListStore* photo_dpi_model;
165
GtkListStore* page_side_model;
166
GtkListStore* paper_size_model;
167
gboolean setting_devices;
168
gboolean user_selected_device;
169
GtkFileChooserDialog* save_dialog;
173
gboolean error_change_scanner_hint;
177
gboolean updating_page_menu;
178
gint default_page_width;
179
gint default_page_height;
180
gint default_page_dpi;
181
ScanDirection default_page_scan_direction;
182
gchar* document_hint;
183
gchar* default_file_name;
187
gboolean window_is_maximized;
191
GTypeInstance parent_instance;
192
volatile int ref_count;
193
ScanDevicePrivate * priv;
198
struct _ScanDeviceClass {
199
GTypeClass parent_class;
200
void (*finalize) (ScanDevice *self);
217
struct _ScanOptions {
218
GTypeInstance parent_instance;
219
volatile int ref_count;
220
ScanOptionsPrivate * priv;
229
struct _ScanOptionsClass {
230
GTypeClass parent_class;
231
void (*finalize) (ScanOptions *self);
234
struct _ParamSpecSimpleScan {
235
GParamSpec parent_instance;
239
static gpointer simple_scan_parent_class = NULL;
241
gpointer simple_scan_ref (gpointer instance);
242
void simple_scan_unref (gpointer instance);
243
GParamSpec* param_spec_simple_scan (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
244
void value_set_simple_scan (GValue* value, gpointer v_object);
245
void value_take_simple_scan (GValue* value, gpointer v_object);
246
gpointer value_get_simple_scan (const GValue* value);
247
GType simple_scan_get_type (void) G_GNUC_CONST;
248
gpointer book_ref (gpointer instance);
249
void book_unref (gpointer instance);
250
GParamSpec* param_spec_book (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
251
void value_set_book (GValue* value, gpointer v_object);
252
void value_take_book (GValue* value, gpointer v_object);
253
gpointer value_get_book (const GValue* value);
254
GType book_get_type (void) G_GNUC_CONST;
255
GType book_view_get_type (void) G_GNUC_CONST;
256
GType scan_direction_get_type (void) G_GNUC_CONST;
257
#define SIMPLE_SCAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_SIMPLE_SCAN, SimpleScanPrivate))
259
SIMPLE_SCAN_DUMMY_PROPERTY
261
#define SIMPLE_SCAN_DEFAULT_TEXT_DPI 150
262
#define SIMPLE_SCAN_DEFAULT_PHOTO_DPI 300
263
SimpleScan* simple_scan_new (void);
264
SimpleScan* simple_scan_construct (GType object_type);
265
Book* book_new (void);
266
Book* book_construct (GType object_type);
267
gpointer page_ref (gpointer instance);
268
void page_unref (gpointer instance);
269
GParamSpec* param_spec_page (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
270
void value_set_page (GValue* value, gpointer v_object);
271
void value_take_page (GValue* value, gpointer v_object);
272
gpointer value_get_page (const GValue* value);
273
GType page_get_type (void) G_GNUC_CONST;
274
static void simple_scan_page_removed_cb (SimpleScan* self, Book* book, Page* page);
275
static void _simple_scan_page_removed_cb_book_page_removed (Book* _sender, Page* page, gpointer self);
276
static void simple_scan_page_added_cb (SimpleScan* self, Book* book, Page* page);
277
static void _simple_scan_page_added_cb_book_page_added (Book* _sender, Page* page, gpointer self);
278
static void simple_scan_load (SimpleScan* self);
279
static gboolean simple_scan_find_scan_device (SimpleScan* self, const gchar* device, GtkTreeIter* iter);
280
static void simple_scan_show_error_dialog (SimpleScan* self, const gchar* error_title, const gchar* error_text);
281
void simple_scan_set_default_file_name (SimpleScan* self, const gchar* default_file_name);
282
void simple_scan_authorize (SimpleScan* self, const gchar* resource, gchar** username, gchar** password);
283
void G_MODULE_EXPORT device_combo_changed_cb (GtkWidget* widget, SimpleScan* self);
284
static void simple_scan_update_info_bar (SimpleScan* self);
285
gpointer scan_device_ref (gpointer instance);
286
void scan_device_unref (gpointer instance);
287
GParamSpec* param_spec_scan_device (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
288
void value_set_scan_device (GValue* value, gpointer v_object);
289
void value_take_scan_device (GValue* value, gpointer v_object);
290
gpointer value_get_scan_device (const GValue* value);
291
GType scan_device_get_type (void) G_GNUC_CONST;
292
void simple_scan_set_scan_devices (SimpleScan* self, GList* devices);
293
static gchar* simple_scan_get_selected_device (SimpleScan* self);
294
void simple_scan_set_selected_device (SimpleScan* self, const gchar* device);
295
static void simple_scan_add_default_page (SimpleScan* self);
296
Page* book_append_page (Book* self, gint width, gint height, gint dpi, ScanDirection scan_direction);
297
void book_view_select_page (BookView* self, Page* page);
298
static void simple_scan_on_file_type_changed (SimpleScan* self, GtkTreeSelection* selection);
299
static gchar* simple_scan_choose_file_location (SimpleScan* self);
300
static void _simple_scan_on_file_type_changed_gtk_tree_selection_changed (GtkTreeSelection* _sender, gpointer self);
301
static gboolean simple_scan_save_document (SimpleScan* self, gboolean force_choose_location);
302
void book_save (Book* self, const gchar* type, GFile* file, GError** error);
303
void simple_scan_show_error (SimpleScan* self, const gchar* error_title, const gchar* error_text, gboolean change_scanner_hint);
304
void book_set_needs_saving (Book* self, gboolean needs_saving);
305
static gboolean simple_scan_prompt_to_save (SimpleScan* self, const gchar* title, const gchar* discard_label);
306
gboolean book_get_needs_saving (Book* self);
307
static void simple_scan_clear_document (SimpleScan* self);
308
void book_clear (Book* self);
309
void G_MODULE_EXPORT new_button_clicked_cb (GtkWidget* widget, SimpleScan* self);
310
static void simple_scan_set_document_hint (SimpleScan* self, const gchar* document_hint);
311
void G_MODULE_EXPORT text_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self);
312
void G_MODULE_EXPORT photo_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self);
313
GType scan_type_get_type (void) G_GNUC_CONST;
314
static void simple_scan_set_page_side (SimpleScan* self, ScanType page_side);
315
static void simple_scan_set_paper_size (SimpleScan* self, gint width, gint height);
316
static gint simple_scan_get_text_dpi (SimpleScan* self);
317
static gint simple_scan_get_photo_dpi (SimpleScan* self);
318
static ScanType simple_scan_get_page_side (SimpleScan* self);
319
static gboolean simple_scan_get_paper_size (SimpleScan* self, gint* width, gint* height);
320
gpointer scan_options_ref (gpointer instance);
321
void scan_options_unref (gpointer instance);
322
GParamSpec* param_spec_scan_options (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
323
void value_set_scan_options (GValue* value, gpointer v_object);
324
void value_take_scan_options (GValue* value, gpointer v_object);
325
gpointer value_get_scan_options (const GValue* value);
326
GType scan_options_get_type (void) G_GNUC_CONST;
327
static ScanOptions* simple_scan_get_scan_options (SimpleScan* self);
328
ScanOptions* scan_options_new (void);
329
ScanOptions* scan_options_construct (GType object_type);
330
GType scan_mode_get_type (void) G_GNUC_CONST;
331
void G_MODULE_EXPORT scan_button_clicked_cb (GtkWidget* widget, SimpleScan* self);
332
void G_MODULE_EXPORT stop_scan_button_clicked_cb (GtkWidget* widget, SimpleScan* self);
333
void G_MODULE_EXPORT continuous_scan_button_clicked_cb (GtkWidget* widget, SimpleScan* self);
334
void G_MODULE_EXPORT preferences_button_clicked_cb (GtkWidget* widget, SimpleScan* self);
335
gboolean G_MODULE_EXPORT preferences_dialog_delete_event_cb (GtkWidget* widget, SimpleScan* self);
336
void G_MODULE_EXPORT preferences_dialog_response_cb (GtkWidget* widget, gint response_id, SimpleScan* self);
337
static void simple_scan_update_page_menu (SimpleScan* self);
338
Page* book_view_get_selected (BookView* self);
339
guint book_get_page_index (Book* self, Page* page);
340
guint book_get_n_pages (Book* self);
341
static void simple_scan_page_selected_cb (SimpleScan* self, BookView* view, Page* page);
342
gboolean page_has_crop (Page* self);
343
gchar* page_get_named_crop (Page* self);
344
static gchar* simple_scan_get_temporary_filename (SimpleScan* self, const gchar* prefix, const gchar* extension);
345
static void simple_scan_show_page_cb (SimpleScan* self, BookView* view, Page* page);
346
void page_save (Page* self, const gchar* type, GFile* file, GError** error);
347
static void simple_scan_show_page_menu_cb (SimpleScan* self, BookView* view);
348
void G_MODULE_EXPORT rotate_left_button_clicked_cb (GtkWidget* widget, SimpleScan* self);
349
void page_rotate_left (Page* self);
350
void G_MODULE_EXPORT rotate_right_button_clicked_cb (GtkWidget* widget, SimpleScan* self);
351
void page_rotate_right (Page* self);
352
static void simple_scan_set_crop (SimpleScan* self, const gchar* crop_name);
353
void page_set_no_crop (Page* self);
354
gint page_get_width (Page* self);
355
gint page_get_height (Page* self);
356
void page_set_custom_crop (Page* self, gint width, gint height);
357
void page_move_crop (Page* self, gint x, gint y);
358
void page_set_named_crop (Page* self, const gchar* name);
359
void G_MODULE_EXPORT no_crop_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self);
360
void G_MODULE_EXPORT custom_crop_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self);
361
void G_MODULE_EXPORT crop_toolbutton_toggled_cb (GtkToggleToolButton* widget, SimpleScan* self);
362
void G_MODULE_EXPORT four_by_six_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self);
363
void G_MODULE_EXPORT legal_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self);
364
void G_MODULE_EXPORT letter_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self);
365
void G_MODULE_EXPORT a6_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self);
366
void G_MODULE_EXPORT a5_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self);
367
void G_MODULE_EXPORT a4_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self);
368
void G_MODULE_EXPORT crop_rotate_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self);
369
void page_rotate_crop (Page* self);
370
void G_MODULE_EXPORT page_move_left_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self);
371
void book_move_page (Book* self, Page* page, guint location);
372
void G_MODULE_EXPORT page_move_right_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self);
373
void G_MODULE_EXPORT page_delete_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self);
374
Book* book_view_get_book (BookView* self);
375
void book_delete_page (Book* self, Page* page);
376
void G_MODULE_EXPORT save_file_button_clicked_cb (GtkWidget* widget, SimpleScan* self);
377
void G_MODULE_EXPORT save_as_file_button_clicked_cb (GtkWidget* widget, SimpleScan* self);
378
static void simple_scan_draw_page (SimpleScan* self, GtkPrintOperation* operation, GtkPrintContext* print_context, gint page_number);
379
Page* book_get_page (Book* self, gint page_number);
380
gboolean page_is_landscape (Page* self);
381
gint page_get_dpi (Page* self);
382
GdkPixbuf* page_get_image (Page* self, gboolean apply_crop);
383
void G_MODULE_EXPORT email_button_clicked_cb (GtkWidget* widget, SimpleScan* self);
384
void G_MODULE_EXPORT print_button_clicked_cb (GtkWidget* widget, SimpleScan* self);
385
static void _simple_scan_draw_page_gtk_print_operation_draw_page (GtkPrintOperation* _sender, GtkPrintContext* context, gint page_nr, gpointer self);
386
void G_MODULE_EXPORT help_contents_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self);
387
void G_MODULE_EXPORT about_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self);
388
static gboolean simple_scan_on_quit (SimpleScan* self);
389
void G_MODULE_EXPORT quit_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self);
390
gboolean G_MODULE_EXPORT simple_scan_window_configure_event_cb (GtkWidget* widget, GdkEventConfigure* event, SimpleScan* self);
391
static void simple_scan_info_bar_response_cb (SimpleScan* self, GtkInfoBar* widget, gint response_id);
392
gboolean G_MODULE_EXPORT simple_scan_window_window_state_event_cb (GtkWidget* widget, GdkEventWindowState* event, SimpleScan* self);
393
gboolean G_MODULE_EXPORT window_delete_event_cb (GtkWidget* widget, GdkEvent* event, SimpleScan* self);
394
static void simple_scan_page_size_changed_cb (SimpleScan* self, Page* page);
395
static void simple_scan_page_scan_direction_changed_cb (SimpleScan* self, Page* page);
396
ScanDirection page_get_scan_direction (Page* self);
397
static void _simple_scan_page_size_changed_cb_page_size_changed (Page* _sender, gpointer self);
398
static void _simple_scan_page_scan_direction_changed_cb_page_scan_direction_changed (Page* _sender, gpointer self);
399
static void simple_scan_set_dpi_combo (SimpleScan* self, GtkComboBox* combo, gint default_dpi, gint current_dpi);
400
static void simple_scan_needs_saving_cb (SimpleScan* self, Book* book);
401
static void _simple_scan_info_bar_response_cb_gtk_info_bar_response (GtkInfoBar* _sender, gint response_id, gpointer self);
402
BookView* book_view_new (Book* book);
403
BookView* book_view_construct (GType object_type, Book* book);
404
static void _simple_scan_page_selected_cb_book_view_page_selected (BookView* _sender, Page* page, gpointer self);
405
static void _simple_scan_show_page_cb_book_view_show_page (BookView* _sender, Page* page, gpointer self);
406
static void _simple_scan_show_page_menu_cb_book_view_show_menu (BookView* _sender, gpointer self);
407
static void _simple_scan_needs_saving_cb_book_needs_saving_changed (Book* _sender, gpointer self);
408
Book* simple_scan_get_book (SimpleScan* self);
409
void simple_scan_set_selected_page (SimpleScan* self, Page* page);
410
Page* simple_scan_get_selected_page (SimpleScan* self);
411
void simple_scan_set_scanning (SimpleScan* self, gboolean scanning);
412
void simple_scan_start (SimpleScan* self);
413
static void g_cclosure_user_marshal_VOID__STRING_SCAN_OPTIONS (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
414
static void simple_scan_finalize (SimpleScan* obj);
415
static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func);
416
static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func);
419
static void _simple_scan_page_removed_cb_book_page_removed (Book* _sender, Page* page, gpointer self) {
420
simple_scan_page_removed_cb (self, _sender, page);
424
static void _simple_scan_page_added_cb_book_page_added (Book* _sender, Page* page, gpointer self) {
425
simple_scan_page_added_cb (self, _sender, page);
429
SimpleScan* simple_scan_construct (GType object_type) {
430
SimpleScan* self = NULL;
432
GSettings* _tmp1_ = NULL;
433
self = (SimpleScan*) g_type_create_instance (object_type);
434
_tmp0_ = book_new ();
435
_book_unref0 (self->priv->book);
436
self->priv->book = _tmp0_;
437
g_signal_connect (self->priv->book, "page-removed", (GCallback) _simple_scan_page_removed_cb_book_page_removed, self);
438
g_signal_connect (self->priv->book, "page-added", (GCallback) _simple_scan_page_added_cb_book_page_added, self);
439
_tmp1_ = g_settings_new ("org.gnome.SimpleScan");
440
_g_object_unref0 (self->priv->settings);
441
self->priv->settings = _tmp1_;
442
simple_scan_load (self);
447
SimpleScan* simple_scan_new (void) {
448
return simple_scan_construct (TYPE_SIMPLE_SCAN);
452
static gboolean simple_scan_find_scan_device (SimpleScan* self, const gchar* device, GtkTreeIter* iter) {
453
GtkTreeIter _iter = {0};
454
gboolean result = FALSE;
456
GtkTreeIter _tmp0_ = {0};
458
g_return_val_if_fail (self != NULL, FALSE);
459
g_return_val_if_fail (device != NULL, FALSE);
461
_tmp1_ = gtk_tree_model_get_iter_first ((GtkTreeModel*) self->priv->device_model, &_tmp0_);
470
gboolean _tmp3_ = FALSE;
473
_tmp4_ = gtk_tree_model_iter_next ((GtkTreeModel*) self->priv->device_model, &_iter);
483
gtk_tree_model_get ((GtkTreeModel*) self->priv->device_model, &_iter, 0, &d, -1, -1);
484
if (g_strcmp0 (d, device) == 0) {
499
static void simple_scan_show_error_dialog (SimpleScan* self, const gchar* error_title, const gchar* error_text) {
500
GtkMessageDialog* _tmp0_ = NULL;
501
GtkMessageDialog* dialog;
502
g_return_if_fail (self != NULL);
503
g_return_if_fail (error_title != NULL);
504
g_return_if_fail (error_text != NULL);
505
_tmp0_ = (GtkMessageDialog*) gtk_message_dialog_new (self->priv->window, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, "%s", error_title);
506
dialog = g_object_ref_sink (_tmp0_);
507
gtk_dialog_add_button ((GtkDialog*) dialog, GTK_STOCK_CLOSE, 0);
508
gtk_message_dialog_format_secondary_text (dialog, "%s", error_text, NULL);
509
gtk_widget_destroy ((GtkWidget*) dialog);
510
_g_object_unref0 (dialog);
514
void simple_scan_set_default_file_name (SimpleScan* self, const gchar* default_file_name) {
516
g_return_if_fail (self != NULL);
517
g_return_if_fail (default_file_name != NULL);
518
_tmp0_ = g_strdup (default_file_name);
519
_g_free0 (self->priv->default_file_name);
520
self->priv->default_file_name = _tmp0_;
524
void simple_scan_authorize (SimpleScan* self, const gchar* resource, gchar** username, gchar** password) {
525
gchar* _username = NULL;
526
gchar* _password = NULL;
527
const gchar* _tmp0_ = NULL;
528
gchar* _tmp1_ = NULL;
530
const gchar* _tmp2_ = NULL;
532
const gchar* _tmp4_ = NULL;
534
g_return_if_fail (self != NULL);
535
g_return_if_fail (resource != NULL);
536
_tmp0_ = _ ("Username and password required to access '%s'");
537
_tmp1_ = g_strdup_printf (_tmp0_, resource);
538
description = _tmp1_;
539
gtk_entry_set_text (self->priv->username_entry, "");
540
gtk_entry_set_text (self->priv->password_entry, "");
541
gtk_label_set_text (self->priv->authorize_label, description);
542
gtk_widget_show ((GtkWidget*) self->priv->authorize_dialog);
543
gtk_dialog_run (self->priv->authorize_dialog);
544
gtk_widget_hide ((GtkWidget*) self->priv->authorize_dialog);
545
_tmp2_ = gtk_entry_get_text (self->priv->username_entry);
546
_tmp3_ = g_strdup (_tmp2_);
547
_g_free0 (_username);
549
_tmp4_ = gtk_entry_get_text (self->priv->password_entry);
550
_tmp5_ = g_strdup (_tmp4_);
551
_g_free0 (_password);
553
_g_free0 (description);
555
*username = _username;
557
_g_free0 (_username);
560
*password = _password;
562
_g_free0 (_password);
567
void G_MODULE_EXPORT device_combo_changed_cb (GtkWidget* widget, SimpleScan* self) {
568
g_return_if_fail (self != NULL);
569
g_return_if_fail (widget != NULL);
570
if (self->priv->setting_devices) {
573
self->priv->user_selected_device = TRUE;
577
static void simple_scan_update_info_bar (SimpleScan* self) {
578
GtkMessageType type = 0;
581
gchar* image_id = NULL;
582
gboolean show_close_button;
583
gboolean show_change_scanner_button;
584
gchar* _tmp9_ = NULL;
586
g_return_if_fail (self != NULL);
587
show_close_button = FALSE;
588
show_change_scanner_button = FALSE;
589
if (self->priv->have_error) {
593
type = GTK_MESSAGE_ERROR;
594
_tmp0_ = g_strdup (GTK_STOCK_DIALOG_ERROR);
597
_tmp1_ = g_strdup (self->priv->error_title);
600
_tmp2_ = g_strdup (self->priv->error_text);
603
show_close_button = TRUE;
604
show_change_scanner_button = self->priv->error_change_scanner_hint;
607
_tmp3_ = gtk_tree_model_iter_n_children ((GtkTreeModel*) self->priv->device_model, NULL);
610
const gchar* _tmp5_ = NULL;
612
const gchar* _tmp7_ = NULL;
614
type = GTK_MESSAGE_WARNING;
615
_tmp4_ = g_strdup (GTK_STOCK_DIALOG_WARNING);
618
_tmp5_ = _ ("No scanners detected");
619
_tmp6_ = g_strdup (_tmp5_);
622
_tmp7_ = _ ("Please check your scanner is connected and powered on");
623
_tmp8_ = g_strdup (_tmp7_);
627
gtk_widget_hide ((GtkWidget*) self->priv->info_bar);
634
gtk_info_bar_set_message_type (self->priv->info_bar, type);
635
gtk_image_set_from_stock (self->priv->info_bar_image, image_id, GTK_ICON_SIZE_DIALOG);
636
_tmp9_ = g_strdup_printf ("<big><b>%s</b></big>\n\n%s", title, text);
638
gtk_label_set_markup (self->priv->info_bar_label, message);
639
gtk_widget_set_visible ((GtkWidget*) self->priv->info_bar_close_button, show_close_button);
640
gtk_widget_set_visible ((GtkWidget*) self->priv->info_bar_change_scanner_button, show_change_scanner_button);
641
gtk_widget_show ((GtkWidget*) self->priv->info_bar);
649
static gpointer _scan_device_ref0 (gpointer self) {
650
return self ? scan_device_ref (self) : NULL;
654
void simple_scan_set_scan_devices (SimpleScan* self, GList* devices) {
655
gboolean have_selection;
657
GtkTreeIter iter = {0};
658
gboolean _tmp11_ = FALSE;
659
g_return_if_fail (self != NULL);
660
have_selection = FALSE;
661
self->priv->setting_devices = TRUE;
662
if (self->priv->user_selected_device) {
664
_tmp0_ = gtk_combo_box_get_active (self->priv->device_combo);
665
have_selection = _tmp0_ >= 0;
669
GList* device_collection = NULL;
670
GList* device_it = NULL;
671
device_collection = devices;
672
for (device_it = device_collection; device_it != NULL; device_it = device_it->next) {
674
ScanDevice* device = NULL;
675
_tmp1_ = _scan_device_ref0 ((ScanDevice*) device_it->data);
679
GtkTreeIter _tmp2_ = {0};
682
_tmp3_ = gtk_tree_model_iter_nth_child ((GtkTreeModel*) self->priv->device_model, &_tmp2_, NULL, index);
692
gboolean matched = FALSE;
695
_tmp5_ = gtk_tree_model_iter_next ((GtkTreeModel*) self->priv->device_model, &iter);
701
gtk_tree_model_get ((GtkTreeModel*) self->priv->device_model, &iter, 0, &name, -1, -1);
702
matched = g_strcmp0 (name, device->name) == 0;
715
gtk_list_store_set (self->priv->device_model, &iter, 1, device->label, -1, -1);
721
GtkTreeIter _tmp7_ = {0};
726
if (!(i < n_delete)) {
729
gtk_tree_model_iter_nth_child ((GtkTreeModel*) self->priv->device_model, &_tmp7_, NULL, index);
731
gtk_list_store_remove (self->priv->device_model, &iter);
735
GtkTreeIter _tmp8_ = {0};
736
gtk_list_store_insert (self->priv->device_model, &_tmp8_, index);
738
gtk_list_store_set (self->priv->device_model, &iter, 0, device->name, 1, device->label, -1, -1);
741
_scan_device_unref0 (device);
746
GtkTreeIter _tmp9_ = {0};
748
_tmp10_ = gtk_tree_model_iter_nth_child ((GtkTreeModel*) self->priv->device_model, &_tmp9_, NULL, index);
753
gtk_list_store_remove (self->priv->device_model, &iter);
755
if (!have_selection) {
756
_tmp11_ = devices != NULL;
761
gtk_combo_box_set_active (self->priv->device_combo, 0);
763
self->priv->setting_devices = FALSE;
764
simple_scan_update_info_bar (self);
768
static gchar* simple_scan_get_selected_device (SimpleScan* self) {
769
gchar* result = NULL;
770
GtkTreeIter iter = {0};
771
GtkTreeIter _tmp0_ = {0};
773
g_return_val_if_fail (self != NULL, NULL);
774
_tmp1_ = gtk_combo_box_get_active_iter (self->priv->device_combo, &_tmp0_);
777
gchar* device = NULL;
778
gtk_tree_model_get ((GtkTreeModel*) self->priv->device_model, &iter, 0, &device, -1, -1);
787
void simple_scan_set_selected_device (SimpleScan* self, const gchar* device) {
788
GtkTreeIter iter = {0};
789
GtkTreeIter _tmp0_ = {0};
791
g_return_if_fail (self != NULL);
792
g_return_if_fail (device != NULL);
793
_tmp1_ = simple_scan_find_scan_device (self, device, &_tmp0_);
798
gtk_combo_box_set_active_iter (self->priv->device_combo, &iter);
799
self->priv->user_selected_device = TRUE;
803
static void simple_scan_add_default_page (SimpleScan* self) {
806
g_return_if_fail (self != NULL);
807
_tmp0_ = book_append_page (self->priv->book, self->priv->default_page_width, self->priv->default_page_height, self->priv->default_page_dpi, self->priv->default_page_scan_direction);
809
book_view_select_page (self->priv->book_view, page);
814
static gpointer _g_object_ref0 (gpointer self) {
815
return self ? g_object_ref (self) : NULL;
819
static gint string_last_index_of_char (const gchar* self, gunichar c, gint start_index) {
821
gchar* _tmp0_ = NULL;
823
g_return_val_if_fail (self != NULL, 0);
824
_tmp0_ = g_utf8_strrchr (((gchar*) self) + start_index, (gssize) (-1), c);
826
if (_result_ != NULL) {
827
result = (gint) (_result_ - ((gchar*) self));
836
static gchar* string_slice (const gchar* self, glong start, glong end) {
837
gchar* result = NULL;
840
gboolean _tmp1_ = FALSE;
841
gboolean _tmp2_ = FALSE;
842
gchar* _tmp3_ = NULL;
843
g_return_val_if_fail (self != NULL, NULL);
844
_tmp0_ = strlen (self);
845
string_length = (glong) _tmp0_;
846
if (start < ((glong) 0)) {
847
start = string_length + start;
849
if (end < ((glong) 0)) {
850
end = string_length + end;
852
if (start >= ((glong) 0)) {
853
_tmp1_ = start <= string_length;
857
g_return_val_if_fail (_tmp1_, NULL);
858
if (end >= ((glong) 0)) {
859
_tmp2_ = end <= string_length;
863
g_return_val_if_fail (_tmp2_, NULL);
864
g_return_val_if_fail (start <= end, NULL);
865
_tmp3_ = g_strndup (((gchar*) self) + start, (gsize) (end - start));
871
static void simple_scan_on_file_type_changed (SimpleScan* self, GtkTreeSelection* selection) {
872
GtkTreeModel* model = NULL;
873
GtkTreeIter iter = {0};
874
GtkTreeModel* _tmp0_ = NULL;
875
GtkTreeIter _tmp1_ = {0};
877
GtkTreeModel* _tmp3_;
878
gchar* extension = NULL;
879
gchar* _tmp4_ = NULL;
881
gchar* _tmp5_ = NULL;
884
gint extension_index;
886
g_return_if_fail (self != NULL);
887
g_return_if_fail (selection != NULL);
888
_tmp2_ = gtk_tree_selection_get_selected (selection, &_tmp0_, &_tmp1_);
889
_g_object_unref0 (model);
890
_tmp3_ = _g_object_ref0 (_tmp0_);
894
_g_object_unref0 (model);
897
gtk_tree_model_get (model, &iter, 1, &extension, -1, -1);
898
_tmp4_ = gtk_file_chooser_get_filename ((GtkFileChooser*) self->priv->save_dialog);
900
_tmp5_ = g_path_get_basename (path);
902
_tmp6_ = string_last_index_of_char (filename, (gunichar) '.', 0);
903
extension_index = _tmp6_;
904
if (extension_index >= 0) {
905
gchar* _tmp7_ = NULL;
906
_tmp7_ = string_slice (filename, (glong) 0, (glong) extension_index);
910
_tmp8_ = g_strconcat (filename, extension, NULL);
913
gtk_file_chooser_set_current_name ((GtkFileChooser*) self->priv->save_dialog, filename);
916
_g_free0 (extension);
917
_g_object_unref0 (model);
921
static void _simple_scan_on_file_type_changed_gtk_tree_selection_changed (GtkTreeSelection* _sender, gpointer self) {
922
simple_scan_on_file_type_changed (self, _sender);
926
static gchar* simple_scan_choose_file_location (SimpleScan* self) {
927
gchar* result = NULL;
929
gchar* _tmp0_ = NULL;
930
gboolean _tmp1_ = FALSE;
931
const gchar* _tmp4_ = NULL;
932
GtkFileChooserDialog* _tmp5_ = NULL;
933
GtkFileFilter* _tmp6_ = NULL;
934
GtkFileFilter* filter;
935
const gchar* _tmp7_ = NULL;
936
GtkFileFilter* _tmp8_ = NULL;
937
const gchar* _tmp9_ = NULL;
938
const gchar* _tmp10_ = NULL;
939
GtkExpander* _tmp11_ = NULL;
940
GtkExpander* expander;
945
GtkListStore* _tmp15_ = NULL;
946
GtkListStore* file_type_store;
947
GtkTreeIter iter = {0};
948
GtkTreeIter _tmp16_ = {0};
949
const gchar* _tmp17_ = NULL;
950
GtkTreeIter _tmp18_ = {0};
951
const gchar* _tmp19_ = NULL;
952
GtkTreeIter _tmp20_ = {0};
953
const gchar* _tmp21_ = NULL;
954
GtkTreeView* _tmp22_ = NULL;
955
GtkTreeView* file_type_view;
956
GtkCellRendererText* _tmp23_ = NULL;
957
GtkCellRendererText* _tmp24_;
958
GtkTreeViewColumn* _tmp25_ = NULL;
959
GtkTreeViewColumn* _tmp26_;
960
GtkTreeViewColumn* column;
961
GtkTreeIter _tmp27_ = {0};
963
GtkTreeSelection* _tmp32_ = NULL;
967
gchar* _tmp35_ = NULL;
969
g_return_val_if_fail (self != NULL, NULL);
971
_tmp0_ = g_settings_get_string (self->priv->settings, "save-directory");
972
_g_free0 (directory);
974
if (directory == NULL) {
977
_tmp1_ = g_strcmp0 (directory, "") == 0;
980
const gchar* _tmp2_ = NULL;
982
_tmp2_ = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
983
_tmp3_ = g_strdup (_tmp2_);
984
_g_free0 (directory);
987
_tmp4_ = _ ("Save As...");
988
_tmp5_ = (GtkFileChooserDialog*) gtk_file_chooser_dialog_new (_tmp4_, self->priv->window, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL, NULL);
989
_g_object_unref0 (self->priv->save_dialog);
990
self->priv->save_dialog = g_object_ref_sink (_tmp5_);
991
gtk_file_chooser_set_do_overwrite_confirmation ((GtkFileChooser*) self->priv->save_dialog, TRUE);
992
gtk_file_chooser_set_local_only ((GtkFileChooser*) self->priv->save_dialog, FALSE);
993
gtk_file_chooser_set_current_folder ((GtkFileChooser*) self->priv->save_dialog, directory);
994
gtk_file_chooser_set_current_name ((GtkFileChooser*) self->priv->save_dialog, self->priv->default_file_name);
995
_tmp6_ = gtk_file_filter_new ();
996
filter = g_object_ref_sink (_tmp6_);
997
_tmp7_ = _ ("Image Files");
998
gtk_buildable_set_name ((GtkBuildable*) filter, _tmp7_);
999
gtk_file_filter_add_pixbuf_formats (filter);
1000
gtk_file_filter_add_mime_type (filter, "application/pdf");
1001
gtk_file_chooser_add_filter ((GtkFileChooser*) self->priv->save_dialog, filter);
1002
_tmp8_ = gtk_file_filter_new ();
1003
_g_object_unref0 (filter);
1004
filter = g_object_ref_sink (_tmp8_);
1005
_tmp9_ = _ ("All Files");
1006
gtk_buildable_set_name ((GtkBuildable*) filter, _tmp9_);
1007
gtk_file_filter_add_pattern (filter, "*");
1008
gtk_file_chooser_add_filter ((GtkFileChooser*) self->priv->save_dialog, filter);
1009
_tmp10_ = _ ("Select File _Type");
1010
_tmp11_ = (GtkExpander*) gtk_expander_new_with_mnemonic (_tmp10_);
1011
expander = g_object_ref_sink (_tmp11_);
1012
gtk_expander_set_spacing (expander, 5);
1013
gtk_file_chooser_set_extra_widget ((GtkFileChooser*) self->priv->save_dialog, (GtkWidget*) expander);
1014
_tmp12_ = g_strdup ("");
1015
extension = _tmp12_;
1016
_tmp13_ = string_last_index_of_char (self->priv->default_file_name, (gunichar) '.', 0);
1019
gchar* _tmp14_ = NULL;
1020
_tmp14_ = string_slice (self->priv->default_file_name, (glong) 0, (glong) index);
1021
_g_free0 (extension);
1022
extension = _tmp14_;
1024
_tmp15_ = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
1025
file_type_store = _tmp15_;
1026
gtk_list_store_append (file_type_store, &_tmp16_);
1028
_tmp17_ = _ ("PDF (multi-page document)");
1029
gtk_list_store_set (file_type_store, &iter, 0, _tmp17_, 1, ".pdf", -1, -1);
1030
gtk_list_store_append (file_type_store, &_tmp18_);
1032
_tmp19_ = _ ("JPEG (compressed)");
1033
gtk_list_store_set (file_type_store, &iter, 0, _tmp19_, 1, ".jpg", -1, -1);
1034
gtk_list_store_append (file_type_store, &_tmp20_);
1036
_tmp21_ = _ ("PNG (lossless)");
1037
gtk_list_store_set (file_type_store, &iter, 0, _tmp21_, 1, ".png", -1, -1);
1038
_tmp22_ = (GtkTreeView*) gtk_tree_view_new_with_model ((GtkTreeModel*) file_type_store);
1039
file_type_view = g_object_ref_sink (_tmp22_);
1040
gtk_tree_view_set_headers_visible (file_type_view, FALSE);
1041
gtk_tree_view_set_rules_hint (file_type_view, TRUE);
1042
_tmp23_ = (GtkCellRendererText*) gtk_cell_renderer_text_new ();
1043
_tmp24_ = g_object_ref_sink (_tmp23_);
1044
_tmp25_ = gtk_tree_view_column_new_with_attributes ("", (GtkCellRenderer*) _tmp24_, "text", 0, NULL, NULL);
1045
_tmp26_ = g_object_ref_sink (_tmp25_);
1046
_g_object_unref0 (_tmp24_);
1048
gtk_tree_view_append_column (file_type_view, column);
1049
gtk_container_add ((GtkContainer*) expander, (GtkWidget*) file_type_view);
1050
_tmp28_ = gtk_tree_model_get_iter_first ((GtkTreeModel*) file_type_store, &_tmp27_);
1060
_tmp30_ = gtk_tree_model_iter_next ((GtkTreeModel*) file_type_store, &iter);
1066
gtk_tree_model_get ((GtkTreeModel*) file_type_store, &iter, 1, &e, -1, -1);
1067
if (g_strcmp0 (extension, e) == 0) {
1068
GtkTreeSelection* _tmp31_ = NULL;
1069
_tmp31_ = gtk_tree_view_get_selection (file_type_view);
1070
gtk_tree_selection_select_iter (_tmp31_, &iter);
1076
_tmp32_ = gtk_tree_view_get_selection (file_type_view);
1077
g_signal_connect (_tmp32_, "changed", (GCallback) _simple_scan_on_file_type_changed_gtk_tree_selection_changed, self);
1078
gtk_widget_show_all ((GtkWidget*) expander);
1079
_tmp33_ = gtk_dialog_run ((GtkDialog*) self->priv->save_dialog);
1082
if (response == ((gint) GTK_RESPONSE_ACCEPT)) {
1083
gchar* _tmp34_ = NULL;
1084
_tmp34_ = gtk_file_chooser_get_uri ((GtkFileChooser*) self->priv->save_dialog);
1088
_tmp35_ = gtk_file_chooser_get_current_folder ((GtkFileChooser*) self->priv->save_dialog);
1090
g_settings_set_string (self->priv->settings, "save-directory", _tmp36_);
1092
gtk_widget_destroy ((GtkWidget*) self->priv->save_dialog);
1093
_g_object_unref0 (self->priv->save_dialog);
1094
self->priv->save_dialog = NULL;
1096
_g_object_unref0 (column);
1097
_g_object_unref0 (file_type_view);
1098
_g_object_unref0 (file_type_store);
1099
_g_free0 (extension);
1100
_g_object_unref0 (expander);
1101
_g_object_unref0 (filter);
1102
_g_free0 (directory);
1107
static gboolean simple_scan_save_document (SimpleScan* self, gboolean force_choose_location) {
1108
gboolean result = FALSE;
1110
gboolean _tmp0_ = FALSE;
1111
GFile* _tmp3_ = NULL;
1113
gchar* _tmp4_ = NULL;
1119
GError * _inner_error_ = NULL;
1120
g_return_val_if_fail (self != NULL, FALSE);
1121
if (self->priv->book_uri != NULL) {
1122
_tmp0_ = !force_choose_location;
1128
_tmp1_ = g_strdup (self->priv->book_uri);
1132
gchar* _tmp2_ = NULL;
1133
_tmp2_ = simple_scan_choose_file_location (self);
1142
_tmp3_ = g_file_new_for_uri (uri);
1144
g_debug ("ui.vala:445: Saving to '%s'", uri);
1145
_tmp4_ = g_utf8_strdown (uri, (gssize) (-1));
1147
_tmp5_ = g_strdup ("jpeg");
1149
_tmp6_ = g_str_has_suffix (uri_lower, ".pdf");
1152
_tmp7_ = g_strdup ("pdf");
1157
_tmp8_ = g_str_has_suffix (uri_lower, ".ps");
1160
_tmp9_ = g_strdup ("ps");
1165
_tmp10_ = g_str_has_suffix (uri_lower, ".png");
1168
_tmp11_ = g_strdup ("png");
1172
gboolean _tmp12_ = FALSE;
1174
_tmp13_ = g_str_has_suffix (uri_lower, ".tif");
1179
_tmp14_ = g_str_has_suffix (uri_lower, ".tiff");
1184
_tmp15_ = g_strdup ("tiff");
1192
book_save (self->priv->book, format, file, &_inner_error_);
1193
if (_inner_error_ != NULL) {
1194
goto __catch10_g_error;
1201
const gchar* _tmp16_ = NULL;
1203
_inner_error_ = NULL;
1204
g_warning ("ui.vala:464: Error saving file: %s", e->message);
1205
_tmp16_ = _ ("Failed to save file");
1206
simple_scan_show_error (self, _tmp16_, e->message, FALSE);
1210
_g_free0 (uri_lower);
1211
_g_object_unref0 (file);
1216
if (_inner_error_ != NULL) {
1218
_g_free0 (uri_lower);
1219
_g_object_unref0 (file);
1221
g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
1222
g_clear_error (&_inner_error_);
1225
_tmp17_ = g_strdup (uri);
1226
_g_free0 (self->priv->book_uri);
1227
self->priv->book_uri = _tmp17_;
1228
book_set_needs_saving (self->priv->book, FALSE);
1231
_g_free0 (uri_lower);
1232
_g_object_unref0 (file);
1238
static gboolean simple_scan_prompt_to_save (SimpleScan* self, const gchar* title, const gchar* discard_label) {
1239
gboolean result = FALSE;
1241
GtkMessageDialog* _tmp1_ = NULL;
1242
GtkMessageDialog* dialog;
1243
const gchar* _tmp2_ = NULL;
1246
g_return_val_if_fail (self != NULL, FALSE);
1247
g_return_val_if_fail (title != NULL, FALSE);
1248
g_return_val_if_fail (discard_label != NULL, FALSE);
1249
_tmp0_ = book_get_needs_saving (self->priv->book);
1254
_tmp1_ = (GtkMessageDialog*) gtk_message_dialog_new (self->priv->window, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, "%s", title);
1255
dialog = g_object_ref_sink (_tmp1_);
1256
_tmp2_ = _ ("If you don't save, changes will be permanently lost.");
1257
gtk_message_dialog_format_secondary_text (dialog, "%s", _tmp2_, NULL);
1258
gtk_dialog_add_button ((GtkDialog*) dialog, discard_label, (gint) GTK_RESPONSE_NO);
1259
gtk_dialog_add_button ((GtkDialog*) dialog, GTK_STOCK_CANCEL, (gint) GTK_RESPONSE_CANCEL);
1260
gtk_dialog_add_button ((GtkDialog*) dialog, GTK_STOCK_SAVE, (gint) GTK_RESPONSE_YES);
1261
_tmp3_ = gtk_dialog_run ((GtkDialog*) dialog);
1263
gtk_widget_destroy ((GtkWidget*) dialog);
1265
case GTK_RESPONSE_YES:
1268
_tmp4_ = simple_scan_save_document (self, FALSE);
1271
_g_object_unref0 (dialog);
1275
_g_object_unref0 (dialog);
1279
case GTK_RESPONSE_CANCEL:
1282
_g_object_unref0 (dialog);
1286
case GTK_RESPONSE_NO:
1289
_g_object_unref0 (dialog);
1293
_g_object_unref0 (dialog);
1297
static void simple_scan_clear_document (SimpleScan* self) {
1298
g_return_if_fail (self != NULL);
1299
book_clear (self->priv->book);
1300
simple_scan_add_default_page (self);
1301
_g_free0 (self->priv->book_uri);
1302
self->priv->book_uri = NULL;
1303
book_set_needs_saving (self->priv->book, FALSE);
1304
gtk_widget_set_sensitive ((GtkWidget*) self->priv->save_as_menuitem, FALSE);
1308
void G_MODULE_EXPORT new_button_clicked_cb (GtkWidget* widget, SimpleScan* self) {
1309
const gchar* _tmp0_ = NULL;
1310
const gchar* _tmp1_ = NULL;
1312
g_return_if_fail (self != NULL);
1313
g_return_if_fail (widget != NULL);
1314
_tmp0_ = _ ("Save current document?");
1315
_tmp1_ = _ ("Discard Changes");
1316
_tmp2_ = simple_scan_prompt_to_save (self, _tmp0_, _tmp1_);
1320
simple_scan_clear_document (self);
1324
static void simple_scan_set_document_hint (SimpleScan* self, const gchar* document_hint) {
1326
g_return_if_fail (self != NULL);
1327
g_return_if_fail (document_hint != NULL);
1328
_tmp0_ = g_strdup (document_hint);
1329
_g_free0 (self->priv->document_hint);
1330
self->priv->document_hint = _tmp0_;
1331
if (g_strcmp0 (document_hint, "text") == 0) {
1332
gtk_check_menu_item_set_active ((GtkCheckMenuItem*) self->priv->text_toolbar_menuitem, TRUE);
1333
gtk_check_menu_item_set_active ((GtkCheckMenuItem*) self->priv->text_menu_menuitem, TRUE);
1335
if (g_strcmp0 (document_hint, "photo") == 0) {
1336
gtk_check_menu_item_set_active ((GtkCheckMenuItem*) self->priv->photo_toolbar_menuitem, TRUE);
1337
gtk_check_menu_item_set_active ((GtkCheckMenuItem*) self->priv->photo_menu_menuitem, TRUE);
1343
void G_MODULE_EXPORT text_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self) {
1345
g_return_if_fail (self != NULL);
1346
g_return_if_fail (widget != NULL);
1347
_tmp0_ = gtk_check_menu_item_get_active (widget);
1349
simple_scan_set_document_hint (self, "text");
1354
void G_MODULE_EXPORT photo_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self) {
1356
g_return_if_fail (self != NULL);
1357
g_return_if_fail (widget != NULL);
1358
_tmp0_ = gtk_check_menu_item_get_active (widget);
1360
simple_scan_set_document_hint (self, "photo");
1365
static void simple_scan_set_page_side (SimpleScan* self, ScanType page_side) {
1366
GtkTreeIter iter = {0};
1367
GtkTreeIter _tmp0_ = {0};
1369
g_return_if_fail (self != NULL);
1370
_tmp1_ = gtk_tree_model_get_iter_first ((GtkTreeModel*) self->priv->page_side_model, &_tmp0_);
1380
_tmp3_ = gtk_tree_model_iter_next ((GtkTreeModel*) self->priv->page_side_model, &iter);
1386
gtk_tree_model_get ((GtkTreeModel*) self->priv->page_side_model, &iter, 0, &s, -1, -1);
1387
if (s == ((gint) page_side)) {
1388
gtk_combo_box_set_active_iter (self->priv->page_side_combo, &iter);
1397
static void simple_scan_set_paper_size (SimpleScan* self, gint width, gint height) {
1398
GtkTreeIter iter = {0};
1399
gboolean have_iter = FALSE;
1400
g_return_if_fail (self != NULL);
1402
GtkTreeIter _tmp0_ = {0};
1405
_tmp1_ = gtk_tree_model_get_iter_first ((GtkTreeModel*) self->priv->paper_size_model, &_tmp0_);
1412
gboolean _tmp4_ = FALSE;
1415
_tmp3_ = gtk_tree_model_iter_next ((GtkTreeModel*) self->priv->paper_size_model, &iter);
1422
gtk_tree_model_get ((GtkTreeModel*) self->priv->paper_size_model, &iter, 0, &w, 1, &h, -1, -1);
1424
_tmp4_ = h == height;
1434
GtkTreeIter _tmp5_ = {0};
1436
_tmp6_ = gtk_tree_model_get_iter_first ((GtkTreeModel*) self->priv->paper_size_model, &_tmp5_);
1441
gtk_combo_box_set_active_iter (self->priv->paper_size_combo, &iter);
1446
static gint simple_scan_get_text_dpi (SimpleScan* self) {
1448
GtkTreeIter iter = {0};
1450
GtkTreeIter _tmp0_ = {0};
1452
g_return_val_if_fail (self != NULL, 0);
1453
dpi = SIMPLE_SCAN_DEFAULT_TEXT_DPI;
1454
_tmp1_ = gtk_combo_box_get_active_iter (self->priv->text_dpi_combo, &_tmp0_);
1457
gtk_tree_model_get ((GtkTreeModel*) self->priv->text_dpi_model, &iter, 0, &dpi, -1, -1);
1464
static gint simple_scan_get_photo_dpi (SimpleScan* self) {
1466
GtkTreeIter iter = {0};
1468
GtkTreeIter _tmp0_ = {0};
1470
g_return_val_if_fail (self != NULL, 0);
1471
dpi = SIMPLE_SCAN_DEFAULT_PHOTO_DPI;
1472
_tmp1_ = gtk_combo_box_get_active_iter (self->priv->photo_dpi_combo, &_tmp0_);
1475
gtk_tree_model_get ((GtkTreeModel*) self->priv->photo_dpi_model, &iter, 0, &dpi, -1, -1);
1482
static ScanType simple_scan_get_page_side (SimpleScan* self) {
1483
ScanType result = 0;
1484
GtkTreeIter iter = {0};
1486
GtkTreeIter _tmp0_ = {0};
1488
g_return_val_if_fail (self != NULL, 0);
1489
page_side = (gint) SCAN_TYPE_ADF_BOTH;
1490
_tmp1_ = gtk_combo_box_get_active_iter (self->priv->page_side_combo, &_tmp0_);
1493
gtk_tree_model_get ((GtkTreeModel*) self->priv->page_side_model, &iter, 0, &page_side, -1, -1);
1495
result = (ScanType) page_side;
1500
static gboolean simple_scan_get_paper_size (SimpleScan* self, gint* width, gint* height) {
1503
gboolean result = FALSE;
1504
GtkTreeIter iter = {0};
1505
GtkTreeIter _tmp0_ = {0};
1507
g_return_val_if_fail (self != NULL, FALSE);
1508
_tmp1_ = gtk_combo_box_get_active_iter (self->priv->paper_size_combo, &_tmp0_);
1511
gtk_tree_model_get ((GtkTreeModel*) self->priv->paper_size_model, &iter, 0, &_width, 1, &_height, -1, -1);
1532
static ScanOptions* simple_scan_get_scan_options (SimpleScan* self) {
1533
ScanOptions* result = NULL;
1534
ScanOptions* _tmp0_ = NULL;
1535
ScanOptions* options;
1538
g_return_val_if_fail (self != NULL, NULL);
1539
_tmp0_ = scan_options_new ();
1541
if (g_strcmp0 (self->priv->document_hint, "text") == 0) {
1543
options->scan_mode = SCAN_MODE_GRAY;
1544
_tmp1_ = simple_scan_get_text_dpi (self);
1545
options->dpi = _tmp1_;
1549
options->scan_mode = SCAN_MODE_COLOR;
1550
_tmp2_ = simple_scan_get_photo_dpi (self);
1551
options->dpi = _tmp2_;
1554
simple_scan_get_paper_size (self, &_tmp3_, &_tmp4_);
1555
options->paper_width = _tmp3_;
1556
options->paper_height = _tmp4_;
1562
void G_MODULE_EXPORT scan_button_clicked_cb (GtkWidget* widget, SimpleScan* self) {
1563
ScanOptions* _tmp0_ = NULL;
1564
ScanOptions* options;
1565
gchar* _tmp1_ = NULL;
1567
g_return_if_fail (self != NULL);
1568
g_return_if_fail (widget != NULL);
1569
_tmp0_ = simple_scan_get_scan_options (self);
1571
options->type = SCAN_TYPE_SINGLE;
1572
_tmp1_ = simple_scan_get_selected_device (self);
1574
g_signal_emit_by_name (self, "start-scan", _tmp2_, options);
1576
_scan_options_unref0 (options);
1580
void G_MODULE_EXPORT stop_scan_button_clicked_cb (GtkWidget* widget, SimpleScan* self) {
1581
g_return_if_fail (self != NULL);
1582
g_return_if_fail (widget != NULL);
1583
g_signal_emit_by_name (self, "stop-scan");
1587
void G_MODULE_EXPORT continuous_scan_button_clicked_cb (GtkWidget* widget, SimpleScan* self) {
1588
g_return_if_fail (self != NULL);
1589
g_return_if_fail (widget != NULL);
1590
if (self->priv->scanning) {
1591
g_signal_emit_by_name (self, "stop-scan");
1593
ScanOptions* _tmp0_ = NULL;
1594
ScanOptions* options;
1596
gchar* _tmp2_ = NULL;
1598
_tmp0_ = simple_scan_get_scan_options (self);
1600
_tmp1_ = simple_scan_get_page_side (self);
1601
options->type = _tmp1_;
1602
_tmp2_ = simple_scan_get_selected_device (self);
1604
g_signal_emit_by_name (self, "start-scan", _tmp3_, options);
1606
_scan_options_unref0 (options);
1611
void G_MODULE_EXPORT preferences_button_clicked_cb (GtkWidget* widget, SimpleScan* self) {
1612
g_return_if_fail (self != NULL);
1613
g_return_if_fail (widget != NULL);
1614
gtk_window_present ((GtkWindow*) self->priv->preferences_dialog);
1618
gboolean G_MODULE_EXPORT preferences_dialog_delete_event_cb (GtkWidget* widget, SimpleScan* self) {
1619
gboolean result = FALSE;
1620
g_return_val_if_fail (self != NULL, FALSE);
1621
g_return_val_if_fail (widget != NULL, FALSE);
1627
void G_MODULE_EXPORT preferences_dialog_response_cb (GtkWidget* widget, gint response_id, SimpleScan* self) {
1628
g_return_if_fail (self != NULL);
1629
g_return_if_fail (widget != NULL);
1630
gtk_widget_hide ((GtkWidget*) self->priv->preferences_dialog);
1634
static void simple_scan_update_page_menu (SimpleScan* self) {
1635
Page* _tmp0_ = NULL;
1637
g_return_if_fail (self != NULL);
1638
_tmp0_ = book_view_get_selected (self->priv->book_view);
1641
gtk_widget_set_sensitive ((GtkWidget*) self->priv->page_move_left_menuitem, FALSE);
1642
gtk_widget_set_sensitive ((GtkWidget*) self->priv->page_move_right_menuitem, FALSE);
1647
_tmp1_ = book_get_page_index (self->priv->book, page);
1649
gtk_widget_set_sensitive ((GtkWidget*) self->priv->page_move_left_menuitem, index > ((guint) 0));
1650
_tmp2_ = book_get_n_pages (self->priv->book);
1651
gtk_widget_set_sensitive ((GtkWidget*) self->priv->page_move_right_menuitem, index < (_tmp2_ - 1));
1653
_page_unref0 (page);
1657
static void simple_scan_page_selected_cb (SimpleScan* self, BookView* view, Page* page) {
1660
GObject* _tmp10_ = NULL;
1661
GtkRadioMenuItem* _tmp11_;
1662
GtkRadioMenuItem* menuitem;
1663
GObject* _tmp12_ = NULL;
1664
GtkToggleToolButton* _tmp13_;
1665
GtkToggleToolButton* toolbutton;
1667
g_return_if_fail (self != NULL);
1668
g_return_if_fail (view != NULL);
1672
self->priv->updating_page_menu = TRUE;
1673
simple_scan_update_page_menu (self);
1675
_tmp0_ = page_has_crop (page);
1677
gchar* _tmp1_ = NULL;
1679
_tmp1_ = page_get_named_crop (page);
1681
if (crop_name != NULL) {
1682
if (g_strcmp0 (crop_name, "A4") == 0) {
1684
_tmp2_ = g_strdup ("a4_menuitem");
1688
if (g_strcmp0 (crop_name, "A5") == 0) {
1690
_tmp3_ = g_strdup ("a5_menuitem");
1694
if (g_strcmp0 (crop_name, "A6") == 0) {
1696
_tmp4_ = g_strdup ("a6_menuitem");
1700
if (g_strcmp0 (crop_name, "letter") == 0) {
1702
_tmp5_ = g_strdup ("letter_menuitem");
1706
if (g_strcmp0 (crop_name, "legal") == 0) {
1708
_tmp6_ = g_strdup ("legal_menuitem");
1712
if (g_strcmp0 (crop_name, "4x6") == 0) {
1714
_tmp7_ = g_strdup ("4x6_menuitem");
1725
_tmp8_ = g_strdup ("custom_crop_menuitem");
1729
_g_free0 (crop_name);
1732
_tmp9_ = g_strdup ("no_crop_menuitem");
1736
_tmp10_ = gtk_builder_get_object (self->priv->builder, name);
1737
_tmp11_ = _g_object_ref0 (GTK_RADIO_MENU_ITEM (_tmp10_));
1739
gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menuitem, TRUE);
1740
_tmp12_ = gtk_builder_get_object (self->priv->builder, "crop_toolbutton");
1741
_tmp13_ = _g_object_ref0 (GTK_TOGGLE_TOOL_BUTTON (_tmp12_));
1742
toolbutton = _tmp13_;
1743
_tmp14_ = page_has_crop (page);
1744
gtk_toggle_tool_button_set_active (toolbutton, _tmp14_);
1745
self->priv->updating_page_menu = FALSE;
1746
_g_object_unref0 (toolbutton);
1747
_g_object_unref0 (menuitem);
1752
static gchar* simple_scan_get_temporary_filename (SimpleScan* self, const gchar* prefix, const gchar* extension) {
1753
gchar* result = NULL;
1754
gchar* _tmp0_ = NULL;
1757
GError * _inner_error_ = NULL;
1758
g_return_val_if_fail (self != NULL, NULL);
1759
g_return_val_if_fail (prefix != NULL, NULL);
1760
g_return_val_if_fail (extension != NULL, NULL);
1761
_tmp0_ = g_strdup_printf ("%sXXXXXX.%s", prefix, extension);
1764
gchar* _tmp1_ = NULL;
1767
_tmp2_ = g_file_open_tmp (filename, &_tmp1_, &_inner_error_);
1771
if (_inner_error_ != NULL) {
1772
goto __catch11_g_error;
1781
_inner_error_ = NULL;
1782
g_warning ("ui.vala:788: Error saving email attachment: %s", e->message);
1786
_g_free0 (filename);
1790
if (_inner_error_ != NULL) {
1792
_g_free0 (filename);
1793
g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
1794
g_clear_error (&_inner_error_);
1798
_g_free0 (filename);
1803
static void simple_scan_show_page_cb (SimpleScan* self, BookView* view, Page* page) {
1804
gchar* _tmp0_ = NULL;
1806
GFile* _tmp1_ = NULL;
1808
GError * _inner_error_ = NULL;
1809
g_return_if_fail (self != NULL);
1810
g_return_if_fail (view != NULL);
1811
g_return_if_fail (page != NULL);
1812
_tmp0_ = simple_scan_get_temporary_filename (self, "scanned-page", "tiff");
1818
_tmp1_ = g_file_new_for_path (path);
1821
page_save (page, "tiff", file, &_inner_error_);
1822
if (_inner_error_ != NULL) {
1823
goto __catch12_g_error;
1830
const gchar* _tmp2_ = NULL;
1832
_inner_error_ = NULL;
1833
_tmp2_ = _ ("Unable to save image for preview");
1834
simple_scan_show_error_dialog (self, _tmp2_, e->message);
1836
_g_object_unref0 (file);
1841
if (_inner_error_ != NULL) {
1842
_g_object_unref0 (file);
1844
g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
1845
g_clear_error (&_inner_error_);
1849
GdkScreen* _tmp3_ = NULL;
1850
gchar* _tmp4_ = NULL;
1853
_tmp3_ = gtk_window_get_screen (self->priv->window);
1854
_tmp4_ = g_file_get_uri (file);
1856
_tmp6_ = gtk_get_current_event_time ();
1857
gtk_show_uri (_tmp3_, _tmp5_, _tmp6_, &_inner_error_);
1859
if (_inner_error_ != NULL) {
1860
goto __catch13_g_error;
1867
const gchar* _tmp7_ = NULL;
1869
_inner_error_ = NULL;
1870
_tmp7_ = _ ("Unable to open image preview application");
1871
simple_scan_show_error_dialog (self, _tmp7_, e->message);
1875
if (_inner_error_ != NULL) {
1876
_g_object_unref0 (file);
1878
g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
1879
g_clear_error (&_inner_error_);
1882
_g_object_unref0 (file);
1887
static void simple_scan_show_page_menu_cb (SimpleScan* self, BookView* view) {
1888
GObject* _tmp0_ = NULL;
1892
g_return_if_fail (self != NULL);
1893
g_return_if_fail (view != NULL);
1894
_tmp0_ = gtk_builder_get_object (self->priv->builder, "page_menu");
1895
_tmp1_ = _g_object_ref0 (GTK_MENU (_tmp0_));
1897
_tmp2_ = gtk_get_current_event_time ();
1898
gtk_menu_popup (menu, NULL, NULL, NULL, NULL, (guint) 3, _tmp2_);
1899
_g_object_unref0 (menu);
1903
void G_MODULE_EXPORT rotate_left_button_clicked_cb (GtkWidget* widget, SimpleScan* self) {
1904
Page* _tmp0_ = NULL;
1906
g_return_if_fail (self != NULL);
1907
g_return_if_fail (widget != NULL);
1908
if (self->priv->updating_page_menu) {
1911
_tmp0_ = book_view_get_selected (self->priv->book_view);
1914
page_rotate_left (page);
1916
_page_unref0 (page);
1920
void G_MODULE_EXPORT rotate_right_button_clicked_cb (GtkWidget* widget, SimpleScan* self) {
1921
Page* _tmp0_ = NULL;
1923
g_return_if_fail (self != NULL);
1924
g_return_if_fail (widget != NULL);
1925
if (self->priv->updating_page_menu) {
1928
_tmp0_ = book_view_get_selected (self->priv->book_view);
1931
page_rotate_right (page);
1933
_page_unref0 (page);
1937
static void simple_scan_set_crop (SimpleScan* self, const gchar* crop_name) {
1938
Page* _tmp0_ = NULL;
1940
g_return_if_fail (self != NULL);
1941
gtk_widget_set_sensitive ((GtkWidget*) self->priv->crop_rotate_menuitem, crop_name != NULL);
1942
if (self->priv->updating_page_menu) {
1945
_tmp0_ = book_view_get_selected (self->priv->book_view);
1948
_page_unref0 (page);
1951
if (crop_name == NULL) {
1952
page_set_no_crop (page);
1953
_page_unref0 (page);
1956
if (g_strcmp0 (crop_name, "custom") == 0) {
1963
_tmp1_ = page_get_width (page);
1965
_tmp2_ = page_get_height (page);
1967
crop_width = (gint) ((width * 0.8) + 0.5);
1968
crop_height = (gint) ((height * 0.8) + 0.5);
1969
page_set_custom_crop (page, crop_width, crop_height);
1970
page_move_crop (page, (width - crop_width) / 2, (height - crop_height) / 2);
1972
page_set_named_crop (page, crop_name);
1975
_page_unref0 (page);
1979
void G_MODULE_EXPORT no_crop_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self) {
1981
g_return_if_fail (self != NULL);
1982
g_return_if_fail (widget != NULL);
1983
_tmp0_ = gtk_check_menu_item_get_active (widget);
1985
simple_scan_set_crop (self, NULL);
1990
void G_MODULE_EXPORT custom_crop_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self) {
1992
g_return_if_fail (self != NULL);
1993
g_return_if_fail (widget != NULL);
1994
_tmp0_ = gtk_check_menu_item_get_active (widget);
1996
simple_scan_set_crop (self, "custom");
2001
void G_MODULE_EXPORT crop_toolbutton_toggled_cb (GtkToggleToolButton* widget, SimpleScan* self) {
2002
GtkRadioMenuItem* menuitem = NULL;
2004
g_return_if_fail (self != NULL);
2005
g_return_if_fail (widget != NULL);
2006
if (self->priv->updating_page_menu) {
2009
_tmp0_ = gtk_toggle_tool_button_get_active (widget);
2011
GObject* _tmp1_ = NULL;
2012
GtkRadioMenuItem* _tmp2_;
2013
_tmp1_ = gtk_builder_get_object (self->priv->builder, "custom_crop_menuitem");
2014
_tmp2_ = _g_object_ref0 (GTK_RADIO_MENU_ITEM (_tmp1_));
2015
_g_object_unref0 (menuitem);
2018
GObject* _tmp3_ = NULL;
2019
GtkRadioMenuItem* _tmp4_;
2020
_tmp3_ = gtk_builder_get_object (self->priv->builder, "no_crop_menuitem");
2021
_tmp4_ = _g_object_ref0 (GTK_RADIO_MENU_ITEM (_tmp3_));
2022
_g_object_unref0 (menuitem);
2025
gtk_check_menu_item_set_active ((GtkCheckMenuItem*) menuitem, TRUE);
2026
_g_object_unref0 (menuitem);
2030
void G_MODULE_EXPORT four_by_six_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self) {
2032
g_return_if_fail (self != NULL);
2033
g_return_if_fail (widget != NULL);
2034
_tmp0_ = gtk_check_menu_item_get_active (widget);
2036
simple_scan_set_crop (self, "4x6");
2041
void G_MODULE_EXPORT legal_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self) {
2043
g_return_if_fail (self != NULL);
2044
g_return_if_fail (widget != NULL);
2045
_tmp0_ = gtk_check_menu_item_get_active (widget);
2047
simple_scan_set_crop (self, "legal");
2052
void G_MODULE_EXPORT letter_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self) {
2054
g_return_if_fail (self != NULL);
2055
g_return_if_fail (widget != NULL);
2056
_tmp0_ = gtk_check_menu_item_get_active (widget);
2058
simple_scan_set_crop (self, "letter");
2063
void G_MODULE_EXPORT a6_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self) {
2065
g_return_if_fail (self != NULL);
2066
g_return_if_fail (widget != NULL);
2067
_tmp0_ = gtk_check_menu_item_get_active (widget);
2069
simple_scan_set_crop (self, "A6");
2074
void G_MODULE_EXPORT a5_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self) {
2076
g_return_if_fail (self != NULL);
2077
g_return_if_fail (widget != NULL);
2078
_tmp0_ = gtk_check_menu_item_get_active (widget);
2080
simple_scan_set_crop (self, "A5");
2085
void G_MODULE_EXPORT a4_menuitem_toggled_cb (GtkCheckMenuItem* widget, SimpleScan* self) {
2087
g_return_if_fail (self != NULL);
2088
g_return_if_fail (widget != NULL);
2089
_tmp0_ = gtk_check_menu_item_get_active (widget);
2091
simple_scan_set_crop (self, "A4");
2096
void G_MODULE_EXPORT crop_rotate_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self) {
2097
Page* _tmp0_ = NULL;
2099
g_return_if_fail (self != NULL);
2100
g_return_if_fail (widget != NULL);
2101
_tmp0_ = book_view_get_selected (self->priv->book_view);
2104
_page_unref0 (page);
2107
page_rotate_crop (page);
2108
_page_unref0 (page);
2112
void G_MODULE_EXPORT page_move_left_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self) {
2113
Page* _tmp0_ = NULL;
2117
g_return_if_fail (self != NULL);
2118
g_return_if_fail (widget != NULL);
2119
_tmp0_ = book_view_get_selected (self->priv->book_view);
2121
_tmp1_ = book_get_page_index (self->priv->book, page);
2123
if (index > ((guint) 0)) {
2124
book_move_page (self->priv->book, page, index - 1);
2126
simple_scan_update_page_menu (self);
2127
_page_unref0 (page);
2131
void G_MODULE_EXPORT page_move_right_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self) {
2132
Page* _tmp0_ = NULL;
2137
g_return_if_fail (self != NULL);
2138
g_return_if_fail (widget != NULL);
2139
_tmp0_ = book_view_get_selected (self->priv->book_view);
2141
_tmp1_ = book_get_page_index (self->priv->book, page);
2143
_tmp2_ = book_get_n_pages (self->priv->book);
2144
if (index < (_tmp2_ - 1)) {
2146
_tmp3_ = book_get_page_index (self->priv->book, page);
2147
book_move_page (self->priv->book, page, _tmp3_ + 1);
2149
simple_scan_update_page_menu (self);
2150
_page_unref0 (page);
2154
void G_MODULE_EXPORT page_delete_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self) {
2155
Book* _tmp0_ = NULL;
2157
Page* _tmp2_ = NULL;
2159
g_return_if_fail (self != NULL);
2160
g_return_if_fail (widget != NULL);
2161
_tmp0_ = book_view_get_book (self->priv->book_view);
2163
_tmp2_ = book_view_get_selected (self->priv->book_view);
2165
book_delete_page (_tmp1_, _tmp3_);
2166
_page_unref0 (_tmp3_);
2167
_book_unref0 (_tmp1_);
2171
void G_MODULE_EXPORT save_file_button_clicked_cb (GtkWidget* widget, SimpleScan* self) {
2172
g_return_if_fail (self != NULL);
2173
g_return_if_fail (widget != NULL);
2174
simple_scan_save_document (self, FALSE);
2178
void G_MODULE_EXPORT save_as_file_button_clicked_cb (GtkWidget* widget, SimpleScan* self) {
2179
g_return_if_fail (self != NULL);
2180
g_return_if_fail (widget != NULL);
2181
simple_scan_save_document (self, TRUE);
2185
static gpointer _cairo_reference0 (gpointer self) {
2186
return self ? cairo_reference (self) : NULL;
2190
static void simple_scan_draw_page (SimpleScan* self, GtkPrintOperation* operation, GtkPrintContext* print_context, gint page_number) {
2191
cairo_t* _tmp0_ = NULL;
2194
Page* _tmp2_ = NULL;
2196
gboolean is_landscape;
2204
GdkPixbuf* _tmp11_ = NULL;
2206
g_return_if_fail (self != NULL);
2207
g_return_if_fail (operation != NULL);
2208
g_return_if_fail (print_context != NULL);
2209
_tmp0_ = gtk_print_context_get_cairo_context (print_context);
2210
_tmp1_ = _cairo_reference0 (_tmp0_);
2212
_tmp2_ = book_get_page (self->priv->book, page_number);
2214
is_landscape = FALSE;
2215
_tmp3_ = gtk_print_context_get_width (print_context);
2216
_tmp4_ = gtk_print_context_get_height (print_context);
2217
if (_tmp3_ > _tmp4_) {
2218
is_landscape = TRUE;
2220
_tmp5_ = page_is_landscape (page);
2221
if (_tmp5_ != is_landscape) {
2223
_tmp6_ = gtk_print_context_get_width (print_context);
2224
cairo_translate (context, _tmp6_, (gdouble) 0);
2225
cairo_rotate (context, G_PI_2);
2227
_tmp7_ = gtk_print_context_get_dpi_x (print_context);
2228
_tmp8_ = page_get_dpi (page);
2229
_tmp9_ = gtk_print_context_get_dpi_y (print_context);
2230
_tmp10_ = page_get_dpi (page);
2231
cairo_scale (context, _tmp7_ / _tmp8_, _tmp9_ / _tmp10_);
2232
_tmp11_ = page_get_image (page, TRUE);
2234
gdk_cairo_set_source_pixbuf (context, image, (gdouble) 0, (gdouble) 0);
2235
cairo_paint (context);
2236
_g_object_unref0 (image);
2237
_page_unref0 (page);
2238
_cairo_destroy0 (context);
2242
void G_MODULE_EXPORT email_button_clicked_cb (GtkWidget* widget, SimpleScan* self) {
2243
g_return_if_fail (self != NULL);
2244
g_return_if_fail (widget != NULL);
2245
g_signal_emit_by_name (self, "email", self->priv->document_hint);
2249
static void _simple_scan_draw_page_gtk_print_operation_draw_page (GtkPrintOperation* _sender, GtkPrintContext* context, gint page_nr, gpointer self) {
2250
simple_scan_draw_page (self, _sender, context, page_nr);
2254
void G_MODULE_EXPORT print_button_clicked_cb (GtkWidget* widget, SimpleScan* self) {
2255
GtkPrintOperation* _tmp0_ = NULL;
2256
GtkPrintOperation* print;
2258
GError * _inner_error_ = NULL;
2259
g_return_if_fail (self != NULL);
2260
g_return_if_fail (widget != NULL);
2261
_tmp0_ = gtk_print_operation_new ();
2263
_tmp1_ = book_get_n_pages (self->priv->book);
2264
gtk_print_operation_set_n_pages (print, (gint) _tmp1_);
2265
g_signal_connect (print, "draw-page", (GCallback) _simple_scan_draw_page_gtk_print_operation_draw_page, self);
2267
gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, self->priv->window, &_inner_error_);
2268
if (_inner_error_ != NULL) {
2269
goto __catch14_g_error;
2277
_inner_error_ = NULL;
2278
g_warning ("ui.vala:1044: Error printing: %s", e->message);
2282
if (_inner_error_ != NULL) {
2283
_g_object_unref0 (print);
2284
g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
2285
g_clear_error (&_inner_error_);
2288
_g_object_unref0 (print);
2292
void G_MODULE_EXPORT help_contents_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self) {
2293
GError * _inner_error_ = NULL;
2294
g_return_if_fail (self != NULL);
2295
g_return_if_fail (widget != NULL);
2297
GdkScreen* _tmp0_ = NULL;
2299
_tmp0_ = gtk_window_get_screen (self->priv->window);
2300
_tmp1_ = gtk_get_current_event_time ();
2301
gtk_show_uri (_tmp0_, "ghelp:simple-scan", _tmp1_, &_inner_error_);
2302
if (_inner_error_ != NULL) {
2303
goto __catch15_g_error;
2310
const gchar* _tmp2_ = NULL;
2312
_inner_error_ = NULL;
2313
_tmp2_ = _ ("Unable to open help file");
2314
simple_scan_show_error_dialog (self, _tmp2_, e->message);
2318
if (_inner_error_ != NULL) {
2319
g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
2320
g_clear_error (&_inner_error_);
2326
void G_MODULE_EXPORT about_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self) {
2328
gchar** _tmp1_ = NULL;
2330
gint authors_length1;
2331
gint _authors_size_;
2332
const gchar* _tmp2_ = NULL;
2335
const gchar* _tmp4_ = NULL;
2338
const gchar* _tmp6_ = NULL;
2341
const gchar* _tmp8_ = NULL;
2342
g_return_if_fail (self != NULL);
2343
g_return_if_fail (widget != NULL);
2344
_tmp0_ = g_strdup ("Robert Ancell <robert.ancell@canonical.com>");
2345
_tmp1_ = g_new0 (gchar*, 1 + 1);
2348
authors_length1 = 1;
2349
_authors_size_ = authors_length1;
2350
_tmp2_ = _ ("This program is free software: you can redistribute it and/or modify\n" \
2351
"it under the terms of the GNU General Public License as published by\n" \
2352
"the Free Software Foundation, either version 3 of the License, or\n" \
2353
"(at your option) any later version.\n" \
2355
"This program is distributed in the hope that it will be useful,\n" \
2356
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
2357
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" \
2358
"GNU General Public License for more details.\n" \
2360
"You should have received a copy of the GNU General Public License\n" \
2361
"along with this program. If not, see <http://www.gnu.org/licenses/>.");
2362
_tmp3_ = g_strdup (_tmp2_);
2364
_tmp4_ = _ ("About Simple Scan");
2365
_tmp5_ = g_strdup (_tmp4_);
2367
_tmp6_ = _ ("Simple document scanning tool");
2368
_tmp7_ = g_strdup (_tmp6_);
2369
description = _tmp7_;
2370
_tmp8_ = _ ("translator-credits");
2371
gtk_show_about_dialog (self->priv->window, "title", title, "program-name", "Simple Scan", "version", VERSION, "comments", description, "logo-icon-name", "scanner", "authors", authors, "translator-credits", _tmp8_, "website", "https://launchpad.net/simple-scan", "copyright", "Copyright © 2009-2011 Canonical Ltd.", "license", license, "wrap-license", TRUE, NULL, NULL);
2372
_g_free0 (description);
2375
authors = (_vala_array_free (authors, authors_length1, (GDestroyNotify) g_free), NULL);
2379
static gboolean simple_scan_on_quit (SimpleScan* self) {
2380
gboolean result = FALSE;
2381
const gchar* _tmp0_ = NULL;
2382
const gchar* _tmp1_ = NULL;
2384
gchar* _tmp3_ = NULL;
2393
g_return_val_if_fail (self != NULL, FALSE);
2394
_tmp0_ = _ ("Save document before quitting?");
2395
_tmp1_ = _ ("Quit without Saving");
2396
_tmp2_ = simple_scan_prompt_to_save (self, _tmp0_, _tmp1_);
2401
_tmp3_ = simple_scan_get_selected_device (self);
2405
simple_scan_get_paper_size (self, &_tmp4_, &_tmp5_);
2406
paper_width = _tmp4_;
2407
paper_height = _tmp5_;
2408
if (device != NULL) {
2409
g_settings_set_string (self->priv->settings, "selected-device", device);
2411
g_settings_set_string (self->priv->settings, "document-type", self->priv->document_hint);
2412
_tmp6_ = simple_scan_get_text_dpi (self);
2413
g_settings_set_int (self->priv->settings, "text-dpi", _tmp6_);
2414
_tmp7_ = simple_scan_get_photo_dpi (self);
2415
g_settings_set_int (self->priv->settings, "photo-dpi", _tmp7_);
2416
_tmp8_ = simple_scan_get_page_side (self);
2417
g_settings_set_enum (self->priv->settings, "page-side", (gint) _tmp8_);
2418
g_settings_set_int (self->priv->settings, "paper-width", paper_width);
2419
g_settings_set_int (self->priv->settings, "paper-height", paper_height);
2420
g_settings_set_int (self->priv->settings, "window-width", self->priv->window_width);
2421
g_settings_set_int (self->priv->settings, "window-height", self->priv->window_height);
2422
g_settings_set_boolean (self->priv->settings, "window-is-maximized", self->priv->window_is_maximized);
2423
g_settings_set_enum (self->priv->settings, "scan-direction", (gint) self->priv->default_page_scan_direction);
2424
g_settings_set_int (self->priv->settings, "page-width", self->priv->default_page_width);
2425
g_settings_set_int (self->priv->settings, "page-height", self->priv->default_page_height);
2426
g_settings_set_int (self->priv->settings, "page-dpi", self->priv->default_page_dpi);
2427
g_signal_emit_by_name (self, "quit");
2434
void G_MODULE_EXPORT quit_menuitem_activate_cb (GtkWidget* widget, SimpleScan* self) {
2435
g_return_if_fail (self != NULL);
2436
g_return_if_fail (widget != NULL);
2437
simple_scan_on_quit (self);
2441
gboolean G_MODULE_EXPORT simple_scan_window_configure_event_cb (GtkWidget* widget, GdkEventConfigure* event, SimpleScan* self) {
2442
gboolean result = FALSE;
2443
g_return_val_if_fail (self != NULL, FALSE);
2444
g_return_val_if_fail (widget != NULL, FALSE);
2445
if (!self->priv->window_is_maximized) {
2446
self->priv->window_width = (*event).width;
2447
self->priv->window_height = (*event).height;
2454
static void simple_scan_info_bar_response_cb (SimpleScan* self, GtkInfoBar* widget, gint response_id) {
2455
g_return_if_fail (self != NULL);
2456
g_return_if_fail (widget != NULL);
2457
if (response_id == 1) {
2458
gtk_widget_grab_focus ((GtkWidget*) self->priv->device_combo);
2459
gtk_window_present ((GtkWindow*) self->priv->preferences_dialog);
2461
self->priv->have_error = FALSE;
2462
_g_free0 (self->priv->error_title);
2463
self->priv->error_title = NULL;
2464
_g_free0 (self->priv->error_text);
2465
self->priv->error_text = NULL;
2466
simple_scan_update_info_bar (self);
2471
gboolean G_MODULE_EXPORT simple_scan_window_window_state_event_cb (GtkWidget* widget, GdkEventWindowState* event, SimpleScan* self) {
2472
gboolean result = FALSE;
2473
g_return_val_if_fail (self != NULL, FALSE);
2474
g_return_val_if_fail (widget != NULL, FALSE);
2475
if (((*event).changed_mask & GDK_WINDOW_STATE_MAXIMIZED) != 0) {
2476
self->priv->window_is_maximized = ((*event).new_window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0;
2483
gboolean G_MODULE_EXPORT window_delete_event_cb (GtkWidget* widget, GdkEvent* event, SimpleScan* self) {
2484
gboolean result = FALSE;
2486
g_return_val_if_fail (self != NULL, FALSE);
2487
g_return_val_if_fail (widget != NULL, FALSE);
2488
g_return_val_if_fail (event != NULL, FALSE);
2489
_tmp0_ = simple_scan_on_quit (self);
2495
static void simple_scan_page_size_changed_cb (SimpleScan* self, Page* page) {
2499
g_return_if_fail (self != NULL);
2500
g_return_if_fail (page != NULL);
2501
_tmp0_ = page_get_width (page);
2502
self->priv->default_page_width = _tmp0_;
2503
_tmp1_ = page_get_height (page);
2504
self->priv->default_page_height = _tmp1_;
2505
_tmp2_ = page_get_dpi (page);
2506
self->priv->default_page_dpi = _tmp2_;
2510
static void simple_scan_page_scan_direction_changed_cb (SimpleScan* self, Page* page) {
2511
ScanDirection _tmp0_;
2512
g_return_if_fail (self != NULL);
2513
g_return_if_fail (page != NULL);
2514
_tmp0_ = page_get_scan_direction (page);
2515
self->priv->default_page_scan_direction = _tmp0_;
2519
static void _simple_scan_page_size_changed_cb_page_size_changed (Page* _sender, gpointer self) {
2520
simple_scan_page_size_changed_cb (self, _sender);
2524
static void _simple_scan_page_scan_direction_changed_cb_page_scan_direction_changed (Page* _sender, gpointer self) {
2525
simple_scan_page_scan_direction_changed_cb (self, _sender);
2529
static void simple_scan_page_added_cb (SimpleScan* self, Book* book, Page* page) {
2533
ScanDirection _tmp3_;
2534
g_return_if_fail (self != NULL);
2535
g_return_if_fail (book != NULL);
2536
g_return_if_fail (page != NULL);
2537
_tmp0_ = page_get_width (page);
2538
self->priv->default_page_width = _tmp0_;
2539
_tmp1_ = page_get_height (page);
2540
self->priv->default_page_height = _tmp1_;
2541
_tmp2_ = page_get_dpi (page);
2542
self->priv->default_page_dpi = _tmp2_;
2543
_tmp3_ = page_get_scan_direction (page);
2544
self->priv->default_page_scan_direction = _tmp3_;
2545
g_signal_connect (page, "size-changed", (GCallback) _simple_scan_page_size_changed_cb_page_size_changed, self);
2546
g_signal_connect (page, "scan-direction-changed", (GCallback) _simple_scan_page_scan_direction_changed_cb_page_scan_direction_changed, self);
2547
simple_scan_update_page_menu (self);
2551
static void simple_scan_page_removed_cb (SimpleScan* self, Book* book, Page* page) {
2553
g_return_if_fail (self != NULL);
2554
g_return_if_fail (book != NULL);
2555
g_return_if_fail (page != NULL);
2556
_tmp0_ = book_get_n_pages (book);
2557
if (_tmp0_ == ((guint) 1)) {
2558
simple_scan_add_default_page (self);
2560
simple_scan_update_page_menu (self);
2564
static void simple_scan_set_dpi_combo (SimpleScan* self, GtkComboBox* combo, gint default_dpi, gint current_dpi) {
2565
GtkCellRendererText* _tmp0_ = NULL;
2566
GtkCellRendererText* renderer;
2567
GtkTreeModel* _tmp1_ = NULL;
2568
GtkListStore* _tmp2_;
2569
GtkListStore* model;
2570
gint* _tmp3_ = NULL;
2571
gint* scan_resolutions;
2572
gint scan_resolutions_length1;
2573
gint _scan_resolutions_size_;
2574
g_return_if_fail (self != NULL);
2575
g_return_if_fail (combo != NULL);
2576
_tmp0_ = (GtkCellRendererText*) gtk_cell_renderer_text_new ();
2577
renderer = g_object_ref_sink (_tmp0_);
2578
gtk_cell_layout_pack_start ((GtkCellLayout*) combo, (GtkCellRenderer*) renderer, TRUE);
2579
gtk_cell_layout_add_attribute ((GtkCellLayout*) combo, (GtkCellRenderer*) renderer, "text", 1);
2580
_tmp1_ = gtk_combo_box_get_model (combo);
2581
_tmp2_ = _g_object_ref0 (GTK_LIST_STORE (_tmp1_));
2583
_tmp3_ = g_new0 (gint, 6);
2590
scan_resolutions = _tmp3_;
2591
scan_resolutions_length1 = 6;
2592
_scan_resolutions_size_ = scan_resolutions_length1;
2594
gint* dpi_collection = NULL;
2595
gint dpi_collection_length1 = 0;
2596
gint _dpi_collection_size_ = 0;
2598
dpi_collection = scan_resolutions;
2599
dpi_collection_length1 = scan_resolutions_length1;
2600
for (dpi_it = 0; dpi_it < scan_resolutions_length1; dpi_it = dpi_it + 1) {
2602
dpi = dpi_collection[dpi_it];
2604
gchar* label = NULL;
2605
GtkTreeIter iter = {0};
2606
GtkTreeIter _tmp12_ = {0};
2607
if (dpi == default_dpi) {
2608
const gchar* _tmp4_ = NULL;
2609
gchar* _tmp5_ = NULL;
2610
_tmp4_ = _ ("%d dpi (default)");
2611
_tmp5_ = g_strdup_printf (_tmp4_, dpi);
2616
const gchar* _tmp6_ = NULL;
2617
gchar* _tmp7_ = NULL;
2618
_tmp6_ = _ ("%d dpi (draft)");
2619
_tmp7_ = g_strdup_printf (_tmp6_, dpi);
2624
const gchar* _tmp8_ = NULL;
2625
gchar* _tmp9_ = NULL;
2626
_tmp8_ = _ ("%d dpi (high resolution)");
2627
_tmp9_ = g_strdup_printf (_tmp8_, dpi);
2631
const gchar* _tmp10_ = NULL;
2632
gchar* _tmp11_ = NULL;
2633
_tmp10_ = _ ("%d dpi");
2634
_tmp11_ = g_strdup_printf (_tmp10_, dpi);
2640
gtk_list_store_append (model, &_tmp12_);
2642
gtk_list_store_set (model, &iter, 0, dpi, 1, label, -1, -1);
2643
if (dpi == current_dpi) {
2644
gtk_combo_box_set_active_iter (combo, &iter);
2650
scan_resolutions = (g_free (scan_resolutions), NULL);
2651
_g_object_unref0 (model);
2652
_g_object_unref0 (renderer);
2656
static void simple_scan_needs_saving_cb (SimpleScan* self, Book* book) {
2660
g_return_if_fail (self != NULL);
2661
g_return_if_fail (book != NULL);
2662
_tmp0_ = book_get_needs_saving (book);
2663
gtk_widget_set_sensitive ((GtkWidget*) self->priv->save_menuitem, _tmp0_);
2664
_tmp1_ = book_get_needs_saving (book);
2665
gtk_widget_set_sensitive ((GtkWidget*) self->priv->save_toolbutton, _tmp1_);
2666
_tmp2_ = book_get_needs_saving (book);
2668
gtk_widget_set_sensitive ((GtkWidget*) self->priv->save_as_menuitem, TRUE);
2673
static void _simple_scan_info_bar_response_cb_gtk_info_bar_response (GtkInfoBar* _sender, gint response_id, gpointer self) {
2674
simple_scan_info_bar_response_cb (self, _sender, response_id);
2678
static void _simple_scan_page_selected_cb_book_view_page_selected (BookView* _sender, Page* page, gpointer self) {
2679
simple_scan_page_selected_cb (self, _sender, page);
2683
static void _simple_scan_show_page_cb_book_view_show_page (BookView* _sender, Page* page, gpointer self) {
2684
simple_scan_show_page_cb (self, _sender, page);
2688
static void _simple_scan_show_page_menu_cb_book_view_show_menu (BookView* _sender, gpointer self) {
2689
simple_scan_show_page_menu_cb (self, _sender);
2693
static void _simple_scan_needs_saving_cb_book_needs_saving_changed (Book* _sender, gpointer self) {
2694
simple_scan_needs_saving_cb (self, _sender);
2698
static void simple_scan_load (SimpleScan* self) {
2699
GtkIconTheme* _tmp0_ = NULL;
2700
GtkBuilder* _tmp1_ = NULL;
2701
gchar* _tmp2_ = NULL;
2703
GObject* _tmp5_ = NULL;
2705
GObject* _tmp7_ = NULL;
2707
GObject* _tmp9_ = NULL;
2708
GtkMenuItem* _tmp10_;
2709
GObject* _tmp11_ = NULL;
2710
GtkMenuItem* _tmp12_;
2711
GObject* _tmp13_ = NULL;
2712
GtkMenuItem* _tmp14_;
2713
GObject* _tmp15_ = NULL;
2714
GtkMenuItem* _tmp16_;
2715
GObject* _tmp17_ = NULL;
2716
GtkMenuItem* _tmp18_;
2717
GObject* _tmp19_ = NULL;
2718
GtkMenuItem* _tmp20_;
2719
GObject* _tmp21_ = NULL;
2720
GtkToolButton* _tmp22_;
2721
GObject* _tmp23_ = NULL;
2722
GtkMenuItem* _tmp24_;
2723
GObject* _tmp25_ = NULL;
2724
GtkToolButton* _tmp26_;
2725
GObject* _tmp27_ = NULL;
2726
GtkRadioMenuItem* _tmp28_;
2727
GObject* _tmp29_ = NULL;
2728
GtkRadioMenuItem* _tmp30_;
2729
GObject* _tmp31_ = NULL;
2730
GtkRadioMenuItem* _tmp32_;
2731
GObject* _tmp33_ = NULL;
2732
GtkRadioMenuItem* _tmp34_;
2733
GObject* _tmp35_ = NULL;
2735
GObject* _tmp37_ = NULL;
2737
GObject* _tmp39_ = NULL;
2739
GObject* _tmp41_ = NULL;
2741
GObject* _tmp43_ = NULL;
2743
GObject* _tmp45_ = NULL;
2744
GtkComboBox* _tmp46_;
2745
GtkTreeModel* _tmp47_ = NULL;
2746
GtkListStore* _tmp48_;
2747
GObject* _tmp49_ = NULL;
2748
GtkComboBox* _tmp50_;
2749
GtkTreeModel* _tmp51_ = NULL;
2750
GtkListStore* _tmp52_;
2751
GObject* _tmp53_ = NULL;
2752
GtkComboBox* _tmp54_;
2753
GtkTreeModel* _tmp55_ = NULL;
2754
GtkListStore* _tmp56_;
2755
GObject* _tmp57_ = NULL;
2756
GtkComboBox* _tmp58_;
2757
GtkTreeModel* _tmp59_ = NULL;
2758
GtkListStore* _tmp60_;
2759
GObject* _tmp61_ = NULL;
2760
GtkComboBox* _tmp62_;
2761
GtkTreeModel* _tmp63_ = NULL;
2762
GtkListStore* _tmp64_;
2763
GtkInfoBar* _tmp65_ = NULL;
2764
GtkHBox* _tmp66_ = NULL;
2766
GtkWidget* _tmp67_ = NULL;
2767
GtkContainer* _tmp68_;
2768
GtkContainer* content_area;
2769
GtkImage* _tmp69_ = NULL;
2770
GtkLabel* _tmp70_ = NULL;
2771
GtkWidget* _tmp71_ = NULL;
2773
const gchar* _tmp73_ = NULL;
2774
GtkWidget* _tmp74_ = NULL;
2776
GtkTreeIter iter = {0};
2777
GtkTreeIter _tmp76_ = {0};
2778
const gchar* _tmp77_ = NULL;
2779
GtkTreeIter _tmp78_ = {0};
2780
GtkTreeIter _tmp79_ = {0};
2781
GtkTreeIter _tmp80_ = {0};
2782
GtkTreeIter _tmp81_ = {0};
2783
GtkTreeIter _tmp82_ = {0};
2784
GtkTreeIter _tmp83_ = {0};
2788
GtkCellRendererText* _tmp86_ = NULL;
2789
GtkCellRendererText* renderer;
2790
GtkCellRendererText* _tmp87_ = NULL;
2792
GtkCellRendererText* _tmp89_ = NULL;
2797
gchar* _tmp92_ = NULL;
2799
gchar* _tmp95_ = NULL;
2800
gchar* document_type;
2801
BookView* _tmp96_ = NULL;
2810
GError * _inner_error_ = NULL;
2811
g_return_if_fail (self != NULL);
2812
_tmp0_ = gtk_icon_theme_get_default ();
2813
gtk_icon_theme_append_search_path (_tmp0_, ICON_DIR);
2814
gtk_window_set_default_icon_name ("scanner");
2815
_tmp1_ = gtk_builder_new ();
2816
_g_object_unref0 (self->priv->builder);
2817
self->priv->builder = _tmp1_;
2818
_tmp2_ = g_build_filename (UI_DIR, "simple-scan.ui", NULL, NULL);
2821
gtk_builder_add_from_file (self->priv->builder, filename, &_inner_error_);
2822
if (_inner_error_ != NULL) {
2823
goto __catch16_g_error;
2830
const gchar* _tmp3_ = NULL;
2831
const gchar* _tmp4_ = NULL;
2833
_inner_error_ = NULL;
2834
g_critical ("ui.vala:1261: Unable to load UI %s: %s\n", filename, e->message);
2835
_tmp3_ = _ ("Files missing");
2836
_tmp4_ = _ ("Please check your installation");
2837
simple_scan_show_error_dialog (self, _tmp3_, _tmp4_);
2838
exit (EXIT_FAILURE);
2842
if (_inner_error_ != NULL) {
2843
_g_free0 (filename);
2844
g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
2845
g_clear_error (&_inner_error_);
2848
gtk_builder_connect_signals (self->priv->builder, self);
2849
_tmp5_ = gtk_builder_get_object (self->priv->builder, "simple_scan_window");
2850
_tmp6_ = _g_object_ref0 (GTK_WINDOW (_tmp5_));
2851
_g_object_unref0 (self->priv->window);
2852
self->priv->window = _tmp6_;
2853
_tmp7_ = gtk_builder_get_object (self->priv->builder, "main_vbox");
2854
_tmp8_ = _g_object_ref0 (GTK_VBOX (_tmp7_));
2855
_g_object_unref0 (self->priv->main_vbox);
2856
self->priv->main_vbox = _tmp8_;
2857
_tmp9_ = gtk_builder_get_object (self->priv->builder, "page_move_left_menuitem");
2858
_tmp10_ = _g_object_ref0 (GTK_MENU_ITEM (_tmp9_));
2859
_g_object_unref0 (self->priv->page_move_left_menuitem);
2860
self->priv->page_move_left_menuitem = _tmp10_;
2861
_tmp11_ = gtk_builder_get_object (self->priv->builder, "page_move_right_menuitem");
2862
_tmp12_ = _g_object_ref0 (GTK_MENU_ITEM (_tmp11_));
2863
_g_object_unref0 (self->priv->page_move_right_menuitem);
2864
self->priv->page_move_right_menuitem = _tmp12_;
2865
_tmp13_ = gtk_builder_get_object (self->priv->builder, "page_delete_menuitem");
2866
_tmp14_ = _g_object_ref0 (GTK_MENU_ITEM (_tmp13_));
2867
_g_object_unref0 (self->priv->page_delete_menuitem);
2868
self->priv->page_delete_menuitem = _tmp14_;
2869
_tmp15_ = gtk_builder_get_object (self->priv->builder, "crop_rotate_menuitem");
2870
_tmp16_ = _g_object_ref0 (GTK_MENU_ITEM (_tmp15_));
2871
_g_object_unref0 (self->priv->crop_rotate_menuitem);
2872
self->priv->crop_rotate_menuitem = _tmp16_;
2873
_tmp17_ = gtk_builder_get_object (self->priv->builder, "save_menuitem");
2874
_tmp18_ = _g_object_ref0 (GTK_MENU_ITEM (_tmp17_));
2875
_g_object_unref0 (self->priv->save_menuitem);
2876
self->priv->save_menuitem = _tmp18_;
2877
_tmp19_ = gtk_builder_get_object (self->priv->builder, "save_as_menuitem");
2878
_tmp20_ = _g_object_ref0 (GTK_MENU_ITEM (_tmp19_));
2879
_g_object_unref0 (self->priv->save_as_menuitem);
2880
self->priv->save_as_menuitem = _tmp20_;
2881
_tmp21_ = gtk_builder_get_object (self->priv->builder, "save_toolbutton");
2882
_tmp22_ = _g_object_ref0 (GTK_TOOL_BUTTON (_tmp21_));
2883
_g_object_unref0 (self->priv->save_toolbutton);
2884
self->priv->save_toolbutton = _tmp22_;
2885
_tmp23_ = gtk_builder_get_object (self->priv->builder, "stop_scan_menuitem");
2886
_tmp24_ = _g_object_ref0 (GTK_MENU_ITEM (_tmp23_));
2887
_g_object_unref0 (self->priv->stop_menuitem);
2888
self->priv->stop_menuitem = _tmp24_;
2889
_tmp25_ = gtk_builder_get_object (self->priv->builder, "stop_toolbutton");
2890
_tmp26_ = _g_object_ref0 (GTK_TOOL_BUTTON (_tmp25_));
2891
_g_object_unref0 (self->priv->stop_toolbutton);
2892
self->priv->stop_toolbutton = _tmp26_;
2893
_tmp27_ = gtk_builder_get_object (self->priv->builder, "text_toolbutton_menuitem");
2894
_tmp28_ = _g_object_ref0 (GTK_RADIO_MENU_ITEM (_tmp27_));
2895
_g_object_unref0 (self->priv->text_toolbar_menuitem);
2896
self->priv->text_toolbar_menuitem = _tmp28_;
2897
_tmp29_ = gtk_builder_get_object (self->priv->builder, "text_menuitem");
2898
_tmp30_ = _g_object_ref0 (GTK_RADIO_MENU_ITEM (_tmp29_));
2899
_g_object_unref0 (self->priv->text_menu_menuitem);
2900
self->priv->text_menu_menuitem = _tmp30_;
2901
_tmp31_ = gtk_builder_get_object (self->priv->builder, "photo_toolbutton_menuitem");
2902
_tmp32_ = _g_object_ref0 (GTK_RADIO_MENU_ITEM (_tmp31_));
2903
_g_object_unref0 (self->priv->photo_toolbar_menuitem);
2904
self->priv->photo_toolbar_menuitem = _tmp32_;
2905
_tmp33_ = gtk_builder_get_object (self->priv->builder, "photo_menuitem");
2906
_tmp34_ = _g_object_ref0 (GTK_RADIO_MENU_ITEM (_tmp33_));
2907
_g_object_unref0 (self->priv->photo_menu_menuitem);
2908
self->priv->photo_menu_menuitem = _tmp34_;
2909
_tmp35_ = gtk_builder_get_object (self->priv->builder, "authorize_dialog");
2910
_tmp36_ = _g_object_ref0 (GTK_DIALOG (_tmp35_));
2911
_g_object_unref0 (self->priv->authorize_dialog);
2912
self->priv->authorize_dialog = _tmp36_;
2913
_tmp37_ = gtk_builder_get_object (self->priv->builder, "authorize_label");
2914
_tmp38_ = _g_object_ref0 (GTK_LABEL (_tmp37_));
2915
_g_object_unref0 (self->priv->authorize_label);
2916
self->priv->authorize_label = _tmp38_;
2917
_tmp39_ = gtk_builder_get_object (self->priv->builder, "username_entry");
2918
_tmp40_ = _g_object_ref0 (GTK_ENTRY (_tmp39_));
2919
_g_object_unref0 (self->priv->username_entry);
2920
self->priv->username_entry = _tmp40_;
2921
_tmp41_ = gtk_builder_get_object (self->priv->builder, "password_entry");
2922
_tmp42_ = _g_object_ref0 (GTK_ENTRY (_tmp41_));
2923
_g_object_unref0 (self->priv->password_entry);
2924
self->priv->password_entry = _tmp42_;
2925
_tmp43_ = gtk_builder_get_object (self->priv->builder, "preferences_dialog");
2926
_tmp44_ = _g_object_ref0 (GTK_DIALOG (_tmp43_));
2927
_g_object_unref0 (self->priv->preferences_dialog);
2928
self->priv->preferences_dialog = _tmp44_;
2929
_tmp45_ = gtk_builder_get_object (self->priv->builder, "device_combo");
2930
_tmp46_ = _g_object_ref0 (GTK_COMBO_BOX (_tmp45_));
2931
_g_object_unref0 (self->priv->device_combo);
2932
self->priv->device_combo = _tmp46_;
2933
_tmp47_ = gtk_combo_box_get_model (self->priv->device_combo);
2934
_tmp48_ = _g_object_ref0 (GTK_LIST_STORE (_tmp47_));
2935
_g_object_unref0 (self->priv->device_model);
2936
self->priv->device_model = _tmp48_;
2937
_tmp49_ = gtk_builder_get_object (self->priv->builder, "text_dpi_combo");
2938
_tmp50_ = _g_object_ref0 (GTK_COMBO_BOX (_tmp49_));
2939
_g_object_unref0 (self->priv->text_dpi_combo);
2940
self->priv->text_dpi_combo = _tmp50_;
2941
_tmp51_ = gtk_combo_box_get_model (self->priv->text_dpi_combo);
2942
_tmp52_ = _g_object_ref0 (GTK_LIST_STORE (_tmp51_));
2943
_g_object_unref0 (self->priv->text_dpi_model);
2944
self->priv->text_dpi_model = _tmp52_;
2945
_tmp53_ = gtk_builder_get_object (self->priv->builder, "photo_dpi_combo");
2946
_tmp54_ = _g_object_ref0 (GTK_COMBO_BOX (_tmp53_));
2947
_g_object_unref0 (self->priv->photo_dpi_combo);
2948
self->priv->photo_dpi_combo = _tmp54_;
2949
_tmp55_ = gtk_combo_box_get_model (self->priv->photo_dpi_combo);
2950
_tmp56_ = _g_object_ref0 (GTK_LIST_STORE (_tmp55_));
2951
_g_object_unref0 (self->priv->photo_dpi_model);
2952
self->priv->photo_dpi_model = _tmp56_;
2953
_tmp57_ = gtk_builder_get_object (self->priv->builder, "page_side_combo");
2954
_tmp58_ = _g_object_ref0 (GTK_COMBO_BOX (_tmp57_));
2955
_g_object_unref0 (self->priv->page_side_combo);
2956
self->priv->page_side_combo = _tmp58_;
2957
_tmp59_ = gtk_combo_box_get_model (self->priv->page_side_combo);
2958
_tmp60_ = _g_object_ref0 (GTK_LIST_STORE (_tmp59_));
2959
_g_object_unref0 (self->priv->page_side_model);
2960
self->priv->page_side_model = _tmp60_;
2961
_tmp61_ = gtk_builder_get_object (self->priv->builder, "paper_size_combo");
2962
_tmp62_ = _g_object_ref0 (GTK_COMBO_BOX (_tmp61_));
2963
_g_object_unref0 (self->priv->paper_size_combo);
2964
self->priv->paper_size_combo = _tmp62_;
2965
_tmp63_ = gtk_combo_box_get_model (self->priv->paper_size_combo);
2966
_tmp64_ = _g_object_ref0 (GTK_LIST_STORE (_tmp63_));
2967
_g_object_unref0 (self->priv->paper_size_model);
2968
self->priv->paper_size_model = _tmp64_;
2969
_tmp65_ = (GtkInfoBar*) gtk_info_bar_new ();
2970
_g_object_unref0 (self->priv->info_bar);
2971
self->priv->info_bar = g_object_ref_sink (_tmp65_);
2972
g_signal_connect (self->priv->info_bar, "response", (GCallback) _simple_scan_info_bar_response_cb_gtk_info_bar_response, self);
2973
gtk_box_pack_start ((GtkBox*) self->priv->main_vbox, (GtkWidget*) self->priv->info_bar, FALSE, TRUE, (guint) 0);
2974
_tmp66_ = (GtkHBox*) gtk_hbox_new (FALSE, 12);
2975
hbox = g_object_ref_sink (_tmp66_);
2976
_tmp67_ = gtk_info_bar_get_content_area (self->priv->info_bar);
2977
_tmp68_ = _g_object_ref0 (GTK_CONTAINER (_tmp67_));
2978
content_area = _tmp68_;
2979
gtk_container_add (content_area, (GtkWidget*) hbox);
2980
gtk_widget_show ((GtkWidget*) hbox);
2981
_tmp69_ = (GtkImage*) gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
2982
_g_object_unref0 (self->priv->info_bar_image);
2983
self->priv->info_bar_image = g_object_ref_sink (_tmp69_);
2984
gtk_box_pack_start ((GtkBox*) hbox, (GtkWidget*) self->priv->info_bar_image, FALSE, TRUE, (guint) 0);
2985
gtk_widget_show ((GtkWidget*) self->priv->info_bar_image);
2986
_tmp70_ = (GtkLabel*) gtk_label_new (NULL);
2987
_g_object_unref0 (self->priv->info_bar_label);
2988
self->priv->info_bar_label = g_object_ref_sink (_tmp70_);
2989
gtk_misc_set_alignment ((GtkMisc*) self->priv->info_bar_label, 0.0f, 0.5f);
2990
gtk_box_pack_start ((GtkBox*) hbox, (GtkWidget*) self->priv->info_bar_label, TRUE, TRUE, (guint) 0);
2991
gtk_widget_show ((GtkWidget*) self->priv->info_bar_label);
2992
_tmp71_ = gtk_info_bar_add_button (self->priv->info_bar, GTK_STOCK_CLOSE, (gint) GTK_RESPONSE_CLOSE);
2993
_tmp72_ = _g_object_ref0 (GTK_BUTTON (_tmp71_));
2994
_g_object_unref0 (self->priv->info_bar_close_button);
2995
self->priv->info_bar_close_button = _tmp72_;
2996
_tmp73_ = _ ("Change _Scanner");
2997
_tmp74_ = gtk_info_bar_add_button (self->priv->info_bar, _tmp73_, 1);
2998
_tmp75_ = _g_object_ref0 (GTK_BUTTON (_tmp74_));
2999
_g_object_unref0 (self->priv->info_bar_change_scanner_button);
3000
self->priv->info_bar_change_scanner_button = _tmp75_;
3001
gtk_list_store_append (self->priv->paper_size_model, &_tmp76_);
3003
_tmp77_ = _ ("Automatic");
3004
gtk_list_store_set (self->priv->paper_size_model, &iter, 0, 0, 1, 0, 2, _tmp77_, -1, -1);
3005
gtk_list_store_append (self->priv->paper_size_model, &_tmp78_);
3007
gtk_list_store_set (self->priv->paper_size_model, &iter, 0, 1050, 1, 1480, 2, "A6", -1, -1);
3008
gtk_list_store_append (self->priv->paper_size_model, &_tmp79_);
3010
gtk_list_store_set (self->priv->paper_size_model, &iter, 0, 1480, 1, 2100, 2, "A5", -1, -1);
3011
gtk_list_store_append (self->priv->paper_size_model, &_tmp80_);
3013
gtk_list_store_set (self->priv->paper_size_model, &iter, 0, 2100, 1, 2970, 2, "A4", -1, -1);
3014
gtk_list_store_append (self->priv->paper_size_model, &_tmp81_);
3016
gtk_list_store_set (self->priv->paper_size_model, &iter, 0, 2159, 1, 2794, 2, "Letter", -1, -1);
3017
gtk_list_store_append (self->priv->paper_size_model, &_tmp82_);
3019
gtk_list_store_set (self->priv->paper_size_model, &iter, 0, 2159, 1, 3556, 2, "Legal", -1, -1);
3020
gtk_list_store_append (self->priv->paper_size_model, &_tmp83_);
3022
gtk_list_store_set (self->priv->paper_size_model, &iter, 0, 1016, 1, 1524, 2, "4×6", -1, -1);
3023
_tmp84_ = g_settings_get_int (self->priv->settings, "text-dpi");
3026
dpi = SIMPLE_SCAN_DEFAULT_TEXT_DPI;
3028
simple_scan_set_dpi_combo (self, self->priv->text_dpi_combo, SIMPLE_SCAN_DEFAULT_TEXT_DPI, dpi);
3029
_tmp85_ = g_settings_get_int (self->priv->settings, "photo-dpi");
3032
dpi = SIMPLE_SCAN_DEFAULT_PHOTO_DPI;
3034
simple_scan_set_dpi_combo (self, self->priv->photo_dpi_combo, SIMPLE_SCAN_DEFAULT_PHOTO_DPI, dpi);
3035
_tmp86_ = (GtkCellRendererText*) gtk_cell_renderer_text_new ();
3036
renderer = g_object_ref_sink (_tmp86_);
3037
gtk_cell_layout_pack_start ((GtkCellLayout*) self->priv->device_combo, (GtkCellRenderer*) renderer, TRUE);
3038
gtk_cell_layout_add_attribute ((GtkCellLayout*) self->priv->device_combo, (GtkCellRenderer*) renderer, "text", 1);
3039
_tmp87_ = (GtkCellRendererText*) gtk_cell_renderer_text_new ();
3040
_g_object_unref0 (renderer);
3041
renderer = g_object_ref_sink (_tmp87_);
3042
gtk_cell_layout_pack_start ((GtkCellLayout*) self->priv->page_side_combo, (GtkCellRenderer*) renderer, TRUE);
3043
gtk_cell_layout_add_attribute ((GtkCellLayout*) self->priv->page_side_combo, (GtkCellRenderer*) renderer, "text", 1);
3044
_tmp88_ = g_settings_get_enum (self->priv->settings, "page-side");
3045
simple_scan_set_page_side (self, (ScanType) _tmp88_);
3046
_tmp89_ = (GtkCellRendererText*) gtk_cell_renderer_text_new ();
3047
_g_object_unref0 (renderer);
3048
renderer = g_object_ref_sink (_tmp89_);
3049
gtk_cell_layout_pack_start ((GtkCellLayout*) self->priv->paper_size_combo, (GtkCellRenderer*) renderer, TRUE);
3050
gtk_cell_layout_add_attribute ((GtkCellLayout*) self->priv->paper_size_combo, (GtkCellRenderer*) renderer, "text", 2);
3051
_tmp90_ = g_settings_get_int (self->priv->settings, "paper-width");
3052
paper_width = _tmp90_;
3053
_tmp91_ = g_settings_get_int (self->priv->settings, "paper-height");
3054
paper_height = _tmp91_;
3055
simple_scan_set_paper_size (self, paper_width, paper_height);
3056
_tmp92_ = g_settings_get_string (self->priv->settings, "selected-device");
3058
if (device != NULL) {
3059
GtkTreeIter _tmp93_ = {0};
3061
_tmp94_ = simple_scan_find_scan_device (self, device, &_tmp93_);
3064
gtk_combo_box_set_active_iter (self->priv->device_combo, &iter);
3067
_tmp95_ = g_settings_get_string (self->priv->settings, "document-type");
3068
document_type = _tmp95_;
3069
if (document_type != NULL) {
3070
simple_scan_set_document_hint (self, document_type);
3072
_tmp96_ = book_view_new (self->priv->book);
3073
_g_object_unref0 (self->priv->book_view);
3074
self->priv->book_view = g_object_ref_sink (_tmp96_);
3075
gtk_container_set_border_width ((GtkContainer*) self->priv->book_view, (guint) 18);
3076
gtk_box_pack_end ((GtkBox*) self->priv->main_vbox, (GtkWidget*) self->priv->book_view, TRUE, TRUE, (guint) 0);
3077
g_signal_connect (self->priv->book_view, "page-selected", (GCallback) _simple_scan_page_selected_cb_book_view_page_selected, self);
3078
g_signal_connect (self->priv->book_view, "show-page", (GCallback) _simple_scan_show_page_cb_book_view_show_page, self);
3079
g_signal_connect (self->priv->book_view, "show-menu", (GCallback) _simple_scan_show_page_menu_cb_book_view_show_menu, self);
3080
gtk_widget_show ((GtkWidget*) self->priv->book_view);
3081
_tmp97_ = g_settings_get_enum (self->priv->settings, "scan-direction");
3082
self->priv->default_page_scan_direction = (ScanDirection) _tmp97_;
3083
_tmp98_ = g_settings_get_int (self->priv->settings, "page-width");
3084
self->priv->default_page_width = _tmp98_;
3085
if (self->priv->default_page_width <= 0) {
3086
self->priv->default_page_width = 595;
3088
_tmp99_ = g_settings_get_int (self->priv->settings, "page-height");
3089
self->priv->default_page_height = _tmp99_;
3090
if (self->priv->default_page_height <= 0) {
3091
self->priv->default_page_height = 842;
3093
_tmp100_ = g_settings_get_int (self->priv->settings, "page-dpi");
3094
self->priv->default_page_dpi = _tmp100_;
3095
if (self->priv->default_page_dpi <= 0) {
3096
self->priv->default_page_dpi = 72;
3098
_tmp101_ = g_settings_get_int (self->priv->settings, "window-width");
3099
self->priv->window_width = _tmp101_;
3100
if (self->priv->window_width <= 0) {
3101
self->priv->window_width = 600;
3103
_tmp102_ = g_settings_get_int (self->priv->settings, "window-height");
3104
self->priv->window_height = _tmp102_;
3105
if (self->priv->window_height <= 0) {
3106
self->priv->window_height = 400;
3108
g_debug ("ui.vala:1407: Restoring window to %dx%d pixels", self->priv->window_width, self->priv->window_height);
3109
gtk_window_set_default_size (self->priv->window, self->priv->window_width, self->priv->window_height);
3110
_tmp103_ = g_settings_get_boolean (self->priv->settings, "window-is-maximized");
3111
self->priv->window_is_maximized = _tmp103_;
3112
if (self->priv->window_is_maximized) {
3113
g_debug ("ui.vala:1412: Restoring window to maximized");
3114
gtk_window_maximize (self->priv->window);
3116
_tmp104_ = book_get_n_pages (self->priv->book);
3117
if (_tmp104_ == ((guint) 0)) {
3118
simple_scan_add_default_page (self);
3120
book_set_needs_saving (self->priv->book, FALSE);
3121
g_signal_connect (self->priv->book, "needs-saving-changed", (GCallback) _simple_scan_needs_saving_cb_book_needs_saving_changed, self);
3122
_g_free0 (document_type);
3124
_g_object_unref0 (renderer);
3125
_g_object_unref0 (content_area);
3126
_g_object_unref0 (hbox);
3127
_g_free0 (filename);
3131
static gpointer _book_ref0 (gpointer self) {
3132
return self ? book_ref (self) : NULL;
3136
Book* simple_scan_get_book (SimpleScan* self) {
3137
Book* result = NULL;
3139
g_return_val_if_fail (self != NULL, NULL);
3140
_tmp0_ = _book_ref0 (self->priv->book);
3146
void simple_scan_set_selected_page (SimpleScan* self, Page* page) {
3147
g_return_if_fail (self != NULL);
3148
g_return_if_fail (page != NULL);
3149
book_view_select_page (self->priv->book_view, page);
3153
Page* simple_scan_get_selected_page (SimpleScan* self) {
3154
Page* result = NULL;
3155
Page* _tmp0_ = NULL;
3156
g_return_val_if_fail (self != NULL, NULL);
3157
_tmp0_ = book_view_get_selected (self->priv->book_view);
3163
void simple_scan_set_scanning (SimpleScan* self, gboolean scanning) {
3164
g_return_if_fail (self != NULL);
3165
self->priv->scanning = scanning;
3166
gtk_widget_set_sensitive ((GtkWidget*) self->priv->page_delete_menuitem, !scanning);
3167
gtk_widget_set_sensitive ((GtkWidget*) self->priv->stop_menuitem, scanning);
3168
gtk_widget_set_sensitive ((GtkWidget*) self->priv->stop_toolbutton, scanning);
3172
void simple_scan_show_error (SimpleScan* self, const gchar* error_title, const gchar* error_text, gboolean change_scanner_hint) {
3175
g_return_if_fail (self != NULL);
3176
g_return_if_fail (error_title != NULL);
3177
g_return_if_fail (error_text != NULL);
3178
self->priv->have_error = TRUE;
3179
_tmp0_ = g_strdup (error_title);
3180
_g_free0 (self->priv->error_title);
3181
self->priv->error_title = _tmp0_;
3182
_tmp1_ = g_strdup (error_text);
3183
_g_free0 (self->priv->error_text);
3184
self->priv->error_text = _tmp1_;
3185
self->priv->error_change_scanner_hint = change_scanner_hint;
3186
simple_scan_update_info_bar (self);
3190
void simple_scan_start (SimpleScan* self) {
3191
g_return_if_fail (self != NULL);
3192
gtk_widget_show ((GtkWidget*) self->priv->window);
3196
static void g_cclosure_user_marshal_VOID__STRING_SCAN_OPTIONS (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
3197
typedef void (*GMarshalFunc_VOID__STRING_SCAN_OPTIONS) (gpointer data1, const char* arg_1, gpointer arg_2, gpointer data2);
3198
register GMarshalFunc_VOID__STRING_SCAN_OPTIONS callback;
3199
register GCClosure * cc;
3200
register gpointer data1;
3201
register gpointer data2;
3202
cc = (GCClosure *) closure;
3203
g_return_if_fail (n_param_values == 3);
3204
if (G_CCLOSURE_SWAP_DATA (closure)) {
3205
data1 = closure->data;
3206
data2 = param_values->data[0].v_pointer;
3208
data1 = param_values->data[0].v_pointer;
3209
data2 = closure->data;
3211
callback = (GMarshalFunc_VOID__STRING_SCAN_OPTIONS) (marshal_data ? marshal_data : cc->callback);
3212
callback (data1, g_value_get_string (param_values + 1), value_get_scan_options (param_values + 2), data2);
3216
static void value_simple_scan_init (GValue* value) {
3217
value->data[0].v_pointer = NULL;
3221
static void value_simple_scan_free_value (GValue* value) {
3222
if (value->data[0].v_pointer) {
3223
simple_scan_unref (value->data[0].v_pointer);
3228
static void value_simple_scan_copy_value (const GValue* src_value, GValue* dest_value) {
3229
if (src_value->data[0].v_pointer) {
3230
dest_value->data[0].v_pointer = simple_scan_ref (src_value->data[0].v_pointer);
3232
dest_value->data[0].v_pointer = NULL;
3237
static gpointer value_simple_scan_peek_pointer (const GValue* value) {
3238
return value->data[0].v_pointer;
3242
static gchar* value_simple_scan_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
3243
if (collect_values[0].v_pointer) {
3245
object = collect_values[0].v_pointer;
3246
if (object->parent_instance.g_class == NULL) {
3247
return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
3248
} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
3249
return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
3251
value->data[0].v_pointer = simple_scan_ref (object);
3253
value->data[0].v_pointer = NULL;
3259
static gchar* value_simple_scan_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
3260
SimpleScan** object_p;
3261
object_p = collect_values[0].v_pointer;
3263
return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
3265
if (!value->data[0].v_pointer) {
3267
} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
3268
*object_p = value->data[0].v_pointer;
3270
*object_p = simple_scan_ref (value->data[0].v_pointer);
3276
GParamSpec* param_spec_simple_scan (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
3277
ParamSpecSimpleScan* spec;
3278
g_return_val_if_fail (g_type_is_a (object_type, TYPE_SIMPLE_SCAN), NULL);
3279
spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
3280
G_PARAM_SPEC (spec)->value_type = object_type;
3281
return G_PARAM_SPEC (spec);
3285
gpointer value_get_simple_scan (const GValue* value) {
3286
g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SIMPLE_SCAN), NULL);
3287
return value->data[0].v_pointer;
3291
void value_set_simple_scan (GValue* value, gpointer v_object) {
3293
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SIMPLE_SCAN));
3294
old = value->data[0].v_pointer;
3296
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SIMPLE_SCAN));
3297
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
3298
value->data[0].v_pointer = v_object;
3299
simple_scan_ref (value->data[0].v_pointer);
3301
value->data[0].v_pointer = NULL;
3304
simple_scan_unref (old);
3309
void value_take_simple_scan (GValue* value, gpointer v_object) {
3311
g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_SIMPLE_SCAN));
3312
old = value->data[0].v_pointer;
3314
g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_SIMPLE_SCAN));
3315
g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
3316
value->data[0].v_pointer = v_object;
3318
value->data[0].v_pointer = NULL;
3321
simple_scan_unref (old);
3326
static void simple_scan_class_init (SimpleScanClass * klass) {
3327
simple_scan_parent_class = g_type_class_peek_parent (klass);
3328
SIMPLE_SCAN_CLASS (klass)->finalize = simple_scan_finalize;
3329
g_type_class_add_private (klass, sizeof (SimpleScanPrivate));
3330
g_signal_new ("start_scan", TYPE_SIMPLE_SCAN, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__STRING_SCAN_OPTIONS, G_TYPE_NONE, 2, G_TYPE_STRING, TYPE_SCAN_OPTIONS);
3331
g_signal_new ("stop_scan", TYPE_SIMPLE_SCAN, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
3332
g_signal_new ("email", TYPE_SIMPLE_SCAN, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING);
3333
g_signal_new ("quit", TYPE_SIMPLE_SCAN, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
3337
static void simple_scan_instance_init (SimpleScan * self) {
3339
const gchar* _tmp1_ = NULL;
3341
self->priv = SIMPLE_SCAN_GET_PRIVATE (self);
3342
self->priv->book_uri = NULL;
3343
_tmp0_ = g_strdup ("photo");
3344
self->priv->document_hint = _tmp0_;
3345
_tmp1_ = _ ("Scanned Document.pdf");
3346
_tmp2_ = g_strdup (_tmp1_);
3347
self->priv->default_file_name = _tmp2_;
3348
self->priv->scanning = FALSE;
3349
self->ref_count = 1;
3353
static void simple_scan_finalize (SimpleScan* obj) {
3355
self = SIMPLE_SCAN (obj);
3356
_g_object_unref0 (self->priv->settings);
3357
_g_object_unref0 (self->priv->builder);
3358
_g_object_unref0 (self->priv->window);
3359
_g_object_unref0 (self->priv->main_vbox);
3360
_g_object_unref0 (self->priv->info_bar);
3361
_g_object_unref0 (self->priv->info_bar_image);
3362
_g_object_unref0 (self->priv->info_bar_label);
3363
_g_object_unref0 (self->priv->info_bar_close_button);
3364
_g_object_unref0 (self->priv->info_bar_change_scanner_button);
3365
_g_object_unref0 (self->priv->page_move_left_menuitem);
3366
_g_object_unref0 (self->priv->page_move_right_menuitem);
3367
_g_object_unref0 (self->priv->page_delete_menuitem);
3368
_g_object_unref0 (self->priv->crop_rotate_menuitem);
3369
_g_object_unref0 (self->priv->save_menuitem);
3370
_g_object_unref0 (self->priv->save_as_menuitem);
3371
_g_object_unref0 (self->priv->save_toolbutton);
3372
_g_object_unref0 (self->priv->stop_menuitem);
3373
_g_object_unref0 (self->priv->stop_toolbutton);
3374
_g_object_unref0 (self->priv->text_toolbar_menuitem);
3375
_g_object_unref0 (self->priv->text_menu_menuitem);
3376
_g_object_unref0 (self->priv->photo_toolbar_menuitem);
3377
_g_object_unref0 (self->priv->photo_menu_menuitem);
3378
_g_object_unref0 (self->priv->authorize_dialog);
3379
_g_object_unref0 (self->priv->authorize_label);
3380
_g_object_unref0 (self->priv->username_entry);
3381
_g_object_unref0 (self->priv->password_entry);
3382
_g_object_unref0 (self->priv->preferences_dialog);
3383
_g_object_unref0 (self->priv->device_combo);
3384
_g_object_unref0 (self->priv->text_dpi_combo);
3385
_g_object_unref0 (self->priv->photo_dpi_combo);
3386
_g_object_unref0 (self->priv->page_side_combo);
3387
_g_object_unref0 (self->priv->paper_size_combo);
3388
_g_object_unref0 (self->priv->device_model);
3389
_g_object_unref0 (self->priv->text_dpi_model);
3390
_g_object_unref0 (self->priv->photo_dpi_model);
3391
_g_object_unref0 (self->priv->page_side_model);
3392
_g_object_unref0 (self->priv->paper_size_model);
3393
_g_object_unref0 (self->priv->save_dialog);
3394
_g_free0 (self->priv->error_title);
3395
_g_free0 (self->priv->error_text);
3396
_book_unref0 (self->priv->book);
3397
_g_free0 (self->priv->book_uri);
3398
_g_object_unref0 (self->priv->book_view);
3399
_g_free0 (self->priv->document_hint);
3400
_g_free0 (self->priv->default_file_name);
3404
GType simple_scan_get_type (void) {
3405
static volatile gsize simple_scan_type_id__volatile = 0;
3406
if (g_once_init_enter (&simple_scan_type_id__volatile)) {
3407
static const GTypeValueTable g_define_type_value_table = { value_simple_scan_init, value_simple_scan_free_value, value_simple_scan_copy_value, value_simple_scan_peek_pointer, "p", value_simple_scan_collect_value, "p", value_simple_scan_lcopy_value };
3408
static const GTypeInfo g_define_type_info = { sizeof (SimpleScanClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) simple_scan_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (SimpleScan), 0, (GInstanceInitFunc) simple_scan_instance_init, &g_define_type_value_table };
3409
static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
3410
GType simple_scan_type_id;
3411
simple_scan_type_id = g_type_register_fundamental (g_type_fundamental_next (), "SimpleScan", &g_define_type_info, &g_define_type_fundamental_info, 0);
3412
g_once_init_leave (&simple_scan_type_id__volatile, simple_scan_type_id);
3414
return simple_scan_type_id__volatile;
3418
gpointer simple_scan_ref (gpointer instance) {
3421
g_atomic_int_inc (&self->ref_count);
3426
void simple_scan_unref (gpointer instance) {
3429
if (g_atomic_int_dec_and_test (&self->ref_count)) {
3430
SIMPLE_SCAN_GET_CLASS (self)->finalize (self);
3431
g_type_free_instance ((GTypeInstance *) self);
3436
static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) {
3437
if ((array != NULL) && (destroy_func != NULL)) {
3439
for (i = 0; i < array_length; i = i + 1) {
3440
if (((gpointer*) array)[i] != NULL) {
3441
destroy_func (((gpointer*) array)[i]);
3448
static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) {
3449
_vala_array_destroy (array, array_length, destroy_func);