Package: gnome-cups-manager
Version: 0.31-3
Severity: wishlist
Tags: patch
In some environments is extremely important specify the printer name because
of the high number of printers wich are equal. For example, where I work we
have five Lexmark Optra-E321 (all of them shared in the network) and
frequently the users have troubles to find what printer they want use
because gnome-cups-manager automatically specify the printer name. Is much
more easy to user understands if the name of the printer is auto-clarifying:
- E321-MarketingDept, E321-FinancialDept instead Optra-E321-1, Optra-E321-2,
Optra-E321-3 etc.
The attached patch, created by Amos Brocco, allow a 3rd step in
gnome-cups-add to change the printer name. Currently its used by
gnome-cups-manager from Ubuntu. I just added some changes on pt_BR language
on original patch.
Thanks
Matheus Morais
--- gnome-cups-add/add-printer.c 2005-03-03 15:54:25.000000000 +0100
+++ gnome-cups-add/add-printer.c 2006-03-23 01:30:07.000000000 +0100
@@ -7,6 +7,7 @@
#include <cups/ipp.h>
#include <unistd.h>
#include <sys/types.h>
+#include <glib.h>
#include <gtk/gtkhbox.h>
#include <gtk/gtkliststore.h>
@@ -96,6 +97,7 @@
}
set_selected_uri (xml, uri);
+
g_free (uri);
return res;
}
@@ -113,23 +115,50 @@
static void
driver_page_sensitivity (GladeXML *xml, gboolean *back, gboolean *next)
{
- GtkWidget *druid = glade_xml_get_widget (xml, "add_printer_druid");
*back = TRUE;
*next = NULL != gcups_driver_selector_get (driver_selector (xml));
- /* see driver_page_prepare for an explanation of the druid hack */
- gnome_druid_set_show_finish (GNOME_DRUID (druid), *next);
+ GCupsPPD const *ppd = gcups_driver_selector_get (driver_selector (xml));
+
+ if (ppd && ppd->model) {
+ g_signal_handlers_block_by_func(glade_xml_get_widget (xml, "printer-name-entry"), G_CALLBACK (druid_update_sensitivities), xml);
+ GtkEntry *printer_name_entry = (GtkEntry*) glade_xml_get_widget(xml, "printer-name-entry");
+ /* Clear invalid names (spaces + slashes) so that the default is always a valid one */
+ char *name, *ptr;
+ name = g_strdup(ppd->model);
+
+ for (ptr = name ; *ptr ; ptr++)
+ if (*ptr == ' ' || *ptr == '/')
+ *ptr = '-';
+
+ gtk_entry_set_text(printer_name_entry, name);
+
+ g_free(name);
+ g_signal_handlers_unblock_by_func(glade_xml_get_widget (xml, "printer-name-entry"), G_CALLBACK (druid_update_sensitivities), xml);
+ }
}
+
static GtkWidget *
driver_page_back (GladeXML *xml)
{
return glade_xml_get_widget (xml, "connection_page");
}
+
+// This function is just a 'fake' to avoid conflicts during compilation with debian patch properties_on_add.patch
static gboolean
add_cups_printer (GladeXML *xml, char const *device_uri, GCupsPPD const *ppd, char const *printer_name)
{
+ return FALSE;
+}
+// Note: The (debian/ubuntu) packager needs to fix this conflict by removing properties_on_add.patch
+// and rename the function extended_add_cups_printer to add_cups_printer
+// for questions feel free to contact me: [EMAIL PROTECTED]
+
+static gboolean
+extended_add_cups_printer (GladeXML *xml, char const *device_uri, GCupsPPD const *ppd, char const *printer_name, char const *printer_info, char const *printer_location)
+{
GError *err = NULL;
char local_uri [HTTP_MAX_URI+1];
ipp_t *request = gnome_cups_request_new (CUPS_ADD_PRINTER);
@@ -139,6 +168,10 @@
"printer-uri", NULL, local_uri);
ippAddString (request, IPP_TAG_PRINTER, IPP_TAG_NAME,
"printer-name", NULL, gnome_cups_strdup (printer_name));
+ ippAddString (request, IPP_TAG_PRINTER, IPP_TAG_TEXT,
+ "printer-info", NULL, printer_info);
+ ippAddString (request, IPP_TAG_PRINTER, IPP_TAG_TEXT,
+ "printer-location", NULL, printer_location);
ippAddString (request, IPP_TAG_PRINTER, IPP_TAG_NAME,
"ppd-name", NULL, gnome_cups_strdup (ppd->filename));
ippAddString (request, IPP_TAG_PRINTER, IPP_TAG_URI,
@@ -172,27 +205,138 @@
static GtkWidget *
driver_page_next (GladeXML *xml)
{
- GList *existing;
char *name, *uri, *ptr;
- unsigned i = 0;
GCupsPPD const *ppd = gcups_driver_selector_get (driver_selector (xml));
-
+ GtkWidget *res = NULL;
+
if (ppd == NULL)
return NULL;
uri = get_selected_uri (xml);
- name = g_strdup (ppd->model);
- /* strip out the spaces */
- for (ptr = name ; *ptr ; ptr++)
- if (*ptr == ' ')
- *ptr = '-';
+ if (uri != NULL) {
+ res = glade_xml_get_widget (xml, "printer_info_page");
+ }
+
+ g_free (uri);
+ return res;
+}
+
+/****************************************************************************/
+
+static void
+printer_info_page_setup (GladeXML *xml)
+{
+ GtkWidget *w = glade_xml_get_widget (xml, "printer-name-entry");
+ g_signal_connect_swapped (w,
+ "changed",
+ G_CALLBACK (druid_update_sensitivities), xml);
+}
+
+static gboolean
+check_printer_name(GladeXML *xml)
+{
+ /* Checks whether the name is correctly filled */
+ GtkEntry *printer_name_entry = (GtkEntry *)glade_xml_get_widget (xml, "printer-name-entry");
+ GtkLabel *warnings_label = (GtkLabel *)glade_xml_get_widget (xml, "warnings-label");
+
+ char *printer_name, *ptr;
+ gboolean has_invalid_chars = FALSE;
+ unsigned i = 0;
+
+ printer_name = g_strchomp(g_strdup(gtk_entry_get_text(printer_name_entry)));
+
+ if(!strlen(printer_name)) {
+ gtk_label_set_markup(warnings_label,_("<i>Printer name cannot be empty.</i>"));
+ g_free (printer_name);
+ return FALSE;
+ }
+
+ /* Checks that the name contains no spaces or slashes (cf. Ubuntu Bug #32085) */
+ for (ptr = printer_name ; *ptr ; ptr++)
+ if (*ptr == ' ' || *ptr == '/') {
+ has_invalid_chars = TRUE;
+ break;
+ }
+
+
+ /* If the name is not valid show a warning message */
+ if(has_invalid_chars) {
+ gtk_label_set_markup(warnings_label,_("<i>Printer name contains invalid characters or spaces.</i>"));
+ g_free (printer_name);
+ return FALSE;
+ }
+
+
+ g_free (printer_name);
+ gtk_label_set_markup(warnings_label,"");
+ return TRUE;
+}
+
+static void
+printer_info_page_sensitivity (GladeXML *xml, gboolean *back, gboolean *next)
+{
+ GtkWidget *druid = glade_xml_get_widget (xml, "add_printer_druid");
+ *back = TRUE;
+ *next = FALSE != check_printer_name (xml);
+
+ /* see driver_page_prepare for an explanation of the druid hack */
+ gnome_druid_set_show_finish (GNOME_DRUID (druid), *next);
+}
+
+static GtkWidget *
+printer_info_page_back (GladeXML *xml)
+{
+ return glade_xml_get_widget (xml, "driver_page");
+}
+
+
+static void
+printer_info_page_prepare (GladeXML *xml)
+{
+ /* The printer name defaults to the printer model */
+ GtkEntry *printer_name_entry = (GtkEntry*) glade_xml_get_widget(xml, "printer-name-entry");
+ GCupsPPD const *ppd = gcups_driver_selector_get (driver_selector (xml));
+ GtkLabel *warnings_label = (GtkLabel *)glade_xml_get_widget (xml, "warnings-label");
+ char *name;
+
+ gtk_misc_set_alignment(GTK_MISC(warnings_label), 0.0f, 0.0f);
+
+ name = g_strdup(gtk_entry_get_text(printer_name_entry));
+
+ if(!strlen(name))
+ gtk_entry_set_text(printer_name_entry, ppd->model);
+
+ g_free(name);
+}
+
+static GtkWidget *
+printer_info_page_next (GladeXML *xml)
+{
+ GCupsPPD const *ppd = gcups_driver_selector_get (driver_selector (xml));
+ char *original_name, *name, *uri, *description, *location;
+ GtkEntry *printer_name_entry = (GtkEntry*) glade_xml_get_widget(xml, "printer-name-entry");
+ GtkEntry *printer_description_entry = (GtkEntry*) glade_xml_get_widget(xml, "printer-description-entry");
+ GtkEntry *printer_location_entry = (GtkEntry*) glade_xml_get_widget(xml, "printer-location-entry");
+ GtkWidget *parent_window = glade_xml_get_widget (xml, "add_printer_window");
+ GList *existing;
+ unsigned i = 0;
+ gboolean name_changed = FALSE;
+
+ uri = get_selected_uri (xml);
+ name = g_strchomp(g_strdup(gtk_entry_get_text(printer_name_entry)));
+ description = g_strchomp(g_strdup(gtk_entry_get_text(printer_description_entry)));
+ location = g_strchomp(g_strdup(gtk_entry_get_text(printer_location_entry)));
+ original_name = g_strchomp(g_strdup(gtk_entry_get_text(printer_name_entry)));
existing = gnome_cups_get_printers ();
+
while (NULL != g_list_find_custom (existing, name, (GCompareFunc)strcasecmp )) {
g_free (name);
- name = g_strdup_printf ("%s-%d", ppd->model, ++i);
- }
+ name = g_strdup_printf ("%s-%d", original_name, ++i);
+ name_changed = TRUE;
+ }
+
g_list_foreach (existing, (GFunc)g_free, NULL);
g_list_free (existing);
@@ -204,14 +348,36 @@
gtk_widget_destroy (toplevel);
g_object_unref (xml);
gtk_main_quit ();
- }
+ } // The above code (in the if) will never be executed: leaved to make a patch happy (see explication above)
+
+ if(name_changed) {
+ GtkWidget *dialog;
+
+ dialog = gtk_message_dialog_new
+ (GTK_WINDOW (parent_window),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
+ _("Printer '%s' is already installed on this system. This printer has been renamed to '%s'."),
+ original_name,
+ name);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ }
+
+ if (extended_add_cups_printer (xml, uri, ppd, name, description, location)) {
+ g_object_unref (xml);
+ gtk_main_quit ();
+ }
g_free (uri);
g_free (name);
-
+ g_free (description);
+ g_free (location);
+ g_free (original_name);
return NULL;
}
+
/****************************************************************************/
static DruidPageDescription pages[] = {
@@ -231,6 +397,14 @@
driver_page_back,
driver_page_next
},
+ {
+ "printer_info_page",
+ printer_info_page_setup,
+ printer_info_page_prepare,
+ printer_info_page_sensitivity,
+ printer_info_page_back,
+ printer_info_page_next
+ },
{ NULL }
};
--- gnome-cups-add/druid-helper.c 2004-08-19 01:48:44.000000000 +0200
+++ gnome-cups-add/druid-helper.c 2006-03-21 19:59:34.000000000 +0100
@@ -120,6 +120,7 @@
G_CALLBACK (druid_page_back_cb),
p);
}
+
if (p->next) {
g_signal_connect (page, "next",
G_CALLBACK (druid_page_next_cb),
@@ -128,6 +129,22 @@
G_CALLBACK (druid_page_next_cb),
p);
}
+
+#if 0
+ if (p->next) {
+ g_signal_connect (page, "next",
+ G_CALLBACK (druid_page_next_cb),
+ p);
+ }
+
+ if (!p->next) {
+ g_signal_connect (page, "finish",
+ G_CALLBACK (druid_page_next_cb),
+ p);
+ }
+#endif
+
+
}
}
--- gnome-cups-add/gnome-cups-add.glade 2004-08-30 22:32:42.000000000 +0200
+++ gnome-cups-add/gnome-cups-add.glade 2006-03-23 01:38:43.000000000 +0100
@@ -18,6 +18,8 @@
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
<child>
<widget class="GnomeDruid" id="add_printer_druid">
@@ -28,7 +30,7 @@
<child>
<widget class="GnomeDruidPageStandard" id="connection_page">
<property name="visible">True</property>
- <property name="title" translatable="yes">Step 1 of 2: Printer Connection</property>
+ <property name="title" translatable="yes">Step 1 of 3: Printer Connection</property>
<property name="logo">gnome-cups-add-druid.png</property>
<child internal-child="vbox">
@@ -51,6 +53,10 @@
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
</widget>
<packing>
<property name="padding">4</property>
@@ -81,11 +87,11 @@
<child>
<widget class="GnomeDruidPageStandard" id="driver_page">
<property name="visible">True</property>
- <property name="title" translatable="yes">Step 2 of 2: Printer Driver</property>
+ <property name="title" translatable="yes">Step 2 of 3: Printer Driver</property>
<property name="logo">gnome-cups-add-druid.png</property>
<child internal-child="vbox">
- <widget class="GtkVBox" id="druid-vbox101">
+ <widget class="GtkVBox" id="druid-vbox103">
<property name="border_width">16</property>
<property name="visible">True</property>
<property name="homogeneous">False</property>
@@ -109,6 +115,257 @@
</child>
</widget>
</child>
+
+ <child>
+ <widget class="GnomeDruidPageStandard" id="printer_info_page">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">Step 3 of 3: Printer Information</property>
+ <property name="logo">gnome-cups-add-druid.png</property>
+
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="druid-vbox2">
+ <property name="border_width">16</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">6</property>
+
+ <child>
+ <widget class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">5</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">4</property>
+ <property name="column_spacing">4</property>
+
+ <child>
+ <widget class="GtkHSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label30">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="printer-name-entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="printer-description-entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="printer-location-entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label34">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Location:</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">printer-location-entry</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label33">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Description: </property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">printer-description-entry</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="warnings-label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label31">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Name:</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">printer-name-entry</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
</widget>
</child>
</widget>
--- po/pt_BR.po 2005-03-07 13:55:33.000000000 -0300
+++ po/pt_BR.po 2007-02-27 10:58:12.000000000 -0300
@@ -27,17 +27,21 @@
msgstr "Adicionar impressora"
#: gnome-cups-add/gnome-cups-add.glade.h:2
-msgid "Step 1 of 2: Printer Connection"
-msgstr "Passo 1 de 2: Conexão da Impressora"
+msgid "Step 1 of 3: Printer Connection"
+msgstr "Passo 1 de 3: Conexão da Impressora"
#: gnome-cups-add/gnome-cups-add.glade.h:3
-msgid "Step 2 of 2: Printer Driver"
-msgstr "Passo 2 de 2: Driver da Impressora"
+msgid "Step 2 of 3: Printer Driver"
+msgstr "Passo 2 de 3: Driver da Impressora"
#: gnome-cups-add/gnome-cups-add.glade.h:4
msgid "This assistant helps you set up a printer."
msgstr "O assistente o ajudará a instalar uma impressora."
+#: gnome-cups-add/gnome-cups-add.glade.h:5
+msgid "Step 3 of 3: Printer Information"
+msgstr "Passo 3 de 3: Informações da Impressora"
+
#: gnome-cups-manager/gnome-cups-icon.c:72
msgid ""
"Could not start the printer tray icon, because the CUPS server could not be "