Commit 8b14b368 authored by Bartosz's avatar Bartosz
Browse files

Allow scan double side of single page if Flatbed is not found

With previous implementation the Scan Single Page
was working only in case the Flatbed is detected.
It seems that for ADF only scanners, scanning Single Page
could be also useful. Unfortunately simple-scan is scanning
only front page. With this commit it is possible to scan
Single Page with both sides on ADF only scanner.

Fixes #188
parent 95b16845
Pipeline #277007 passed with stage
in 18 minutes and 49 seconds
......@@ -849,8 +849,7 @@ public class AppWindow : Hdy.ApplicationWindow
private void scan_adf_cb ()
{
var options = make_scan_options ();
options.type = ScanType.ADF_BOTH;
options.type = preferences_dialog.get_page_side ();
options.type = ScanType.ADF;
scan (options);
}
......@@ -906,7 +905,7 @@ public class AppWindow : Hdy.ApplicationWindow
scan_single_radio.active = true;
scan_options_image.icon_name = "scanner-symbolic";
break;
case ScanType.ADF_BOTH:
case ScanType.ADF:
scan_adf_radio.active = true;
scan_options_image.icon_name = "scan-type-adf-symbolic";
break;
......@@ -928,7 +927,7 @@ public class AppWindow : Hdy.ApplicationWindow
private void scan_adf_radio_toggled_cb (Gtk.ToggleButton button)
{
if (button.active)
set_scan_type (ScanType.ADF_BOTH);
set_scan_type (ScanType.ADF);
}
[GtkCallback]
......@@ -996,6 +995,7 @@ public class AppWindow : Hdy.ApplicationWindow
options.brightness = brightness;
options.contrast = contrast;
options.page_delay = page_delay;
options.side = preferences_dialog.get_page_side ();
return options;
}
......@@ -1017,8 +1017,6 @@ public class AppWindow : Hdy.ApplicationWindow
stop_button.visible = true;
var options = make_scan_options ();
options.type = scan_type;
if (options.type == ScanType.ADF_BOTH)
options.type = preferences_dialog.get_page_side ();
scan (options);
}
......
......@@ -87,10 +87,10 @@ private class PreferencesDialog : Hdy.PreferencesWindow
set_dpi_combo (photo_dpi_combo, DEFAULT_PHOTO_DPI, dpi);
photo_dpi_combo.changed.connect (() => { settings.set_int ("photo-dpi", get_photo_dpi ()); });
set_page_side ((ScanType) settings.get_enum ("page-side"));
front_side_button.toggled.connect ((button) => { if (button.active) settings.set_enum ("page-side", ScanType.ADF_FRONT); });
back_side_button.toggled.connect ((button) => { if (button.active) settings.set_enum ("page-side", ScanType.ADF_BACK); });
both_side_button.toggled.connect ((button) => { if (button.active) settings.set_enum ("page-side", ScanType.ADF_BOTH); });
set_page_side ((ScanSide) settings.get_enum ("page-side"));
front_side_button.toggled.connect ((button) => { if (button.active) settings.set_enum ("page-side", ScanSide.FRONT); });
back_side_button.toggled.connect ((button) => { if (button.active) settings.set_enum ("page-side", ScanSide.BACK); });
both_side_button.toggled.connect ((button) => { if (button.active) settings.set_enum ("page-side", ScanSide.BOTH); });
var renderer = new Gtk.CellRendererText ();
paper_size_combo.pack_start (renderer, true);
......@@ -135,31 +135,31 @@ private class PreferencesDialog : Hdy.PreferencesWindow
page_delay_15s_button.toggled.connect ((button) => { if (button.active) settings.set_int ("page-delay", 15000); });
}
private void set_page_side (ScanType page_side)
private void set_page_side (ScanSide page_side)
{
switch (page_side)
{
case ScanType.ADF_FRONT:
case ScanSide.FRONT:
front_side_button.active = true;
break;
case ScanType.ADF_BACK:
case ScanSide.BACK:
back_side_button.active = true;
break;
default:
case ScanType.ADF_BOTH:
case ScanSide.BOTH:
both_side_button.active = true;
break;
}
}
public ScanType get_page_side ()
public ScanSide get_page_side ()
{
if (front_side_button.active)
return ScanType.ADF_FRONT;
return ScanSide.FRONT;
else if (back_side_button.active)
return ScanType.ADF_BACK;
return ScanSide.BACK;
else
return ScanType.ADF_BOTH;
return ScanSide.BOTH;
}
public void set_paper_size (int width, int height)
......
......@@ -67,18 +67,24 @@ public enum ScanMode
public enum ScanType
{
SINGLE,
ADF_FRONT,
ADF_BACK,
ADF_BOTH,
ADF,
BATCH
}
public enum ScanSide
{
FRONT,
BACK,
BOTH
}
public class ScanOptions : Object
{
public int dpi;
public ScanMode scan_mode;
public int depth;
public ScanType type;
public ScanSide side;
public int paper_width;
public int paper_height;
public int brightness;
......@@ -94,6 +100,7 @@ private class ScanJob : Object
public ScanMode scan_mode;
public int depth;
public ScanType type;
public ScanSide side;
public int page_width;
public int page_height;
public int brightness;
......@@ -911,6 +918,62 @@ public class Scanner : Object
state = ScanState.GET_OPTION;
}
private void set_adf (ScanJob job, Sane.OptionDescriptor option, Sane.Int index)
{
string[] adf_sources =
{
"Automatic Document Feeder",
Sane.I18N ("Automatic Document Feeder"),
"ADF",
"Automatic Document Feeder(left aligned)", /* Seen in the proprietary brother3 driver */
"Automatic Document Feeder(centrally aligned)", /* Seen in the proprietary brother3 driver */
"ADF Simplex" /* Samsung unified driver. LP: # 892915 */
};
string[] adf_front_sources =
{
"ADF Front",
Sane.I18N ("ADF Front")
};
string[] adf_back_sources =
{
"ADF Back",
Sane.I18N ("ADF Back")
};
string[] adf_duplex_sources =
{
"ADF Duplex",
"Duplex ADF", /* Brother DS-720, #157 */
Sane.I18N ("ADF Duplex"),
"ADF Duplex - Long-Edge Binding", /* Samsung unified driver. LP: # 892915 */
"ADF Duplex - Short-Edge Binding",
"Duplex", /* HP duplex scan support. LP: #1353599 */
"Automatic Document Feeder(centrally aligned,Duplex)", /* Brother duplex scan support. LP: #1343773 */
"Automatic Document Feeder(left aligned,Duplex)"
};
if (job.side == ScanSide.FRONT)
{
if (!set_constrained_string_option (handle, option, index, adf_front_sources, null))
if (!set_constrained_string_option (handle, option, index, adf_sources, null))
warning ("Unable to set front ADF source, please file a bug");
}
else if (job.side == ScanSide.BACK)
{
if (!set_constrained_string_option (handle, option, index, adf_back_sources, null))
if (!set_constrained_string_option (handle, option, index, adf_sources, null))
warning ("Unable to set back ADF source, please file a bug");
}
else if (job.side == ScanSide.BOTH)
{
if (!set_constrained_string_option (handle, option, index, adf_duplex_sources, null))
if (!set_constrained_string_option (handle, option, index, adf_sources, null))
warning ("Unable to set duplex ADF source, please file a bug");
}
}
private void do_get_option ()
{
var job = (ScanJob) job_queue.data;
......@@ -943,62 +1006,20 @@ public class Scanner : Object
"Document Table" /* Epson scanners, eg. ET-3760 */
};
string[] adf_sources =
{
"Automatic Document Feeder",
Sane.I18N ("Automatic Document Feeder"),
"ADF",
"Automatic Document Feeder(left aligned)", /* Seen in the proprietary brother3 driver */
"Automatic Document Feeder(centrally aligned)", /* Seen in the proprietary brother3 driver */
"ADF Simplex" /* Samsung unified driver. LP: # 892915 */
};
string[] adf_front_sources =
{
"ADF Front",
Sane.I18N ("ADF Front")
};
string[] adf_back_sources =
{
"ADF Back",
Sane.I18N ("ADF Back")
};
string[] adf_duplex_sources =
{
"ADF Duplex",
"Duplex ADF", /* Brother DS-720, #157 */
Sane.I18N ("ADF Duplex"),
"ADF Duplex - Long-Edge Binding", /* Samsung unified driver. LP: # 892915 */
"ADF Duplex - Short-Edge Binding",
"Duplex", /* HP duplex scan support. LP: #1353599 */
"Automatic Document Feeder(centrally aligned,Duplex)", /* Brother duplex scan support. LP: #1343773 */
"Automatic Document Feeder(left aligned,Duplex)"
};
switch (job.type)
{
case ScanType.SINGLE:
case ScanType.BATCH:
if (!set_default_option (handle, option, index))
if (!set_constrained_string_option (handle, option, index, flatbed_sources, null))
warning ("Unable to set single page source, please file a bug");
break;
case ScanType.ADF_FRONT:
if (!set_constrained_string_option (handle, option, index, adf_front_sources, null))
if (!set_constrained_string_option (handle, option, index, adf_sources, null))
warning ("Unable to set front ADF source, please file a bug");
{
warning ("Unable to set single page source, trying to set ADF instead");
warning ("If Flatbed is existing and it is not set, please file a bug");
set_adf (job, option, index);
}
break;
case ScanType.ADF_BACK:
if (!set_constrained_string_option (handle, option, index, adf_back_sources, null))
if (!set_constrained_string_option (handle, option, index, adf_sources, null))
warning ("Unable to set back ADF source, please file a bug");
break;
case ScanType.ADF_BOTH:
if (!set_constrained_string_option (handle, option, index, adf_duplex_sources, null))
if (!set_constrained_string_option (handle, option, index, adf_sources, null))
warning ("Unable to set duplex ADF source, please file a bug");
case ScanType.ADF:
set_adf (job, option, index);
break;
}
}
......@@ -1076,7 +1097,7 @@ public class Scanner : Object
if (option != null)
{
if (option.type == Sane.ValueType.BOOL)
set_bool_option (handle, option, index, job.type == ScanType.ADF_BOTH, null);
set_bool_option (handle, option, index, job.side == ScanSide.BOTH, null);
}
/* Non-standard Epson GT-S50 ADF options */
......@@ -1091,7 +1112,7 @@ public class Scanner : Object
{
"Duplex"
};
if (job.type == ScanType.ADF_BOTH)
if (job.side == ScanSide.BOTH)
set_constrained_string_option (handle, option, index, adf_duplex_modes, null);
else
set_constrained_string_option (handle, option, index, adf_simplex_modes, null);
......@@ -1668,12 +1689,8 @@ public class Scanner : Object
return "single";
case ScanType.BATCH:
return "batch";
case ScanType.ADF_FRONT:
return "adf-front";
case ScanType.ADF_BACK:
return "adf-back";
case ScanType.ADF_BOTH:
return "adf-both";
case ScanType.ADF:
return "adf";
default:
return "%d".printf (type);
}
......@@ -1687,23 +1704,51 @@ public class Scanner : Object
return ScanType.SINGLE;
case "batch":
return ScanType.BATCH;
case "adf-front":
return ScanType.ADF_FRONT;
case "adf-back":
return ScanType.ADF_BACK;
case "adf-both":
return ScanType.ADF_BOTH;
case "adf":
return ScanType.ADF;
default:
warning ("Unknown ScanType: %s. Please report this error.", type);
return ScanType.SINGLE;
}
}
public static string side_to_string (ScanSide side)
{
switch (side)
{
case ScanSide.FRONT:
return "front";
case ScanSide.BACK:
return "back";
case ScanSide.BOTH:
return "both";
default:
return "%d".printf (side);
}
}
public static ScanSide side_from_string (string side)
{
switch (side)
{
case "front":
return ScanSide.FRONT;
case "back":
return ScanSide.BACK;
case "both":
return ScanSide.BOTH;
default:
warning ("Unknown ScanSide: %s. Please report this error.", side);
return ScanSide.FRONT;
}
}
public void scan (string? device, ScanOptions options)
{
debug ("Scanner.scan (\"%s\", dpi=%d, scan_mode=%s, depth=%d, type=%s, paper_width=%d, paper_height=%d, brightness=%d, contrast=%d, delay=%dms)",
debug ("Scanner.scan (\"%s\", dpi=%d, scan_mode=%s, depth=%d, type=%s, side=%s, paper_width=%d, paper_height=%d, brightness=%d, contrast=%d, delay=%dms)",
device != null ? device : "(null)", options.dpi, get_scan_mode_string (options.scan_mode), options.depth,
type_to_string (options.type), options.paper_width, options.paper_height,
type_to_string (options.type), side_to_string (options.side),
options.paper_width, options.paper_height,
options.brightness, options.contrast, options.page_delay);
var request = new RequestStartScan ();
request.job = new ScanJob ();
......@@ -1713,6 +1758,7 @@ public class Scanner : Object
request.job.scan_mode = options.scan_mode;
request.job.depth = options.depth;
request.job.type = options.type;
request.job.side = options.side;
request.job.page_width = options.paper_width;
request.job.page_height = options.paper_height;
request.job.brightness = options.brightness;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment