http_t *http;
GtkCupsRequest *request;
+ GtkCupsPollState poll_state;
GPollFD *data_poll;
GtkPrintBackendCups *backend;
GtkPrintCupsResponseCallbackFunc callback;
GDK_THREADS_LEAVE ();
}
+typedef struct {
+ GtkCupsRequest *request;
+ GtkPrinterCups *printer;
+} CupsOptionsData;
+
static void
add_cups_options (const gchar *key,
const gchar *value,
gpointer user_data)
{
- GtkCupsRequest *request = user_data;
+ CupsOptionsData *data = (CupsOptionsData *) user_data;
+ GtkCupsRequest *request = data->request;
+ GtkPrinterCups *printer = data->printer;
+ gboolean custom_value = FALSE;
+ gchar *new_value = NULL;
+ gint i;
+
+ if (!key || !value)
+ return;
if (!g_str_has_prefix (key, "cups-"))
return;
if (strcmp (value, "gtk-ignore-value") == 0)
return;
-
+
key = key + strlen ("cups-");
- gtk_cups_request_encode_option (request, key, value);
+ if (printer && printer->ppd_file)
+ {
+ ppd_coption_t *coption;
+ gboolean found = FALSE;
+ gboolean custom_values_enabled = FALSE;
+
+ coption = ppdFindCustomOption (printer->ppd_file, key);
+ if (coption && coption->option)
+ {
+ for (i = 0; i < coption->option->num_choices; i++)
+ {
+ /* Are custom values enabled ? */
+ if (g_str_equal (coption->option->choices[i].choice, "Custom"))
+ custom_values_enabled = TRUE;
+
+ /* Is the value among available choices ? */
+ if (g_str_equal (coption->option->choices[i].choice, value))
+ found = TRUE;
+ }
+
+ if (custom_values_enabled && !found)
+ custom_value = TRUE;
+ }
+ }
+
+ /* Add "Custom." prefix to custom values. */
+ if (custom_value)
+ {
+ new_value = g_strdup_printf ("Custom.%s", value);
+ gtk_cups_request_encode_option (request, key, new_value);
+ g_free (new_value);
+ }
+ else
+ gtk_cups_request_encode_option (request, key, value);
}
static void
{
GtkPrinterCups *cups_printer;
CupsPrintStreamData *ps;
+ CupsOptionsData *options_data;
GtkCupsRequest *request;
GtkPrintSettings *settings;
const gchar *title;
IPP_TAG_NAME, "job-name",
NULL, title);
- gtk_print_settings_foreach (settings, add_cups_options, request);
-
+ options_data = g_new0 (CupsOptionsData, 1);
+ options_data->request = request;
+ options_data->printer = cups_printer;
+ gtk_print_settings_foreach (settings, add_cups_options, options_data);
+ g_free (options_data);
+
ps = g_new0 (CupsPrintStreamData, 1);
ps->callback = callback;
ps->user_data = user_data;
gint i;
if (dispatch->backend->authentication_lock)
- return FALSE;
+ return G_SOURCE_REMOVE;
httpGetHostname (dispatch->request->http, hostname, sizeof (hostname));
if (is_address_local (hostname))
g_free (auth_info_visible);
g_free (key);
- return FALSE;
+ return G_SOURCE_REMOVE;
}
static void
poll_state = gtk_cups_request_get_poll_state (dispatch->request);
+ /* Remove the old source if the poll state changed. */
+ if (poll_state != dispatch->poll_state && dispatch->data_poll != NULL)
+ {
+ g_source_remove_poll (source, dispatch->data_poll);
+ g_free (dispatch->data_poll);
+ dispatch->data_poll = NULL;
+ }
+
if (dispatch->request->http != NULL)
{
if (dispatch->data_poll == NULL)
{
dispatch->data_poll = g_new0 (GPollFD, 1);
+ dispatch->poll_state = poll_state;
if (poll_state == GTK_CUPS_HTTP_READ)
dispatch->data_poll->events = G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI;
dispatch->request->auth_info = NULL;
}
- return FALSE;
+ return G_SOURCE_REMOVE;
}
- return TRUE;
+ return G_SOURCE_CONTINUE;
}
static gboolean
poll_state = gtk_cups_request_get_poll_state (dispatch->request);
- cups_dispatch_add_poll (source);
-
if (poll_state != GTK_CUPS_HTTP_IDLE && !dispatch->request->need_password)
if (!(dispatch->data_poll->revents & dispatch->data_poll->events))
return FALSE;
- result = gtk_cups_request_read_write (dispatch->request);
+ result = gtk_cups_request_read_write (dispatch->request, FALSE);
if (result && dispatch->data_poll != NULL)
{
g_source_remove_poll (source, dispatch->data_poll);
g_print ("CUPS Backend: %s <source %p>\n", G_STRFUNC, source));
*timeout_ = -1;
-
- result = gtk_cups_request_read_write (dispatch->request);
+
+ result = gtk_cups_request_read_write (dispatch->request, TRUE);
cups_dispatch_add_poll (source);
dispatch->backend = NULL;
}
- g_free (dispatch->data_poll);
+ if (dispatch->data_poll)
+ {
+ g_source_remove_poll (source, dispatch->data_poll);
+ g_free (dispatch->data_poll);
+ dispatch->data_poll = NULL;
+ }
}
static GSourceFuncs _cups_dispatch_watch_funcs = {
dispatch->request = request;
dispatch->backend = g_object_ref (print_backend);
+ dispatch->poll_state = GTK_CUPS_HTTP_IDLE;
dispatch->data_poll = NULL;
dispatch->callback = NULL;
dispatch->callback_data = NULL;
else
cups_request_job_info (data);
- return FALSE;
+ return G_SOURCE_REMOVE;
}
static void
as inactive if it is in the list, emitting a printer_removed signal */
if (removed_printer_checklist != NULL)
{
- g_list_foreach (removed_printer_checklist, (GFunc) mark_printer_inactive, backend);
- g_list_free (removed_printer_checklist);
+ g_list_free_full (removed_printer_checklist, (GDestroyNotify) mark_printer_inactive);
list_has_changed = TRUE;
}
option->choices_display[i] = get_choice_text (ppd_file, available[i]);
}
}
- gtk_printer_option_set (option, ppd_option->defchoice);
+
+ if (option->type != GTK_PRINTER_OPTION_TYPE_PICKONE)
+ {
+ if (g_str_has_prefix (ppd_option->defchoice, "Custom."))
+ gtk_printer_option_set (option, ppd_option->defchoice + 7);
+ else
+ gtk_printer_option_set (option, ppd_option->defchoice);
+ }
+ else
+ {
+ gtk_printer_option_set (option, ppd_option->defchoice);
+ }
}
#ifdef PRINT_IGNORED_OPTIONS
else
return NULL;
option = ppdFindOption (ppd_file, "PageSize");
+ if (option == NULL)
+ return NULL;
+
size = ppdPageSize (ppd_file, option->defchoice);
+ if (size == NULL)
+ return NULL;
return create_page_setup (ppd_file, size);
}