diff options
author | Alexander Larsson <alexl@redhat.com> | 2006-04-21 15:09:32 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2006-04-21 15:09:32 +0000 |
commit | 27f746fbd0e56872a8d3b4bfff2588ad0b7cd7c4 (patch) | |
tree | dcf0769596bd36a76b7dcea7eed46b378a634f72 /gtk/gtkprinteroptionset.c | |
parent | ea32742b93348e1ce47cd92a26afe5317b37dd73 (diff) | |
download | gtk+-27f746fbd0e56872a8d3b4bfff2588ad0b7cd7c4.tar.gz |
Merge the gtk-printing branch. For more detailed ChangeLog entries, see
2006-04-21 Alexander Larsson <alexl@redhat.com>
Merge the gtk-printing branch.
For more detailed ChangeLog entries, see the branch.
* .cvsignore:
* Makefile.am:
* configure.in:
* docs/tools/widgets.c:
* gtk+-unix-print-2.0.pc.in:
* gtk/Makefile.am:
* gtk/gen-paper-names.c:
* gtk/gtk.h:
* gtk/gtk.symbols:
* gtk/gtkenums.h:
* gtk/gtkiconfactory.c:
* gtk/gtkmarshalers.list:
* gtk/gtkpagesetup.[ch]:
* gtk/gtkpagesetupunixdialog.[ch]:
* gtk/gtkpapersize.[ch]:
* gtk/gtkprint-win32.[ch]:
* gtk/gtkprintbackend.[ch]:
* gtk/gtkprintcontext.[ch]:
* gtk/gtkprinter-private.h:
* gtk/gtkprinter.[ch]:
* gtk/gtkprinteroption.[ch]:
* gtk/gtkprinteroptionset.[ch]:
* gtk/gtkprinteroptionwidget.[ch]:
* gtk/gtkprintjob.[ch]:
* gtk/gtkprintoperation-private.h:
* gtk/gtkprintoperation-unix.c:
* gtk/gtkprintoperation-win32.c:
* gtk/gtkprintoperation.[ch]:
* gtk/gtkprintsettings.[ch]:
* gtk/gtkprintunixdialog.[ch]:
* gtk/paper_names.c:
* gtk/paper_names_offsets.c:
Platform independent printing API and implementations
for unix and windows.
* gtk/gtkstock.h:
* gtk/stock-icons/24/gtk-orientation-landscape.png:
* gtk/stock-icons/24/gtk-orientation-portrait.png:
* gtk/stock-icons/24/gtk-orientation-reverse-landscape.png:
Add stock icons for page orientation.
* modules/Makefile.am:
* modules/printbackends/Makefile.am:
* modules/printbackends/cups/Makefile.am:
* modules/printbackends/cups/gtkcupsutils.[ch]:
* modules/printbackends/cups/gtkprintbackendcups.[ch]:
* modules/printbackends/cups/gtkprintercups.[ch]:
Cups printing backend for unix.
* modules/printbackends/lpr/Makefile.am:
* modules/printbackends/lpr/gtkprintbackendlpr.[ch]:
lpr printing backend for unix.
* modules/printbackends/pdf/Makefile.am:
* modules/printbackends/pdf/gtkprintbackendpdf.[ch]:
print-to-pdf printing backend for unix.
* tests/.cvsignore:
* tests/Makefile.am:
* tests/print-editor.c:
Test application for printing.
* gdk/gdk.symbols:
* gdk/win32/gdkevents-win32.c:
* gdk/win32/gdkwin32.h:
Add gdk_win32_set_modal_dialog_libgtk_only so that we can pump the
mainloop while displaying a win32 common dialog.
* gdk/directfb/Makefile.am:
Whitespace cleanup.
Diffstat (limited to 'gtk/gtkprinteroptionset.c')
-rw-r--r-- | gtk/gtkprinteroptionset.c | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/gtk/gtkprinteroptionset.c b/gtk/gtkprinteroptionset.c new file mode 100644 index 0000000000..eb84a3448e --- /dev/null +++ b/gtk/gtkprinteroptionset.c @@ -0,0 +1,205 @@ +/* GTK - The GIMP Toolkit + * gtkprintbackend.h: Abstract printer backend interfaces + * Copyright (C) 2006, Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include <string.h> +#include <glib.h> +#include <gmodule.h> + +#include "gtkprinteroptionset.h" +#include "gtkalias.h" + +/***************************************** + * GtkPrinterOptionSet * + *****************************************/ + +enum { + CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +/* ugly side-effect of aliasing */ +#undef gtk_printer_option_set + +G_DEFINE_TYPE (GtkPrinterOptionSet, gtk_printer_option_set, G_TYPE_OBJECT) + +static void +gtk_printer_option_set_finalize (GObject *object) +{ + GtkPrinterOptionSet *set = GTK_PRINTER_OPTION_SET (object); + + g_hash_table_destroy (set->hash); + g_ptr_array_foreach (set->array, (GFunc)g_object_unref, NULL); + g_ptr_array_free (set->array, TRUE); + + G_OBJECT_CLASS (gtk_printer_option_set_parent_class)->finalize (object); +} + +static void +gtk_printer_option_set_init (GtkPrinterOptionSet *set) +{ + set->array = g_ptr_array_new (); + set->hash = g_hash_table_new (g_str_hash, g_str_equal); +} + +static void +gtk_printer_option_set_class_init (GtkPrinterOptionSetClass *class) +{ + GObjectClass *gobject_class = (GObjectClass *)class; + + gobject_class->finalize = gtk_printer_option_set_finalize; + + signals[CHANGED] = + g_signal_new ("changed", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkPrinterOptionSetClass, changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + + +static void +emit_changed (GtkPrinterOptionSet *set) +{ + g_signal_emit (set, signals[CHANGED], 0); +} + +GtkPrinterOptionSet * +gtk_printer_option_set_new (void) +{ + return g_object_new (GTK_TYPE_PRINTER_OPTION_SET, NULL); +} + +void +gtk_printer_option_set_remove (GtkPrinterOptionSet *set, + GtkPrinterOption *option) +{ + int i; + + for (i = 0; i < set->array->len; i++) + { + if (g_ptr_array_index (set->array, i) == option) + { + g_ptr_array_remove_index (set->array, i); + g_hash_table_remove (set->hash, option->name); + g_signal_handlers_disconnect_by_func (option, emit_changed, set); + + g_object_unref (option); + break; + } + } +} + +void +gtk_printer_option_set_add (GtkPrinterOptionSet *set, + GtkPrinterOption *option) +{ + g_object_ref (option); + + if (gtk_printer_option_set_lookup (set, option->name)) + gtk_printer_option_set_remove (set, option); + + g_ptr_array_add (set->array, option); + g_hash_table_insert (set->hash, option->name, option); + g_signal_connect_object (option, "changed", G_CALLBACK (emit_changed), set, G_CONNECT_SWAPPED); +} + +GtkPrinterOption * +gtk_printer_option_set_lookup (GtkPrinterOptionSet *set, + const char *name) +{ + gpointer ptr; + + ptr = g_hash_table_lookup (set->hash, name); + + return GTK_PRINTER_OPTION (ptr); +} + +void +gtk_printer_option_set_clear_conflicts (GtkPrinterOptionSet *set) +{ + gtk_printer_option_set_foreach (set, + (GtkPrinterOptionSetFunc)gtk_printer_option_clear_has_conflict, + NULL); +} + +static int +safe_strcmp (const char *a, const char *b) +{ + if (a == NULL) + a = ""; + if (b == NULL) + b = ""; + + return strcmp (a, b); +} + +GList * +gtk_printer_option_set_get_groups (GtkPrinterOptionSet *set) +{ + GtkPrinterOption *option; + GList *list = NULL; + int i; + + for (i = 0; i < set->array->len; i++) + { + option = g_ptr_array_index (set->array, i); + + if (g_list_find_custom (list, option->group, (GCompareFunc)safe_strcmp) == NULL) + list = g_list_prepend (list, g_strdup (option->group)); + } + + return g_list_reverse (list); +} + +void +gtk_printer_option_set_foreach_in_group (GtkPrinterOptionSet *set, + const char *group, + GtkPrinterOptionSetFunc func, + gpointer user_data) +{ + GtkPrinterOption *option; + int i; + + for (i = 0; i < set->array->len; i++) + { + option = g_ptr_array_index (set->array, i); + + if (group == NULL || + (option->group != NULL && strcmp (group, option->group) == 0)) + func (option, user_data); + } +} + +void +gtk_printer_option_set_foreach (GtkPrinterOptionSet *set, + GtkPrinterOptionSetFunc func, + gpointer user_data) +{ + gtk_printer_option_set_foreach_in_group (set, NULL, func, user_data); +} + + +#define __GTK_PRINTER_OPTION_SET_C__ +#include "gtkaliasdef.c" |