guint list_printers_poll;
guint list_printers_pending : 1;
guint got_default_printer : 1;
+ guint default_printer_poll;
+ GtkCupsConnectionTest *default_printer_connection_test;
char **covers;
char *default_cover_before;
static void gtk_print_backend_cups_finalize (GObject *object);
static void gtk_print_backend_cups_dispose (GObject *object);
static void cups_get_printer_list (GtkPrintBackend *print_backend);
+static void cups_get_default_printer (GtkPrintBackendCups *print_backend);
static void cups_request_execute (GtkPrintBackendCups *print_backend,
GtkCupsRequest *request,
GtkPrintCupsResponseCallbackFunc callback,
static GList * cups_printer_list_papers (GtkPrinter *printer);
static GtkPageSetup * cups_printer_get_default_page_size (GtkPrinter *printer);
static void cups_printer_request_details (GtkPrinter *printer);
-static void cups_request_default_printer (GtkPrintBackendCups *print_backend);
+static gboolean cups_request_default_printer (GtkPrintBackendCups *print_backend);
static void cups_request_ppd (GtkPrinter *printer);
static void cups_printer_get_hard_margins (GtkPrinter *printer,
double *top,
backend_cups->default_cover_after = NULL;
backend_cups->number_of_covers = 0;
- cups_request_default_printer (backend_cups);
+ backend_cups->default_printer_poll = 0;
+ backend_cups->default_printer_connection_test = NULL;
+
+ cups_get_default_printer (backend_cups);
}
static void
g_free (backend_cups->default_cover_before);
g_free (backend_cups->default_cover_after);
+
+ gtk_cups_connection_test_free (backend_cups->default_printer_connection_test);
backend_parent_class->finalize (object);
}
g_source_remove (backend_cups->list_printers_poll);
backend_cups->list_printers_poll = 0;
+ if (backend_cups->default_printer_poll > 0)
+ g_source_remove (backend_cups->default_printer_poll);
+ backend_cups->default_printer_poll = 0;
+
backend_parent_class->dispose (object);
}
{
N_("Printer '%s' is low on toner."),
N_("Printer '%s' has no toner left."),
+ /* Translators: "Developer" like on photo development context */
N_("Printer '%s' is low on developer."),
+ /* Translators: "Developer" like on photo development context */
N_("Printer '%s' is out of developer."),
+ /* Translators: "marker" is one color bin of the printer */
N_("Printer '%s' is low on at least one marker supply."),
+ /* Translators: "marker" is one color bin of the printer */
N_("Printer '%s' is out of at least one marker supply."),
N_("The cover is open on printer '%s'."),
N_("The door is open on printer '%s'."),
if (state_msg != NULL && strlen (state_msg) == 0)
{
if (is_paused && !is_accepting_jobs)
+ /* Translators: this is a printer status. */
tmp_msg2 = g_strdup ( N_("Paused ; Rejecting Jobs"));
if (is_paused && is_accepting_jobs)
+ /* Translators: this is a printer status. */
tmp_msg2 = g_strdup ( N_("Paused"));
if (!is_paused && !is_accepting_jobs)
+ /* Translators: this is a printer status. */
tmp_msg2 = g_strdup ( N_("Rejecting Jobs"));
if (tmp_msg2 != NULL)
return num_options;
}
+/* This function requests default printer from a CUPS server in regular intervals.
+ * In the case of unreachable CUPS server the request is repeated later.
+ * The default printer is not requested in the case of previous success.
+ */
+static void
+cups_get_default_printer (GtkPrintBackendCups *backend)
+{
+ GtkPrintBackendCups *cups_backend;
+
+ cups_backend = backend;
+
+ cups_backend->default_printer_connection_test = gtk_cups_connection_test_new (NULL);
+ if (cups_backend->default_printer_poll == 0)
+ {
+ if (cups_request_default_printer (cups_backend))
+ cups_backend->default_printer_poll = gdk_threads_add_timeout_seconds (1,
+ (GSourceFunc) cups_request_default_printer,
+ backend);
+ }
+}
+
static void
cups_request_default_printer_cb (GtkPrintBackendCups *print_backend,
GtkCupsResult *result,
ipp_t *response;
ipp_attribute_t *attr;
+ GDK_THREADS_ENTER ();
+
response = gtk_cups_result_get_response (result);
if ((attr = ippFindAttribute (response, "printer-name", IPP_TAG_NAME)) != NULL)
*/
if (print_backend->list_printers_poll != 0)
cups_request_printer_list (print_backend);
+
+ GDK_THREADS_LEAVE ();
}
-static void
+static gboolean
cups_request_default_printer (GtkPrintBackendCups *print_backend)
{
GtkCupsRequest *request;
const char *str;
char *name = NULL;
+ if (!gtk_cups_connection_test_is_server_available (print_backend->default_printer_connection_test))
+ return TRUE;
+
+ gtk_cups_connection_test_free (print_backend->default_printer_connection_test);
+ print_backend->default_printer_connection_test = NULL;
+
if ((str = g_getenv ("LPDEST")) != NULL)
{
print_backend->default_printer = g_strdup (str);
print_backend->got_default_printer = TRUE;
- return;
+ return FALSE;
}
else if ((str = g_getenv ("PRINTER")) != NULL &&
strcmp (str, "lp") != 0)
{
print_backend->default_printer = g_strdup (str);
print_backend->got_default_printer = TRUE;
- return;
+ return FALSE;
}
/* Figure out user setting for default printer */
{
print_backend->default_printer = name;
print_backend->got_default_printer = TRUE;
- return;
+ return FALSE;
}
request = gtk_cups_request_new (NULL,
(GtkPrintCupsResponseCallbackFunc) cups_request_default_printer_cb,
g_object_ref (print_backend),
g_object_unref);
+
+ return FALSE;
}
static void
const char *translation;
} cups_choice_translations[] = {
{ "Duplex", "None", N_("One Sided") },
+ /* Translators: this is an option of "Paper Source" */
{ "InputSlot", "Auto", N_("Auto Select") },
+ /* Translators: this is an option of "Paper Source" */
{ "InputSlot", "AutoSelect", N_("Auto Select") },
+ /* Translators: this is an option of "Paper Source" */
{ "InputSlot", "Default", N_("Printer Default") },
+ /* Translators: this is an option of "Paper Source" */
{ "InputSlot", "None", N_("Printer Default") },
+ /* Translators: this is an option of "Paper Source" */
{ "InputSlot", "PrinterDefault", N_("Printer Default") },
+ /* Translators: this is an option of "Paper Source" */
{ "InputSlot", "Unspecified", N_("Auto Select") },
};
char *n_up[] = {"1", "2", "4", "6", "9", "16" };
char *prio[] = {"100", "80", "50", "30" };
char *prio_display[] = {N_("Urgent"), N_("High"), N_("Medium"), N_("Low") };
+ char *n_up_layout[] = { "lrtb", "lrbt", "rltb", "rlbt", "tblr", "tbrl", "btlr", "btrl" };
+ char *n_up_layout_display[] = { N_("Left to right, top to bottom"), N_("Left to right, bottom to top"),
+ N_("Right to left, top to bottom"), N_("Right to left, bottom to top"),
+ N_("Top to bottom, left to right"), N_("Top to bottom, right to left"),
+ N_("Bottom to top, left to right"), N_("Bottom to top, right to left") };
char *name;
int num_opts;
cups_option_t *opts = NULL;
GtkPrintBackendCups *backend;
+ GtkTextDirection text_direction;
set = gtk_printer_option_set_new ();
/* Cups specific, non-ppd related settings */
- option = gtk_printer_option_new ("gtk-n-up", "Pages Per Sheet", GTK_PRINTER_OPTION_TYPE_PICKONE);
+ option = gtk_printer_option_new ("gtk-n-up", _("Pages Per Sheet"), GTK_PRINTER_OPTION_TYPE_PICKONE);
gtk_printer_option_choices_from_array (option, G_N_ELEMENTS (n_up),
n_up, n_up);
gtk_printer_option_set (option, "1");
gtk_printer_option_set_add (set, option);
g_object_unref (option);
+ if (cups_printer_get_capabilities (printer) & GTK_PRINT_CAPABILITY_NUMBER_UP_LAYOUT)
+ {
+ for (i = 0; i < G_N_ELEMENTS (n_up_layout_display); i++)
+ n_up_layout_display[i] = _(n_up_layout_display[i]);
+
+ option = gtk_printer_option_new ("gtk-n-up-layout", _("Page Ordering"), GTK_PRINTER_OPTION_TYPE_PICKONE);
+ gtk_printer_option_choices_from_array (option, G_N_ELEMENTS (n_up_layout),
+ n_up_layout, n_up_layout_display);
+
+ text_direction = gtk_widget_get_default_direction ();
+ if (text_direction == GTK_TEXT_DIR_LTR)
+ gtk_printer_option_set (option, "lrtb");
+ else
+ gtk_printer_option_set (option, "rltb");
+
+ set_option_from_settings (option, settings);
+ gtk_printer_option_set_add (set, option);
+ g_object_unref (option);
+ }
+
for (i = 0; i < G_N_ELEMENTS(prio_display); i++)
prio_display[i] = _(prio_display[i]);
- option = gtk_printer_option_new ("gtk-job-prio", "Job Priority", GTK_PRINTER_OPTION_TYPE_PICKONE);
+ option = gtk_printer_option_new ("gtk-job-prio", _("Job Priority"), GTK_PRINTER_OPTION_TYPE_PICKONE);
gtk_printer_option_choices_from_array (option, G_N_ELEMENTS (prio),
prio, prio_display);
gtk_printer_option_set (option, "50");
gtk_printer_option_set_add (set, option);
g_object_unref (option);
- option = gtk_printer_option_new ("gtk-billing-info", "Billing Info", GTK_PRINTER_OPTION_TYPE_STRING);
+ option = gtk_printer_option_new ("gtk-billing-info", _("Billing Info"), GTK_PRINTER_OPTION_TYPE_STRING);
gtk_printer_option_set (option, "");
set_option_from_settings (option, settings);
gtk_printer_option_set_add (set, option);
char *cover_display_default[] = {N_("None"), N_("Classified"), N_("Confidential"), N_("Secret"), N_("Standard"), N_("Top Secret"), N_("Unclassified"),};
char **cover = NULL;
char **cover_display = NULL;
+ char **cover_display_translated = NULL;
gint num_of_covers = 0;
gpointer value;
gint j;
cover[num_of_covers] = NULL;
cover_display = g_new (char *, num_of_covers + 1);
cover_display[num_of_covers] = NULL;
+ cover_display_translated = g_new (char *, num_of_covers + 1);
+ cover_display_translated[num_of_covers] = NULL;
for (i = 0; i < num_of_covers; i++)
{
}
for (i = 0; i < num_of_covers; i++)
- cover_display[i] = _(cover_display[i]);
+ cover_display_translated[i] = _(cover_display[i]);
- option = gtk_printer_option_new ("gtk-cover-before", "Before", GTK_PRINTER_OPTION_TYPE_PICKONE);
+ option = gtk_printer_option_new ("gtk-cover-before", _("Before"), GTK_PRINTER_OPTION_TYPE_PICKONE);
gtk_printer_option_choices_from_array (option, num_of_covers,
- cover, cover_display);
+ cover, cover_display_translated);
if (backend->default_cover_before != NULL)
gtk_printer_option_set (option, backend->default_cover_before);
gtk_printer_option_set_add (set, option);
g_object_unref (option);
- option = gtk_printer_option_new ("gtk-cover-after", "After", GTK_PRINTER_OPTION_TYPE_PICKONE);
+ option = gtk_printer_option_new ("gtk-cover-after", _("After"), GTK_PRINTER_OPTION_TYPE_PICKONE);
gtk_printer_option_choices_from_array (option, num_of_covers,
- cover, cover_display);
+ cover, cover_display_translated);
if (backend->default_cover_after != NULL)
gtk_printer_option_set (option, backend->default_cover_after);
else
g_strfreev (cover);
g_strfreev (cover_display);
+ g_free (cover_display_translated);
}
- option = gtk_printer_option_new ("gtk-print-time", "Print at", GTK_PRINTER_OPTION_TYPE_PICKONE);
+ option = gtk_printer_option_new ("gtk-print-time", _("Print at"), GTK_PRINTER_OPTION_TYPE_PICKONE);
gtk_printer_option_choices_from_array (option, G_N_ELEMENTS (print_at),
print_at, print_at);
gtk_printer_option_set (option, "now");
gtk_printer_option_set_add (set, option);
g_object_unref (option);
- option = gtk_printer_option_new ("gtk-print-time-text", "Print at time", GTK_PRINTER_OPTION_TYPE_STRING);
+ option = gtk_printer_option_new ("gtk-print-time-text", _("Print at time"), GTK_PRINTER_OPTION_TYPE_STRING);
gtk_printer_option_set (option, "");
set_option_from_settings (option, settings);
gtk_printer_option_set_add (set, option);
map_settings_to_option (option, all_map, G_N_ELEMENTS (all_map),
settings, GTK_PRINT_SETTINGS_NUMBER_UP, "number-up");
}
+ else if (strcmp (option->name, "gtk-n-up-layout") == 0)
+ {
+ map_settings_to_option (option, all_map, G_N_ELEMENTS (all_map),
+ settings, GTK_PRINT_SETTINGS_NUMBER_UP_LAYOUT, "number-up-layout");
+ }
else if (strcmp (option->name, "gtk-billing-info") == 0)
{
cups_value = gtk_print_settings_get (settings, "cups-job-billing");
else if (strcmp (option->name, "gtk-n-up") == 0)
map_option_to_settings (value, all_map, G_N_ELEMENTS (all_map),
settings, GTK_PRINT_SETTINGS_NUMBER_UP, "number-up");
+ else if (strcmp (option->name, "gtk-n-up-layout") == 0)
+ map_option_to_settings (value, all_map, G_N_ELEMENTS (all_map),
+ settings, GTK_PRINT_SETTINGS_NUMBER_UP_LAYOUT, "number-up-layout");
else if (strcmp (option->name, "gtk-billing-info") == 0 && strlen (value) > 0)
gtk_print_settings_set (settings, "cups-job-billing", value);
else if (strcmp (option->name, "gtk-job-prio") == 0)
GTK_PRINT_CAPABILITY_COPIES |
GTK_PRINT_CAPABILITY_COLLATE |
GTK_PRINT_CAPABILITY_REVERSE |
+#if (CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR >= 1 && CUPS_VERSION_PATCH >= 15) || (CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR > 1) || CUPS_VERSION_MAJOR > 1
+ GTK_PRINT_CAPABILITY_NUMBER_UP_LAYOUT |
+#endif
GTK_PRINT_CAPABILITY_NUMBER_UP;
}