diff --git a/ChangeLog b/ChangeLog.pre-2-16 similarity index 100% rename from ChangeLog rename to ChangeLog.pre-2-16 diff --git a/HACKING b/HACKING index 54c2baea8b..91dd2156ea 100644 --- a/HACKING +++ b/HACKING @@ -17,7 +17,7 @@ can be found here: Information about using git with GNOME can be found here: - http://live.gnome.org/GitMigration + http://live.gnome.org/Git In order to get GIT gtk+ installed on your system, you need to have the most recent GIT versions of glib, pango, and atk installed as well. @@ -32,6 +32,11 @@ gtk+ and glib. You can do the following to get glib and gtk+ from GIT: $ git clone git://git.gnome.org/atk $ git clone git://git.gnome.org/gtk+ +Note: if you plan to push changes to back to the master repository and +have a gnome account, you want to use the following instead: + + $ git clone ssh://@git.gnome.org/git/gtk+ + To compile the GIT version of gtk+ on your system, you will need to take several steps to setup the tree for compilation. You can do all these steps at once by running: diff --git a/INSTALL b/INSTALL deleted file mode 100644 index f9b3a0787c..0000000000 --- a/INSTALL +++ /dev/null @@ -1,41 +0,0 @@ -Prerequisites -============= - -GTK+ requires the following packages: - - - The GLib, Pango, ATK and cairo libraries, available at the same - location as GTK+. GTK+ 2.16.0 requires at least GLib 2.17.6, - Pango 1.20, ATK 1.13.0 and cairo 1.6.0. - - - The TIFF, PNG, and JPEG image loading libraries. You most - likely have these installed on your system already. If not - these libraries are available from: - - http://www.libtiff.org/ - http://www.libpng.org/ - http://www.ijg.org/ - - libtiff must be version 3.6.0 or higher. - -Simple install procedure -======================== - - % gzip -cd gtk+-2.16.0.tar.gz | tar xvf - # unpack the sources - % cd gtk+-2.16.0 # change to the toplevel directory - % ./configure # run the `configure' script - % make # build GTK+ - [ Become root if necessary ] - % make install # install GTK+ - -The Details -=========== - -Complete information about installing GTK+ and related libraries can be found -in the file: - - docs/reference/gtk/html/gtk-building.html - -Or online at: - - http://developer.gnome.org/doc/API/2.0/gtk/gtk-building.html - diff --git a/Makefile.am b/Makefile.am index 3fdb9f2706..090c2fb4ce 100644 --- a/Makefile.am +++ b/Makefile.am @@ -19,6 +19,9 @@ EXTRA_DIST += \ ChangeLog.pre-2-6 \ ChangeLog.pre-2-8 \ ChangeLog.pre-2-10 \ + ChangeLog.pre-2-12 \ + ChangeLog.pre-2-14 \ + ChangeLog.pre-2-16 \ ChangeLog.gtk-async-file-chooser \ ChangeLog.gtk-printing \ README.commits \ @@ -115,6 +118,26 @@ EXTRA_DIST += \ examples/spinbutton/spinbutton.c \ examples/spinbutton/Makefile \ examples/find-examples.sh +MAINTAINERCLEANFILES = \ + $(srcdir)/INSTALL \ + $(srcdir)/README \ + $(srcdir)/aclocal.m4 \ + $(srcdir)/autoscan.log \ + $(srcdir)/compile \ + $(srcdir)/config.guess \ + $(srcdir)/config.h.in \ + $(srcdir)/config.sub \ + $(srcdir)/configure.scan \ + $(srcdir)/depcomp \ + $(srcdir)/install-sh \ + $(srcdir)/ltmain.sh \ + $(srcdir)/missing \ + $(srcdir)/mkinstalldirs \ + $(srcdir)/omf.make \ + $(srcdir)/xmldocs.make \ + $(srcdir)/gtk-doc.make \ + $(srcdir)/ChangeLog \ + `find "$(srcdir)" -type f -name Makefile.in -print` GDKTARGET=@gdktarget@ @@ -152,6 +175,25 @@ DISTCLEANFILES = \ gail-uninstalled.pc \ config.lt +distclean-local: + if test $(srdcir) = .; then :; else \ + rm -f ChangeLog; \ + fi + +ChangeLog: + @echo Creating $@ + @if test -d "$(srcdir)/.git"; then \ + (GIT_DIR=$(top_srcdir)/.git ./missing --run git log GTK_2_16_0^^.. --stat) | fmt --split-only > $@.tmp \ + && mv -f $@.tmp $@ \ + || ($(RM) $@.tmp; \ + echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \ + (test -f $@ || echo git-log is required to generate this file >> $@)); \ + else \ + test -f $@ || \ + (echo A git checkout and git-log is required to generate ChangeLog >&2 && \ + echo A git checkout and git-log is required to generate this file >> $@); \ + fi + ## copy the default target for this platform to gdk-2.0.pc and gtk+-2.0.pc DEFAULT_GDKTARGET=x11 install-data-hook: @@ -176,7 +218,7 @@ dist-hook: && cp INSTALL README $(distdir) ; \ fi -.PHONY: files release sanity snapshot +.PHONY: files release sanity snapshot ChangeLog files: @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ @@ -201,3 +243,15 @@ snapshot: $(MAKE) dist distdir=$(PACKAGE)-snap`date +"%Y%m%d"` DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-man --disable-rebuilds + +GITIGNOREFILES = \ + po-properties/Makefile.in.in \ + po-properties/Makefile.in \ + po-properties/Makefile \ + po-properties/*.gmo \ + po-properties/*.mo \ + po-properties/POTFILES \ + po-properties/stamp-it \ + po-properties/.intltool-merge-cache + +-include $(top_srcdir)/git.mk diff --git a/NEWS b/NEWS index 1a993aa744..e911c1173c 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,124 @@ +Overview of Changes from GTK+ 2.17.0 to 2.17.1 +============================================== + +* GtkLabel: + - GtkLabel can now show embedded URLs, much like SexyUrlLabel + +* Changes that are relevant for theme authors: + - The URL support in GtkLabel uses the link-color / visited-link-color + style properties + + +Overview of Changes from GTK+ 2.16.x to 2.17.0 +============================================== + +* GtkBuilder: + - Scale marks can now be specified in builder markup + - GtkAssistant action widgets can be added in builder markup + +* Changes that are relevant for theme authors + - GtkEntry now has a ::invisible-char style property that allows + themes to set the preferred invisible character + +* Printing: + - GTK+ supports authentication of users against CUPS servers now. + +* Bugs fixed: + 578634 gtkdial example fails to compile + 580678 Minor improvement to GTK+ mediaLib code + 580511 gdk_x11_atom_to_xatom_for_display translates GDK_NONE... + 581110 Handlebox widget uses static variables, crashes in multi... + 553385 gtk-builder-convert creates untranslated combobox models + 580814 GtkTextLayout incorrectly assumes pango iterates in logi... + 579366 gtkbuilderparser leaks RequiresInfo objects + 579741 gailcombox should emit property-changed:accessible-name... + 574386 Remove deprecated call to gtk_status_icon_set_tooltip... + 384940 handle rejecting jobs and authentication meaningfully + +* Updated translations + Arabic + Brazilian Portuguese + British English + Catalan + Czech + Estonian + Italian + Kannada + Oriya + Simplified Chinese + Slovenian + Spanish + Ukrainian + + +Overview of Changes from GTK+ 2.16.0 to 2.16.1 +============================================== + +* GtkBuilder: + - Accessible action names can now be marked as translatable. + - gtk-builder-convert correctly handles response ids in all dialogs. + - gtk-builder-convert warns about duplicate ids. + +* GDK: + - GDK no longer refuses to work on 30-bit visuals + +* Win32: + - The appearance of GTK+ menus on Vista has been improved. + +* Bugs fixed: + 575700 Crash when moving a GtkWindow + 574283 unused assignment and dead code in gtk_widget_set_tooltip_window + 538840 [Win32] GTK menu theming could be improved + 576254 requires attribute "id" + 576306 gdkscreen.c: get_nearest_monitor too simple... + 437533 Implement draw_shape PangoRenderer method + 577224 crash when setting new icon after setting icon... + 576150 Doc bug for GtkMenuPositionFunc + 562863 GtkVscrollbar is hardly documented + 575644 Cygwin gail build patch + 571374 Add 30-bit visuals to the list of supported depths + 577650 gtkitemfactory.h fails to compile + 578094 ProcessIdToSessionId needs to be declared as WINAPI + 518642 Custom tags and translatable content + 532858 segv setting GBoxed subclass + 557629 Response ID not converted for GtkFileChooserDialog + 577789 about dialogue doesn't linkify licence text + 577824 empathy_chat_window_init: GClosure is leaked + 577964 Page Range entry is not accessible + 578221 Assertion warning `GTK_IS_TEXT_LAYOUT (layout)' failed + 578271 PageSetup should be sent to the previewer + 578276 gtk-builder-convert improperly converts GtkComboBox + 578290 two memory leaks + 578354 Memory leak in gdkscreen-x11 + 578365 GtkMountOperation does not allow passwordless mount of sf... + 578366 file descriptor leak + 573922 Using NET_WM_USER_TIME even if startup notification times... + 561345 Title of Print Preview window should not be previewXXXXXX... + 577868 about dialogue changes appearance on style-set (change th... + 572797 GtkCellRendererAccel display string i18n in OTHER mode + +* Updated translations: + Arabic + Assamese + Basque + Bulgarian + Crimean Tatar + Danish + Galician + German + Greek + Gujarati + Japanese + Kannada + Malayalam + Marathi + Oriya + Pashto + Russian + Spanish + Telugu + Turkish + Overview of Changes from GTK+ 2.15.5 to 2.16.0 ============================================== diff --git a/README b/README deleted file mode 100644 index 260361a02b..0000000000 --- a/README +++ /dev/null @@ -1,401 +0,0 @@ -General Information -=================== - -This is GTK+ version 2.16.0. GTK+ is a multi-platform toolkit for -creating graphical user interfaces. Offering a complete set of widgets, -GTK+ is suitable for projects ranging from small one-off projects to -complete application suites. - -GTK+ is free software and part of the GNU Project. However, the -licensing terms for GTK+, the GNU LGPL, allow it to be used by all -developers, including those developing proprietary software, without any -license fees or royalties. - -The official ftp site is: - ftp://ftp.gtk.org/pub/gtk - -The official web site is: - http://www.gtk.org/ - -Information about mailing lists can be found at - http://www.gtk.org/mailinglists.html - - -Installation -============ - -See the file 'INSTALL' - - -Release notes for 2.14 -====================== - -* gtkitemfactory.h is now completely deprecated. - As gtkactiongroup.h and gtkstock.h no longer include the gtkitemfactory.h - header, this might break application using gtk_item_factory_* symbols - without including gtkitemfactory.h - even though this behaviour has never - been supported in the first place. - -* The GtkFileSystem semi-private interface has been removed. - The GTK+ filechooser implementation now uses GIO directly, which has - rendered external filesystem implementations unnecessary. Consequently, - the GtkFileSystem interface is no longer available, nor the filechooser - will load any GtkFileSystem implementation. - -* GtkComboBox now renders the popdown button insensitive when - the model is empty. Applications which want to populate the list - only before displaying it can set gtk_combo_box_set_button_sensitivity - to GTK_SENSITIVITY_ON, so that the button is always sensitive or - GTK_SENSITIVITY_OFF to make it insensitive respectively. - -* GtkAdjustment now enforces that values are restricted to the - range [lower, upper - page_size]. This has always been the documented - behaviour, and the recommended practice is to set page_size to 0 - when using adjustments for simple scalar values, like in a slider - or spin button. - -* gdk-pixbuf will use GIO for mime type detection if possible. For - this to work, shared-mime-info needs to be installed and XDG_DATA_DIRS - set accordingly at configure time. Otherwise, gdk-pixbuf falls - back to its built-in sniffing implementation. - -Release notes for 2.12 -====================== - -* gtk_about_dialog_get/set_name() were deprecated in favour of - gtk_about_dialog_get/set_program_name(), the GtkAboutDialog now uses the - "program-name" property instead of the conflicting "name" property. - -* The gdk-pixbuf tiff loader now requires libtiff 3.6.0 or later. - -* Support for Windows 9x/ME has officially been removed. It hasn't worked - since 2.6 anyway. - -* The GtkTextBufferTargetInfo enumeration values have been changed from - G_MAXUINT-0, G_MAXUINT-1, G_MAXUINT-2, etc, to -1, -2, -3 to stay within - ANSI C limits. - -* A change in the handling of _NET_WM_USER_TIME properties on toplevel - windows can cause deadlock problems with window managers that are using - GDK for drawing decorations. In particular, metacity <= 2.18.0 is affected - by this. The problem has been fixed in metacity 2.18.1. - -* Semi-private GtkTextLayout api has changed: new GtkTextLayout method - invalidate_cursors(), and new functions gtk_text_layout_invalidate_cursors() - and gtk_text_layout_cursors_changed(), which should be used in place of - gtk_text_layout_invalidate() and gtk_text_layout_changed() if invalidation - is due to marks moved or changed selection; new GtkTextLineDisplay structure - member. Source compatibility is preserved; binary compatibility may break - only if GtkTextLineDisplay structure was created on stack or as a part - of another structure (in particular GnomeCanvas and its clones do not need - recompiling). - -* Another new signal has been added to GtkNotebook. The new signal - is called create-window, so this name can no longer be used for signals - in objects derived from GtkNotebook. - -* The gtk_notebook_set/get_group_id() functions were found to be insufficient - and have been deprecated in favour of gtk_notebook_set/get_group(). - -* The move-focus signal has been moved to GtkWidget, to unify the - various implementations of this signal in specific widgets. Great care - has been taken to make sure that all code using this signal continues - to work. - -* An unused and hardly visible GtkFrame has been removed from the menu - widget hierarchy when GtkComboBox::appears-as-list style property is - set. Any RC file applying a different style to any widget below the - widget path "gtk-combobox-popup-window.GtkFrame" should take into - account that the frame no longer exists. - -* The external print preview application used by GtkPrintOperationPreview - is now passed the print settings on the command line with the - --print-settings parameter pointing to a temp file containing the - settings. The preview application assumes ownership of the file and - should delete it once it does not need it anymore. The --print-settings - commandline option is understood by Evince 0.9.0 and newer. To use a - different print preview application, change the gtk-print-preview-command - setting in your gtkrc file, e.g. gtk-print-preview-command = "ggv %f" - -* GtkMenuShell is now defined as an abstract type. It was already - documented as an abstract class, and there is little reason to - instantiate it. - -* The GtkTooltips struct (this is the old tooltips API) is now considered - private. Code that used to access this struct, in particular the - tips_data_list field, will need to change. All of the old tooltips - API has been deprecated in favour of a new implementation and - API. This affects all of the gtk_tooltips_ functions, and functions - which take a GtkTooltips argument, such as gtk_tool_item_set_tooltip() - and gtk_menu_tool_button_set_arrow_tooltip(). - -* The memory management of the GtkRecentManager object has been changed, - as using the screen didn't guarantee that the singleton instance was - correctly destroyed. The screen-related functions have been deprecated, - and should not be used anymore; the GtkRecentManager instance returned by - the gtk_recent_manager_get_default() function is guaranteed to be valid - for the entire lifetime of an application. - -* A number of interfaces that have been superseded by newer interfaces for - a long time have finally been deprecated. This includes - gtk_widget_ref/unref(), gtk_rc_style_ref/unref() and the old file selector. - -* The various coordinate systems in use in GtkTreeView widgets have - been clarified in the documentation, and in the cause of doing so, - the functions gtk_tree_view_widget_to_tree_coords() and - gtk_tree_view_tree_to_widget_coords() have been deprecated in - favour of a new family of gtk_tree_view_convert_ functions. - -* gtk_menu_item_remove_submenu() has been deprecated in favour of - gtk_menu_item_set_submenu (..., NULL). - -* gtk_default_draw_check() has been fixed to really decrease the - indicator size by one pixel to ensure an odd size instead of - accidentially increasing it. - Consequently, gtk_cell_renderer_toggle_render() could be fixed to - not subtract 1 from the size passed to gtk_paint_option(), which - was just a workaround for above off-by-two for even sizes (theme - engines now get the real indicator size passed). - The default toggle size of GtkCheckMenuItem and GtkCellRendererToggle - has been changed to 13 to be consistent with GtkCheckButton. - The only visible change with default settings is that the indicator in - GtkCellRendererToggle has changed its size from 11 to 13 and is now - consistent with menus and toggle buttons. - -* GTK+ has always required that gtk_init() (or a variant thereof) is - called before any other GTK+ function. Some applications call functions - like gtk_clipboard_get() to check if they need to call gtk_init(), - anyway. A change in GLib 2.14 has recently broken this unsupported - practise. It is worth pointing out that calling gtk_init() twice - does no harm. - - -Release notes for 2.10 -====================== - -* The hexadecimal Unicode input feature has been reworked. It no longer - blocks the use of the sixteen Ctrl-Shift- key sequences. Now - it only uses Ctrl-Shift-u. - -* A memory leak in GtkStyle handling has been fixed. This may expose bugs - in third-party widgets which forget to call gtk_style_attach() in their - realize functions. - -* Range widgets like GtkScrollbar now render their arrows insensitive - when the slider is at the end. Applications which react to arrow - clicks even if the slider is at the end may want to use the new - gtk_range_set_[upper/lower]_stepper_sensitivity() functions to - prevent the arrows from being rendered insensitive. - -* GtkObject now uses the "floating reference" support in GObject. - GTK_OBJECT_IS_FLOATING() will still work, but direct checking - of the GTK_FLOATING flag will no longer detect the floating - reference. Details about floating references can be found in the docs: - http://developer.gnome.org/doc/API/2.0/gobject/gobject-The-Base-Object-Type.html#floating-ref - -* Accelerators like (_F) are now stripped from labels when they are - displayed in toolbars. If this is not wanted, the feature can be - suppressed by inserting a Unicode control character, e.g ZWNJ. - -* The pixbuf theme engine can now customize expanders (in GtkTreeView - and GtkExpander) and resize grips, using the new EXPANDER and - RESIZE_GRIP function values. - -* Dialogs created by gtk_about_dialog_new() no longer hide automatically - when the user clicks close. It is the applications responsibility to - hide or destroy the dialog. - -* Several new signals have been added to GtkNotebook. Care has been taken - to choose signal names which do not collide with signals added by well-known - derived classes. The names which can no longer be used for signals in - objects derived from GtkNotebook are page-reordered, page-removed and - page-added. - -* Due to the interface changes in the file chooser backend interface, - the GTK+ ABI version has been bumped to 2.10.0. Third-party filesystem - backends have to be ported to the new interface, other modules, such as - theme engines, input method modules or pixbuf loaders have to be rebuilt - so that they are installed in the right place for GTK+ to find them. - - -Release notes for 2.8 -===================== - -* GTK+ 2.8 and Pango 1.10 require the cairo library. - -* The default theme has been renamed to "Raleigh". Existing configurations - specifying the "Default" theme name should still work. - -* The GtkTreeView::enable-search property has been changed to control - only typeahead search, not the C-f keybinding to start an interactive - search. To turn off interactive searching completely, you have to - set GtkTreeView::search-column to -1. - -* The restriction on using the same cell renderer in multiple columns - of a GtkTreeView is now more strictly enforced. - -* In GTK+ 2.8, GtkCalendar uses nl_langinfo() (if available) to determine - the first day of the week. Thus, it is possible to select the first day - of the week independently from the language, by setting LC_TIME. - -* In GTK+ 2.8, the gtk-update-icon-cache utility includes image data - in the icon caches, which will make the icon cache files larger than - the one produced by GTK+ 2.6. This change will reduce the memory - overhead of icon themes at runtime, since all GTK+ applications can - share the image data in memory. - -* In 2.8, GDK emits GdkEventGrabBroken events when a keyboard or pointer - grab is broken. On X11, this can happen if the same application grabs - again, or if the window used for the grab becomes unviewable. It happens - more often on Win32. Applications which use grabs should pay attention - to these events and do the necessary cleanups when the grab is lost. -* The GIOChannel code for sockets on win32 has been rewritten. - Applications who make non-trivial use of GIOChannels on win32 should - be watched for possible problems. - -* GLib 2.8 uses atomic operations to implement reference counting, thus - g_object_ref/unref, g_closure_ref/sink/unref and g_iochannel_ref/unref - can be used without locking in multithreaded applications. Note that - other modifications, like concurrent setting of properties still require - locking. - -* g_convert() and related character set conversion functions have been - fixed to emit pending shift states and to not cache iconv descriptors - across multiple calls, since that is problematic for some encodings. - Note that these functions are not suitable for streaming conversions; - use g_iconv() to do streaming conversion. - - -Release notes for 2.6 -===================== - -* GTK+ 2.6 supports clipboard persistency. To make use of this feature, - a clipboard manager following the specification at - http://www.freedesktop.org/wiki/Standards/clipboard-manager-spec - must be running. A sample implementation of such a clipboard manager - is available at - http://people.imendio.com/andersca/archives/clipboard-manager-0.3.tar.gz - Applications can use the function gdk_display_supports_clipboard_persistence() - to find out if clipboard persistence is available. - -* Notification on clipboard ownership changes via GdkOwnerChange events - requires the XFIXES X extension. Applications can use the function - gdk_display_supports_selection_notification() to find out if ownerchip - change notification is available. - -* The icon theme code in GTK+ 2.6 follows the freedesktop.org icon theme - specification. Setting the XDG_DATA_DIRS environtment variable may be - necessary if your icons aren't installed in the default location - /usr/share/icons. - -* The icon theme code in GTK+ 2.6 can make use of mmap()able cache files - to avoid a lot of disk searching overhead. GTK+ includes a utility named - gtk-update-icon-cache to generate these cache files. For further details, - see the gtk-update-icon-cache man page or the GTK+ documentation. - -* To reduce code size and improve efficiency, GTK+, when compiled - with the GNU toolchain, has separate internal and external entry - points for exported functions. The internal names, which begin with - IA__, may be seen when debugging a GTK+ program. - -* The following functions have been deprecated in GTK+ 2.6: - gdk_pango_context_set_colormap - gtk_cell_renderer_editing_canceled - -* The new GtkFileChooser widget emphasizes simplicity and thus does - not provide a navigation entry by default when opening files. - Experienced command line users will likely want to make heavy use of - the location dialog brought up by the Control-L key shortcut. - -* The GTK+ libraries use an '_' prefix to indicate private symbols that - must not be used by applications. On some platforms, symbols beginning - with prefixes such as _gtk, _gdk, and _pango will be exported - from the library, on others not. In no case can applications - use these private symbols. In addition to that, GTK+ 2.6 makes several - symbols private which were not in any installed header files and - were never intended to be exported. - -* The gdk_pixbuf_xlib library included in the contrib/ directory - and the framebuffer GDK backend included in the gdk/linux-fb directory - of GTK+ are provided on an as-is basis and have not been tested at all. - No guarantees about the degree of workingness or about future - compatibility are provided. - -* On Unix, the assumption of GLib and GTK+ by default is that filenames on - the filesystem are encoded in UTF-8 rather than the encoding of the locale; - the GTK+ developers consider that having filenames whose interpretation - depends on the current locale is fundamentally a bad idea. - - If you have filenames encoded in the encoding of your locale, then you - may want to set the G_FILENAME_ENCODING environment variable: - - G_FILENAME_ENCODING=@locale - export G_FILENAME_ENCODING - - (Earlier versions of GLib 2.x required a different environment variable - setting; G_BROKEN_FILENAMES=1 to achieve the same effect; this - is still supported, but G_FILENAME_ENCODING is preferred.) - Best integration of GTK+ 2.6 with the environment is achieved by - using a UTF-8 locale. - - On Windows, filenames passed to GTK+ should always be in UTF-8, as - in GLib 2.6. This is different than in previous versions of GTK+ - where the system codepage was used. As in GLib, for DLL ABI - stability, applications built against previous versions of GTK+ will - use entry points providing the old semantics. - - When compiling against GTK+ 2.6, applications intended to be - portable to Windows must take the UTF-8 file name encoding into - consideration, and use the gstdio wrappers to access files whose - names have been constructed from strings returned from GTK+ or GLib. - - -How to report bugs -================== - -Bugs should be reported to the GNOME bug tracking system. -(http://bugzilla.gnome.org, product gtk+.) You will need to create an -account for yourself. - -In the bug report please include: - -* Information about your system. For instance: - - - What operating system and version - - What version of X - - For Linux, what version of the C library - - And anything else you think is relevant. - -* How to reproduce the bug. - - If you can reproduce it with one of the tests or demos built with GTK+, - such as demos/gtk-demo/gtk-demo, that would be most convenient. Otherwise, - please include a short test program that exhibits the behavior. As a - last resort, you can also provide a pointer to a larger piece of software - that can be downloaded. - -* If the bug was a crash, the exact text that was printed out when the - crash occured. - -* Further information such as stack traces may be useful, but is not - necessary. If you do send a stack trace, and the error is an X error, - it will be more useful if the stacktrace is produced running the test - program with the --sync command line option. - - -Patches -======= - -Patches should also be submitted to bugzilla.gnome.org. If the patch -fixes an existing bug, add the patch as an attachment to that bug -report. - -Otherwise, enter a new bug report that describes the patch, and attach -the patch to that bug report. - -Bug reports containing patches should include the PATCH keyword in their -keyword fields. If the patch adds to or changes the GTK+ programming -interface, the API keyword should also be included. - -Patches should be in unified diff form. (The -u option to GNU diff.) diff --git a/README.in b/README.in index 2bc3209a91..3e2d7da727 100644 --- a/README.in +++ b/README.in @@ -27,6 +27,14 @@ Installation See the file 'INSTALL' +Release notes for 2.18 +====================== + +* gtk_tooltip_set_custom now accept a NULL custom_widget to unset the + old custom_widget. Custom_widget does not get destroyed when the + tooltip goes away. + + Release notes for 2.16 ====================== @@ -69,11 +77,15 @@ Release notes for 2.14 to GTK_SENSITIVITY_ON, so that the button is always sensitive or GTK_SENSITIVITY_OFF to make it insensitive respectively. -* GtkAdjustment now enforces that values are restricted to the - range [lower, upper - page_size]. This has always been the documented - behaviour, and the recommended practice is to set page_size to 0 - when using adjustments for simple scalar values, like in a slider - or spin button. +* In the early 2.14.x releases, GtkAdjustment was changed to enforce + that values are restricted to the range [lower, upper - page_size]. + This has always been the documented behaviour, and the recommended + practice is to set page_size to 0 when using adjustments for simple + scalar values, like in a slider or spin button. + Due to the large number of applications that are affected by this + change, the behaviour has been reverted to the old behaviour in + 2.14.3, with an explicit warning that this change will be + reintroduced in 2.90. * gdk-pixbuf will use GIO for mime type detection if possible. For this to work, shared-mime-info needs to be installed and XDG_DATA_DIRS diff --git a/configure.in b/configure.in index 029acb8582..7614ea89d5 100644 --- a/configure.in +++ b/configure.in @@ -11,9 +11,9 @@ AC_PREREQ(2.54) # set GTK_BINARY_AGE and GTK_INTERFACE_AGE to 0. m4_define([gtk_major_version], [2]) -m4_define([gtk_minor_version], [16]) +m4_define([gtk_minor_version], [17]) m4_define([gtk_micro_version], [1]) -m4_define([gtk_interface_age], [1]) +m4_define([gtk_interface_age], [0]) m4_define([gtk_binary_age], [m4_eval(100 * gtk_minor_version + gtk_micro_version)]) m4_define([gtk_version], @@ -1879,6 +1879,28 @@ else AM_CONDITIONAL(HAVE_CUPS, false) fi +# Checks to see if we should compile with PAPI backend for GTK+ +# + +AC_ARG_ENABLE(papi, + [AC_HELP_STRING([--disable-papi] + [disable papi print backend])],, + [enable_papi=auto]) + +if test "x$enable_papi" = "xauto" +then + AC_MSG_CHECKING(libpapi) + AC_CHECK_LIB(papi, papiServiceCreate, have_papi=yes, have_papi=no) + if test $have_papi = yes; then + AC_DEFINE([HAVE_PAPI], [], [Define to 1 if libpapi available]) + fi + AM_CONDITIONAL(HAVE_PAPI, test $have_papi = yes) +else + AM_CONDITIONAL(HAVE_PAPI, false) +fi + +AM_CONDITIONAL(HAVE_PAPI_CUPS, test $have_papi = yes && test "x$CUPS_CONFIG" != "xno") + gtk_save_cppflags="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $GTK_DEP_CFLAGS" @@ -2107,6 +2129,7 @@ modules/printbackends/Makefile modules/printbackends/cups/Makefile modules/printbackends/lpr/Makefile modules/printbackends/file/Makefile +modules/printbackends/papi/Makefile modules/printbackends/test/Makefile perf/Makefile contrib/Makefile diff --git a/contrib/Makefile.am b/contrib/Makefile.am index 3d2ba11ebc..feb4bdbf82 100644 --- a/contrib/Makefile.am +++ b/contrib/Makefile.am @@ -4,3 +4,5 @@ SUBDIRS = if USE_X11 SUBDIRS += gdk-pixbuf-xlib endif + +-include $(top_srcdir)/git.mk diff --git a/contrib/gdk-pixbuf-xlib/Makefile.am b/contrib/gdk-pixbuf-xlib/Makefile.am index 328bbe6758..4b89e5172d 100644 --- a/contrib/gdk-pixbuf-xlib/Makefile.am +++ b/contrib/gdk-pixbuf-xlib/Makefile.am @@ -38,3 +38,5 @@ pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = gdk-pixbuf-xlib-2.0.pc EXTRA_DIST += gdk-pixbuf-xlib-2.0.pc.in + +-include $(top_srcdir)/git.mk diff --git a/demos/Makefile.am b/demos/Makefile.am index fd819543e2..c8c9bbb1c5 100644 --- a/demos/Makefile.am +++ b/demos/Makefile.am @@ -82,3 +82,5 @@ EXTRA_DIST += \ gnu-keys.png DISTCLEANFILES = test-inline-pixbufs.h + +-include $(top_srcdir)/git.mk diff --git a/demos/gtk-demo/Makefile.am b/demos/gtk-demo/Makefile.am index 46ebc03a1b..aced886a3d 100644 --- a/demos/gtk-demo/Makefile.am +++ b/demos/gtk-demo/Makefile.am @@ -3,7 +3,7 @@ include $(top_srcdir)/Makefile.decl democodedir=$(datadir)/gtk-2.0/demo -## These should be in the order you want them to appear in the +## These should be in the order you want them to appear in the ## demo app, which means alphabetized by demo title, not filename demos = \ appwindow.c \ @@ -23,6 +23,7 @@ demos = \ iconview.c \ iconview_edit.c \ images.c \ + links.c \ list_store.c \ menus.c \ panes.c \ @@ -96,3 +97,5 @@ IMAGEFILES= alphatest.png \ democode_DATA = $(demos) $(IMAGEFILES) demo.ui DISTCLEANFILES = demos.h + +-include $(top_srcdir)/git.mk diff --git a/demos/gtk-demo/links.c b/demos/gtk-demo/links.c new file mode 100644 index 0000000000..c506144c87 --- /dev/null +++ b/demos/gtk-demo/links.c @@ -0,0 +1,85 @@ +/* Links + * + * GtkLabel can show hyperlinks. The default action is to call + * gtk_show_uri() on their URI, but it is possible to override + * this with a custom handler. + */ + +#include + +static void +response_cb (GtkWidget *dialog, + gint response_id, + gpointer data) +{ + gtk_widget_destroy (dialog); +} + +static gboolean +activate_link (GtkWidget *label, + const gchar *uri, + gpointer data) +{ + if (g_strcmp0 (uri, "keynav") == 0) + { + GtkWidget *dialog; + GtkWidget *parent; + + parent = gtk_widget_get_toplevel (label); + dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (parent), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_OK, + "The term keynav is a shorthand for " + "keyboard navigation and refers to the process of using " + "a program (exclusively) via keyboard input."); + + gtk_window_present (GTK_WINDOW (dialog)); + g_signal_connect (dialog, "response", G_CALLBACK (response_cb), NULL); + + return TRUE; + } + + return FALSE; +} + +GtkWidget * +do_links (GtkWidget *do_widget) +{ + static GtkWidget *window = NULL; + GtkWidget *box; + GtkWidget *label; + + if (!window) + { + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (do_widget)); + gtk_container_set_border_width (GTK_CONTAINER (window), 12); + g_signal_connect (window, "destroy", + G_CALLBACK(gtk_widget_destroyed), &window); + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_true), NULL); + + label = gtk_label_new ("Some text may be marked up\n" + "as hyperlinks, which can be clicked\n" + "or activated via keynav"); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL); + gtk_container_add (GTK_CONTAINER (window), label); + gtk_widget_show (label); + } + + if (!GTK_WIDGET_VISIBLE (window)) + { + gtk_widget_show (window); + } + else + { + gtk_widget_destroy (window); + window = NULL; + } + + return window; +} diff --git a/demos/testgtk/main.c b/demos/testgtk/main.c index f21c0f80a8..69c872a2b6 100644 --- a/demos/testgtk/main.c +++ b/demos/testgtk/main.c @@ -189,6 +189,7 @@ load_file (const gchar *filename) gtk_text_buffer_get_bounds (source_buffer, &start, &end); gtk_text_buffer_apply_tag_by_name (info_buffer, "source", &start, &end); + fclose (file); } gboolean diff --git a/docs/Makefile.am b/docs/Makefile.am index 47f80304cd..515a7c100a 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -19,3 +19,5 @@ EXTRA_DIST += \ generation.txt \ gtkdocs_fix \ RELEASE-HOWTO + +-include $(top_srcdir)/git.mk diff --git a/docs/RELEASE-HOWTO b/docs/RELEASE-HOWTO index 8690081060..4991d9a9f1 100644 --- a/docs/RELEASE-HOWTO +++ b/docs/RELEASE-HOWTO @@ -9,17 +9,19 @@ dependencies: Without those packages make distcheck will *not* pass. - 0) Blow away your gtk+ directory, check a new version out + 0) Go back to a pristine working directory. With git, this works: - 1) autogen and build it, make sure to enable docs by specifying + git clean -f -x + + 1) autogen and build it, make sure to enable docs by specifying --enable-gtk-doc --enable-man - 2) Update NEWS based on the various ChangeLog files; follow the format + 2) Update NEWS based on the content of git log; follow the format of prior entries. This includes finding noteworthy new features, collecting summaries for all the fixed bugs that are referenced - and collecting all updated translations. - Also collect the names of all contributors that are mentioned. - We don't discriminate between bug reporters, patch writers, + and collecting all updated translations. + Also collect the names of all contributors that are mentioned. + We don't discriminate between bug reporters, patch writers, committers, etc. Anybody who is mentioned in ChangeLog gets credits, but only real names, not email addresses or nicknames. @@ -29,14 +31,14 @@ Without those packages make distcheck will *not* pass. with configure.in. 4) Verify that the version in configure.in has been bumped after the last - release. (Note that this is critical, a slip-up here will cause the + release. (Note that this is critical, a slip-up here will cause the soname to change). 5) Make sure that make check is happy (If you don't do it here, make distcheck - will also catch it, but it is kind of disheartening to see make distcheck - fail due to an extraneous symbol after watching it build the docs for an - hour...). - Typical problems to expect here (depending on whether this is a devel + will also catch it, but it is kind of disheartening to see make distcheck + fail due to an extraneous symbol after watching it build the docs for an + hour...). + Typical problems to expect here (depending on whether this is a devel snapshot or a stable release): * forgotten source files * new symbols missing from .symbols files @@ -48,57 +50,58 @@ Without those packages make distcheck will *not* pass. 6) If this is a devel release, make sure that the docs for new symbols are in good shape. Look at the -unused.txt files and add stuff found - there to the corresponding -sections.txt file. Look at the + there to the corresponding -sections.txt file. Look at the -undocumented.txt files and see if there is anything in there that should be documented. If it is, this may be due to typos in the doc - comments in the source. Make sure that all new symbols have proper - Since: tags, and that there is an index in the main -docs.sgml for - the next stable version. + comments in the source. Make sure that all new symbols have proper + Since: tags, and that there is an index in the main -docs.sgml for + the next stable version. - 7) Add === Released 2.x.y === at the top of all ChangeLog files + 7) make distcheck - 8) make distcheck + 8) Fix broken stuff found by 7), repeat - 9) Fix broken stuff found by 8), repeat + 9) Commit all changes: git commit -a. You will have a bunch of po file + changes, NEWS and maybe some doc changes too -10) svn commit; you'll have a bunch of po file changes, ChangeLog updates, - and maybe some doc changes too - -11) If 10) fails because someone else committed inbetween, curse, svn up, - fix conflicts and go to 8) - -12) Now you've got the tarball. Check that the tarball size looks +10) Now you've got the tarball. Check that the tarball size looks reasonable compared to previous releases. If the size goes down a lot, likely the docs went missing for some reason. Or the translations. If the size goes up by a lot, something else may be wrong. -13) Tag the release. The command for doing that looks like +11) Tag the release. The git command for doing that looks like - svn cp svn+ssh://matthiasc@svn.gnome.org/svn/gtk+/branches/gtk-2-12 \ - svn+ssh://matthiasc@svn.gnome.org/svn/gtk+/tags/GTK_2_12_10 + git tag -m "GTK+ 2.12.10" 2.12.10 -14) Bump the version number in configure.in and commit this change - with a ChangeLog entry +12) Push the tagged commit upstream. The git command for doing that is -15) Upload the tarball to master.gnome.org and run install-module to transfer + git push origin refs/tags/2.12.10 + +13) Bump the version number in configure.in and commit and push this change + +14) Upload the tarball to master.gnome.org and run install-module to transfer it to download.gnome.org. If you don't have an account on master.gnome.org, find someone who can do it for you. The command for this looks like - + scp gtk+-2.12.10.tar.gz matthiasc@master.gnome.org: ssh matthiasc@master.gnome.org install-module gtk+-2.12.10.tar.gz -16) Get the bz2 tarball and the .md5sum files back from master.gnome.org - You can probably also create it locally, but I've experienced md5 - mismatches when doing so +15) Get the .bz2 tarball and the .md5sum files back from master.gnome.org + You can probably also create it locally, but I've experienced md5 + mismatches when doing so. + +16) Upload the .gz and .bz2 tarballs and checksums to ftp.gtk.org and put + them in the right directory below /ftp/pub. Pay attention to correct + ownership, and don't forget to update the LATEST file in the directory. 17) Go to the gnome-announce list archives, find the last announce message, - create a new message in the same form, replacing version numbers, - commentary at the top about "what this release is about" and the - Summary of changes. + create a new message in the same form, replacing version numbers, + commentary at the top about "what this release is about" and the + summary of changes. 18) Send it to gnome-announce-list, gtk-list, gtk-app-devel-list and gtk-devel-list. Set reply-to to gnome-hackers. -19) Add a link to the release announcement to www.gtk.org which lives +19) Add a link to the release announcement to www.gtk.org which lives in the gtk-web cvs module. diff --git a/docs/faq/Makefile.am b/docs/faq/Makefile.am index 5aebcd2b45..9bdaf1284c 100644 --- a/docs/faq/Makefile.am +++ b/docs/faq/Makefile.am @@ -38,3 +38,5 @@ dist-hook: endif .PHONY: html + +-include $(top_srcdir)/git.mk diff --git a/docs/faq/gtk-faq.sgml b/docs/faq/gtk-faq.sgml index 6b80590491..e1fd8934f9 100644 --- a/docs/faq/gtk-faq.sgml +++ b/docs/faq/gtk-faq.sgml @@ -824,8 +824,8 @@ However, bindings for many other languages are available. So, after you have installed GTK+ there are a couple of things that can ease you into developing applications with it. There is the GTK+ Tutorial -http://www.gtk.org/tutorial/, which is undergoing +url="http://library.gnome.org/devel/gtk-tutorial/stable/"> +http://library.gnome.org/devel/gtk-tutorial/stable/, which is undergoing development. This will introduce you to writing applications using C. diff --git a/docs/reference/Makefile.am b/docs/reference/Makefile.am index f4d7451db1..f780c4f162 100644 --- a/docs/reference/Makefile.am +++ b/docs/reference/Makefile.am @@ -3,3 +3,6 @@ include $(top_srcdir)/Makefile.decl SUBDIRS = gdk-pixbuf gdk gtk libgail-util +GITIGNOREFILES = */*.1 + +-include $(top_srcdir)/git.mk diff --git a/docs/reference/gdk-pixbuf/Makefile.am b/docs/reference/gdk-pixbuf/Makefile.am index 3bf686d3ee..7734e72e8d 100644 --- a/docs/reference/gdk-pixbuf/Makefile.am +++ b/docs/reference/gdk-pixbuf/Makefile.am @@ -79,19 +79,21 @@ EXTRA_DIST += version.xml.in \ ######################################################################## -man_MANS = gdk-pixbuf-csource.1 gdk-pixbuf-query-loaders.1 - if ENABLE_MAN +man_MANS = gdk-pixbuf-csource.1 gdk-pixbuf-query-loaders.1 + %.1 : %.xml @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< -endif - BUILT_EXTRA_DIST = $(man_MANS) +endif + dist-hook-local: $(BUILT_EXTRA_DIST) files='$(BUILT_EXTRA_DIST)'; \ for f in $$files; do \ if test -f $$f; then d=.; else d=$(srcdir); fi; \ cp $$d/$$f $(distdir) || exit 1; done + +-include $(top_srcdir)/git.mk diff --git a/docs/reference/gdk-pixbuf/gdk-pixbuf-csource.1 b/docs/reference/gdk-pixbuf/gdk-pixbuf-csource.1 deleted file mode 100644 index 745abd8ef9..0000000000 --- a/docs/reference/gdk-pixbuf/gdk-pixbuf-csource.1 +++ /dev/null @@ -1,138 +0,0 @@ -'\" t -.\" Title: gdk-pixbuf-csource -.\" Author: [see the "Author" section] -.\" Generator: DocBook XSL Stylesheets v1.74.2 -.\" Date: 03/02/2009 -.\" Manual: [FIXME: manual] -.\" Source: [FIXME: source] -.\" Language: English -.\" -.TH "GDK\-PIXBUF\-CSOURCE" "1" "03/02/2009" "[FIXME: source]" "[FIXME: manual]" -.\" ----------------------------------------------------------------- -.\" * set default formatting -.\" ----------------------------------------------------------------- -.\" disable hyphenation -.nh -.\" disable justification (adjust text to left margin only) -.ad l -.\" ----------------------------------------------------------------- -.\" * MAIN CONTENT STARTS HERE * -.\" ----------------------------------------------------------------- -.SH "NAME" -gdk-pixbuf-csource \- C code generation utility for GdkPixbuf images -.SH "SYNOPSIS" -.HP \w'\fBgdk\-pixbuf\-csource\fR\ 'u -\fBgdk\-pixbuf\-csource\fR [options] [image] -.HP \w'\fBgdk\-pixbuf\-csource\fR\ 'u -\fBgdk\-pixbuf\-csource\fR [options] \-\-build\-list [[name]\ [image]...] -.SH "DESCRIPTION" -.PP - -\fBgdk\-pixbuf\-csource\fR -is a small utility that generates C code containing images, useful for compiling images directly into programs\&. -.SH "INVOCATION" -.PP - -\fBgdk\-pixbuf\-csource\fR -either takes as input one image file name to generate code for, or, using the -\fB\-\-build\-list\fR -option, a list of (\fIname\fR, -\fIimage\fR) pairs to generate code for a list of images into named variables\&. -.SS "Options" -.PP -\fB\-\-stream\fR -.RS 4 -Generate pixbuf data stream (a single string containing a serialized -GdkPixdata -structure in network byte order)\&. -.RE -.PP -\fB\-\-struct\fR -.RS 4 -Generate GdkPixdata structure (needs the -GdkPixdata -structure definition from -gdk\-pixdata\&.h)\&. -.RE -.PP -\fB\-\-macros\fR -.RS 4 -Generate *_ROWSTRIDE, *_WIDTH, *_HEIGHT, *_BYTES_PER_PIXEL and *_RLE_PIXEL_DATA or *_PIXEL_DATA macro definitions for the image\&. -.RE -.PP -\fB\-\-rle\fR -.RS 4 -Enables run\-length encoding for the generated pixel data (default)\&. -.RE -.PP -\fB\-\-raw\fR -.RS 4 -Disables run\-length encoding for the generated pixel data\&. -.RE -.PP -\fB\-\-extern\fR -.RS 4 -Generate extern symbols\&. -.RE -.PP -\fB\-\-static\fR -.RS 4 -Generate static symbols (default)\&. -.RE -.PP -\fB\-\-decoder\fR -.RS 4 -Provide a *_RUN_LENGTH_DECODE(image_buf, rle_data, size, bpp) macro definition to decode run\-length encoded image data\&. -.RE -.PP -\fB\-\-name=identifier\fR -.RS 4 -Specifies the identifier name (prefix) for the generated variables or macros (useful only if -\fB\-\-build\-list\fR -was not specified)\&. -.RE -.PP -\fB\-\-build\-list\fR -.RS 4 -Enables (\fIname\fR, -\fIimage\fR) pair parsing mode\&. -.RE -.PP -\fB\-h\fR, \fB\-\-help\fR -.RS 4 -Print brief help and exit\&. -.RE -.PP -\fB\-v\fR, \fB\-\-version\fR -.RS 4 -Print version and exit\&. -.RE -.PP -\fB\-\-g\-fatal\-warnings\fR -.RS 4 -Make warnings fatal (causes the program to abort)\&. -.RE -.SH "SEE ALSO" -.PP -The -GdkPixbuf -documentation, shipped with the Gtk+ distribution, available from -\m[blue]\fBwww\&.gtk\&.org\fR\m[]\&\s-2\u[1]\d\s+2\&. -.SH "BUGS" -.PP -The runlength encoder gets out of sync with the pixel boundaries, since it includes the rowstride padding in the encoded stream\&. Furthermore, it generates pixbufs with suboptimal rowstride in some cases\&. -.SH "AUTHOR" -.PP - -\fBgdk\-pixbuf\-csource\fR -was written by Tim Janik -timj@gtk\&.org\&. -.PP -This manual page was provided by Tim Janik -timj@gtk\&.org\&. -.SH "NOTES" -.IP " 1." 4 -www.gtk.org -.RS 4 -\%http://www.gtk.org -.RE diff --git a/docs/reference/gdk-pixbuf/gdk-pixbuf-query-loaders.1 b/docs/reference/gdk-pixbuf/gdk-pixbuf-query-loaders.1 deleted file mode 100644 index 56bacc5194..0000000000 --- a/docs/reference/gdk-pixbuf/gdk-pixbuf-query-loaders.1 +++ /dev/null @@ -1,50 +0,0 @@ -'\" t -.\" Title: gdk-pixbuf-query-loaders -.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.74.2 -.\" Date: 03/13/2009 -.\" Manual: [FIXME: manual] -.\" Source: [FIXME: source] -.\" Language: English -.\" -.TH "GDK\-PIXBUF\-QUERY\-" "1" "03/13/2009" "[FIXME: source]" "[FIXME: manual]" -.\" ----------------------------------------------------------------- -.\" * set default formatting -.\" ----------------------------------------------------------------- -.\" disable hyphenation -.nh -.\" disable justification (adjust text to left margin only) -.ad l -.\" ----------------------------------------------------------------- -.\" * MAIN CONTENT STARTS HERE * -.\" ----------------------------------------------------------------- -.SH "NAME" -gdk-pixbuf-query-loaders \- GdkPixbuf loader registration utility -.SH "SYNOPSIS" -.HP \w'\fBgdk\-pixbuf\-query\-loaders\fR\ 'u -\fBgdk\-pixbuf\-query\-loaders\fR [module...] -.SH "DESCRIPTION" -.PP - -\fBgdk\-pixbuf\-query\-loaders\fR -collects information about loadable modules for -gdk\-pixbuf -and writes it to -stdout\&. -.PP -If called without arguments, it looks for modules in the -gdk\-pixbuf -loader directory\&. -.PP -If called with arguments, it looks for the specified modules\&. The arguments may be absolute or relative paths\&. -.SH "ENVIRONMENT" -.PP -The environment variable -\fBGDK_PIXBUF_MODULEDIR\fR -can be used to specify a different loader directory\&. The default -gdk\-pixbuf -loader directory is -\fIlibdir\fR/gtk\-2\&.0/\fIversion\fR/loaders\&. -.SH "BUGS" -.PP -None known yet\&. diff --git a/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt b/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt index be208fdeb3..6d84f8e326 100644 --- a/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt +++ b/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt @@ -136,6 +136,8 @@ gdk_pixbuf_animation_iter_get_pixbuf GdkPixbufSimpleAnim gdk_pixbuf_simple_anim_new gdk_pixbuf_simple_anim_add_frame +gdk_pixbuf_simple_anim_set_loop +gdk_pixbuf_simple_anim_get_loop GDK_PIXBUF_ANIMATION diff --git a/docs/reference/gdk-pixbuf/tmpl/animation.sgml b/docs/reference/gdk-pixbuf/tmpl/animation.sgml index 3cd15b4baf..6df1a8b72f 100644 --- a/docs/reference/gdk-pixbuf/tmpl/animation.sgml +++ b/docs/reference/gdk-pixbuf/tmpl/animation.sgml @@ -172,3 +172,21 @@ An opaque struct representing a simple animation. @pixbuf: + + + + + +@animation: +@loop: + + + + + + + +@animation: +@Returns: + + diff --git a/docs/reference/gdk/Makefile.am b/docs/reference/gdk/Makefile.am index 28d7035e8d..7e21e35fdb 100644 --- a/docs/reference/gdk/Makefile.am +++ b/docs/reference/gdk/Makefile.am @@ -152,3 +152,5 @@ include $(top_srcdir)/gtk-doc.make # Other files to distribute EXTRA_DIST += version.xml.in + +-include $(top_srcdir)/git.mk diff --git a/docs/reference/gtk/Makefile.am b/docs/reference/gtk/Makefile.am index 2e2b9f84f3..72aed73800 100644 --- a/docs/reference/gtk/Makefile.am +++ b/docs/reference/gtk/Makefile.am @@ -129,17 +129,18 @@ content_files = \ drawing-model.xml \ glossary.xml \ migrating-checklist.sgml \ + migrating-GtkAboutDialog.sgml \ migrating-GtkAction.sgml \ + migrating-GtkAssistant.sgml \ + migrating-GtkBuilder.sgml \ + migrating-GtkColorButton.sgml \ migrating-GtkComboBox.sgml \ migrating-GtkEntry-icons.sgml \ migrating-GtkFileChooser.sgml \ migrating-GtkIconView.sgml \ - migrating-GtkAboutDialog.sgml \ - migrating-GtkColorButton.sgml \ - migrating-GtkAssistant.sgml \ - migrating-GtkRecentChooser.sgml \ + migrating-GtkLabel-links.sgml \ migrating-GtkLinkButton.sgml \ - migrating-GtkBuilder.sgml \ + migrating-GtkRecentChooser.sgml \ migrating-GtkTooltip.sgml \ objects_grouped.sgml \ osx.sgml \ @@ -361,19 +362,21 @@ EXTRA_DIST += version.xml.in ######################################################################## -man_MANS = gtk-query-immodules-2.0.1 gtk-update-icon-cache.1 gtk-builder-convert.1 - if ENABLE_MAN +man_MANS = gtk-query-immodules-2.0.1 gtk-update-icon-cache.1 gtk-builder-convert.1 + %.1 : %.xml @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< -endif - BUILT_EXTRA_DIST = $(man_MANS) +endif + dist-hook-local: $(BUILT_EXTRA_DIST) files='$(BUILT_EXTRA_DIST)'; \ for f in $$files; do \ if test -f $$f; then d=.; else d=$(srcdir); fi; \ cp $$d/$$f $(distdir) || exit 1; done + +-include $(top_srcdir)/git.mk diff --git a/docs/reference/gtk/gtk-builder-convert.1 b/docs/reference/gtk/gtk-builder-convert.1 deleted file mode 100644 index df2404a088..0000000000 --- a/docs/reference/gtk/gtk-builder-convert.1 +++ /dev/null @@ -1,51 +0,0 @@ -'\" t -.\" Title: gtk-builder-convert -.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.74.2 -.\" Date: 03/13/2009 -.\" Manual: [FIXME: manual] -.\" Source: [FIXME: source] -.\" Language: English -.\" -.TH "GTK\-BUILDER\-CONVER" "1" "03/13/2009" "[FIXME: source]" "[FIXME: manual]" -.\" ----------------------------------------------------------------- -.\" * set default formatting -.\" ----------------------------------------------------------------- -.\" disable hyphenation -.nh -.\" disable justification (adjust text to left margin only) -.ad l -.\" ----------------------------------------------------------------- -.\" * MAIN CONTENT STARTS HERE * -.\" ----------------------------------------------------------------- -.SH "NAME" -gtk-builder-convert \- Glade file conversion utility -.SH "SYNOPSIS" -.HP \w'\fBgtk\-builder\-convert\fR\ 'u -\fBgtk\-builder\-convert\fR [\-\-skip\-windows] [\-\-root\ \fIname\fR] {input} {output} -.SH "DESCRIPTION" -.PP -\fBgtk\-builder\-convert\fR -converts glade files into XML files which can be loaded with GtkBuilder\&. -.PP -It expects the name of a glade file as the first argument, and writes its output the file specified as the second argument\&. -.SH "OPTIONS" -.PP -\-\-skip\-windows, \-w -.RS 4 -Convert everything but GtkWindow subclasses\&. -.RE -.PP -\-\-root, \-r -.RS 4 -Convert only the widget named -\fIname\fR -and its children\&. -.RE -.SH "BUGS" -.PP -Toolbars are not handled\&. -.PP -Support for accessibility is not yet implemented\&. -.PP -The script requires a python interpreter to run\&. diff --git a/docs/reference/gtk/gtk-docs.sgml b/docs/reference/gtk/gtk-docs.sgml index 97015103a9..0d27e5ff45 100644 --- a/docs/reference/gtk/gtk-docs.sgml +++ b/docs/reference/gtk/gtk-docs.sgml @@ -432,6 +432,7 @@ that is, GUI components such as #GtkButton or #GtkTextView. + @@ -483,4 +484,8 @@ that is, GUI components such as #GtkButton or #GtkTextView. Index of new symbols in 2.16 + + Index of new symbols in 2.18 + + diff --git a/docs/reference/gtk/gtk-query-immodules-2.0.1 b/docs/reference/gtk/gtk-query-immodules-2.0.1 deleted file mode 100644 index e105e20bcf..0000000000 --- a/docs/reference/gtk/gtk-query-immodules-2.0.1 +++ /dev/null @@ -1,43 +0,0 @@ -'\" t -.\" Title: gtk-query-immodules-2.0 -.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] -.\" Generator: DocBook XSL Stylesheets v1.74.2 -.\" Date: 03/13/2009 -.\" Manual: [FIXME: manual] -.\" Source: [FIXME: source] -.\" Language: English -.\" -.TH "GTK\-QUERY\-IMMODULE" "1" "03/13/2009" "[FIXME: source]" "[FIXME: manual]" -.\" ----------------------------------------------------------------- -.\" * set default formatting -.\" ----------------------------------------------------------------- -.\" disable hyphenation -.nh -.\" disable justification (adjust text to left margin only) -.ad l -.\" ----------------------------------------------------------------- -.\" * MAIN CONTENT STARTS HERE * -.\" ----------------------------------------------------------------- -.SH "NAME" -gtk-query-immodules-2.0 \- Input method module registration utility -.SH "SYNOPSIS" -.HP \w'\fBgtk\-query\-immodules\-2\&.0\fR\ 'u -\fBgtk\-query\-immodules\-2\&.0\fR [module...] -.SH "DESCRIPTION" -.PP - -\fBgtk\-query\-immodules\-2\&.0\fR -collects information about loadable input method modules for GTK+ and writes it to -stdout\&. -.PP -If called without arguments, it looks for modules in the GTK+ input method module path\&. -.PP -If called with arguments, it looks for the specified modules\&. The arguments may be absolute or relative paths\&. -.SH "ENVIRONMENT" -.PP -The environment variable -\fBGTK_PATH\fR -can be used to prepend directories to the input method module path\&. -.SH "BUGS" -.PP -None known yet\&. diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt index 72051c28fc..d300ea6322 100644 --- a/docs/reference/gtk/gtk-sections.txt +++ b/docs/reference/gtk/gtk-sections.txt @@ -2274,6 +2274,7 @@ gtk_label_set_use_markup gtk_label_set_use_underline gtk_label_set_single_line_mode gtk_label_set_angle +gtk_label_get_current_uri GTK_LABEL GTK_IS_LABEL diff --git a/docs/reference/gtk/gtk-update-icon-cache.1 b/docs/reference/gtk/gtk-update-icon-cache.1 deleted file mode 100644 index ad488840cf..0000000000 --- a/docs/reference/gtk/gtk-update-icon-cache.1 +++ /dev/null @@ -1,51 +0,0 @@ -.\" ** You probably do not want to edit this file directly ** -.\" It was generated using the DocBook XSL Stylesheets (version 1.69.1). -.\" Instead of manually editing it, you probably should edit the DocBook XML -.\" source for it and then use the DocBook XSL Stylesheets to regenerate it. -.TH "GTK\-UPDATE\-ICON\-CACH" "1" "11/07/2005" "" "" -.\" disable hyphenation -.nh -.\" disable justification (adjust text to left margin only) -.ad l -.SH "NAME" -gtk\-update\-icon\-cache \- Icon theme caching utility -.SH "SYNOPSIS" -.HP 22 -\fBgtk\-update\-icon\-cache\fR [\-\-force] [\-\-ignore\-theme\-index] [\-\-index\-only] [\-\-source\ [name]] [\-\-quiet] {iconpath} -.SH "DESCRIPTION" -.PP -\fBgtk\-update\-icon\-cache\fR -creates mmap()able cache files for icon themes. -.PP -It expects to be given the path to a icon theme directory containing an -\fIindex.theme\fR, e.g. -\fI/usr/share/icons/hicolor\fR, and writes a -\fIicon\-theme.cache\fR -containing cached information about the icons in the directory tree below the given directory. -.PP -GTK+ can use the cache files created by -\fBgtk\-update\-icon\-cache\fR -to avoid a lot of system call and disk seek overhead when the application starts. Since the format of the cache files allows them to be mmap()ed shared between multiple applications, the overall memory consumption is reduced as well. -.SH "OPTIONS" -.TP -\-\-force, \-f -Overwrite an existing cache file even if it appears to be uptodate. -.TP -\-\-ignore\-theme\-index, \-t -Don't check for the existence of 'index.theme' in the icon theme directory. Without this option, -\fBgtk\-update\-icon\-cache\fR -refuses to create an icon cache in a directory which does not appear to be the toplevel directory of an icon theme. -.TP -\-\-index\-only, \-i -Don't include image data in the cache. -.TP -\-\-source, \-c -Output a C header file declaring a constant -\fIname\fR -with the contents of the icon cache. -.TP -\-\-quiet, \-q -Turn off verbose output. -.SH "BUGS" -.PP -None known yet. diff --git a/docs/reference/gtk/gtk.types b/docs/reference/gtk/gtk.types index 68e2e52bfe..24dd79b285 100644 --- a/docs/reference/gtk/gtk.types +++ b/docs/reference/gtk/gtk.types @@ -72,6 +72,7 @@ gtk_hruler_get_type gtk_hscale_get_type gtk_hscrollbar_get_type gtk_hseparator_get_type +gtk_hsv_get_type gtk_icon_factory_get_type gtk_icon_theme_get_type gtk_icon_view_get_type diff --git a/docs/reference/gtk/migrating-GtkBuilder.sgml b/docs/reference/gtk/migrating-GtkBuilder.sgml index f406ab361d..d18eaf89fe 100644 --- a/docs/reference/gtk/migrating-GtkBuilder.sgml +++ b/docs/reference/gtk/migrating-GtkBuilder.sgml @@ -16,14 +16,65 @@ A good way to start a migration from libglade to GtkBuilder is to run the gtk-builder-convert utility on your glade file, and inspect the resulting output. - If your code uses the @root parameter of glade_xml_new(), you + If your code uses the @root parameter of glade_xml_new(), you may want to split your glade file into multiple GtkBuilder files - by using the option of + by using the option of gtk-builder-convert. Alternatively, you can use gtk_builder_add_objects_from_file() to construct only certain objects from a GtkBuilder file. + + Alternatively, you can open the glade file with + glade3 and then save it in GtkBuilder + format. This is supported by glade3 since version 3.6. + + + + Step-by-step instructions for porting code from libglade to GtkBuilder + + + libgladeGtkBuilder + + + + ]]> + not needed + + + GladeXML* + GtkBuilder* + + + glade_xml_new (FILE, "first_widget", NULL) + + +GError* error = NULL; +GtkBuilder* builder = gtk_builder_new (); +if (!gtk_builder_add_from_file (builder, FILE, &error)) + { + g_warning ("Couldn't load builder file: %amp;s", error->message); + g_error_free (error); + } + + + + + glade_xml_get_widget (gxml, “widget_name”) + GTK_WIDGET (gtk_builder_get_object (builder, “widget_name”)) + + + glade_get_widget_name (widget) + gtk_widget_get_name (widget) + + + glade_xml_get_widget_prefix (gxml, “prefix”) + can be emulated by gtk_builder_get_objects (builder) together with manual filtering. It returns a GSList* instead of a GList* though. + + + +
+ While GtkBuilder strives to be a complete replacement for libglade, there are a number of areas where it is currently @@ -32,21 +83,23 @@ GtkBuilder supports context information in translatable - properties in a slightly different way than libglade. - Intltool does not yet support this; see - bug - 454894 for the current status of intltool support for - GtkBuilder files. Thankfully, context in translations is a - rarely used feature, and if you are not using it, intltools + properties in a slightly different way than libglade. + Intltool does not yet support this; see + bug + 454894 for the current status of intltool support for + GtkBuilder files. Thankfully, context in translations is a + rarely used feature, and if you are not using it, intltools glade format support works just fine for GtkBuilder files. + + While libglade can often tolerate multiple widgets having the + same id in a glade file, GtkBuilder will not accept duplicate + object ids. Both gtk-builder-convert + and the GtkBuilder parser emit warnings when they see + duplicate ids. + - - More details about migrating from libglade to GtkBuilder will - appear here over time... - - diff --git a/docs/reference/gtk/migrating-GtkLabel-links.sgml b/docs/reference/gtk/migrating-GtkLabel-links.sgml new file mode 100644 index 0000000000..350aa8fb3f --- /dev/null +++ b/docs/reference/gtk/migrating-GtkLabel-links.sgml @@ -0,0 +1,24 @@ + + + + + Migrating from SexyUrlLabel to GtkLabel + + + GTK+ 2.18 supports showing links inside a #GtkLabel, similar to + SexyUrlLabel. Porting from SexyUrlLabel to GtkLabel is relatively + straightforward. GtkLabel accepts links in the markup using the + same HTML a notation that SexyUrlLabel uses. In addition + to the href attribute, GtkLabel accepts a title attribute that + is displayed as a tooltip on the link. Instead of + sexy_url_label_set_markup(), just call gtk_label_set_markup(). + + + One difference between the two APIs is that the ::url-activated signal + from SexyUrlLabel has been replaced by the #GtkLabel::activate-link + signal. The need for connecting to this signal is greatly reduced, + since GtkLabel has a default handler that calls gtk_show_uri(). + + diff --git a/docs/reference/gtk/tmpl/filesystem.sgml b/docs/reference/gtk/tmpl/filesystem.sgml new file mode 100644 index 0000000000..15c9de5831 --- /dev/null +++ b/docs/reference/gtk/tmpl/filesystem.sgml @@ -0,0 +1,108 @@ + +Filesystem utilities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@parent: +@Returns: + + + + + + + +@op: +@Returns: + + + + + + + +@op: +@parent: + + + + + + + +@op: +@Returns: + + + + + + + +@op: +@screen: + + + + + + + +@op: +@Returns: + + + + + + + +@screen: +@uri: +@timestamp: +@error: +@Returns: + + diff --git a/docs/reference/gtk/tmpl/gtkaboutdialog.sgml b/docs/reference/gtk/tmpl/gtkaboutdialog.sgml index ebecec0b4e..6aac589c90 100644 --- a/docs/reference/gtk/tmpl/gtkaboutdialog.sgml +++ b/docs/reference/gtk/tmpl/gtkaboutdialog.sgml @@ -24,16 +24,20 @@ recognized by looking for http://url, with url extending to the next space, tab or line break. -When setting the website and email hooks for the #GtkAboutDialog widget, -you should remember that the order is important: you should set the hook -functions before setting the website and email URL properties, like this: +Since 2.18 #GtkAboutDialog provides default website and email hooks that use +gtk_show_uri(). + + +If you want provide your own hooks overriding the default ones, it is important +to do so before setting the website and email URL properties, like this: gtk_about_dialog_set_url_hook (GTK_ABOUT_DIALOG (dialog), launch_url, NULL, NULL); gtk_about_dialog_set_website (GTK_ABOUT_DIALOG (dialog), app_url); -Otherwise the GtkAboutDialog widget will not display the website and the +To disable the default hooks, you can pass %NULL as the hook func. Then, +the #GtkAboutDialog widget will not display the website or the email addresses as clickable. diff --git a/docs/reference/gtk/tmpl/gtkactivatable.sgml b/docs/reference/gtk/tmpl/gtkactivatable.sgml new file mode 100644 index 0000000000..3911672b5b --- /dev/null +++ b/docs/reference/gtk/tmpl/gtkactivatable.sgml @@ -0,0 +1,100 @@ + +GtkActivatable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@g_iface: +@update: +@sync_action_properties: + + + + + + +@activatable: +@action: + + + + + + + +@activatable: +@Returns: + + + + + + + +@activatable: +@Returns: + + + + + + + +@activatable: +@action: + + + + + + + +@activatable: +@action: + + + + + + + +@activatable: +@use_appearance: + + diff --git a/docs/reference/gtk/tmpl/gtkassistant.sgml b/docs/reference/gtk/tmpl/gtkassistant.sgml index c921014392..ab00eee54c 100644 --- a/docs/reference/gtk/tmpl/gtkassistant.sgml +++ b/docs/reference/gtk/tmpl/gtkassistant.sgml @@ -10,6 +10,16 @@ A #GtkAssistant is a widget used to represent a generally complex operation splitted in several steps, guiding the user through its pages and controlling the page flow to collect the necessary data. +GtkAssistant as GtkBuildable + +The GtkAssistant implementation of the GtkBuildable interface exposes the +@action_area as internal children with the name "action_area". + + +To add pages to an assistant in GtkBuilder, simply add it as a <child> +to the GtkAssistant object, and set its child properties as necessary. + + diff --git a/docs/reference/gtk/tmpl/gtkbuilder.sgml b/docs/reference/gtk/tmpl/gtkbuilder.sgml index 4353b1d2e3..8dc1eb54a7 100644 --- a/docs/reference/gtk/tmpl/gtkbuilder.sgml +++ b/docs/reference/gtk/tmpl/gtkbuilder.sgml @@ -7,46 +7,46 @@ Build an interface from an XML UI definition A GtkBuilder is an auxiliary object that reads textual descriptions -of a user interface and instantiates the described objects. To pass a -description to a GtkBuilder, call gtk_builder_add_from_file() or +of a user interface and instantiates the described objects. To pass a +description to a GtkBuilder, call gtk_builder_add_from_file() or gtk_builder_add_from_string(). These functions can be called multiple -times; the builder merges the content of all descriptions. +times; the builder merges the content of all descriptions. A GtkBuilder holds a reference to all objects that it has constructed -and drops these references when it is finalized. This finalization can -cause the destruction of non-widget objects or widgets which are not -contained in a toplevel window. For toplevel windows constructed by a -builder, it is the responsibility of the user to call gtk_widget_destroy() +and drops these references when it is finalized. This finalization can +cause the destruction of non-widget objects or widgets which are not +contained in a toplevel window. For toplevel windows constructed by a +builder, it is the responsibility of the user to call gtk_widget_destroy() to get rid of them and all the widgets they contain. The functions gtk_builder_get_object() and gtk_builder_get_objects() -can be used to access the widgets in the interface by the names assigned +can be used to access the widgets in the interface by the names assigned to them inside the UI description. Toplevel windows returned by these functions will stay around until the user explicitly destroys them -with gtk_widget_destroy(). Other widgets will either be part of a +with gtk_widget_destroy(). Other widgets will either be part of a larger hierarchy constructed by the builder (in which case you should -not have to worry about their lifecycle), or without a parent, in which -case they have to be added to some container to make use of them. +not have to worry about their lifecycle), or without a parent, in which +case they have to be added to some container to make use of them. Non-widget objects need to be reffed with g_object_ref() to keep them beyond the lifespan of the builder. -The function gtk_builder_connect_signals() and variants thereof can be -used to connect handlers to the named signals in the description. +The function gtk_builder_connect_signals() and variants thereof can be +used to connect handlers to the named signals in the description. GtkBuilder UI Definitions -GtkBuilder parses textual descriptions of user interfaces which -are specified in an XML format which can be roughly described -by the DTD below. We refer to these descriptions as +GtkBuilder parses textual descriptions of user interfaces which +are specified in an XML format which can be roughly described +by the DTD below. We refer to these descriptions as GtkBuilder UI definitions or just UI definitions if the context is clear. -Do not confuse GtkBuilder UI Definitions with -GtkUIManager UI Definitions, -which are more limited in scope. +Do not confuse GtkBuilder UI Definitions with +GtkUIManager UI Definitions, +which are more limited in scope. @@ -101,28 +101,28 @@ The builder will error out if the version requirements are not met. Typically, the specific kind of object represented by an <object> element is specified by the "class" attribute. If the type has not been loaded yet, GTK+ tries to find the -_get_type() from the class name by applying +_get_type() from the class name by applying heuristics. This works in most cases, but if necessary, it is -possible to specify the name of the _get_type() -explictly with the "type-func" attribute. As a special case, +possible to specify the name of the _get_type() +explictly with the "type-func" attribute. As a special case, GtkBuilder allows to use an object that has been constructed by a #GtkUIManager in another part of the UI definition by specifying the id of the #GtkUIManager in the "constructor" attribute and the name of the object in the "id" attribute. -Objects must be given a name with the "id" attribute, which -allows the application to retrieve them from the builder with -gtk_builder_get_object(). An id is also necessary to use the +Objects must be given a name with the "id" attribute, which +allows the application to retrieve them from the builder with +gtk_builder_get_object(). An id is also necessary to use the object as property value in other parts of the UI definition. Setting properties of objects is pretty straightforward with the <property> element: the "name" attribute specifies -the name of the property, and the content of the element -specifies the value. If the "translatable" attribute is +the name of the property, and the content of the element +specifies the value. If the "translatable" attribute is set to a true value, GTK+ uses gettext() (or dgettext() if -the builder has a translation domain set) to find a translation +the builder has a translation domain set) to find a translation for the value. This happens before the value is parsed, so it can be used for properties of any type, but it is probably most useful for string properties. It is also possible to @@ -134,16 +134,16 @@ GtkBuilder can parse textual representations for the most common property types: characters, strings, integers, floating-point numbers, booleans (strings like "TRUE", "t", "yes", "y", "1" are interpreted as %TRUE, strings like "FALSE, "f", "no", "n", "0" are -interpreted as %FALSE), enumerations (can be specified by their -name, nick or integer value), flags (can be specified by their name, -nick, integer value, optionally combined with "|", e.g. -"GTK_VISIBLE|GTK_REALIZED") and colors (in a format understood by -gdk_color_parse()). Objects can be referred to by their name. +interpreted as %FALSE), enumerations (can be specified by their +name, nick or integer value), flags (can be specified by their name, +nick, integer value, optionally combined with "|", e.g. +"GTK_VISIBLE|GTK_REALIZED") and colors (in a format understood by +gdk_color_parse()). Objects can be referred to by their name. Pixbufs can be specified as a filename of an image file to load. -In general, GtkBuilder allows forward references to objects — +In general, GtkBuilder allows forward references to objects — an object doesn't have to constructed before it can be referred to. The exception to this rule is that an object has to be constructed -before it can be used as the value of a construct-only property. +before it can be used as the value of a construct-only property. Signal handlers are set up with the <signal> element. @@ -152,25 +152,25 @@ The "name" attribute specifies the name of the signal, and the By default, GTK+ tries to find the handler using g_module_symbol(), but this can be changed by passing a custom #GtkBuilderConnectFunc to gtk_builder_connect_signals_full(). The remaining attributes, -"after", "swapped" and "object", have the same meaning as the +"after", "swapped" and "object", have the same meaning as the corresponding parameters of the g_signal_connect_object() or g_signal_connect_data() functions. A "last_modification_time" attribute is also allowed, but it does not have a meaning to the builder. Sometimes it is necessary to refer to widgets which have implicitly -been constructed by GTK+ as part of a composite widget, to set -properties on them or to add further children (e.g. the @vbox +been constructed by GTK+ as part of a composite widget, to set +properties on them or to add further children (e.g. the @vbox of a #GtkDialog). This can be achieved by setting the "internal-child" propery of the <child> element to a true value. Note that GtkBuilder still requires an <object> element for the internal child, even if it has already been constructed. -A number of widgets have different places where a child can be +A number of widgets have different places where a child can be added (e.g. tabs vs. page content in notebooks). This can be reflected in a UI definition by specifying the "type" attribute on a <child> -The possible values for the "type" attribute are described in +The possible values for the "type" attribute are described in the sections describing the widget-specific portions of UI definitions. @@ -205,11 +205,11 @@ their own XML DTD fragments for filling in the ANY placeholders in the DTD above. Note that a custom element in a <child> element gets parsed by the custom tag handler of the parent object, while a custom element in an <object> element -gets parsed by the custom tag handler of the object. +gets parsed by the custom tag handler of the object. These XML fragments are explained in the documentation of the -respective objects, see +respective objects, see GtkWidget, GtkLabel, GtkWindow, @@ -228,7 +228,9 @@ respective objects, see GtkTreeView, GtkUIManager, GtkActionGroup. -GtkMenuItem. +GtkMenuItem, +GtkAssistant, +GtkScale. @@ -285,6 +287,7 @@ using #GtkBuilder. some attribute value. @GTK_BUILDER_ERROR_VERSION_MISMATCH: The input file requires a newer version of GTK+. +@GTK_BUILDER_ERROR_DUPLICATE_ID: An object id occurred twice. diff --git a/docs/reference/gtk/tmpl/gtkentry.sgml b/docs/reference/gtk/tmpl/gtkentry.sgml index 72b802c2c8..385e7235e7 100644 --- a/docs/reference/gtk/tmpl/gtkentry.sgml +++ b/docs/reference/gtk/tmpl/gtkentry.sgml @@ -378,6 +378,11 @@ The #GtkEntry-struct struct contains only private data. + + + + + diff --git a/docs/reference/gtk/tmpl/gtkenums.sgml b/docs/reference/gtk/tmpl/gtkenums.sgml index ec4c89bc5d..3b72290bd4 100644 --- a/docs/reference/gtk/tmpl/gtkenums.sgml +++ b/docs/reference/gtk/tmpl/gtkenums.sgml @@ -433,12 +433,12 @@ other, rather than vertically stacked - +Used by #GtkRange to control the policy for notifying value changes. -@GTK_UPDATE_CONTINUOUS: -@GTK_UPDATE_DISCONTINUOUS: -@GTK_UPDATE_DELAYED: +@GTK_UPDATE_CONTINUOUS: Notify updates whenever the value changed +@GTK_UPDATE_DISCONTINUOUS: Notify updates when the mouse button has been released +@GTK_UPDATE_DELAYED: Space out updates with a small timeout diff --git a/docs/reference/gtk/tmpl/gtkhsv.sgml b/docs/reference/gtk/tmpl/gtkhsv.sgml index 1c2c2f4c67..999a74347b 100644 --- a/docs/reference/gtk/tmpl/gtkhsv.sgml +++ b/docs/reference/gtk/tmpl/gtkhsv.sgml @@ -35,7 +35,21 @@ saturation. -@parent_instance: + + + + + + +@hsv: the object which received the signal. + + + + + + +@hsv: the object which received the signal. +@arg1: diff --git a/docs/reference/gtk/tmpl/gtkimcontext.sgml b/docs/reference/gtk/tmpl/gtkimcontext.sgml new file mode 100644 index 0000000000..7257879014 --- /dev/null +++ b/docs/reference/gtk/tmpl/gtkimcontext.sgml @@ -0,0 +1,212 @@ + +GtkIMContext + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@imcontext: the object which received the signal. +@arg1: + + + + + + +@imcontext: the object which received the signal. +@arg1: +@arg2: +@Returns: + + + + + + +@imcontext: the object which received the signal. + + + + + + +@imcontext: the object which received the signal. + + + + + + +@imcontext: the object which received the signal. + + + + + + +@imcontext: the object which received the signal. +@Returns: + + + + + + +@preedit_start: +@preedit_end: +@preedit_changed: +@commit: +@retrieve_surrounding: +@delete_surrounding: +@set_client_window: +@get_preedit_string: +@filter_keypress: +@focus_in: +@focus_out: +@reset: +@set_cursor_location: +@set_use_preedit: +@set_surrounding: +@get_surrounding: + + + + + + +@context_id: +@context_name: +@domain: +@domain_dirname: +@default_locales: + + + + + + +@context: +@window: + + + + + + + +@context: +@str: +@attrs: +@cursor_pos: + + + + + + + +@context: +@event: +@Returns: + + + + + + + +@context: + + + + + + + +@context: + + + + + + + +@context: + + + + + + + +@context: +@area: + + + + + + + +@context: +@use_preedit: + + + + + + + +@context: +@text: +@len: +@cursor_index: + + + + + + + +@context: +@text: +@cursor_index: +@Returns: + + + + + + + +@context: +@offset: +@n_chars: +@Returns: + + diff --git a/docs/reference/gtk/tmpl/gtklabel.sgml b/docs/reference/gtk/tmpl/gtklabel.sgml index 2fdc855b04..0f25786a97 100644 --- a/docs/reference/gtk/tmpl/gtklabel.sgml +++ b/docs/reference/gtk/tmpl/gtklabel.sgml @@ -162,6 +162,24 @@ aligns in its available space, see gtk_misc_set_alignment(). + +Links + + +Since 2.18, GTK+ supports markup for clickable hyperlinks in addition +to regular Pango markup. The markup for links is borrowed from HTML, using the +a with href and title attributes. GTK+ renders links similar to the +way they appear in web browsers, with colored, underlined text. The title +attribute is displayed as a tooltip on the link. An example looks like this: + +gtk_label_set_markup (label, "Go to the <a href=\"http://www.gtk.org\" title=\"&lt;i&gt;Our&/i&gt; website\">GTK+ website</a> for more..."); + +It is possible to implement custom handling for links and their tooltips with +the #GtkLabel::activate-link signal and the gtk_label_get_current_uri() function. + + + + diff --git a/docs/reference/gtk/tmpl/gtkprintoperation.sgml b/docs/reference/gtk/tmpl/gtkprintoperation.sgml index 1694d1a68d..6c195341b0 100644 --- a/docs/reference/gtk/tmpl/gtkprintoperation.sgml +++ b/docs/reference/gtk/tmpl/gtkprintoperation.sgml @@ -178,6 +178,16 @@ Printing support was added in GTK+ 2.10. @printoperation: the object which received the signal. + + + + + +@printoperation: the object which received the signal. +@widget: +@arg1: +@arg2: + diff --git a/docs/reference/gtk/tmpl/gtkscale.sgml b/docs/reference/gtk/tmpl/gtkscale.sgml index 3955e9f0ff..b3f5bf5b82 100644 --- a/docs/reference/gtk/tmpl/gtkscale.sgml +++ b/docs/reference/gtk/tmpl/gtkscale.sgml @@ -7,18 +7,29 @@ Base class for GtkHScale and GtkVScale A #GtkScale is a slider control used to select a numeric value. -To use it, you'll probably want to investigate the methods on +To use it, you'll probably want to investigate the methods on its base class, #GtkRange, in addition to the methods for #GtkScale itself. -To set the value of a scale, you would normally use gtk_range_set_value(). -To detect changes to the value, you would normally use the "value_changed" +To set the value of a scale, you would normally use gtk_range_set_value(). +To detect changes to the value, you would normally use the "value_changed" signal. The #GtkScale widget is an abstract class, used only for deriving the -subclasses #GtkHScale and #GtkVScale. To create a scale widget, +subclasses #GtkHScale and #GtkVScale. To create a scale widget, call gtk_hscale_new_with_range() or gtk_vscale_new_with_range(). +GtkScale as GtkBuildable + +GtkScale supports a custom <marks> element, which +can contain multiple <mark> elements. The "value" and "position" +attributes have the same meaning as gtk_scale_add_mark() parameters of the +same name. If the element is not empty, its content is taken as the markup +to show at the mark. It can be translated with the usual "translatable and +"context" attributes. + + + diff --git a/docs/reference/gtk/tmpl/gtktoolshell.sgml b/docs/reference/gtk/tmpl/gtktoolshell.sgml new file mode 100644 index 0000000000..8e31f27684 --- /dev/null +++ b/docs/reference/gtk/tmpl/gtktoolshell.sgml @@ -0,0 +1,82 @@ + +GtkToolShell + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@get_icon_size: +@get_orientation: +@get_style: +@get_relief_style: +@rebuild_menu: + + + + + + +@shell: +@Returns: + + + + + + + +@shell: +@Returns: + + + + + + + +@shell: +@Returns: + + + + + + + +@shell: +@Returns: + + + + + + + +@shell: + + diff --git a/docs/reference/gtk/tmpl/gtkwidget.sgml b/docs/reference/gtk/tmpl/gtkwidget.sgml index 817b1e5417..664288e9cb 100644 --- a/docs/reference/gtk/tmpl/gtkwidget.sgml +++ b/docs/reference/gtk/tmpl/gtkwidget.sgml @@ -49,7 +49,7 @@ internal child "accessible" of a GtkWidget.
- + Click the button. diff --git a/docs/reference/libgail-util/Makefile.am b/docs/reference/libgail-util/Makefile.am index 92bdbd870a..e6b4bb96bb 100644 --- a/docs/reference/libgail-util/Makefile.am +++ b/docs/reference/libgail-util/Makefile.am @@ -32,3 +32,5 @@ content_files = HTML_IMAGES = include $(top_srcdir)/gtk-doc.make + +-include $(top_srcdir)/git.mk diff --git a/docs/tools/Makefile.am b/docs/tools/Makefile.am index 4b78142645..3b3c09bcc9 100644 --- a/docs/tools/Makefile.am +++ b/docs/tools/Makefile.am @@ -40,3 +40,5 @@ clean-local: *) rm -f $$file ;; \ esac ; \ done + +-include $(top_srcdir)/git.mk diff --git a/docs/tutorial/Makefile.am b/docs/tutorial/Makefile.am index 43e6c24413..5448bd2960 100644 --- a/docs/tutorial/Makefile.am +++ b/docs/tutorial/Makefile.am @@ -72,3 +72,5 @@ dist-hook: echo "***" endif + +-include $(top_srcdir)/git.mk diff --git a/examples/gtkdial/gtkdial.c b/examples/gtkdial/gtkdial.c index 87c8dbb564..385ed420f4 100644 --- a/examples/gtkdial/gtkdial.c +++ b/examples/gtkdial/gtkdial.c @@ -190,11 +190,11 @@ gtk_dial_set_adjustment (GtkDial *dial, dial->adjustment = adjustment; g_object_ref (GTK_OBJECT (dial->adjustment)); - g_signal_connect (GTK_OBJECT (adjustment), "changed", - GTK_SIGNAL_FUNC (gtk_dial_adjustment_changed), + g_signal_connect (G_OBJECT (adjustment), "changed", + G_CALLBACK (gtk_dial_adjustment_changed), (gpointer) dial); - g_signal_connect (GTK_OBJECT (adjustment), "value_changed", - GTK_SIGNAL_FUNC (gtk_dial_adjustment_value_changed), + g_signal_connect (G_OBJECT (adjustment), "value_changed", + G_CALLBACK (gtk_dial_adjustment_value_changed), (gpointer) dial); dial->old_value = adjustment->value; @@ -333,6 +333,8 @@ gtk_dial_expose( GtkWidget *widget, widget->style->bg_gc[GTK_STATE_NORMAL]; blankstyle->black_gc = widget->style->bg_gc[GTK_STATE_NORMAL]; + blankstyle->depth = + gdk_drawable_get_depth( GDK_DRAWABLE (widget->window)); gtk_paint_polygon (blankstyle, widget->window, diff --git a/gdk-pixbuf/Makefile.am b/gdk-pixbuf/Makefile.am index c1ac554383..39b52f3ce2 100644 --- a/gdk-pixbuf/Makefile.am +++ b/gdk-pixbuf/Makefile.am @@ -718,3 +718,5 @@ gdk-pixbuf.loaders: echo "No dynamic modules found; will use only static modules for uninstalled example programs."; \ touch gdk-pixbuf.loaders; endif + +-include $(top_srcdir)/git.mk diff --git a/gdk-pixbuf/gdk-pixbuf-simple-anim.c b/gdk-pixbuf/gdk-pixbuf-simple-anim.c index 3cd1560440..24d7ba48dd 100644 --- a/gdk-pixbuf/gdk-pixbuf-simple-anim.c +++ b/gdk-pixbuf/gdk-pixbuf-simple-anim.c @@ -25,9 +25,12 @@ * Havoc Pennington */ +#include "config.h" #include +#define GDK_PIXBUF_C_COMPILATION #include "gdk-pixbuf.h" +#include "gdk-pixbuf-private.h" #include "gdk-pixbuf-io.h" #include "gdk-pixbuf-simple-anim.h" #include "gdk-pixbuf-alias.h" @@ -109,6 +112,21 @@ static GdkPixbufAnimationIter *get_iter (GdkPixbufAnimation *anim, const GTimeVal *start_time); +static void gdk_pixbuf_simple_anim_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void gdk_pixbuf_simple_anim_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +enum +{ + PROP_0, + PROP_LOOP +}; + G_DEFINE_TYPE (GdkPixbufSimpleAnim, gdk_pixbuf_simple_anim, GDK_TYPE_PIXBUF_ANIMATION) static void @@ -124,13 +142,30 @@ gdk_pixbuf_simple_anim_class_init (GdkPixbufSimpleAnimClass *klass) object_class = G_OBJECT_CLASS (klass); anim_class = GDK_PIXBUF_ANIMATION_CLASS (klass); - + + object_class->set_property = gdk_pixbuf_simple_anim_set_property; + object_class->get_property = gdk_pixbuf_simple_anim_get_property; object_class->finalize = gdk_pixbuf_simple_anim_finalize; anim_class->is_static_image = is_static_image; anim_class->get_static_image = get_static_image; anim_class->get_size = get_size; anim_class->get_iter = get_iter; + + /** + * GdkPixbufSimpleAnim:loop: + * + * Whether the animation should loop when it reaches the end. + * + * Since: 2.18 + */ + g_object_class_install_property (object_class, + PROP_LOOP, + g_param_spec_boolean ("loop", + P_("Loop"), + P_("Whether the animation should loop when it reaches the end"), + FALSE, + G_PARAM_READWRITE)); } static void @@ -277,7 +312,7 @@ advance (GdkPixbufAnimationIter *anim_iter, { GdkPixbufSimpleAnimIter *iter; gint elapsed; - gint loop; + gint loop_count; GList *tmp; GList *old; @@ -302,13 +337,13 @@ advance (GdkPixbufAnimationIter *anim_iter, /* See how many times we've already played the full animation, * and subtract time for that. */ - loop = elapsed / iter->simple_anim->total_time; + loop_count = elapsed / iter->simple_anim->total_time; elapsed = elapsed % iter->simple_anim->total_time; iter->position = elapsed; /* Now move to the proper frame */ - if (loop < 1) + if (loop_count < 1 || iter->simple_anim->loop) tmp = iter->simple_anim->frames; else tmp = NULL; @@ -437,6 +472,82 @@ gdk_pixbuf_simple_anim_add_frame (GdkPixbufSimpleAnim *animation, animation->frames = g_list_append (animation->frames, frame); } +static void +gdk_pixbuf_simple_anim_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GdkPixbufSimpleAnim *animation = GDK_PIXBUF_SIMPLE_ANIM (object); + + switch (prop_id) { + case PROP_LOOP: + g_value_set_boolean (value, + gdk_pixbuf_simple_anim_get_loop (animation)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gdk_pixbuf_simple_anim_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GdkPixbufSimpleAnim *animation = GDK_PIXBUF_SIMPLE_ANIM (object); + + switch (prop_id) { + case PROP_LOOP: + gdk_pixbuf_simple_anim_set_loop (animation, + g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * gdk_pixbuf_simple_anim_set_loop: + * @animation: a #GdkPixbufSimpleAnim + * @loop: whether to loop the animation + * + * Sets whether @animation should loop indefinitely when it reaches the end. + * + * Since: 2.18 + **/ +void +gdk_pixbuf_simple_anim_set_loop (GdkPixbufSimpleAnim *animation, + gboolean loop) +{ + g_return_if_fail (GDK_IS_PIXBUF_SIMPLE_ANIM (animation)); + + if (loop != animation->loop) { + animation->loop = loop; + g_object_notify (G_OBJECT (animation), "loop"); + } +} + +/** + * gdk_pixbuf_simple_anim_get_loop: + * @animation: a #GdkPixbufSimpleAnim + * + * Gets whether @animation should loop indefinitely when it reaches the end. + * + * Returns: %TRUE if the animation loops forever, %FALSE otherwise + * + * Since: 2.18 + **/ +gboolean +gdk_pixbuf_simple_anim_get_loop (GdkPixbufSimpleAnim *animation) +{ + g_return_val_if_fail (GDK_IS_PIXBUF_SIMPLE_ANIM (animation), FALSE); + + return animation->loop; +} #define __GDK_PIXBUF_SIMPLE_ANIM_C__ #include "gdk-pixbuf-aliasdef.c" diff --git a/gdk-pixbuf/gdk-pixbuf-simple-anim.h b/gdk-pixbuf/gdk-pixbuf-simple-anim.h index ae77c202a5..cb96c538d5 100644 --- a/gdk-pixbuf/gdk-pixbuf-simple-anim.h +++ b/gdk-pixbuf/gdk-pixbuf-simple-anim.h @@ -51,6 +51,9 @@ GdkPixbufSimpleAnim *gdk_pixbuf_simple_anim_new (gint width, gfloat rate); void gdk_pixbuf_simple_anim_add_frame (GdkPixbufSimpleAnim *animation, GdkPixbuf *pixbuf); +void gdk_pixbuf_simple_anim_set_loop (GdkPixbufSimpleAnim *animation, + gboolean loop); +gboolean gdk_pixbuf_simple_anim_get_loop (GdkPixbufSimpleAnim *animation); G_END_DECLS diff --git a/gdk-pixbuf/gdk-pixbuf.symbols b/gdk-pixbuf/gdk-pixbuf.symbols index 4b579dd78d..ddf01c0411 100644 --- a/gdk-pixbuf/gdk-pixbuf.symbols +++ b/gdk-pixbuf/gdk-pixbuf.symbols @@ -133,6 +133,8 @@ gdk_pixbuf_simple_anim_get_type G_GNUC_CONST gdk_pixbuf_simple_anim_iter_get_type G_GNUC_CONST gdk_pixbuf_simple_anim_new gdk_pixbuf_simple_anim_add_frame +gdk_pixbuf_simple_anim_set_loop +gdk_pixbuf_simple_anim_get_loop #endif #endif diff --git a/gdk-pixbuf/io-jasper.c b/gdk-pixbuf/io-jasper.c index a841b83024..e60a7c82e9 100644 --- a/gdk-pixbuf/io-jasper.c +++ b/gdk-pixbuf/io-jasper.c @@ -163,7 +163,6 @@ jasper_image_try_load (struct jasper_context *context, GError **error) if (!context->pixbuf) { int bits_per_sample; - guchar *data; /* Unfortunately, gdk-pixbuf doesn't support 16 bpp images * bits_per_sample = jas_image_cmptprec (image, 0); @@ -174,17 +173,16 @@ jasper_image_try_load (struct jasper_context *context, GError **error) */ bits_per_sample = 8; - data = g_try_malloc0 (context->width * context->height * bits_per_sample / 8); - if (data == NULL) { + context->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, + FALSE, bits_per_sample, + context->width, context->height); + if (context->pixbuf == NULL) { g_set_error_literal (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Insufficient memory to open JPEG 2000 file")); return FALSE; } - context->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, - FALSE, bits_per_sample, - context->width, context->height); if (context->prepared_func) context->prepared_func (context->pixbuf, NULL, context->user_data); } diff --git a/gdk-pixbuf/io-jpeg.c b/gdk-pixbuf/io-jpeg.c index da59386c16..cf8c9ed195 100644 --- a/gdk-pixbuf/io-jpeg.c +++ b/gdk-pixbuf/io-jpeg.c @@ -1184,6 +1184,7 @@ real_save_jpeg (GdkPixbuf *pixbuf, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY, _("Couldn't allocate memory for loading JPEG file")); + g_free (buf); return FALSE; } } diff --git a/gdk-pixbuf/pixops/Makefile.am b/gdk-pixbuf/pixops/Makefile.am index e4c4e26cbf..fe7775a293 100644 --- a/gdk-pixbuf/pixops/Makefile.am +++ b/gdk-pixbuf/pixops/Makefile.am @@ -30,3 +30,5 @@ EXTRA_DIST += \ DETAILS \ pixbuf-transform-math.ltx \ makefile.msc + +-include $(top_srcdir)/git.mk diff --git a/gdk-pixbuf/pixops/pixops.c b/gdk-pixbuf/pixops/pixops.c index 3d01edaf2a..513d16fc8b 100644 --- a/gdk-pixbuf/pixops/pixops.c +++ b/gdk-pixbuf/pixops/pixops.c @@ -217,10 +217,7 @@ _pixops_use_medialib () * For x86 processors use of libumem conflicts with * mediaLib, so avoid using it. */ - if ((dlsym (RTLD_DEFAULT, "umem_alloc") != NULL) || - (dlsym (RTLD_PROBE, "umem_alloc") != NULL) || - (dlsym (RTLD_NEXT, "umem_alloc") != NULL) || - (dlsym (RTLD_SELF, "umem_alloc") != NULL)) + if (dlsym (RTLD_PROBE, "umem_alloc") != NULL) { use_medialib = FALSE; return; diff --git a/gdk/Makefile.am b/gdk/Makefile.am index 580db1bdbd..1e962428be 100644 --- a/gdk/Makefile.am +++ b/gdk/Makefile.am @@ -304,3 +304,5 @@ files: @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ echo $$p; \ done + +-include $(top_srcdir)/git.mk diff --git a/gdk/directfb/Makefile.am b/gdk/directfb/Makefile.am index e7b7966eaf..867f470cd9 100644 --- a/gdk/directfb/Makefile.am +++ b/gdk/directfb/Makefile.am @@ -56,3 +56,5 @@ libgdkinclude_HEADERS = \ EXTRA_DIST += AUTHORS README TODO + +-include $(top_srcdir)/git.mk diff --git a/gdk/directfb/gdktestutils-directfb.c b/gdk/directfb/gdktestutils-directfb.c index 9f843fbaac..2197f2ffa8 100644 --- a/gdk/directfb/gdktestutils-directfb.c +++ b/gdk/directfb/gdktestutils-directfb.c @@ -161,7 +161,8 @@ gdk_test_simulate_key (GdkWindow *window, DFBWindowEvent evt; g_return_val_if_fail (GDK_IS_WINDOW(window), FALSE); - g_return_val_if_fail (key_pressrelease == GDK_KEY_PRESS || key_pressrelease == GDK_KEY_RELEASE, FALSE); + g_return_val_if_fail (key_pressrelease == GDK_KEY_PRESS || + key_pressrelease == GDK_KEY_RELEASE, FALSE); private = GDK_WINDOW_OBJECT (window); impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl); @@ -175,7 +176,9 @@ gdk_test_simulate_key (GdkWindow *window, evt.clazz = DFEC_WINDOW; evt.type = (key_pressrelease == GDK_KEY_PRESS) ? DWET_KEYDOWN : DWET_KEYUP; +#if ((DIRECTFB_MAJOR_VERSION > 1) || (DIRECTFB_MINOR_VERSION >= 2)) evt.flags = DWEF_NONE; +#endif evt.window_id = impl->dfb_id; evt.x = MAX(x, 0); evt.y = MAX(y, 0); @@ -227,7 +230,8 @@ gdk_test_simulate_button (GdkWindow *window, DFBWindowEvent evt; g_return_val_if_fail (GDK_IS_WINDOW(window), FALSE); - g_return_val_if_fail (button_pressrelease == GDK_BUTTON_PRESS || button_pressrelease == GDK_BUTTON_RELEASE, FALSE); + g_return_val_if_fail (button_pressrelease == GDK_BUTTON_PRESS || + button_pressrelease == GDK_BUTTON_RELEASE, FALSE); private = GDK_WINDOW_OBJECT (window); impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl); @@ -241,13 +245,17 @@ gdk_test_simulate_button (GdkWindow *window, evt.clazz = DFEC_WINDOW; evt.type = (button_pressrelease == GDK_BUTTON_PRESS) ? DWET_BUTTONDOWN : DWET_BUTTONUP; +#if ((DIRECTFB_MAJOR_VERSION > 1) || (DIRECTFB_MINOR_VERSION >= 2)) evt.flags = DWEF_NONE; +#endif evt.window_id = impl->dfb_id; evt.x = MAX(x, 0); evt.y = MAX(y, 0); _gdk_display->layer->GetCursorPosition (_gdk_display->layer, &evt.cx, &evt.cy); evt.modifiers = _gdk_modifiers_to_directfb (modifiers); evt.locks = (modifiers & GDK_LOCK_MASK) ? DILS_CAPS : 0; + evt.button = button; + evt.buttons = 0; gettimeofday (&evt.timestamp, NULL); _gdk_display->buffer->PostEvent (_gdk_display->buffer, DFB_EVENT(&evt)); diff --git a/gdk/gdkmedialib.c b/gdk/gdkmedialib.c index 0a2301208f..effb89dd85 100644 --- a/gdk/gdkmedialib.c +++ b/gdk/gdkmedialib.c @@ -104,10 +104,7 @@ _gdk_use_medialib (void) * For x86 processors use of libumem conflicts with * mediaLib, so avoid using it. */ - if ((dlsym (RTLD_DEFAULT, "umem_alloc") != NULL) || - (dlsym (RTLD_PROBE, "umem_alloc") != NULL) || - (dlsym (RTLD_NEXT, "umem_alloc") != NULL) || - (dlsym (RTLD_SELF, "umem_alloc") != NULL)) + if (dlsym (RTLD_PROBE, "umem_alloc") != NULL) { return FALSE; } diff --git a/gdk/quartz/Makefile.am b/gdk/quartz/Makefile.am index 2e2fbc888f..2c3e621c59 100644 --- a/gdk/quartz/Makefile.am +++ b/gdk/quartz/Makefile.am @@ -57,3 +57,5 @@ libgdk_quartz_la_SOURCES = \ libgdkinclude_HEADERS = \ gdkquartz.h + +-include $(top_srcdir)/git.mk diff --git a/gdk/tests/Makefile.am b/gdk/tests/Makefile.am index 7417229992..423a353d61 100644 --- a/gdk/tests/Makefile.am +++ b/gdk/tests/Makefile.am @@ -25,3 +25,5 @@ check_gdk_cairo_LDADD=\ CLEANFILES = \ cairosurface.png \ gdksurface.png + +-include $(top_srcdir)/git.mk diff --git a/gdk/win32/Makefile.am b/gdk/win32/Makefile.am index 02f8c2f7aa..17d048edde 100644 --- a/gdk/win32/Makefile.am +++ b/gdk/win32/Makefile.am @@ -63,3 +63,5 @@ libgdk_win32_la_SOURCES = \ libgdkinclude_HEADERS = \ gdkwin32.h + +-include $(top_srcdir)/git.mk diff --git a/gdk/win32/gdkdisplay-win32.c b/gdk/win32/gdkdisplay-win32.c index 8d9d526ae0..340d243f33 100644 --- a/gdk/win32/gdkdisplay-win32.c +++ b/gdk/win32/gdkdisplay-win32.c @@ -235,7 +235,7 @@ gdk_display_get_name (GdkDisplay *display) DWORD session_id; char *display_name; static const char *display_name_cache = NULL; - typedef BOOL (* PFN_ProcessIdToSessionId) (DWORD, DWORD *); + typedef BOOL (WINAPI *PFN_ProcessIdToSessionId) (DWORD, DWORD *); PFN_ProcessIdToSessionId processIdToSessionId; g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); diff --git a/gdk/win32/rc/Makefile.am b/gdk/win32/rc/Makefile.am index 4253b5a523..91719233cc 100644 --- a/gdk/win32/rc/Makefile.am +++ b/gdk/win32/rc/Makefile.am @@ -11,3 +11,5 @@ endif gdk-win32-res.o : gdk.rc gtk.ico $(WINDRES) gdk.rc $@ + +-include $(top_srcdir)/git.mk diff --git a/gdk/x11/Makefile.am b/gdk/x11/Makefile.am index 0b6d5ec5d5..5d41ec8f3f 100644 --- a/gdk/x11/Makefile.am +++ b/gdk/x11/Makefile.am @@ -82,3 +82,5 @@ EXTRA_DIST += \ gdkinput-xfree.c \ gdkinput-none.c \ gdksettings.c + +-include $(top_srcdir)/git.mk diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index a43bac0e5f..118d793c79 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -1919,9 +1919,14 @@ static GdkDragAction xdnd_action_from_atom (GdkDisplay *display, Atom xatom) { - GdkAtom atom = gdk_x11_xatom_to_atom_for_display (display, xatom); + GdkAtom atom; gint i; + if (xatom == None) + return 0; + + atom = gdk_x11_xatom_to_atom_for_display (display, xatom); + if (!xdnd_actions_initialized) xdnd_initialize_actions(); diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index d6268e92e0..8d3141a8ee 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -2004,7 +2004,10 @@ gdk_event_translate (GdkDisplay *display, event->selection.window = window; event->selection.selection = gdk_x11_xatom_to_atom_for_display (display, xevent->xselection.selection); event->selection.target = gdk_x11_xatom_to_atom_for_display (display, xevent->xselection.target); - event->selection.property = gdk_x11_xatom_to_atom_for_display (display, xevent->xselection.property); + if (xevent->xselection.property == None) + event->selection.property = GDK_NONE; + else + event->selection.property = gdk_x11_xatom_to_atom_for_display (display, xevent->xselection.property); event->selection.time = xevent->xselection.time; break; diff --git a/gdk/x11/gdkproperty-x11.c b/gdk/x11/gdkproperty-x11.c index 0310a75222..9123990b60 100644 --- a/gdk/x11/gdkproperty-x11.c +++ b/gdk/x11/gdkproperty-x11.c @@ -44,7 +44,7 @@ static GHashTable *virtual_atom_hash; static const gchar xatoms_string[] = /* These are all the standard predefined X atoms */ - "NONE\0" + "\0" /* leave a space for None, even though it is not a predefined atom */ "PRIMARY\0" "SECONDARY\0" "ARC\0" @@ -120,12 +120,12 @@ static const gchar xatoms_string[] = ; static const gint xatoms_offset[] = { - 0, 5, 13, 23, 27, 32, 39, 48, 57, 64, 76, 88, - 100, 112, 124, 136, 148, 160, 169, 174, 182, 189, 195, 205, - 222, 236, 249, 262, 278, 291, 305, 317, 324, 333, 340, 351, - 360, 378, 391, 404, 412, 428, 442, 456, 466, 477, 487, 497, - 511, 525, 537, 549, 568, 588, 605, 623, 636, 645, 656, 663, - 674, 685, 695, 702, 712, 724, 734, 745, 754, 771 + 0, 1, 9, 19, 23, 28, 35, 44, 53, 60, 72, 84, + 96, 108, 120, 132, 144, 156, 165, 170, 178, 185, 189, 201, + 218, 232, 245, 258, 274, 287, 301, 313, 320, 329, 336, 347, + 356, 374, 387, 400, 408, 424, 438, 452, 462, 473, 483, 493, + 507, 521, 533, 545, 564, 584, 601, 619, 632, 641, 652, 659, + 670, 681, 691, 698, 708, 720, 730, 741, 750, 767 }; #define N_CUSTOM_PREDEFINED 1 @@ -189,6 +189,7 @@ gdk_x11_atom_to_xatom_for_display (GdkDisplay *display, Atom xatom = None; g_return_val_if_fail (GDK_IS_DISPLAY (display), None); + g_return_val_if_fail (atom != GDK_NONE, None); if (display->closed) return None; @@ -292,6 +293,7 @@ gdk_x11_xatom_to_atom_for_display (GdkDisplay *display, GdkAtom virtual_atom = GDK_NONE; g_return_val_if_fail (GDK_IS_DISPLAY (display), GDK_NONE); + g_return_val_if_fail (xatom != None, GDK_NONE); if (display->closed) return GDK_NONE; diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c index 0bcb2bcdab..a2eaceaf3a 100644 --- a/gdk/x11/gdkscreen-x11.c +++ b/gdk/x11/gdkscreen-x11.c @@ -663,6 +663,21 @@ init_fake_xinerama (GdkScreen *screen) return FALSE; } +static void +free_monitors (GdkX11Monitor *monitors, + gint n_monitors) +{ + int i; + + for (i = 0; i < n_monitors; ++i) + { + g_free (monitors[i].output_name); + g_free (monitors[i].manufacturer); + } + + g_free (monitors); +} + static int monitor_compare_function (GdkX11Monitor *monitor1, GdkX11Monitor *monitor2) @@ -753,7 +768,11 @@ init_randr13 (GdkScreen *screen) /* non RandR 1.2 X driver doesn't return any usable multihead data */ if (randr12_compat) { - g_array_free (monitors, TRUE); + guint n_monitors = monitors->len; + + free_monitors ((GdkX11Monitor *)g_array_free (monitors, FALSE), + n_monitors); + return FALSE; } @@ -856,21 +875,6 @@ init_xfree_xinerama (GdkScreen *screen) return FALSE; } -static void -free_monitors (GdkX11Monitor *monitors, - gint n_monitors) -{ - int i; - - for (i = 0; i < n_monitors; ++i) - { - g_free (monitors[i].output_name); - g_free (monitors[i].manufacturer); - } - - g_free (monitors); -} - static void deinit_multihead (GdkScreen *screen) { diff --git a/gdk/x11/gdkselection-x11.c b/gdk/x11/gdkselection-x11.c index d9ef881a2e..7d23080fdd 100644 --- a/gdk/x11/gdkselection-x11.c +++ b/gdk/x11/gdkselection-x11.c @@ -405,7 +405,10 @@ gdk_selection_send_notify_for_display (GdkDisplay *display, xevent.requestor = requestor; xevent.selection = gdk_x11_atom_to_xatom_for_display (display, selection); xevent.target = gdk_x11_atom_to_xatom_for_display (display, target); - xevent.property = gdk_x11_atom_to_xatom_for_display (display, property); + if (property == GDK_NONE) + xevent.property = None; + else + xevent.property = gdk_x11_atom_to_xatom_for_display (display, property); xevent.time = time; _gdk_send_xevent (display, requestor, False, NoEventMask, (XEvent*) & xevent); diff --git a/gdk/x11/gdkvisual-x11.c b/gdk/x11/gdkvisual-x11.c index e06c3560a5..593e3bab81 100644 --- a/gdk/x11/gdkvisual-x11.c +++ b/gdk/x11/gdkvisual-x11.c @@ -95,7 +95,7 @@ gdk_visual_get_type (void) void _gdk_visual_init (GdkScreen *screen) { - static const gint possible_depths[7] = { 32, 24, 16, 15, 8, 4, 1 }; + static const gint possible_depths[8] = { 32, 30, 24, 16, 15, 8, 4, 1 }; static const GdkVisualType possible_types[6] = { GDK_VISUAL_DIRECT_COLOR, diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 7f783a9bee..e29dc7b14b 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -3299,18 +3299,20 @@ gdk_window_x11_get_events (GdkWindow *window) { XWindowAttributes attrs; GdkEventMask event_mask; + GdkEventMask filtered; if (GDK_WINDOW_DESTROYED (window)) return 0; else { XGetWindowAttributes (GDK_WINDOW_XDISPLAY (window), - GDK_WINDOW_XID (window), + GDK_WINDOW_XID (window), &attrs); - event_mask = x_event_mask_to_gdk_event_mask (attrs.your_event_mask); - GDK_WINDOW_OBJECT (window)->event_mask = event_mask; - + /* if property change was filtered out before, keep it filtered out */ + filtered = GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK; + GDK_WINDOW_OBJECT (window)->event_mask = event_mask & ((GDK_WINDOW_OBJECT (window)->event_mask & filtered) | ~filtered); + return event_mask; } } @@ -3318,13 +3320,13 @@ static void gdk_window_x11_set_events (GdkWindow *window, GdkEventMask event_mask) { - long xevent_mask; + long xevent_mask = 0; int i; if (!GDK_WINDOW_DESTROYED (window)) { - xevent_mask = StructureNotifyMask | PropertyChangeMask; - + if (GDK_WINDOW_XID (window) != GDK_WINDOW_XROOTWIN (window)) + xevent_mask = StructureNotifyMask | PropertyChangeMask; for (i = 0; i < _gdk_nenvent_masks; i++) { if (event_mask & (1 << (i + 1))) @@ -3647,7 +3649,9 @@ gdk_x11_window_set_user_time (GdkWindow *window, XA_CARDINAL, 32, PropModeReplace, (guchar *)×tamp_long, 1); - if (timestamp_long != GDK_CURRENT_TIME) + if (timestamp_long != GDK_CURRENT_TIME && + (display_x11->user_time == GDK_CURRENT_TIME || + XSERVER_TIME_IS_LATER (timestamp_long, display_x11->user_time))) display_x11->user_time = timestamp_long; if (toplevel) @@ -3854,13 +3858,18 @@ gdk_window_icon_name_set (GdkWindow *window) * idea from a user interface standpoint. But you can set such a name * with this function, if you like. * + * After calling this with a non-%NULL @name, calls to gdk_window_set_title() + * will not update the icon title. + * + * Using %NULL for @name unsets the icon title; further calls to + * gdk_window_set_title() will again update the icon title as well. **/ -void +void gdk_window_set_icon_name (GdkWindow *window, const gchar *name) { GdkDisplay *display; - + if (GDK_WINDOW_DESTROYED (window) || WINDOW_IS_TOPLEVEL (window)) return; @@ -3868,17 +3877,29 @@ gdk_window_set_icon_name (GdkWindow *window, display = gdk_drawable_get_display (window); g_object_set_qdata (G_OBJECT (window), g_quark_from_static_string ("gdk-icon-name-set"), - GUINT_TO_POINTER (TRUE)); + GUINT_TO_POINTER (name != NULL)); - XChangeProperty (GDK_DISPLAY_XDISPLAY (display), - GDK_WINDOW_XID (window), - gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_ICON_NAME"), - gdk_x11_get_xatom_by_name_for_display (display, "UTF8_STRING"), 8, - PropModeReplace, (guchar *)name, strlen (name)); - - set_text_property (display, GDK_WINDOW_XID (window), - gdk_x11_get_xatom_by_name_for_display (display, "WM_ICON_NAME"), - name); + if (name != NULL) + { + XChangeProperty (GDK_DISPLAY_XDISPLAY (display), + GDK_WINDOW_XID (window), + gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_ICON_NAME"), + gdk_x11_get_xatom_by_name_for_display (display, "UTF8_STRING"), 8, + PropModeReplace, (guchar *)name, strlen (name)); + + set_text_property (display, GDK_WINDOW_XID (window), + gdk_x11_get_xatom_by_name_for_display (display, "WM_ICON_NAME"), + name); + } + else + { + XDeleteProperty (GDK_DISPLAY_XDISPLAY (display), + GDK_WINDOW_XID (window), + gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_ICON_NAME")); + XDeleteProperty (GDK_DISPLAY_XDISPLAY (display), + GDK_WINDOW_XID (window), + gdk_x11_get_xatom_by_name_for_display (display, "WM_ICON_NAME")); + } } /** diff --git a/gdk/x11/gdkxid.c b/gdk/x11/gdkxid.c index 1d18b557e0..b4b46fe05f 100644 --- a/gdk/x11/gdkxid.c +++ b/gdk/x11/gdkxid.c @@ -47,16 +47,19 @@ _gdk_xid_table_insert (GdkDisplay *display, gpointer data) { GdkDisplayX11 *display_x11; - + g_return_if_fail (xid != NULL); g_return_if_fail (GDK_IS_DISPLAY (display)); - + display_x11 = GDK_DISPLAY_X11 (display); if (!display_x11->xid_ht) display_x11->xid_ht = g_hash_table_new ((GHashFunc) gdk_xid_hash, (GEqualFunc) gdk_xid_equal); + if (g_hash_table_lookup (display_x11->xid_ht, xid)) + g_warning ("XID collision, trouble ahead"); + g_hash_table_insert (display_x11->xid_ht, xid, data); } @@ -65,11 +68,11 @@ _gdk_xid_table_remove (GdkDisplay *display, XID xid) { GdkDisplayX11 *display_x11; - + g_return_if_fail (GDK_IS_DISPLAY (display)); - + display_x11 = GDK_DISPLAY_X11 (display); - + if (display_x11->xid_ht) g_hash_table_remove (display_x11->xid_ht, &xid); } diff --git a/git.mk b/git.mk new file mode 100644 index 0000000000..4b742b5a07 --- /dev/null +++ b/git.mk @@ -0,0 +1,182 @@ +# git.mk +# +# Copyright 2009, Red Hat, Inc. +# Written by Behdad Esfahbod +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. +# +# The canonical source for this file is pango/git.mk, or whereever the +# header of pango/git.mk suggests in the future. +# +# To use in your project, import this file in your git repo's toplevel, +# then do "make -f git.mk". This modifies all Makefile.am files in +# your project to include git.mk. +# +# This enables automatic .gitignore generation. If you need to ignore +# more files, add them to the GITIGNOREFILES variable in your Makefile.am. +# But think twice before doing that. If a file has to be in .gitignore, +# chances are very high that it's a generated file and should be in one +# of MOSTLYCLEANFILES, CLEANFILES, DISTCLEANFILES, or MAINTAINERCLEANFILES. +# +# The only case that you need to manually add a file to GITIGNOREFILES is +# when remove files in one of mostlyclean-local, clean-local, distclean-local, +# or maintainer-clean-local. +# +# Note that for files like editor backup, etc, there are better places to +# ignore them. See "man gitignore". +# +# If "make maintainer-clean" removes the files but they are not recognized +# by this script (that is, if "git status" shows untracked files still), send +# me the output of "git status" as well as your Makefile.am and Makefile for +# the directories involved. +# +# For a list of toplevel files that should be in MAINTAINERCLEANFILES, see +# pango/Makefile.am. +# +# Don't EXTRA_DIST this file. It is supposed to only live in git clones, +# not tarballs. It serves no useful purpose in tarballs and clutters the +# build dir. +# +# This file knows how to handle autoconf, automake, libtool, gtk-doc, +# gnome-doc-utils, intltool. +# +# +# KNOWN ISSUES: +# +# - Recursive configure doesn't work as $(top_srcdir)/git.mk inside the +# submodule doesn't find us. If you have configure.{in,ac} files in +# subdirs, add a proxy git.mk file in those dirs that simply does: +# "include $(top_srcdir)/../git.mk". Add more ..'s to your taste. +# And add those files to git. See vte/gnome-pty-helper/git.mk for +# example. +# + +git-all: git-mk-install + +git-mk-install: + @echo Installing git makefile + @any_failed=; find $(top_srcdir) -name Makefile.am | while read x; do \ + if grep 'include .*/git.mk' $$x >/dev/null; then \ + echo $$x already includes git.mk; \ + else \ + failed=; \ + echo "Updating $$x"; \ + { cat $$x; \ + echo ''; \ + echo '-include $$(top_srcdir)/git.mk'; \ + } > $$x.tmp || failed=1; \ + if test x$$failed = x; then \ + mv $$x.tmp $$x || failed=1; \ + fi; \ + if test x$$failed = x; then : else \ + echo Failed updating $$x; >&2 \ + any_failed=1; \ + fi; \ + fi; done; test -z "$$any_failed" + +.PHONY: git-all git-mk-install + + +### .gitignore generation + +$(srcdir)/.gitignore: Makefile.am $(top_srcdir)/git.mk + @echo Generating $@; \ + { \ + if test "x$(DOC_MODULE)" = x -o "x$(DOC_MAIN_SGML_FILE)" = x; then :; else \ + for x in \ + $(DOC_MODULE)-decl-list.txt \ + $(DOC_MODULE)-decl.txt \ + tmpl/$(DOC_MODULE)-unused.sgml \ + "tmpl/*.bak" \ + xml html \ + ; do echo /$$x; done; \ + fi; \ + if test "x$(DOC_MODULE)" = x -o "x$(DOC_LINGUAS)" = x; then :; else \ + for x in \ + $(_DOC_C_DOCS) \ + $(_DOC_LC_DOCS) \ + $(_DOC_OMF_ALL) \ + $(_DOC_DSK_ALL) \ + $(_DOC_HTML_ALL) \ + $(_DOC_POFILES) \ + "*/.xml2po.mo" \ + "*/*.omf.out" \ + ; do echo /$$x; done; \ + fi; \ + if test -f $(srcdir)/po/Makefile.in.in; then \ + for x in \ + po/Makefile.in.in \ + po/Makefile.in \ + po/Makefile \ + po/POTFILES \ + po/stamp-it \ + po/.intltool-merge-cache \ + "po/*.gmo" \ + "po/*.mo" \ + intltool-extract.in \ + intltool-merge.in \ + intltool-update.in \ + ; do echo /$$x; done; \ + fi; \ + if test -f $(srcdir)/configure; then \ + for x in \ + autom4te.cache \ + configure \ + config.h \ + stamp-h1 \ + libtool \ + config.lt \ + ; do echo /$$x; done; \ + fi; \ + for x in \ + .gitignore \ + $(GITIGNOREFILES) \ + $(CLEANFILES) \ + $(PROGRAMS) \ + $(EXTRA_PROGRAMS) \ + $(LTLIBRARIES) \ + so_locations \ + .libs _libs \ + $(MOSTLYCLEANFILES) \ + "*.$(OBJEXT)" \ + "*.lo" \ + $(DISTCLEANFILES) \ + $(am__CONFIG_DISTCLEAN_FILES) \ + $(CONFIG_CLEAN_FILES) \ + TAGS ID GTAGS GRTAGS GSYMS GPATH tags \ + "*.tab.c" \ + $(MAINTAINERCLEANFILES) \ + $(BUILT_SOURCES) \ + $(DEPDIR) \ + Makefile \ + Makefile.in \ + "*.orig" \ + "*.rej" \ + "*.bak" \ + "*~" \ + ".*.sw[nop]" \ + ; do echo /$$x; done; \ + } | \ + sed "s@^/`echo "$(srcdir)" | sed 's/\(.\)/[\1]/g'`/@/@" | \ + sed 's@/[.]/@/@g' | \ + LANG=C sort | uniq > $@.tmp && \ + mv $@.tmp $@; + +all: $(srcdir)/.gitignore gitignore-recurse-maybe +gitignore-recurse-maybe: + @if test "x$(SUBDIRS)" = "x$(DIST_SUBDIRS)"; then :; else \ + $(MAKE) $(AM_MAKEFLAGS) gitignore-recurse; \ + fi; +gitignore-recurse: + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) .gitignore gitignore-recurse); \ + done +gitignore: $(srcdir)/.gitignore gitignore-recurse + +maintainer-clean: gitignore-clean +gitignore-clean: + -rm -f $(srcdir)/.gitignore + +.PHONY: gitignore-clean gitignore gitignore-recurse gitignore-recurse-maybe diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 2339a86543..d80dc7f56a 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -10,11 +10,19 @@ endif SUBDIRS = theme-bits . tests DIST_SUBDIRS=theme-bits tests +if HAVE_PAPI_CUPS +GTK_PRINT_BACKENDS=file,papi,cups +else if HAVE_CUPS GTK_PRINT_BACKENDS=file,cups else +if HAVE_PAPI +GTK_PRINT_BACKENDS=file,papi +else GTK_PRINT_BACKENDS=file,lpr endif +endif +endif INCLUDES = \ -DG_LOG_DOMAIN=\"Gtk\" \ @@ -778,7 +786,7 @@ gtk_extra_sources = \ # # setup GTK+ sources and their dependencies # -MAINTAINERCLEANFILES = $(gtk_built_sources) $(stamp_files) $(GENERATED_ICONS) +MAINTAINERCLEANFILES = $(gtk_built_sources) $(stamp_files) $(GENERATED_ICONS) stock-icons/icon-theme.cache EXTRA_HEADERS = EXTRA_DIST += $(gtk_private_h_sources) $(gtk_extra_sources) EXTRA_DIST += $(gtk_built_sources) @@ -1286,3 +1294,5 @@ EXTRA_DIST += \ install-data-local: + +-include $(top_srcdir)/git.mk diff --git a/gtk/gtk-builder-convert b/gtk/gtk-builder-convert index 470e206de1..a641b3385d 100755 --- a/gtk/gtk-builder-convert +++ b/gtk/gtk-builder-convert @@ -29,7 +29,7 @@ The [INPUT] file is -r, --root Convert only widget named root and its children -h, --help display this help and exit -When OUTPUT is -, write to standard input. +When OUTPUT is -, write to standard output. Examples: gtk-builder-convert preference.glade preferences.ui @@ -42,10 +42,10 @@ import sys from xml.dom import minidom, Node -WINDOWS = ['GtkWindow', - 'GtkDialog', +DIALOGS = ['GtkDialog', 'GtkFileChooserDialog', 'GtkMessageDialog'] +WINDOWS = ['GtkWindow'] + DIALOGS # The subprocess is only available in Python 2.4+ try: @@ -257,6 +257,8 @@ class GtkBuilderConverter(object): for node in objects: self._convert(node.getAttribute("class"), node) + if self._get_object(node.getAttribute('id')) is not None: + print "WARNING: duplicate id \"" + node.getAttribute('id') + "\"" self.objects[node.getAttribute('id')] = node # Convert Gazpachos UI tag @@ -497,7 +499,7 @@ class GtkBuilderConverter(object): return if (node.tagName == 'object' and - node.getAttribute('class') == 'GtkDialog'): + node.getAttribute('class') in DIALOGS): dialog = node break node = node.parentNode @@ -544,6 +546,14 @@ class GtkBuilderConverter(object): if not prop.childNodes: parent.removeChild(prop) return + + translatable_attr = prop.attributes.get('translatable') + translatable = translatable_attr is not None and translatable_attr.value == 'yes' + has_context_attr = prop.attributes.get('context') + has_context = has_context_attr is not None and has_context_attr.value == 'yes' + comments_attr = prop.attributes.get('comments') + comments = comments_attr is not None and comments_attr.value or None + value = prop.childNodes[0].data model = self._create_root_object("GtkListStore", template="model") @@ -558,13 +568,23 @@ class GtkBuilderConverter(object): data = self._dom.createElement('data') model.appendChild(data) + if value.endswith('\n'): + value = value[:-1] for item in value.split('\n'): row = self._dom.createElement('row') data.appendChild(row) col = self._dom.createElement('col') col.setAttribute('id', '0') - col.setAttribute('translatable', 'yes') + if translatable: + col.setAttribute('translatable', 'yes') + if has_context: + splitting = item.split('|', 1) + if len(splitting) == 2: + context, item = splitting + col.setAttribute('context', context) + if comments is not None: + col.setAttribute('comments', comments) col.appendChild(self._dom.createTextNode(item)) row.appendChild(col) diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index 9e99266f7c..d9ddbf8691 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -2210,6 +2210,7 @@ gtk_label_set_text_with_mnemonic gtk_label_set_use_markup gtk_label_set_use_underline gtk_label_set_width_chars +gtk_label_get_current_uri #endif #endif @@ -2823,6 +2824,7 @@ gtk_print_backend_printer_list_is_done gtk_print_backend_find_printer gtk_print_backend_print_stream gtk_print_backend_load_modules +gtk_print_backend_set_password #endif #endif #endif diff --git a/gtk/gtkaboutdialog.c b/gtk/gtkaboutdialog.c index 62bc3ff66d..b073c98228 100644 --- a/gtk/gtkaboutdialog.c +++ b/gtk/gtkaboutdialog.c @@ -49,6 +49,9 @@ #include "gtktextview.h" #include "gtkvbox.h" #include "gtkiconfactory.h" +#include "gtkshow.h" +#include "gtkmain.h" +#include "gtkmessagedialog.h" #include "gtkprivate.h" #include "gtkintl.h" @@ -137,37 +140,73 @@ static void set_cursor_if_appropriate (GtkAboutDialog GtkTextView *text_view, gint x, gint y); -static void add_credits_page (GtkAboutDialog *about, - GtkWidget *notebook, - gchar *title, - gchar **people); -static gboolean credits_key_press_event (GtkWidget *text_view, - GdkEventKey *event, - GtkAboutDialog *about); -static gboolean credits_event_after (GtkWidget *text_view, - GdkEvent *event, - GtkAboutDialog *about); -static gboolean credits_motion_notify_event (GtkWidget *text_view, - GdkEventMotion *event, - GtkAboutDialog *about); -static gboolean credits_visibility_notify_event (GtkWidget *text_view, - GdkEventVisibility *event, - GtkAboutDialog *about); static void display_credits_dialog (GtkWidget *button, gpointer data); static void display_license_dialog (GtkWidget *button, gpointer data); static void close_cb (GtkAboutDialog *about); - - +static void default_url_hook (GtkAboutDialog *about, + const gchar *uri, + gpointer user_data); +static void default_email_hook (GtkAboutDialog *about, + const gchar *email_address, + gpointer user_data); + +static gboolean activate_email_hook_set = FALSE; static GtkAboutDialogActivateLinkFunc activate_email_hook = NULL; static gpointer activate_email_hook_data = NULL; static GDestroyNotify activate_email_hook_destroy = NULL; +static gboolean activate_url_hook_set = FALSE; static GtkAboutDialogActivateLinkFunc activate_url_hook = NULL; static gpointer activate_url_hook_data = NULL; static GDestroyNotify activate_url_hook_destroy = NULL; +static void +default_url_hook (GtkAboutDialog *about, + const gchar *uri, + gpointer user_data G_GNUC_UNUSED) +{ + GdkScreen *screen; + GError *error = NULL; + + screen = gtk_widget_get_screen (GTK_WIDGET (about)); + + if (!gtk_show_uri (screen, uri, gtk_get_current_event_time (), &error)) { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (GTK_WINDOW (about), + GTK_DIALOG_DESTROY_WITH_PARENT | + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "%s", _("Could not show link")); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + "%s", error->message); + g_error_free (error); + + g_signal_connect (dialog, "response", + G_CALLBACK (gtk_widget_destroy), NULL); + + gtk_window_present (GTK_WINDOW (dialog)); + } +} + +static void +default_email_hook (GtkAboutDialog *about, + const gchar *email_address, + gpointer user_data) +{ + char *escaped, *uri; + + escaped = g_uri_escape_string (email_address, NULL, FALSE); + uri = g_strdup_printf ("mailto:%s", escaped); + g_free (escaped); + + default_url_hook (about, uri, user_data); + g_free (uri); +} + G_DEFINE_TYPE (GtkAboutDialog, gtk_about_dialog, GTK_TYPE_DIALOG) static void @@ -485,8 +524,6 @@ gtk_about_dialog_init (GtkAboutDialog *about) priv->website_button = button = gtk_link_button_new (""); gtk_widget_set_no_show_all (button, TRUE); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (activate_url), about); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); priv->website_label = button = gtk_label_new (""); @@ -704,7 +741,7 @@ update_website (GtkAboutDialog *about) { GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; - if (priv->website_url && activate_url_hook) + if (priv->website_url && (!activate_url_hook_set || activate_url_hook != NULL)) { gtk_widget_show (priv->website_button); gtk_widget_hide (priv->website_label); @@ -1663,9 +1700,22 @@ activate_url (GtkWidget *widget, { GtkAboutDialog *about = GTK_ABOUT_DIALOG (data); const gchar *url = gtk_link_button_get_uri (GTK_LINK_BUTTON (widget)); - - if (activate_url_hook != NULL) - (* activate_url_hook) (about, url, activate_url_hook_data); + GtkAboutDialogActivateLinkFunc url_hook; + gpointer url_hook_data; + + if (activate_url_hook_set) + { + url_hook = activate_url_hook; + url_hook_data = activate_url_hook_data; + } + else + { + url_hook = default_url_hook; + url_hook_data = NULL; + } + + if (url_hook) + url_hook (about, url, url_hook_data); } static void @@ -1676,24 +1726,48 @@ follow_if_link (GtkAboutDialog *about, GSList *tags = NULL, *tagp = NULL; GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; gchar *url = NULL; + GtkAboutDialogActivateLinkFunc email_hook, url_hook; + gpointer email_hook_data, url_hook_data; + + if (activate_email_hook_set) + { + email_hook = activate_email_hook; + email_hook_data = activate_email_hook_data; + } + else + { + email_hook = default_email_hook; + email_hook_data = NULL; + } + + if (activate_url_hook_set) + { + url_hook = activate_url_hook; + url_hook_data = activate_url_hook_data; + } + else + { + url_hook = default_url_hook; + url_hook_data = NULL; + } tags = gtk_text_iter_get_tags (iter); for (tagp = tags; tagp != NULL && !url; tagp = tagp->next) { GtkTextTag *tag = tagp->data; - if (activate_email_hook != NULL) + if (email_hook != NULL) { url = g_object_get_data (G_OBJECT (tag), "email"); - if (url) - (* activate_email_hook) (about, url, activate_email_hook_data); + if (url) + email_hook (about, url, email_hook_data); } - if (!url && activate_url_hook != NULL) + if (!url && url_hook != NULL) { url = g_object_get_data (G_OBJECT (tag), "url"); if (url) - (* activate_url_hook) (about, url, activate_url_hook_data); + url_hook (about, url, url_hook_data); } if (url && !g_slist_find_custom (priv->visited_links, url, (GCompareFunc)strcmp)) @@ -1724,9 +1798,9 @@ follow_if_link (GtkAboutDialog *about, } static gboolean -credits_key_press_event (GtkWidget *text_view, - GdkEventKey *event, - GtkAboutDialog *about) +text_view_key_press_event (GtkWidget *text_view, + GdkEventKey *event, + GtkAboutDialog *about) { GtkTextIter iter; GtkTextBuffer *buffer; @@ -1750,9 +1824,9 @@ credits_key_press_event (GtkWidget *text_view, } static gboolean -credits_event_after (GtkWidget *text_view, - GdkEvent *event, - GtkAboutDialog *about) +text_view_event_after (GtkWidget *text_view, + GdkEvent *event, + GtkAboutDialog *about) { GtkTextIter start, end, iter; GtkTextBuffer *buffer; @@ -1827,9 +1901,9 @@ set_cursor_if_appropriate (GtkAboutDialog *about, } static gboolean -credits_motion_notify_event (GtkWidget *text_view, - GdkEventMotion *event, - GtkAboutDialog *about) +text_view_motion_notify_event (GtkWidget *text_view, + GdkEventMotion *event, + GtkAboutDialog *about) { gint x, y; @@ -1846,9 +1920,9 @@ credits_motion_notify_event (GtkWidget *text_view, static gboolean -credits_visibility_notify_event (GtkWidget *text_view, - GdkEventVisibility *event, - GtkAboutDialog *about) +text_view_visibility_notify_event (GtkWidget *text_view, + GdkEventVisibility *event, + GtkAboutDialog *about) { gint wx, wy, bx, by; @@ -1863,24 +1937,16 @@ credits_visibility_notify_event (GtkWidget *text_view, return FALSE; } -static void -text_view_style_set (GtkWidget *widget, - GtkStyle *prev_style, - GtkWidget *text_view) -{ - gtk_widget_modify_base (text_view, GTK_STATE_NORMAL, - &widget->style->bg[GTK_STATE_NORMAL]); -} - -static void -add_credits_page (GtkAboutDialog *about, - GtkWidget *notebook, - gchar *title, - gchar **people) +static GtkWidget * +text_view_new (GtkAboutDialog *about, + GtkWidget *dialog, + gchar **strings, + GtkWrapMode wrap_mode) { gchar **p; gchar *q0, *q1, *q2, *r1, *r2; - GtkWidget *sw, *view; + GtkWidget *view; + GtkTextView *text_view; GtkTextBuffer *buffer; gboolean linkify_email, linkify_urls; GdkColor *style_link_color; @@ -1890,11 +1956,11 @@ add_credits_page (GtkAboutDialog *about, GdkColor visited_link_color; GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; - linkify_email = (activate_email_hook != NULL); - linkify_urls = (activate_url_hook != NULL); + linkify_email = (!activate_email_hook_set || activate_email_hook != NULL); + linkify_urls = (!activate_url_hook_set || activate_url_hook != NULL); gtk_widget_ensure_style (GTK_WIDGET (about)); - gtk_widget_style_get (GTK_WIDGET (about), + gtk_widget_style_get (GTK_WIDGET (about), "link-color", &style_link_color, "visited-link-color", &style_visited_link_color, NULL); @@ -1915,48 +1981,34 @@ add_credits_page (GtkAboutDialog *about, visited_link_color = default_visited_link_color; view = gtk_text_view_new (); - g_signal_connect_object (about, "style-set", - G_CALLBACK (text_view_style_set), view, 0); - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE); - gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE); + text_view = GTK_TEXT_VIEW (view); + buffer = gtk_text_view_get_buffer (text_view); + gtk_text_view_set_cursor_visible (text_view, FALSE); + gtk_text_view_set_editable (text_view, FALSE); + gtk_text_view_set_wrap_mode (text_view, wrap_mode); - gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view), 8); - gtk_text_view_set_right_margin (GTK_TEXT_VIEW (view), 8); + gtk_text_view_set_left_margin (text_view, 8); + gtk_text_view_set_right_margin (text_view, 8); g_signal_connect (view, "key-press-event", - G_CALLBACK (credits_key_press_event), about); + G_CALLBACK (text_view_key_press_event), about); g_signal_connect (view, "event-after", - G_CALLBACK (credits_event_after), about); - g_signal_connect (view, "motion-notify-event", - G_CALLBACK (credits_motion_notify_event), about); - g_signal_connect (view, "visibility-notify-event", - G_CALLBACK (credits_visibility_notify_event), about); + G_CALLBACK (text_view_event_after), about); + g_signal_connect (view, "motion-notify-event", + G_CALLBACK (text_view_motion_notify_event), about); + g_signal_connect (view, "visibility-notify-event", + G_CALLBACK (text_view_visibility_notify_event), about); - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), - GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (sw), view); - - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - sw, gtk_label_new (title)); - - if (people == NULL) + if (strings == NULL) { gtk_widget_hide (view); - return; + return view; } - else - gtk_widget_show (view); - - for (p = people; *p; p++) + + for (p = strings; *p; p++) { q0 = *p; - while (*q0) + while (*q0) { q1 = linkify_email ? strchr (q0, '<') : NULL; q2 = q1 ? strchr (q1, '>') : NULL; @@ -2025,6 +2077,32 @@ add_credits_page (GtkAboutDialog *about, if (p[1]) gtk_text_buffer_insert_at_cursor (buffer, "\n", 1); } + + gtk_widget_show (view); + return view; +} + +static void +add_credits_page (GtkAboutDialog *about, + GtkWidget *credits_dialog, + GtkWidget *notebook, + gchar *title, + gchar **people) +{ + GtkWidget *sw, *view; + + view = text_view_new (about, credits_dialog, people, GTK_WRAP_NONE); + + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), + GTK_SHADOW_IN); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (sw), view); + + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), + sw, gtk_label_new (title)); } static void @@ -2071,10 +2149,10 @@ display_credits_dialog (GtkWidget *button, gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook, TRUE, TRUE, 0); if (priv->authors != NULL) - add_credits_page (about, notebook, _("Written by"), priv->authors); + add_credits_page (about, dialog, notebook, _("Written by"), priv->authors); if (priv->documenters != NULL) - add_credits_page (about, notebook, _("Documented by"), priv->documenters); + add_credits_page (about, dialog, notebook, _("Documented by"), priv->documenters); /* Don't show an untranslated gettext msgid */ if (priv->translator_credits != NULL && @@ -2086,11 +2164,11 @@ display_credits_dialog (GtkWidget *button, translators[0] = priv->translator_credits; translators[1] = NULL; - add_credits_page (about, notebook, _("Translated by"), translators); + add_credits_page (about, dialog, notebook, _("Translated by"), translators); } if (priv->artists != NULL) - add_credits_page (about, notebook, _("Artwork by"), priv->artists); + add_credits_page (about, dialog, notebook, _("Artwork by"), priv->artists); gtk_widget_show_all (dialog); } @@ -2111,7 +2189,8 @@ display_license_dialog (GtkWidget *button, GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; GtkWidget *dialog, *view, *sw; GtkDialog *licence_dialog; - + gchar *strings[2]; + if (priv->license_dialog != NULL) { gtk_window_present (GTK_WINDOW (priv->license_dialog)); @@ -2152,17 +2231,10 @@ display_license_dialog (GtkWidget *button, g_signal_connect (sw, "map", G_CALLBACK (set_policy), NULL); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), sw, TRUE, TRUE, 0); - view = gtk_text_view_new (); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), - priv->wrap_license ? GTK_WRAP_WORD : GTK_WRAP_NONE); - gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)), - priv->license, -1); - - gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE); - gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE); - - gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view), 8); - gtk_text_view_set_right_margin (GTK_TEXT_VIEW (view), 8); + strings[0] = priv->license; + strings[1] = NULL; + view = text_view_new (about, dialog, strings, + priv->wrap_license ? GTK_WRAP_WORD : GTK_WRAP_NONE); gtk_container_add (GTK_CONTAINER (sw), view); @@ -2194,6 +2266,9 @@ gtk_about_dialog_new (void) * * Installs a global function to be called whenever the user activates an * email link in an about dialog. + * + * Since 2.18 there exists a default function which uses gtk_show_uri(). To + * deactivate it, you can pass %NULL for @func. * * Return value: the previous email hook. * @@ -2211,6 +2286,7 @@ gtk_about_dialog_set_email_hook (GtkAboutDialogActivateLinkFunc func, old = activate_email_hook; + activate_email_hook_set = TRUE; activate_email_hook = func; activate_email_hook_data = data; activate_email_hook_destroy = destroy; @@ -2227,6 +2303,9 @@ gtk_about_dialog_set_email_hook (GtkAboutDialogActivateLinkFunc func, * Installs a global function to be called whenever the user activates a * URL link in an about dialog. * + * Since 2.18 here exists a default function which uses gtk_show_uri(). To + * deactivate it, you can pass %NULL for @func. + * * Return value: the previous URL hook. * * Since: 2.6 @@ -2243,6 +2322,7 @@ gtk_about_dialog_set_url_hook (GtkAboutDialogActivateLinkFunc func, old = activate_url_hook; + activate_url_hook_set = TRUE; activate_url_hook = func; activate_url_hook_data = data; activate_url_hook_destroy = destroy; diff --git a/gtk/gtkaccelgroup.c b/gtk/gtkaccelgroup.c index 32c76db8e3..b26fd63a05 100644 --- a/gtk/gtkaccelgroup.c +++ b/gtk/gtkaccelgroup.c @@ -165,6 +165,9 @@ gtk_accel_group_finalize (GObject *object) _gtk_accel_map_remove_group (accel_path, accel_group); } g_closure_remove_invalidate_notifier (entry->closure, accel_group, accel_closure_invalidate); + + /* remove quick_accel_add() refcount */ + g_closure_unref (entry->closure); } g_free (accel_group->priv_accels); diff --git a/gtk/gtkadjustment.c b/gtk/gtkadjustment.c index dd1b3f609d..49f5008ec2 100644 --- a/gtk/gtkadjustment.c +++ b/gtk/gtkadjustment.c @@ -359,11 +359,7 @@ gtk_adjustment_set_value (GtkAdjustment *adjustment, { g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); - /* don't use CLAMP() so we don't end up below lower if upper - page_size - * is smaller than lower - */ - value = MIN (value, adjustment->upper - adjustment->page_size); - value = MAX (value, adjustment->lower); + value = CLAMP (value, adjustment->lower, adjustment->upper); if (value != adjustment->value) { diff --git a/gtk/gtkassistant.c b/gtk/gtkassistant.c index e469b5a282..4e8f155aea 100644 --- a/gtk/gtkassistant.c +++ b/gtk/gtkassistant.c @@ -40,6 +40,7 @@ #include "gtkintl.h" #include "gtkprivate.h" +#include "gtkbuildable.h" #include "gtkalias.h" @@ -119,6 +120,23 @@ static void gtk_assistant_get_child_property (GtkContainer *container, static AtkObject *gtk_assistant_get_accessible (GtkWidget *widget); +static void gtk_assistant_buildable_interface_init (GtkBuildableIface *iface); +static GObject *gtk_assistant_buildable_get_internal_child (GtkBuildable *buildable, + GtkBuilder *builder, + const gchar *childname); +static gboolean gtk_assistant_buildable_custom_tag_start (GtkBuildable *buildable, + GtkBuilder *builder, + GObject *child, + const gchar *tagname, + GMarkupParser *parser, + gpointer *data); +static void gtk_assistant_buildable_custom_finished (GtkBuildable *buildable, + GtkBuilder *builder, + GObject *child, + const gchar *tagname, + gpointer user_data); + + enum { CHILD_PROP_0, @@ -141,7 +159,9 @@ enum static guint signals [LAST_SIGNAL] = { 0 }; -G_DEFINE_TYPE (GtkAssistant, gtk_assistant, GTK_TYPE_WINDOW) +G_DEFINE_TYPE_WITH_CODE (GtkAssistant, gtk_assistant, GTK_TYPE_WINDOW, + G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, + gtk_assistant_buildable_interface_init)) static void @@ -197,8 +217,8 @@ gtk_assistant_class_init (GtkAssistantClass *class) * @assistant: the #GtkAssistant * @page: the current page * - * The ::prepared signal is emitted when a new page is set as the assistant's - * current page, before making the new page visible. A handler for this signal + * The ::prepared signal is emitted when a new page is set as the assistant's + * current page, before making the new page visible. A handler for this signal * can do any preparation which are necessary before showing @page. * * Since: 2.10 @@ -709,6 +729,7 @@ gtk_assistant_init (GtkAssistant *assistant) priv = assistant->priv = GTK_ASSISTANT_GET_PRIVATE (assistant); gtk_container_set_reallocate_redraws (GTK_CONTAINER (assistant), TRUE); + gtk_container_set_border_width (GTK_CONTAINER (assistant), 12); gtk_widget_push_composite_child (); @@ -1472,9 +1493,8 @@ gtk_assistant_new (void) { GtkWidget *assistant; - assistant = g_object_new (GTK_TYPE_ASSISTANT, - "border-width", 12, - NULL); + assistant = g_object_new (GTK_TYPE_ASSISTANT, NULL); + return assistant; } @@ -2233,7 +2253,7 @@ gtk_assistant_accessible_ref_child (AtkObject *accessible, GtkWidget *widget, *child; gint n_pages; AtkObject *obj; - gchar *title; + const gchar *title; widget = GTK_ACCESSIBLE (accessible)->widget; if (!widget) @@ -2290,15 +2310,15 @@ gtk_assistant_accessible_get_type (void) GType derived_type; GTypeQuery query; GType derived_atk_type; - + derived_type = g_type_parent (GTK_TYPE_ASSISTANT); factory = atk_registry_get_factory (atk_get_default_registry (), derived_type); derived_atk_type = atk_object_factory_get_accessible_type (factory); g_type_query (derived_atk_type, &query); - - type = g_type_register_static_simple (derived_atk_type, - I_("GtkAssistantAccessible"), + + type = g_type_register_static_simple (derived_atk_type, + I_("GtkAssistantAccessible"), query.class_size, (GClassInitFunc) gtk_assistant_accessible_class_init, query.instance_size, @@ -2315,9 +2335,9 @@ gtk_assistant_accessible_new (GObject *obj) g_return_val_if_fail (GTK_IS_ASSISTANT (obj), NULL); - accessible = g_object_new (gtk_assistant_accessible_get_type (), NULL); + accessible = g_object_new (gtk_assistant_accessible_get_type (), NULL); atk_object_initialize (accessible, obj); - + return accessible; } @@ -2345,16 +2365,16 @@ gtk_assistant_accessible_factory_get_type (void) { static GType type = 0; - if (!type) + if (!type) { - type = g_type_register_static_simple (ATK_TYPE_OBJECT_FACTORY, + type = g_type_register_static_simple (ATK_TYPE_OBJECT_FACTORY, I_("GtkAssistantAccessibleFactory"), sizeof (AtkObjectFactoryClass), (GClassInitFunc) gtk_assistant_accessible_factory_class_init, sizeof (AtkObjectFactory), NULL, 0); } - + return type; } @@ -2363,12 +2383,12 @@ gtk_assistant_get_accessible (GtkWidget *widget) { static gboolean first_time = TRUE; - if (first_time) + if (first_time) { AtkObjectFactory *factory; AtkRegistry *registry; - GType derived_type; - GType derived_atk_type; + GType derived_type; + GType derived_atk_type; /* * Figure out whether accessibility is enabled by looking at the @@ -2383,7 +2403,7 @@ gtk_assistant_get_accessible (GtkWidget *widget) derived_atk_type = atk_object_factory_get_accessible_type (factory); if (g_type_is_a (derived_atk_type, GTK_TYPE_ACCESSIBLE)) { - atk_registry_set_factory_type (registry, + atk_registry_set_factory_type (registry, GTK_TYPE_ASSISTANT, gtk_assistant_accessible_factory_get_type ()); } @@ -2394,5 +2414,53 @@ gtk_assistant_get_accessible (GtkWidget *widget) } +static GtkBuildableIface *parent_buildable_iface; + +static void +gtk_assistant_buildable_interface_init (GtkBuildableIface *iface) +{ + parent_buildable_iface = g_type_interface_peek_parent (iface); + iface->get_internal_child = gtk_assistant_buildable_get_internal_child; + iface->custom_tag_start = gtk_assistant_buildable_custom_tag_start; + iface->custom_finished = gtk_assistant_buildable_custom_finished; +} + +static GObject * +gtk_assistant_buildable_get_internal_child (GtkBuildable *buildable, + GtkBuilder *builder, + const gchar *childname) +{ + if (strcmp (childname, "action_area") == 0) + return G_OBJECT (GTK_ASSISTANT (buildable)->priv->action_area); + + return parent_buildable_iface->get_internal_child (buildable, + builder, + childname); +} + +gboolean +gtk_assistant_buildable_custom_tag_start (GtkBuildable *buildable, + GtkBuilder *builder, + GObject *child, + const gchar *tagname, + GMarkupParser *parser, + gpointer *data) +{ + return parent_buildable_iface->custom_tag_start (buildable, builder, child, + tagname, parser, data); +} + +static void +gtk_assistant_buildable_custom_finished (GtkBuildable *buildable, + GtkBuilder *builder, + GObject *child, + const gchar *tagname, + gpointer user_data) +{ + parent_buildable_iface->custom_finished (buildable, builder, child, + tagname, user_data); +} + + #define __GTK_ASSISTANT_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c index 1ea7db3ac7..9dff20e38a 100644 --- a/gtk/gtkbuilder.c +++ b/gtk/gtkbuilder.c @@ -1329,7 +1329,14 @@ gtk_builder_value_from_string_type (GtkBuilder *builder, g_value_take_boxed (value, vector); } else - ret = FALSE; + { + g_set_error (error, + GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_INVALID_VALUE, + "Could not parse '%s' as a %s", + string, G_VALUE_TYPE_NAME (value)); + ret = FALSE; + } break; case G_TYPE_OBJECT: if (G_VALUE_HOLDS (value, GDK_TYPE_PIXBUF)) diff --git a/gtk/gtkbuilder.h b/gtk/gtkbuilder.h index 4a11001c5c..0f9224e0e7 100644 --- a/gtk/gtkbuilder.h +++ b/gtk/gtkbuilder.h @@ -52,7 +52,8 @@ typedef enum GTK_BUILDER_ERROR_INVALID_TAG, GTK_BUILDER_ERROR_MISSING_PROPERTY_VALUE, GTK_BUILDER_ERROR_INVALID_VALUE, - GTK_BUILDER_ERROR_VERSION_MISMATCH + GTK_BUILDER_ERROR_VERSION_MISMATCH, + GTK_BUILDER_ERROR_DUPLICATE_ID } GtkBuilderError; GQuark gtk_builder_error_quark (void); diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c index 44b10fa036..c5cb2d8938 100644 --- a/gtk/gtkbuilderparser.c +++ b/gtk/gtkbuilderparser.c @@ -298,11 +298,12 @@ is_requested_object (const gchar *object, } static void -parse_object (ParserData *data, - const gchar *element_name, - const gchar **names, - const gchar **values, - GError **error) +parse_object (GMarkupParseContext *context, + ParserData *data, + const gchar *element_name, + const gchar **names, + const gchar **values, + GError **error) { ObjectInfo *object_info; ChildInfo* child_info; @@ -310,6 +311,7 @@ parse_object (ParserData *data, gchar *object_class = NULL; gchar *object_id = NULL; gchar *constructor = NULL; + gint line, line2; child_info = state_peek_info (data, ChildInfo); if (child_info && strcmp (child_info->tag.name, "object") == 0) @@ -335,10 +337,11 @@ parse_object (ParserData *data, object_class = _get_type_by_symbol (values[i]); if (!object_class) { - g_set_error (error, GTK_BUILDER_ERROR, + g_markup_parse_context_get_position (context, &line, NULL); + g_set_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION, - _("Invalid type function: `%s'"), - values[i]); + _("Invalid type function on line %d: '%s'"), + line, values[i]); return; } } @@ -389,6 +392,19 @@ parse_object (ParserData *data, if (child_info) object_info->parent = (CommonInfo*)child_info; + + g_markup_parse_context_get_position (context, &line, NULL); + line2 = GPOINTER_TO_INT (g_hash_table_lookup (data->object_ids, object_id)); + if (line2 != 0) + { + g_set_error (error, GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_DUPLICATE_ID, + _("Duplicate object id '%s' on line %d (previously on line %d)"), + object_id, line, line2); + return; + } + + g_hash_table_insert (data->object_ids, object_id, GINT_TO_POINTER (line)); } static void @@ -848,7 +864,7 @@ start_element (GMarkupParseContext *context, if (strcmp (element_name, "requires") == 0) parse_requires (data, element_name, names, values, error); else if (strcmp (element_name, "object") == 0) - parse_object (data, element_name, names, values, error); + parse_object (context, data, element_name, names, values, error); else if (data->requested_objects && !data->inside_requested_object) { /* If outside a requested object, simply ignore this tag */ @@ -958,10 +974,11 @@ end_element (GMarkupParseContext *context, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_VERSION_MISMATCH, "%s: required %s version %d.%d, current version is %d.%d", - data->filename, req_info->library, + data->filename, req_info->library, req_info->major, req_info->minor, GTK_MAJOR_VERSION, GTK_MINOR_VERSION); } + _free_requires_info (req_info, NULL); } else if (strcmp (element_name, "interface") == 0) { @@ -1145,6 +1162,7 @@ _gtk_builder_parser_parse_buffer (GtkBuilder *builder, data->builder = builder; data->filename = filename; data->domain = g_strdup (domain); + data->object_ids = g_hash_table_new (g_str_hash, g_str_equal); data->requested_objects = NULL; if (requested_objs) @@ -1204,6 +1222,7 @@ _gtk_builder_parser_parse_buffer (GtkBuilder *builder, g_slist_foreach (data->requested_objects, (GFunc) g_free, NULL); g_slist_free (data->requested_objects); g_free (data->domain); + g_hash_table_destroy (data->object_ids); g_markup_parse_context_free (data->ctx); g_free (data); diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h index 8c69630d6c..e633a28b5d 100644 --- a/gtk/gtkbuilderprivate.h +++ b/gtk/gtkbuilderprivate.h @@ -101,6 +101,8 @@ typedef struct { gboolean inside_requested_object; gint requested_object_level; gint cur_object_level; + + GHashTable *object_ids; } ParserData; typedef GType (*GTypeGetFunc) (void); diff --git a/gtk/gtkcellrendereraccel.c b/gtk/gtkcellrendereraccel.c index 9b10d86035..f3e229688b 100644 --- a/gtk/gtkcellrendereraccel.c +++ b/gtk/gtkcellrendereraccel.c @@ -244,12 +244,24 @@ convert_keysym_state_to_string (GtkCellRendererAccel *accel, else { if (accel->accel_mode == GTK_CELL_RENDERER_ACCEL_MODE_GTK) - return gtk_accelerator_get_label (keysym, mask); + { + if (!gtk_accelerator_valid (keysym, mask)) + /* This label is displayed in a treeview cell displaying + * an accelerator key combination that is not valid according + * to gtk_accelerator_valid(). + */ + return g_strdup (C_("Accelerator", "Invalid")); + + return gtk_accelerator_get_label (keysym, mask); + } else { gchar *name; - name = gtk_accelerator_name (keysym, mask); + name = gtk_accelerator_get_label (keysym, mask); + if (name == NULL) + name = gtk_accelerator_name (keysym, mask); + if (keysym == 0) { gchar *tmp; diff --git a/gtk/gtkclipboard.c b/gtk/gtkclipboard.c index 48ee63f537..c9e9a2c119 100644 --- a/gtk/gtkclipboard.c +++ b/gtk/gtkclipboard.c @@ -300,6 +300,7 @@ GtkClipboard * gtk_clipboard_get_for_display (GdkDisplay *display, GdkAtom selection) { + g_return_val_if_fail (display != NULL, NULL); /* See bgo#463773; this is needed because Flash Player sucks */ g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); g_return_val_if_fail (!display->closed, NULL); diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c index 57a975d0ef..555418a19f 100644 --- a/gtk/gtkcombobox.c +++ b/gtk/gtkcombobox.c @@ -4018,13 +4018,13 @@ gtk_combo_box_list_auto_scroll (GtkComboBox *combo_box, adj->lower < adj->value) { value = adj->value - (tree_view->allocation.x - x + 1); - gtk_adjustment_set_value (adj, value); + gtk_adjustment_set_value (adj, CLAMP (value, adj->lower, adj->upper - adj->page_size)); } else if (x >= tree_view->allocation.x + tree_view->allocation.width && adj->upper - adj->page_size > adj->value) { value = adj->value + (x - tree_view->allocation.x - tree_view->allocation.width + 1); - gtk_adjustment_set_value (adj, MAX (value, 0.0)); + gtk_adjustment_set_value (adj, CLAMP (value, 0.0, adj->upper - adj->page_size)); } } @@ -4035,13 +4035,13 @@ gtk_combo_box_list_auto_scroll (GtkComboBox *combo_box, adj->lower < adj->value) { value = adj->value - (tree_view->allocation.y - y + 1); - gtk_adjustment_set_value (adj, value); + gtk_adjustment_set_value (adj, CLAMP (value, adj->lower, adj->upper - adj->page_size)); } else if (y >= tree_view->allocation.height && adj->upper - adj->page_size > adj->value) { value = adj->value + (y - tree_view->allocation.height + 1); - gtk_adjustment_set_value (adj, MAX (value, 0.0)); + gtk_adjustment_set_value (adj, CLAMP (value, 0.0, adj->upper - adj->page_size)); } } } @@ -5251,10 +5251,11 @@ gtk_combo_box_remove_text (GtkComboBox *combo_box, * * Returns the currently active string in @combo_box or %NULL if none * is selected. Note that you can only use this function with combo - * boxes constructed with gtk_combo_box_new_text() and with + * boxes constructed with gtk_combo_box_new_text() and with * #GtkComboBoxEntrys. * * Returns: a newly allocated string containing the currently active text. + * Must be freed with g_free(). * * Since: 2.6 */ diff --git a/gtk/gtkdialog.c b/gtk/gtkdialog.c index 05be93fad8..d463306844 100644 --- a/gtk/gtkdialog.c +++ b/gtk/gtkdialog.c @@ -1371,7 +1371,7 @@ static const GMarkupParser attributes_parser = attributes_text_element, }; -gboolean +static gboolean gtk_dialog_buildable_custom_tag_start (GtkBuildable *buildable, GtkBuilder *builder, GObject *child, diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 607ef878a5..a21e94f57f 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -1213,6 +1213,27 @@ gtk_entry_class_init (GtkEntryClass *class) GTK_TYPE_BORDER, GTK_PARAM_READABLE)); + /** + * GtkEntry::invisible-char: + * + * The invisible character is used when masking entry contents (in + * \"password mode\")"). When it is not explicitly set with the + * #GtkEntry::invisible-char property, GTK+ determines the character + * to use from a list of possible candidates, depending on availability + * in the current font. + * + * This style property allows the theme to prepend a character + * to the list of candidates. + * + * Since: 2.22 + */ + gtk_widget_class_install_style_property (widget_class, + g_param_spec_unichar ("invisible-char", + P_("Invisible character"), + P_("The character to use when masking entry contents (in \"password mode\")"), + 0, + GTK_PARAM_READABLE)); + /** * GtkEntry::populate-popup: * @entry: The entry on which the signal is emitted @@ -2149,12 +2170,18 @@ find_invisible_char (GtkWidget *widget) PangoAttrList *attr_list; gint i; gunichar invisible_chars [] = { + 0, 0x25cf, /* BLACK CIRCLE */ 0x2022, /* BULLET */ 0x2731, /* HEAVY ASTERISK */ 0x273a /* SIXTEEN POINTED ASTERISK */ }; + if (widget->style) + gtk_widget_style_get (widget, + "invisible-char", &invisible_chars[0], + NULL); + layout = gtk_widget_create_pango_layout (widget, NULL); attr_list = pango_attr_list_new (); @@ -2163,7 +2190,7 @@ find_invisible_char (GtkWidget *widget) pango_layout_set_attributes (layout, attr_list); pango_attr_list_unref (attr_list); - for (i = 0; i < G_N_ELEMENTS (invisible_chars); i++) + for (i = (invisible_chars[0] != 0 ? 0 : 1); i < G_N_ELEMENTS (invisible_chars); i++) { gchar text[7] = { 0, }; gint len, count; @@ -2181,6 +2208,7 @@ find_invisible_char (GtkWidget *widget) } g_object_unref (layout); + return '*'; } diff --git a/gtk/gtkexpander.c b/gtk/gtkexpander.c index ebfead7aa4..6866f982c9 100644 --- a/gtk/gtkexpander.c +++ b/gtk/gtkexpander.c @@ -1538,6 +1538,12 @@ gtk_expander_set_label (GtkExpander *expander, * return value will be %NULL. This will be the case if you create an * empty button with gtk_button_new() to use as a container. * + * Note that this function behaved differently in versions prior to + * 2.14 and used to return the label text stripped of embedded + * underlines indicating mnemonics and Pango markup. This problem can + * be avoided by fetching the label text directly from the label + * widget. + * * Return value: The text of the label widget. This string is owned * by the widget and must not be modified or freed. * diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index b70af42160..5f40411551 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -8307,10 +8307,15 @@ save_entry_get_info_cb (GCancellable *cancellable, if (data->file_exists_and_is_not_folder) { gboolean retval; - const char *file_part; + char *file_part; - file_part = _gtk_file_chooser_entry_get_file_part (GTK_FILE_CHOOSER_ENTRY (data->impl->location_entry)); + /* Dup the string because the string may be modified + * depending on what clients do in the confirm-overwrite + * signal and this corrupts the pointer + */ + file_part = g_strdup (_gtk_file_chooser_entry_get_file_part (GTK_FILE_CHOOSER_ENTRY (data->impl->location_entry))); retval = should_respond_after_confirm_overwrite (data->impl, file_part, data->parent_file); + g_free (file_part); if (retval) g_signal_emit_by_name (data->impl, "response-requested"); diff --git a/gtk/gtkfilesel.c b/gtk/gtkfilesel.c index 318e67aa38..0aa9f17d91 100644 --- a/gtk/gtkfilesel.c +++ b/gtk/gtkfilesel.c @@ -3005,14 +3005,16 @@ open_new_dir (gchar *dir_name, if (!sys_dir_name) { cmpl_errno = CMPL_ERRNO_DID_NOT_CONVERT; + g_free (sent); return NULL; } - + directory = g_dir_open (sys_dir_name, 0, &error); if (!directory) { cmpl_errno = error->code; /* ??? */ g_free (sys_dir_name); + g_free (sent); return NULL; } diff --git a/gtk/gtkhandlebox.c b/gtk/gtkhandlebox.c index d376248428..2215689567 100644 --- a/gtk/gtkhandlebox.c +++ b/gtk/gtkhandlebox.c @@ -1079,6 +1079,7 @@ gtk_handle_box_button_press (GtkWidget *widget, gint root_x, root_y; gint width, height; + gtk_invisible_set_screen (GTK_INVISIBLE (invisible), gtk_widget_get_screen (hb)); gdk_window_get_deskrelative_origin (hb->bin_window, &desk_x, &desk_y); gdk_window_get_origin (hb->bin_window, &root_x, &root_y); gdk_drawable_get_size (hb->bin_window, &width, &height); diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c index 78d24d7134..3a413f0ed2 100644 --- a/gtk/gtkiconview.c +++ b/gtk/gtkiconview.c @@ -1471,7 +1471,7 @@ gtk_icon_view_size_allocate (GtkWidget *widget, hadjustment->upper = MAX (allocation->width, icon_view->priv->width); if (hadjustment->value > hadjustment->upper - hadjustment->page_size) - gtk_adjustment_set_value (hadjustment, hadjustment->upper - hadjustment->page_size); + gtk_adjustment_set_value (hadjustment, MAX (0, hadjustment->upper - hadjustment->page_size)); vadjustment->page_size = allocation->height; vadjustment->page_increment = allocation->height * 0.9; @@ -1480,7 +1480,7 @@ gtk_icon_view_size_allocate (GtkWidget *widget, vadjustment->upper = MAX (allocation->height, icon_view->priv->height); if (vadjustment->value > vadjustment->upper - vadjustment->page_size) - gtk_adjustment_set_value (vadjustment, vadjustment->upper - vadjustment->page_size); + gtk_adjustment_set_value (vadjustment, MAX (0, vadjustment->upper - vadjustment->page_size)); if (GTK_WIDGET_REALIZED (widget) && icon_view->priv->scroll_to_path) @@ -1638,11 +1638,17 @@ gtk_icon_view_expose (GtkWidget *widget, static gboolean rubberband_scroll_timeout (gpointer data) { - GtkIconView *icon_view = data; + GtkIconView *icon_view; + gdouble value; - gtk_adjustment_set_value (icon_view->priv->vadjustment, - icon_view->priv->vadjustment->value + - icon_view->priv->scroll_value_diff); + icon_view = data; + + value = MIN (icon_view->priv->vadjustment->value + + icon_view->priv->scroll_value_diff, + icon_view->priv->vadjustment->upper - + icon_view->priv->vadjustment->page_size); + + gtk_adjustment_set_value (icon_view->priv->vadjustment, value); gtk_icon_view_update_rubberband (icon_view); @@ -2144,14 +2150,11 @@ gtk_icon_view_button_press (GtkWidget *widget, } else { - if (!item->selected) - { - gtk_icon_view_unselect_all_internal (icon_view); - - item->selected = TRUE; - gtk_icon_view_queue_draw_item (icon_view, item); - dirty = TRUE; - } + gtk_icon_view_unselect_all_internal (icon_view); + + item->selected = TRUE; + gtk_icon_view_queue_draw_item (icon_view, item); + dirty = TRUE; } gtk_icon_view_set_cursor_item (icon_view, item, cursor_cell); icon_view->priv->anchor_item = item; @@ -4349,7 +4352,7 @@ gtk_icon_view_scroll_to_path (GtkIconView *icon_view, { gint x, y; gint focus_width; - gfloat offset; + gfloat offset, value; gtk_widget_style_get (GTK_WIDGET (icon_view), "focus-line-width", &focus_width, @@ -4359,15 +4362,17 @@ gtk_icon_view_scroll_to_path (GtkIconView *icon_view, offset = y + item->y - focus_width - row_align * (GTK_WIDGET (icon_view)->allocation.height - item->height); - - gtk_adjustment_set_value (icon_view->priv->vadjustment, - icon_view->priv->vadjustment->value + offset); + value = CLAMP (icon_view->priv->vadjustment->value + offset, + icon_view->priv->vadjustment->lower, + icon_view->priv->vadjustment->upper - icon_view->priv->vadjustment->page_size); + gtk_adjustment_set_value (icon_view->priv->vadjustment, value); offset = x + item->x - focus_width - col_align * (GTK_WIDGET (icon_view)->allocation.width - item->width); - - gtk_adjustment_set_value (icon_view->priv->hadjustment, - icon_view->priv->hadjustment->value + offset); + value = CLAMP (icon_view->priv->hadjustment->value + offset, + icon_view->priv->hadjustment->lower, + icon_view->priv->hadjustment->upper - icon_view->priv->hadjustment->page_size); + gtk_adjustment_set_value (icon_view->priv->hadjustment, value); gtk_adjustment_changed (icon_view->priv->hadjustment); gtk_adjustment_changed (icon_view->priv->vadjustment); @@ -6407,6 +6412,7 @@ gtk_icon_view_autoscroll (GtkIconView *icon_view) { gint px, py, x, y, width, height; gint hoffset, voffset; + gfloat value; gdk_window_get_pointer (GTK_WIDGET (icon_view)->window, &px, &py, NULL); gdk_window_get_geometry (GTK_WIDGET (icon_view)->window, &x, &y, &width, &height, NULL); @@ -6421,12 +6427,19 @@ gtk_icon_view_autoscroll (GtkIconView *icon_view) hoffset = MAX (px - (x + width - 2 * SCROLL_EDGE_SIZE), 0); if (voffset != 0) - gtk_adjustment_set_value (icon_view->priv->vadjustment, - icon_view->priv->vadjustment->value + voffset); - + { + value = CLAMP (icon_view->priv->vadjustment->value + voffset, + icon_view->priv->vadjustment->lower, + icon_view->priv->vadjustment->upper - icon_view->priv->vadjustment->page_size); + gtk_adjustment_set_value (icon_view->priv->vadjustment, value); + } if (hoffset != 0) - gtk_adjustment_set_value (icon_view->priv->hadjustment, - icon_view->priv->hadjustment->value + hoffset); + { + value = CLAMP (icon_view->priv->hadjustment->value + hoffset, + icon_view->priv->hadjustment->lower, + icon_view->priv->hadjustment->upper - icon_view->priv->hadjustment->page_size); + gtk_adjustment_set_value (icon_view->priv->hadjustment, value); + } } diff --git a/gtk/gtkitemfactory.h b/gtk/gtkitemfactory.h index 0e71f4886a..5c57b8032e 100644 --- a/gtk/gtkitemfactory.h +++ b/gtk/gtkitemfactory.h @@ -228,10 +228,9 @@ void gtk_item_factory_create_menu_entries (guint n_entries, void gtk_item_factories_path_delete (const gchar *ifactory_path, const gchar *path); -#endif /* !GTK_DISABLE_DEPRECATED */ - - G_END_DECLS +#endif /* !GTK_DISABLE_DEPRECATED */ + #endif /* __GTK_ITEM_FACTORY_H__ */ diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index 91ab5ccb31..ea963b1853 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -45,6 +45,9 @@ #include "gtkstock.h" #include "gtkbindings.h" #include "gtkbuildable.h" +#include "gtkimage.h" +#include "gtkshow.h" +#include "gtktooltip.h" #include "gtkprivate.h" #include "gtkalias.h" @@ -55,8 +58,47 @@ typedef struct gint wrap_width; gint width_chars; gint max_width_chars; -} -GtkLabelPrivate; +} GtkLabelPrivate; + +/* Notes about the handling of links: + * + * Links share the GtkLabelSelectionInfo struct with selectable labels. + * There are some new fields for links. The links field contains the list + * of GtkLabelLink structs that describe the links which are embedded in + * the label. The active_link field points to the link under the mouse + * pointer. For keyboard navigation, the 'focus' link is determined by + * finding the link which contains the selection_anchor position. + * The link_clicked field is used with button press and release events + * to ensure that pressing inside a link and releasing outside of it + * does not activate the link. + * + * Links are rendered with the link-color/visited-link-color colors + * that are determined by the style and with an underline. When the mouse + * pointer is over a link, the pointer is changed to indicate the link, + * and the background behind the link is rendered with the base[PRELIGHT] + * color. While a button is pressed over a link, the background is rendered + * with the base[ACTIVE] color. + * + * Labels with links accept keyboard focus, and it is possible to move + * the focus between the embedded links using Tab/Shift-Tab. The focus + * is indicated by a focus rectangle that is drawn around the link text. + * Pressing Enter activates the focussed link, and there is a suitable + * context menu for links that can be opened with the Menu key. Pressing + * Control-C copies the link URI to the clipboard. + * + * In selectable labels with links, link functionality is only available + * when the selection is empty. + */ +typedef struct +{ + gchar *uri; + gchar *title; /* the title attribute, used as tooltip */ + gboolean visited; /* get set when the link is activated; this flag + * gets preserved over later set_markup() calls + */ + gint start; /* position of the link in the PangoLayout */ + gint end; +} GtkLabelLink; struct _GtkLabelSelectionInfo { @@ -64,18 +106,25 @@ struct _GtkLabelSelectionInfo gint selection_anchor; gint selection_end; GtkWidget *popup_menu; - + + GList *links; + GtkLabelLink *active_link; + gint drag_start_x; gint drag_start_y; - guint in_drag : 1; + guint in_drag : 1; guint select_words : 1; + guint selectable : 1; + guint link_clicked : 1; }; enum { MOVE_CURSOR, COPY_CLIPBOARD, POPULATE_POPUP, + ACTIVATE_LINK, + ACTIVATE_CURRENT_LINK, LAST_SIGNAL }; @@ -103,6 +152,9 @@ enum { static guint signals[LAST_SIGNAL] = { 0 }; +static const GdkColor default_link_color = { 0, 0, 0, 0xeeee }; +static const GdkColor default_visited_link_color = { 0, 0x5555, 0x1a1a, 0x8b8b }; + static void gtk_label_set_property (GObject *object, guint prop_id, const GValue *value, @@ -125,6 +177,8 @@ static void gtk_label_direction_changed (GtkWidget *widget, GtkTextDirection previous_dir); static gint gtk_label_expose (GtkWidget *widget, GdkEventExpose *event); +static gboolean gtk_label_focus (GtkWidget *widget, + GtkDirectionType direction); static void gtk_label_realize (GtkWidget *widget); static void gtk_label_unrealize (GtkWidget *widget); @@ -137,8 +191,16 @@ static gboolean gtk_label_button_release (GtkWidget *widget, GdkEventButton *event); static gboolean gtk_label_motion (GtkWidget *widget, GdkEventMotion *event); +static gboolean gtk_label_leave_notify (GtkWidget *widget, + GdkEventCrossing *event); + static void gtk_label_grab_focus (GtkWidget *widget); +static gboolean gtk_label_query_tooltip (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip); static void gtk_label_set_text_internal (GtkLabel *label, gchar *str); @@ -154,7 +216,7 @@ static void gtk_label_set_uline_text_internal (GtkLabel *label, const gchar *str); static void gtk_label_set_pattern_internal (GtkLabel *label, const gchar *pattern); -static void set_markup (GtkLabel *label, +static void gtk_label_set_markup_internal (GtkLabel *label, const gchar *str, gboolean with_uline); static void gtk_label_recalculate (GtkLabel *label); @@ -162,9 +224,13 @@ static void gtk_label_hierarchy_changed (GtkWidget *widget, GtkWidget *old_toplevel); static void gtk_label_screen_changed (GtkWidget *widget, GdkScreen *old_screen); +static gboolean gtk_label_popup_menu (GtkWidget *widget); static void gtk_label_create_window (GtkLabel *label); static void gtk_label_destroy_window (GtkLabel *label); +static void gtk_label_ensure_select_info (GtkLabel *label); +static void gtk_label_clear_select_info (GtkLabel *label); +static void gtk_label_update_cursor (GtkLabel *label); static void gtk_label_clear_layout (GtkLabel *label); static void gtk_label_ensure_layout (GtkLabel *label); static void gtk_label_invalidate_wrap_width (GtkLabel *label); @@ -197,7 +263,7 @@ static void gtk_label_buildable_custom_finished (GtkBuildable *builda gpointer user_data); -/* For selectable lables: */ +/* For selectable labels: */ static void gtk_label_move_cursor (GtkLabel *label, GtkMovementStep step, gint count, @@ -206,12 +272,24 @@ static void gtk_label_copy_clipboard (GtkLabel *label); static void gtk_label_select_all (GtkLabel *label); static void gtk_label_do_popup (GtkLabel *label, GdkEventButton *event); - static gint gtk_label_move_forward_word (GtkLabel *label, gint start); static gint gtk_label_move_backward_word (GtkLabel *label, gint start); +/* For links: */ +static void gtk_label_rescan_links (GtkLabel *label); +static void gtk_label_clear_links (GtkLabel *label); +static gboolean gtk_label_activate_link (GtkLabel *label, + const gchar *uri); +static void gtk_label_activate_current_link (GtkLabel *label); +static GtkLabelLink *gtk_label_get_current_link (GtkLabel *label); +static void gtk_label_get_link_colors (GtkWidget *widget, + GdkColor **link_color, + GdkColor **visited_link_color); +static void emit_activate_link (GtkLabel *label, + GtkLabelLink *link); + static GQuark quark_angle = 0; static GtkBuildableIface *buildable_parent_iface = NULL; @@ -258,11 +336,12 @@ gtk_label_class_init (GtkLabelClass *class) gobject_class->finalize = gtk_label_finalize; object_class->destroy = gtk_label_destroy; - + widget_class->size_request = gtk_label_size_request; widget_class->size_allocate = gtk_label_size_allocate; widget_class->state_changed = gtk_label_state_changed; widget_class->style_set = gtk_label_style_set; + widget_class->query_tooltip = gtk_label_query_tooltip; widget_class->direction_changed = gtk_label_direction_changed; widget_class->expose_event = gtk_label_expose; widget_class->realize = gtk_label_realize; @@ -272,15 +351,19 @@ gtk_label_class_init (GtkLabelClass *class) widget_class->button_press_event = gtk_label_button_press; widget_class->button_release_event = gtk_label_button_release; widget_class->motion_notify_event = gtk_label_motion; + widget_class->leave_notify_event = gtk_label_leave_notify; widget_class->hierarchy_changed = gtk_label_hierarchy_changed; widget_class->screen_changed = gtk_label_screen_changed; widget_class->mnemonic_activate = gtk_label_mnemonic_activate; widget_class->drag_data_get = gtk_label_drag_data_get; widget_class->grab_focus = gtk_label_grab_focus; + widget_class->popup_menu = gtk_label_popup_menu; + widget_class->focus = gtk_label_focus; class->move_cursor = gtk_label_move_cursor; class->copy_clipboard = gtk_label_copy_clipboard; - + class->activate_link = gtk_label_activate_link; + /** * GtkLabel::move-cursor: * @entry: the object which received the signal @@ -361,6 +444,51 @@ gtk_label_class_init (GtkLabelClass *class) G_TYPE_NONE, 1, GTK_TYPE_MENU); + /** + * GtkLabel::activate-current-link: + * @label: The label on which the signal was emitted + * + * A keybinding signal + * which gets emitted when the user activates a link in the label. + * + * Applications may also emit the signal with g_signal_emit_by_name() + * if they need to control activation of URIs programmatically. + * + * The default bindings for this signal are all forms of the Enter key. + * + * Since: 2.18 + */ + signals[ACTIVATE_CURRENT_LINK] = + g_signal_new_class_handler ("activate-current-link", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_CALLBACK (gtk_label_activate_current_link), + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** + * GtkLabel::activate-link: + * @label: The label on which the signal was emitted + * @uri: the URI that is activated + * + * The signal which gets emitted to activate a URI. + * Applications may connect to it to override the default behaviour, + * which is to call gtk_show_uri(). + * + * Returns: %TRUE if the link has been activated + * + * Since: 2.18 + */ + signals[ACTIVATE_LINK] = + g_signal_new ("activate-link", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkLabelClass, activate_link), + _gtk_boolean_handled_accumulator, NULL, + _gtk_marshal_BOOLEAN__STRING, + G_TYPE_BOOLEAN, 1, G_TYPE_STRING); + g_object_class_install_property (gobject_class, PROP_LABEL, g_param_spec_string ("label", @@ -691,6 +819,13 @@ gtk_label_class_init (GtkLabelClass *class) gtk_binding_entry_add_signal (binding_set, GDK_c, GDK_CONTROL_MASK, "copy-clipboard", 0); + gtk_binding_entry_add_signal (binding_set, GDK_Return, 0, + "activate-current-link", 0); + gtk_binding_entry_add_signal (binding_set, GDK_ISO_Enter, 0, + "activate-current-link", 0); + gtk_binding_entry_add_signal (binding_set, GDK_KP_Enter, 0, + "activate-current-link", 0); + gtk_settings_install_property (g_param_spec_boolean ("gtk-label-select-on-focus", P_("Select on focus"), P_("Whether to select the contents of a selectable label when it is focused"), @@ -807,7 +942,7 @@ gtk_label_get_property (GObject *object, g_value_set_object (value, (GObject*) label->mnemonic_widget); break; case PROP_CURSOR_POSITION: - if (label->select_info) + if (label->select_info && label->select_info->selectable) { gint offset = g_utf8_pointer_to_offset (label->text, label->text + label->select_info->selection_end); @@ -817,7 +952,7 @@ gtk_label_get_property (GObject *object, g_value_set_int (value, 0); break; case PROP_SELECTION_BOUND: - if (label->select_info) + if (label->select_info && label->select_info->selectable) { gint offset = g_utf8_pointer_to_offset (label->text, label->text + label->select_info->selection_anchor); @@ -1634,7 +1769,7 @@ gtk_label_recalculate (GtkLabel *label) if (label->use_markup) { - set_markup (label, label->label, label->use_underline); + gtk_label_set_markup_internal (label, label->label, label->use_underline); gtk_label_compose_effective_attrs (label); } else @@ -1664,7 +1799,8 @@ gtk_label_recalculate (GtkLabel *label) g_object_notify (G_OBJECT (label), "mnemonic-keyval"); } - gtk_label_clear_layout (label); + gtk_label_clear_layout (label); + gtk_label_clear_select_info (label); gtk_widget_queue_resize (GTK_WIDGET (label)); } @@ -1788,17 +1924,317 @@ gtk_label_get_label (GtkLabel *label) return label->label; } +typedef struct +{ + GtkLabel *label; + GList *links; + GString *new_str; + GdkColor *link_color; + GdkColor *visited_link_color; +} UriParserData; + static void -set_markup (GtkLabel *label, - const gchar *str, - gboolean with_uline) +start_element_handler (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + UriParserData *pdata = user_data; + + if (strcmp (element_name, "a") == 0) + { + GtkLabelLink *link; + const gchar *uri = NULL; + const gchar *title = NULL; + gboolean visited = FALSE; + gint line_number; + gint char_number; + gint i; + GdkColor *color = NULL; + + g_markup_parse_context_get_position (context, &line_number, &char_number); + + for (i = 0; attribute_names[i] != NULL; i++) + { + const gchar *attr = attribute_names[i]; + + if (strcmp (attr, "href") == 0) + uri = attribute_values[i]; + else if (strcmp (attr, "title") == 0) + title = attribute_values[i]; + else + { + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, + "Attribute '%s' is not allowed on the tag " + "on line %d char %d", + attr, line_number, char_number); + return; + } + } + + if (uri == NULL) + { + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Attribute 'href' was missing on the tag " + "on line %d char %d", + line_number, char_number); + return; + } + + if (pdata->label->select_info) + { + GList *l; + for (l = pdata->label->select_info->links; l; l = l->next) + { + link = l->data; + if (strcmp (uri, link->uri) == 0) + { + visited = link->visited; + break; + } + } + } + + if (visited) + color = pdata->visited_link_color; + else + color = pdata->link_color; + + g_string_append_printf (pdata->new_str, + "", + color->red, + color->green, + color->blue); + + link = g_new0 (GtkLabelLink, 1); + link->uri = g_strdup (uri); + link->title = g_strdup (title); + link->visited = visited; + pdata->links = g_list_append (pdata->links, link); + } + else + { + gint i; + + g_string_append_c (pdata->new_str, '<'); + g_string_append (pdata->new_str, element_name); + + for (i = 0; attribute_names[i] != NULL; i++) + { + const gchar *attr = attribute_names[i]; + const gchar *value = attribute_values[i]; + gchar *newvalue; + + newvalue = g_markup_escape_text (value, -1); + + g_string_append_c (pdata->new_str, ' '); + g_string_append (pdata->new_str, attr); + g_string_append (pdata->new_str, "=\""); + g_string_append (pdata->new_str, newvalue); + g_string_append_c (pdata->new_str, '\"'); + + g_free (newvalue); + } + g_string_append_c (pdata->new_str, '>'); + } +} + +static void +end_element_handler (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + UriParserData *pdata = user_data; + + if (!strcmp (element_name, "a")) + g_string_append (pdata->new_str, ""); + else + { + g_string_append (pdata->new_str, "new_str, element_name); + g_string_append_c (pdata->new_str, '>'); + } +} + +static void +text_handler (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + UriParserData *pdata = user_data; + gchar *newtext; + + newtext = g_markup_escape_text (text, text_len); + g_string_append (pdata->new_str, newtext); + g_free (newtext); +} + +static const GMarkupParser markup_parser = +{ + start_element_handler, + end_element_handler, + text_handler, + NULL, + NULL +}; + +static gboolean +xml_isspace (gchar c) +{ + return (c == ' ' || c == '\t' || c == '\n' || c == '\r'); +} + +static void +link_free (GtkLabelLink *link) +{ + g_free (link->uri); + g_free (link->title); + g_free (link); +} + +static void +gtk_label_get_link_colors (GtkWidget *widget, + GdkColor **link_color, + GdkColor **visited_link_color) +{ + gtk_widget_ensure_style (widget); + gtk_widget_style_get (widget, + "link-color", link_color, + "visited-link-color", visited_link_color, + NULL); + if (!*link_color) + *link_color = gdk_color_copy (&default_link_color); + if (!*visited_link_color) + *visited_link_color = gdk_color_copy (&default_visited_link_color); +} + +static gboolean +parse_uri_markup (GtkLabel *label, + const gchar *str, + gchar **new_str, + GList **links, + GError **error) +{ + GMarkupParseContext *context = NULL; + const gchar *p, *end; + gboolean needs_root = TRUE; + gsize length; + UriParserData pdata; + + length = strlen (str); + p = str; + end = str + length; + + pdata.label = label; + pdata.links = NULL; + pdata.new_str = g_string_sized_new (length); + + gtk_label_get_link_colors (GTK_WIDGET (label), &pdata.link_color, &pdata.visited_link_color); + + while (p != end && xml_isspace (*p)) + p++; + + if (end - p >= 8 && strncmp (p, "", 8) == 0) + needs_root = FALSE; + + context = g_markup_parse_context_new (&markup_parser, 0, &pdata, NULL); + + if (needs_root) + { + if (!g_markup_parse_context_parse (context, "", -1, error)) + goto failed; + } + + if (!g_markup_parse_context_parse (context, str, length, error)) + goto failed; + + if (needs_root) + { + if (!g_markup_parse_context_parse (context, "", -1, error)) + goto failed; + } + + if (!g_markup_parse_context_end_parse (context, error)) + goto failed; + + g_markup_parse_context_free (context); + + *new_str = g_string_free (pdata.new_str, FALSE); + *links = pdata.links; + + gdk_color_free (pdata.link_color); + gdk_color_free (pdata.visited_link_color); + + return TRUE; + +failed: + g_markup_parse_context_free (context); + g_string_free (pdata.new_str, TRUE); + g_list_foreach (pdata.links, (GFunc)link_free, NULL); + g_list_free (pdata.links); + gdk_color_free (pdata.link_color); + gdk_color_free (pdata.visited_link_color); + + return FALSE; +} + +static void +gtk_label_ensure_has_tooltip (GtkLabel *label) +{ + GList *l; + gboolean has_tooltip = FALSE; + + for (l = label->select_info->links; l; l = l->next) + { + GtkLabelLink *link = l->data; + if (link->title) + { + has_tooltip = TRUE; + break; + } + } + + gtk_widget_set_has_tooltip (GTK_WIDGET (label), has_tooltip); +} + +static void +gtk_label_set_markup_internal (GtkLabel *label, + const gchar *str, + gboolean with_uline) { gchar *text = NULL; GError *error = NULL; PangoAttrList *attrs = NULL; gunichar accel_char = 0; + gchar *new_str; + GList *links = NULL; - if (!pango_parse_markup (str, + if (!parse_uri_markup (label, str, &new_str, &links, &error)) + { + g_warning ("Failed to set text from markup due to error parsing markup: %s", + error->message); + g_error_free (error); + return; + } + + gtk_label_clear_links (label); + if (links) + { + gtk_label_ensure_select_info (label); + label->select_info->links = links; + gtk_label_ensure_has_tooltip (label); + } + + if (!pango_parse_markup (new_str, -1, with_uline ? '_' : 0, &attrs, @@ -1808,10 +2244,13 @@ set_markup (GtkLabel *label, { g_warning ("Failed to set text from markup due to error parsing markup: %s", error->message); + g_free (new_str); g_error_free (error); return; } + g_free (new_str); + if (text) gtk_label_set_text_internal (label, text); @@ -2320,6 +2759,7 @@ gtk_label_finalize (GObject *object) if (label->effective_attrs) pango_attr_list_unref (label->effective_attrs); + gtk_label_clear_links (label); g_free (label->select_info); G_OBJECT_CLASS (gtk_label_parent_class)->finalize (object); @@ -2332,6 +2772,8 @@ gtk_label_clear_layout (GtkLabel *label) { g_object_unref (label->layout); label->layout = NULL; + + //gtk_label_clear_links (label); } } @@ -2417,7 +2859,7 @@ gtk_label_ensure_layout (GtkLabel *label) widget = GTK_WIDGET (label); - rtl = gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL; + rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL; if (!label->layout) { @@ -2450,7 +2892,9 @@ gtk_label_ensure_layout (GtkLabel *label) if (label->effective_attrs) pango_layout_set_attributes (label->layout, label->effective_attrs); - + + gtk_label_rescan_links (label); + switch (label->jtype) { case GTK_JUSTIFY_LEFT: @@ -2675,38 +3119,55 @@ gtk_label_size_allocate (GtkWidget *widget, } } +static void +gtk_label_update_cursor (GtkLabel *label) +{ + if (!label->select_info) + return; + + if (GTK_WIDGET_REALIZED (label)) + { + GdkDisplay *display; + GdkCursor *cursor; + + if (GTK_WIDGET_IS_SENSITIVE (label)) + { + display = gtk_widget_get_display (GTK_WIDGET (label)); + + if (label->select_info->active_link) + cursor = gdk_cursor_new_for_display (display, GDK_HAND2); + else if (label->select_info->selectable) + cursor = gdk_cursor_new_for_display (display, GDK_XTERM); + else + cursor = NULL; + } + else + cursor = NULL; + + gdk_window_set_cursor (label->select_info->window, cursor); + + if (cursor) + gdk_cursor_unref (cursor); + } +} + static void gtk_label_state_changed (GtkWidget *widget, GtkStateType prev_state) { - GtkLabel *label; - GdkCursor *cursor; - - label = GTK_LABEL (widget); + GtkLabel *label = GTK_LABEL (widget); if (label->select_info) { gtk_label_select_region (label, 0, 0); - - if (GTK_WIDGET_REALIZED (widget)) - { - if (GTK_WIDGET_IS_SENSITIVE (widget)) - cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), GDK_XTERM); - else - cursor = NULL; - - gdk_window_set_cursor (label->select_info->window, cursor); - - if (cursor) - gdk_cursor_unref (cursor); - } + gtk_label_update_cursor (label); } if (GTK_WIDGET_CLASS (gtk_label_parent_class)->state_changed) GTK_WIDGET_CLASS (gtk_label_parent_class)->state_changed (widget, prev_state); } -static void +static void gtk_label_style_set (GtkWidget *widget, GtkStyle *previous_style) { @@ -2775,9 +3236,26 @@ get_layout_location (GtkLabel *label, x = MIN (x, widget->allocation.x + widget->allocation.width - misc->xpad); x -= logical.x; - y = floor (widget->allocation.y + (gint)misc->ypad - + MAX (((widget->allocation.height - widget->requisition.height) * misc->yalign), - 0)); + /* bgo#315462 - For single-line labels, *do* align the requisition with + * respect to the allocation, even if we are under-allocated. For multi-line + * labels, always show the top of the text when they are under-allocated. The + * rationale is this: + * + * - Single-line labels appear in GtkButtons, and it is very easy to get them + * to be smaller than their requisition. The button may clip the label, but + * the label will still be able to show most of itself and the focus + * rectangle. Also, it is fairly easy to read a single line of clipped text. + * + * - Multi-line labels should not be clipped to showing "something in the + * middle". You want to read the first line, at least, to get some context. + */ + if (pango_layout_get_line_count (label->layout) == 1) + y = floor (widget->allocation.y + (gint)misc->ypad + + (widget->allocation.height - widget->requisition.height) * misc->yalign); + else + y = floor (widget->allocation.y + (gint)misc->ypad + + MAX (((widget->allocation.height - widget->requisition.height) * misc->yalign), + 0)); if (xp) *xp = x; @@ -2909,18 +3387,36 @@ gtk_label_draw_cursor (GtkLabel *label, gint xoffset, gint yoffset) } } +static GtkLabelLink * +gtk_label_get_focus_link (GtkLabel *label) +{ + GtkLabelSelectionInfo *info = label->select_info; + GList *l; + + if (!info) + return NULL; + + if (info->selection_anchor != info->selection_end) + return NULL; + + for (l = info->links; l; l = l->next) + { + GtkLabelLink *link = l->data; + if (link->start <= info->selection_anchor && + info->selection_anchor <= link->end) + return link; + } + + return NULL; +} static gint gtk_label_expose (GtkWidget *widget, GdkEventExpose *event) { - GtkLabel *label; + GtkLabel *label = GTK_LABEL (widget); + GtkLabelSelectionInfo *info = label->select_info; gint x, y; - - g_return_val_if_fail (GTK_IS_LABEL (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - label = GTK_LABEL (widget); gtk_label_ensure_layout (label); @@ -2938,17 +3434,16 @@ gtk_label_expose (GtkWidget *widget, "label", x, y, label->layout); - - if (label->select_info && - (label->select_info->selection_anchor != - label->select_info->selection_end)) + + if (info && + (info->selection_anchor != info->selection_end)) { gint range[2]; GdkRegion *clip; GtkStateType state; - - range[0] = label->select_info->selection_anchor; - range[1] = label->select_info->selection_end; + + range[0] = info->selection_anchor; + range[1] = info->selection_end; if (range[0] > range[1]) { @@ -2962,7 +3457,7 @@ gtk_label_expose (GtkWidget *widget, range, 1); gdk_region_intersect (clip, event->region); - + /* FIXME should use gtk_paint, but it can't use a clip * region */ @@ -2973,7 +3468,7 @@ gtk_label_expose (GtkWidget *widget, state = GTK_STATE_SELECTED; if (!GTK_WIDGET_HAS_FOCUS (widget)) state = GTK_STATE_ACTIVE; - + gdk_draw_layout_with_colors (widget->window, widget->style->black_gc, x, y, @@ -2984,8 +3479,75 @@ gtk_label_expose (GtkWidget *widget, gdk_gc_set_clip_region (widget->style->black_gc, NULL); gdk_region_destroy (clip); } - else if (label->select_info && GTK_WIDGET_HAS_FOCUS (widget)) - gtk_label_draw_cursor (label, x, y); + else if (info) + { + GtkLabelLink *focus_link; + GtkLabelLink *active_link; + gint range[2]; + GdkRegion *clip; + GdkRectangle rect; + GdkColor *text_color; + GdkColor *base_color; + GdkColor *link_color; + GdkColor *visited_link_color; + + if (info->selectable && GTK_WIDGET_HAS_FOCUS (widget)) + gtk_label_draw_cursor (label, x, y); + + focus_link = gtk_label_get_focus_link (label); + active_link = info->active_link; + + if (active_link) + { + range[0] = active_link->start; + range[1] = active_link->end; + + clip = gdk_pango_layout_get_clip_region (label->layout, + x, y, + range, + 1); + gdk_gc_set_clip_region (widget->style->black_gc, clip); + + gtk_label_get_link_colors (widget, &link_color, &visited_link_color); + if (active_link->visited) + text_color = visited_link_color; + else + text_color = link_color; + if (info->link_clicked) + base_color = &widget->style->base[GTK_STATE_ACTIVE]; + else + base_color = &widget->style->base[GTK_STATE_PRELIGHT]; + gdk_draw_layout_with_colors (widget->window, + widget->style->black_gc, + x, y, + label->layout, + text_color, + base_color); + gdk_color_free (link_color); + gdk_color_free (visited_link_color); + + gdk_gc_set_clip_region (widget->style->black_gc, NULL); + gdk_region_destroy (clip); + } + + if (focus_link && GTK_WIDGET_HAS_FOCUS (widget)) + { + range[0] = focus_link->start; + range[1] = focus_link->end; + + clip = gdk_pango_layout_get_clip_region (label->layout, + x, y, + range, + 1); + gdk_region_get_clipbox (clip, &rect); + + gtk_paint_focus (widget->style, widget->window, GTK_WIDGET_STATE (widget), + &event->area, widget, "label", + rect.x, rect.y, rect.width, rect.height); + + gdk_region_destroy (clip); + } + } } return FALSE; @@ -3245,7 +3807,7 @@ layout_to_window_coords (GtkLabel *label, } #endif -static void +static gboolean get_layout_index (GtkLabel *label, gint x, gint y, @@ -3256,28 +3818,32 @@ get_layout_index (GtkLabel *label, const gchar *cluster_end; *index = 0; - + gtk_label_ensure_layout (label); - + window_to_layout_coords (label, &x, &y); x *= PANGO_SCALE; y *= PANGO_SCALE; - - pango_layout_xy_to_index (label->layout, - x, y, - index, &trailing); - - cluster = label->text + *index; - cluster_end = cluster; - while (trailing) + if (pango_layout_xy_to_index (label->layout, + x, y, + index, &trailing)) { - cluster_end = g_utf8_next_char (cluster_end); - --trailing; + cluster = label->text + *index; + cluster_end = cluster; + while (trailing) + { + cluster_end = g_utf8_next_char (cluster_end); + --trailing; + } + + *index += (cluster_end - cluster); + + return TRUE; } - *index += (cluster_end - cluster); + return FALSE; } static void @@ -3304,7 +3870,8 @@ gtk_label_grab_focus (GtkWidget *widget) { GtkLabel *label; gboolean select_on_focus; - + GtkLabelLink *link; + label = GTK_LABEL (widget); if (label->select_info == NULL) @@ -3312,34 +3879,172 @@ gtk_label_grab_focus (GtkWidget *widget) GTK_WIDGET_CLASS (gtk_label_parent_class)->grab_focus (widget); - g_object_get (gtk_widget_get_settings (widget), - "gtk-label-select-on-focus", - &select_on_focus, - NULL); - - if (select_on_focus && !label->in_click) - gtk_label_select_region (label, 0, -1); + if (label->select_info->selectable) + { + g_object_get (gtk_widget_get_settings (widget), + "gtk-label-select-on-focus", + &select_on_focus, + NULL); + + if (select_on_focus && !label->in_click) + gtk_label_select_region (label, 0, -1); + } + else + { + if (label->select_info->links && !label->in_click) + { + link = label->select_info->links->data; + label->select_info->selection_anchor = link->start; + label->select_info->selection_end = link->start; + } + } } - + +static gboolean +gtk_label_focus (GtkWidget *widget, + GtkDirectionType direction) +{ + GtkLabel *label = GTK_LABEL (widget); + GtkLabelSelectionInfo *info = label->select_info; + GtkLabelLink *focus_link; + GList *l; + + if (!gtk_widget_is_focus (widget)) + { + gtk_widget_grab_focus (widget); + if (info) + { + focus_link = gtk_label_get_focus_link (label); + if (focus_link && direction == GTK_DIR_TAB_BACKWARD) + { + l = g_list_last (info->links); + focus_link = l->data; + info->selection_anchor = focus_link->start; + info->selection_end = focus_link->start; + } + } + + return TRUE; + } + + if (!info) + return FALSE; + + if (info->selectable) + { + gint index; + + if (info->selection_anchor != info->selection_end) + goto out; + + index = info->selection_anchor; + + if (direction == GTK_DIR_TAB_FORWARD) + for (l = info->links; l; l = l->next) + { + GtkLabelLink *link = l->data; + + if (link->start > index) + { + gtk_label_select_region_index (label, link->start, link->start); + return TRUE; + } + } + else if (direction == GTK_DIR_TAB_BACKWARD) + for (l = g_list_last (info->links); l; l = l->prev) + { + GtkLabelLink *link = l->data; + + if (link->end < index) + { + gtk_label_select_region_index (label, link->start, link->start); + return TRUE; + } + } + + goto out; + } + else + { + focus_link = gtk_label_get_focus_link (label); + switch (direction) + { + case GTK_DIR_TAB_FORWARD: + if (focus_link) + { + l = g_list_find (info->links, focus_link); + l = l->next; + } + else + l = info->links; + break; + + case GTK_DIR_TAB_BACKWARD: + if (focus_link) + { + l = g_list_find (info->links, focus_link); + l = l->prev; + } + else + l = g_list_last (info->links); + break; + + default: + goto out; + } + + if (l) + { + focus_link = l->data; + info->selection_anchor = focus_link->start; + info->selection_end = focus_link->start; + gtk_widget_queue_draw (widget); + + return TRUE; + } + } + +out: + + return FALSE; +} + static gboolean gtk_label_button_press (GtkWidget *widget, GdkEventButton *event) { - GtkLabel *label; + GtkLabel *label = GTK_LABEL (widget); + GtkLabelSelectionInfo *info = label->select_info; gint index = 0; - gint min, max; - - label = GTK_LABEL (widget); + gint min, max; - if (label->select_info == NULL) + if (info == NULL) return FALSE; - label->select_info->in_drag = FALSE; - label->select_info->select_words = FALSE; + if (info->active_link) + { + if (event->button == 1) + { + info->link_clicked = 1; + gtk_widget_queue_draw (widget); + } + else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) + { + info->link_clicked = 1; + gtk_label_do_popup (label, event); + return TRUE; + } + } + + if (!info->selectable) + return FALSE; + + info->in_drag = FALSE; + info->select_words = FALSE; if (event->button == 1) { - if (!GTK_WIDGET_HAS_FOCUS (widget)) + if (!GTK_WIDGET_HAS_FOCUS (widget)) { label->in_click = TRUE; gtk_widget_grab_focus (widget); @@ -3351,29 +4056,26 @@ gtk_label_button_press (GtkWidget *widget, gtk_label_select_region_index (label, 0, strlen (label->text)); return TRUE; } - + if (event->type == GDK_2BUTTON_PRESS) { - label->select_info->select_words = TRUE; + info->select_words = TRUE; gtk_label_select_word (label); return TRUE; } - + get_layout_index (label, event->x, event->y, &index); - - min = MIN (label->select_info->selection_anchor, - label->select_info->selection_end); - max = MAX (label->select_info->selection_anchor, - label->select_info->selection_end); - - if ((label->select_info->selection_anchor != - label->select_info->selection_end) && + + min = MIN (info->selection_anchor, info->selection_end); + max = MAX (info->selection_anchor, info->selection_end); + + if ((info->selection_anchor != info->selection_end) && (event->state & GDK_SHIFT_MASK)) { /* extend (same as motion) */ min = MIN (min, index); max = MAX (max, index); - + /* ensure the anchor is opposite index */ if (index == min) { @@ -3381,10 +4083,10 @@ gtk_label_button_press (GtkWidget *widget, min = max; max = tmp; } - + gtk_label_select_region_index (label, min, max); } - else + else { if (event->type == GDK_3BUTTON_PRESS) gtk_label_select_region_index (label, 0, strlen (label->text)); @@ -3392,15 +4094,15 @@ gtk_label_button_press (GtkWidget *widget, gtk_label_select_word (label); else if (min < max && min <= index && index <= max) { - label->select_info->in_drag = TRUE; - label->select_info->drag_start_x = event->x; - label->select_info->drag_start_y = event->y; + info->in_drag = TRUE; + info->drag_start_x = event->x; + info->drag_start_y = event->y; } else /* start a replacement */ gtk_label_select_region_index (label, index, index); } - + return TRUE; } else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) @@ -3408,7 +4110,6 @@ gtk_label_button_press (GtkWidget *widget, gtk_label_do_popup (label, event); return TRUE; - } return FALSE; } @@ -3419,28 +4120,38 @@ gtk_label_button_release (GtkWidget *widget, { GtkLabel *label = GTK_LABEL (widget); + GtkLabelSelectionInfo *info = label->select_info; gint index; - - if (label->select_info == NULL) + + if (info == NULL) return FALSE; - - if (label->select_info->in_drag) + + if (info->in_drag) { - label->select_info->in_drag = 0; + info->in_drag = 0; get_layout_index (label, event->x, event->y, &index); gtk_label_select_region_index (label, index, index); - + return FALSE; } if (event->button != 1) return FALSE; - + + if (info->active_link && + info->selection_anchor == info->selection_end && + info->link_clicked) + { + emit_activate_link (label, info->active_link); + info->link_clicked = 0; + + return TRUE; + } + /* The goal here is to return TRUE iff we ate the * button press to start selecting. */ - return TRUE; } @@ -3462,7 +4173,7 @@ drag_begin_cb (GtkWidget *widget, { gint start, end; gint len; - + start = MIN (label->select_info->selection_anchor, label->select_info->selection_end); end = MAX (label->select_info->selection_anchor, @@ -3498,48 +4209,94 @@ static gboolean gtk_label_motion (GtkWidget *widget, GdkEventMotion *event) { - GtkLabel *label; + GtkLabel *label = GTK_LABEL (widget); + GtkLabelSelectionInfo *info = label->select_info; gint index; gint x, y; - - label = GTK_LABEL (widget); - - if (label->select_info == NULL) - return FALSE; + + if (info == NULL) + return FALSE; + + if (info->links && !info->in_drag) + { + GList *l; + GtkLabelLink *link; + gboolean found = FALSE; + + if (info->selection_anchor == info->selection_end) + { + gdk_window_get_pointer (event->window, &x, &y, NULL); + if (get_layout_index (label, x, y, &index)) + { + for (l = info->links; l != NULL; l = l->next) + { + link = l->data; + if (index >= link->start && index <= link->end) + { + found = TRUE; + break; + } + } + } + } + + if (found) + { + if (info->active_link != link) + { + info->link_clicked = 0; + info->active_link = link; + gtk_label_update_cursor (label); + gtk_widget_queue_draw (widget); + } + } + else + { + if (info->active_link != NULL) + { + info->link_clicked = 0; + info->active_link = NULL; + gtk_label_update_cursor (label); + gtk_widget_queue_draw (widget); + } + } + } + + if (!info->selectable) + return FALSE; if ((event->state & GDK_BUTTON1_MASK) == 0) return FALSE; - gdk_window_get_pointer (label->select_info->window, - &x, &y, NULL); - - if (label->select_info->in_drag) + gdk_window_get_pointer (info->window, &x, &y, NULL); + + if (info->in_drag) { if (gtk_drag_check_threshold (widget, - label->select_info->drag_start_x, - label->select_info->drag_start_y, + info->drag_start_x, + info->drag_start_y, event->x, event->y)) { GtkTargetList *target_list = gtk_target_list_new (NULL, 0); gtk_target_list_add_text_targets (target_list, 0); - - g_signal_connect (widget, "drag-begin", + + g_signal_connect (widget, "drag-begin", G_CALLBACK (drag_begin_cb), NULL); - gtk_drag_begin (widget, target_list, + gtk_drag_begin (widget, target_list, GDK_ACTION_COPY, 1, (GdkEvent *)event); - - label->select_info->in_drag = FALSE; - + + info->in_drag = FALSE; + gtk_target_list_unref (target_list); } } else { get_layout_index (label, x, y, &index); - - if (label->select_info->select_words) + + if (info->select_words) { gint min, max; gint old_min, old_max; @@ -3548,8 +4305,8 @@ gtk_label_motion (GtkWidget *widget, min = gtk_label_move_backward_word (label, index); max = gtk_label_move_forward_word (label, index); - anchor = label->select_info->selection_anchor; - end = label->select_info->selection_end; + anchor = info->selection_anchor; + end = info->selection_end; old_min = MIN (anchor, end); old_max = MAX (anchor, end); @@ -3578,14 +4335,31 @@ gtk_label_motion (GtkWidget *widget, gtk_label_select_region_index (label, anchor, end); } else - gtk_label_select_region_index (label, - label->select_info->selection_anchor, - index); + gtk_label_select_region_index (label, info->selection_anchor, index); } return TRUE; } +static gboolean +gtk_label_leave_notify (GtkWidget *widget, + GdkEventCrossing *event) +{ + GtkLabel *label = GTK_LABEL (widget); + + if (label->select_info) + { + label->select_info->active_link = NULL; + gtk_label_update_cursor (label); + gtk_widget_queue_draw (widget); + } + + if (GTK_WIDGET_CLASS (gtk_label_parent_class)->leave_notify_event) + return GTK_WIDGET_CLASS (gtk_label_parent_class)->leave_notify_event (widget, event); + + return FALSE; +} + static void gtk_label_create_window (GtkLabel *label) { @@ -3611,8 +4385,11 @@ gtk_label_create_window (GtkLabel *label) attributes.event_mask = gtk_widget_get_events (widget) | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | - GDK_BUTTON_MOTION_MASK; - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_NOREDIR; + GDK_LEAVE_NOTIFY_MASK | + GDK_BUTTON_MOTION_MASK | + GDK_POINTER_MOTION_MASK | + GDK_POINTER_MOTION_HINT_MASK; + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_NOREDIR; if (GTK_WIDGET_IS_SENSITIVE (widget)) { attributes.cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), @@ -3636,12 +4413,46 @@ gtk_label_destroy_window (GtkLabel *label) if (label->select_info->window == NULL) return; - + gdk_window_set_user_data (label->select_info->window, NULL); gdk_window_destroy (label->select_info->window); label->select_info->window = NULL; } +static void +gtk_label_ensure_select_info (GtkLabel *label) +{ + if (label->select_info == NULL) + { + label->select_info = g_new0 (GtkLabelSelectionInfo, 1); + + GTK_WIDGET_SET_FLAGS (label, GTK_CAN_FOCUS); + + if (GTK_WIDGET_REALIZED (label)) + gtk_label_create_window (label); + + if (GTK_WIDGET_MAPPED (label)) + gdk_window_show (label->select_info->window); + } +} + +static void +gtk_label_clear_select_info (GtkLabel *label) +{ + if (label->select_info == NULL) + return; + + if (!label->select_info->selectable && !label->select_info->links) + { + gtk_label_destroy_window (label); + + g_free (label->select_info); + label->select_info = NULL; + + GTK_WIDGET_UNSET_FLAGS (label, GTK_CAN_FOCUS); + } +} + /** * gtk_label_set_selectable: * @label: a #GtkLabel @@ -3655,44 +4466,28 @@ gtk_label_set_selectable (GtkLabel *label, gboolean setting) { gboolean old_setting; - + g_return_if_fail (GTK_IS_LABEL (label)); - + setting = setting != FALSE; - old_setting = label->select_info != NULL; - + old_setting = label->select_info && label->select_info->selectable; + if (setting) { - if (label->select_info == NULL) - { - label->select_info = g_new0 (GtkLabelSelectionInfo, 1); - - GTK_WIDGET_SET_FLAGS (label, GTK_CAN_FOCUS); - - if (GTK_WIDGET_REALIZED (label)) - gtk_label_create_window (label); - - if (GTK_WIDGET_MAPPED (label)) - gdk_window_show (label->select_info->window); - } + gtk_label_ensure_select_info (label); + label->select_info->selectable = TRUE; + gtk_label_update_cursor (label); } else { - if (label->select_info) + if (old_setting) { /* unselect, to give up the selection */ gtk_label_select_region (label, 0, 0); - - if (label->select_info->window) - { - gtk_label_destroy_window (label); - } - g_free (label->select_info); - - label->select_info = NULL; - - GTK_WIDGET_UNSET_FLAGS (label, GTK_CAN_FOCUS); + label->select_info->selectable = FALSE; + gtk_label_clear_select_info (label); + gtk_label_update_cursor (label); } } if (setting != old_setting) @@ -3719,7 +4514,7 @@ gtk_label_get_selectable (GtkLabel *label) { g_return_val_if_fail (GTK_IS_LABEL (label), FALSE); - return label->select_info != NULL; + return label->select_info && label->select_info->selectable; } static void @@ -3875,7 +4670,7 @@ gtk_label_select_region_index (GtkLabel *label, { g_return_if_fail (GTK_IS_LABEL (label)); - if (label->select_info) + if (label->select_info && label->select_info->selectable) { GtkClipboard *clipboard; @@ -3887,8 +4682,8 @@ gtk_label_select_region_index (GtkLabel *label, label->select_info->selection_end = end_index; clipboard = gtk_widget_get_clipboard (GTK_WIDGET (label), - GDK_SELECTION_PRIMARY); - + GDK_SELECTION_PRIMARY); + if (anchor_index != end_index) { GtkTargetList *list; @@ -4528,7 +5323,8 @@ gtk_label_copy_clipboard (GtkLabel *label) { gint start, end; gint len; - + GtkClipboard *clipboard; + start = MIN (label->select_info->selection_anchor, label->select_info->selection_end); end = MAX (label->select_info->selection_anchor, @@ -4542,10 +5338,18 @@ gtk_label_copy_clipboard (GtkLabel *label) if (start > len) start = len; + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (label), GDK_SELECTION_CLIPBOARD); + if (start != end) - gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (label), - GDK_SELECTION_CLIPBOARD), - label->text + start, end - start); + gtk_clipboard_set_text (clipboard, label->text + start, end - start); + else + { + GtkLabelLink *link; + + link = gtk_label_get_focus_link (label); + if (link) + gtk_clipboard_set_text (clipboard, link->uri, -1); + } } } @@ -4588,8 +5392,7 @@ static void popup_menu_detach (GtkWidget *attach_widget, GtkMenu *menu) { - GtkLabel *label; - label = GTK_LABEL (attach_widget); + GtkLabel *label = GTK_LABEL (attach_widget); if (label->select_info) label->select_info->popup_menu = NULL; @@ -4606,20 +5409,20 @@ popup_position_func (GtkMenu *menu, GtkWidget *widget; GtkRequisition req; GdkScreen *screen; - - label = GTK_LABEL (user_data); + + label = GTK_LABEL (user_data); widget = GTK_WIDGET (label); - if (label->select_info == NULL) - return; - g_return_if_fail (GTK_WIDGET_REALIZED (label)); - - screen = gtk_widget_get_screen (widget); - gdk_window_get_origin (widget->window, x, y); - gtk_widget_size_request (label->select_info->popup_menu, &req); - + screen = gtk_widget_get_screen (widget); + gdk_window_get_origin (widget->window, x, y); + + *x += widget->allocation.x; + *y += widget->allocation.y; + + gtk_widget_size_request (GTK_WIDGET (menu), &req); + *x += widget->allocation.width / 2; *y += widget->allocation.height; @@ -4627,66 +5430,363 @@ popup_position_func (GtkMenu *menu, *y = CLAMP (*y, 0, MAX (0, gdk_screen_get_height (screen) - req.height)); } +static void +open_link_activate_cb (GtkMenuItem *menu_item, + GtkLabel *label) +{ + GtkLabelLink *link; + + link = gtk_label_get_current_link (label); + + if (link) + emit_activate_link (label, link); +} + +static void +copy_link_activate_cb (GtkMenuItem *menu_item, + GtkLabel *label) +{ + GtkClipboard *clipboard; + const gchar *uri; + + uri = gtk_label_get_current_uri (label); + if (uri) + { + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (label), GDK_SELECTION_CLIPBOARD); + gtk_clipboard_set_text (clipboard, uri, -1); + } +} + +static gboolean +gtk_label_popup_menu (GtkWidget *widget) +{ + gtk_label_do_popup (GTK_LABEL (widget), NULL); + + return TRUE; +} static void gtk_label_do_popup (GtkLabel *label, GdkEventButton *event) { GtkWidget *menuitem; + GtkWidget *menu; + GtkWidget *image; gboolean have_selection; + GtkLabelLink *link; - if (label->select_info == NULL) + if (!label->select_info) return; - + if (label->select_info->popup_menu) gtk_widget_destroy (label->select_info->popup_menu); - - label->select_info->popup_menu = gtk_menu_new (); - gtk_menu_attach_to_widget (GTK_MENU (label->select_info->popup_menu), - GTK_WIDGET (label), - popup_menu_detach); + label->select_info->popup_menu = menu = gtk_menu_new (); + + gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (label), popup_menu_detach); have_selection = label->select_info->selection_anchor != label->select_info->selection_end; - - append_action_signal (label, label->select_info->popup_menu, GTK_STOCK_CUT, "cut-clipboard", - FALSE); - append_action_signal (label, label->select_info->popup_menu, GTK_STOCK_COPY, "copy-clipboard", - have_selection); - append_action_signal (label, label->select_info->popup_menu, GTK_STOCK_PASTE, "paste-clipboard", - FALSE); - - menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, NULL); - gtk_widget_set_sensitive (menuitem, FALSE); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (label->select_info->popup_menu), menuitem); - - menuitem = gtk_separator_menu_item_new (); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (label->select_info->popup_menu), menuitem); - - menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_SELECT_ALL, NULL); - g_signal_connect_swapped (menuitem, "activate", - G_CALLBACK (gtk_label_select_all), label); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (label->select_info->popup_menu), menuitem); - - g_signal_emit (label, - signals[POPULATE_POPUP], - 0, - label->select_info->popup_menu); - if (event) - gtk_menu_popup (GTK_MENU (label->select_info->popup_menu), NULL, NULL, + { + if (label->select_info->link_clicked) + link = label->select_info->active_link; + else + link = NULL; + } + else + link = gtk_label_get_focus_link (label); + + if (!have_selection && link) + { + /* Open Link */ + menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Open Link")); + gtk_widget_show (menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + + g_signal_connect (G_OBJECT (menuitem), "activate", + G_CALLBACK (open_link_activate_cb), label); + + image = gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU); + gtk_widget_show (image); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); + + /* Copy Link Address */ + menuitem = gtk_image_menu_item_new_with_mnemonic (_("Copy _Link Address")); + gtk_widget_show (menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + + g_signal_connect (G_OBJECT (menuitem), "activate", + G_CALLBACK (copy_link_activate_cb), label); + + image = gtk_image_new_from_stock (GTK_STOCK_COPY, GTK_ICON_SIZE_MENU); + gtk_widget_show (image); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); + } + else + { + append_action_signal (label, menu, GTK_STOCK_CUT, "cut-clipboard", FALSE); + append_action_signal (label, menu, GTK_STOCK_COPY, "copy-clipboard", have_selection); + append_action_signal (label, menu, GTK_STOCK_PASTE, "paste-clipboard", FALSE); + + menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, NULL); + gtk_widget_set_sensitive (menuitem, FALSE); + gtk_widget_show (menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + + menuitem = gtk_separator_menu_item_new (); + gtk_widget_show (menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + + menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_SELECT_ALL, NULL); + g_signal_connect_swapped (menuitem, "activate", + G_CALLBACK (gtk_label_select_all), label); + gtk_widget_show (menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + } + + g_signal_emit (label, signals[POPULATE_POPUP], 0, menu); + + if (event) + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, event->button, event->time); else - gtk_menu_popup (GTK_MENU (label->select_info->popup_menu), NULL, NULL, - popup_position_func, label, - 0, gtk_get_current_event_time ()); + { + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, + popup_position_func, label, + 0, gtk_get_current_event_time ()); + gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE); + } } +static void +gtk_label_clear_links (GtkLabel *label) +{ + if (!label->select_info) + return; + + g_list_foreach (label->select_info->links, (GFunc)link_free, NULL); + g_list_free (label->select_info->links); + label->select_info->links = NULL; + label->select_info->active_link = NULL; +} + +static void +gtk_label_rescan_links (GtkLabel *label) +{ + PangoLayout *layout = label->layout; + PangoAttrList *attlist; + PangoAttrIterator *iter; + GList *links; + + if (!label->select_info) + return; + + attlist = pango_layout_get_attributes (layout); + + if (attlist == NULL) + return; + + iter = pango_attr_list_get_iterator (attlist); + + links = label->select_info->links; + + do + { + PangoAttribute *underline; + PangoAttribute *color; + + underline = pango_attr_iterator_get (iter, PANGO_ATTR_UNDERLINE); + color = pango_attr_iterator_get (iter, PANGO_ATTR_FOREGROUND); + + if (underline != NULL && color != NULL) + { + gint start, end; + PangoRectangle start_pos; + PangoRectangle end_pos; + GtkLabelLink *link; + + pango_attr_iterator_range (iter, &start, &end); + pango_layout_index_to_pos (layout, start, &start_pos); + pango_layout_index_to_pos (layout, end, &end_pos); + + if (links == NULL) + { + g_warning ("Ran out of links"); + break; + } + link = links->data; + links = links->next; + link->start = start; + link->end = end; + } + } while (pango_attr_iterator_next (iter)); + + pango_attr_iterator_destroy (iter); +} + +static gboolean +gtk_label_activate_link (GtkLabel *label, + const gchar *uri) +{ + GtkWidget *widget = GTK_WIDGET (label); + GError *error = NULL; + + if (!gtk_show_uri (gtk_widget_get_screen (widget), + uri, gtk_get_current_event_time (), &error)) + { + g_warning ("Unable to show '%s': %s", uri, error->message); + g_error_free (error); + } + + return TRUE; +} + +static void +emit_activate_link (GtkLabel *label, + GtkLabelLink *link) +{ + gboolean handled; + + g_signal_emit (label, signals[ACTIVATE_LINK], 0, link->uri, &handled); + if (handled && !link->visited) + { + link->visited = TRUE; + /* FIXME: shouldn't have to redo everything here */ + gtk_label_recalculate (label); + } +} + +static void +gtk_label_activate_current_link (GtkLabel *label) +{ + GtkLabelLink *link; + GtkWidget *widget = GTK_WIDGET (label); + + link = gtk_label_get_focus_link (label); + + if (link) + { + emit_activate_link (label, link); + } + else + { + GtkWidget *toplevel; + GtkWindow *window; + + toplevel = gtk_widget_get_toplevel (widget); + if (GTK_IS_WINDOW (toplevel)) + { + window = GTK_WINDOW (toplevel); + + if (window && + window->default_widget != widget && + !(widget == window->focus_widget && + (!window->default_widget || !GTK_WIDGET_SENSITIVE (window->default_widget)))) + gtk_window_activate_default (window); + } + } +} + +static GtkLabelLink * +gtk_label_get_current_link (GtkLabel *label) +{ + GtkLabelLink *link; + + if (!label->select_info) + return NULL; + + if (label->select_info->link_clicked) + link = label->select_info->active_link; + else + link = gtk_label_get_focus_link (label); + + return link; +} + +/** + * gtk_label_get_current_uri: + * @label: a #GtkLabel + * + * Returns the URI for the currently active link in the label. + * The active link is the one under the mouse pointer or, in a + * selectable label, the link in which the text cursor is currently + * positioned. + * + * This function is intended for use in a #GtkLabel::link-activate handler + * or for use in a #GtkWidget::query-tooltip handler. + * + * Returns: the currently active URI. The string is owned by GTK+ and must + * not be freed or modified. + * + * Since: 2.18 + */ +G_CONST_RETURN gchar * +gtk_label_get_current_uri (GtkLabel *label) +{ + GtkLabelLink *link; + g_return_val_if_fail (GTK_IS_LABEL (label), NULL); + + link = gtk_label_get_current_link (label); + + if (link) + return link->uri; + + return NULL; +} + + +static gboolean +gtk_label_query_tooltip (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip) +{ + GtkLabel *label = GTK_LABEL (widget); + GtkLabelSelectionInfo *info = label->select_info; + gint index = -1; + GList *l; + + if (info && info->links) + { + if (keyboard_tip) + { + if (info->selection_anchor == info->selection_end) + index = info->selection_anchor; + } + else + { + if (!get_layout_index (label, x, y, &index)) + index = -1; + } + + if (index != -1) + { + for (l = info->links; l != NULL; l = l->next) + { + GtkLabelLink *link = l->data; + if (index >= link->start && index <= link->end) + { + if (link->title) + { + gtk_tooltip_set_markup (tooltip, link->title); + return TRUE; + } + break; + } + } + } + } + + return GTK_WIDGET_CLASS (gtk_label_parent_class)->query_tooltip (widget, + x, y, + keyboard_tip, + tooltip); +} + + #define __GTK_LABEL_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtklabel.h b/gtk/gtklabel.h index 59778ef67d..3788108eda 100644 --- a/gtk/gtklabel.h +++ b/gtk/gtklabel.h @@ -96,11 +96,13 @@ struct _GtkLabelClass void (* populate_popup) (GtkLabel *label, GtkMenu *menu); + gboolean (*activate_link) (GtkLabel *label, + const gchar *uri); + /* Padding for future expansion */ void (*_gtk_reserved1) (void); void (*_gtk_reserved2) (void); void (*_gtk_reserved3) (void); - void (*_gtk_reserved4) (void); }; GType gtk_label_get_type (void) G_GNUC_CONST; @@ -174,6 +176,8 @@ void gtk_label_set_single_line_mode (GtkLabel *label, gboolean single_line_mode); gboolean gtk_label_get_single_line_mode (GtkLabel *label); +G_CONST_RETURN gchar *gtk_label_get_current_uri (GtkLabel *label); + #ifndef GTK_DISABLE_DEPRECATED #define gtk_label_set gtk_label_set_text diff --git a/gtk/gtkmarshalers.list b/gtk/gtkmarshalers.list index c932f1d555..b625cba470 100644 --- a/gtk/gtkmarshalers.list +++ b/gtk/gtkmarshalers.list @@ -88,6 +88,7 @@ VOID:OBJECT,STRING,STRING VOID:OBJECT,UINT VOID:OBJECT,UINT,FLAGS VOID:OBJECT,STRING +VOID:OBJECT,OBJECT,OBJECT VOID:POINTER VOID:POINTER,INT VOID:POINTER,BOOLEAN @@ -97,6 +98,7 @@ VOID:POINTER,UINT VOID:STRING VOID:STRING,BOXED VOID:STRING,STRING +VOID:STRING,STRING,STRING VOID:STRING,INT,POINTER VOID:STRING,UINT,FLAGS VOID:STRING,UINT,FLAGS,UINT diff --git a/gtk/gtkmodules.c b/gtk/gtkmodules.c index dddee9d550..a6b40d88b5 100644 --- a/gtk/gtkmodules.c +++ b/gtk/gtkmodules.c @@ -289,9 +289,16 @@ load_module (GSList *module_list, g_module_close (module); else { + GSList *temp; + success = TRUE; - info = (GtkModuleInfo *) g_slist_find_custom (gtk_modules, module, - (GCompareFunc)cmp_module); + info = NULL; + + temp = g_slist_find_custom (gtk_modules, module, + (GCompareFunc)cmp_module); + if (temp != NULL) + info = temp->data; + if (!info) { info = g_new0 (GtkModuleInfo, 1); diff --git a/gtk/gtkmountoperation.c b/gtk/gtkmountoperation.c index add46e85bd..ace58ed90a 100644 --- a/gtk/gtkmountoperation.c +++ b/gtk/gtkmountoperation.c @@ -316,9 +316,14 @@ pw_dialog_input_is_valid (GtkMountOperation *operation) GtkMountOperationPrivate *priv = operation->priv; gboolean is_valid = TRUE; + /* We don't require password to be non-empty here + * since there are situations where it is not needed, + * see bug 578365. + * We may add a way for the backend to specify that it + * definitively needs a password. + */ is_valid = entry_has_input (priv->username_entry) && - entry_has_input (priv->domain_entry) && - entry_has_input (priv->password_entry); + entry_has_input (priv->domain_entry); return is_valid; } diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c index 9b1c0c3cb8..2e0e8dd2f6 100644 --- a/gtk/gtknotebook.c +++ b/gtk/gtknotebook.c @@ -4981,12 +4981,15 @@ gtk_notebook_calculate_shown_tabs (GtkNotebook *notebook, remaining_space, STEP_NEXT); } - if (*remaining_space <= 0) + if (tab_space <= 0 || *remaining_space < 0) { /* show 1 tab */ notebook->first_tab = notebook->focus_tab; *last_child = gtk_notebook_search_page (notebook, notebook->focus_tab, STEP_NEXT, TRUE); + page = notebook->first_tab->data; + *remaining_space = tab_space - page->requisition.width; + *n = 1; } else { @@ -5073,22 +5076,22 @@ gtk_notebook_calculate_shown_tabs (GtkNotebook *notebook, TRUE); } } - } - if (*remaining_space < 0) - { - /* calculate number of tabs */ - *remaining_space = - (*remaining_space); - *n = 0; + if (*remaining_space < 0) + { + /* calculate number of tabs */ + *remaining_space = - (*remaining_space); + *n = 0; - for (children = notebook->first_tab; - children && children != *last_child; - children = gtk_notebook_search_page (notebook, children, - STEP_NEXT, TRUE)) - (*n)++; - } - else - *remaining_space = 0; + for (children = notebook->first_tab; + children && children != *last_child; + children = gtk_notebook_search_page (notebook, children, + STEP_NEXT, TRUE)) + (*n)++; + } + else + *remaining_space = 0; + } /* unmap all non-visible tabs */ for (children = gtk_notebook_search_page (notebook, NULL, diff --git a/gtk/gtkprintbackend.c b/gtk/gtkprintbackend.c index 2889b94fba..567273bdd7 100644 --- a/gtk/gtkprintbackend.c +++ b/gtk/gtkprintbackend.c @@ -25,6 +25,7 @@ #include "gtkintl.h" #include "gtkmodules.h" +#include "gtkmarshalers.h" #include "gtkprivate.h" #include "gtkprintbackend.h" #include "gtkprinter-private.h" @@ -49,6 +50,9 @@ struct _GtkPrintBackendPrivate guint printer_list_requested : 1; guint printer_list_done : 1; GtkPrintBackendStatus status; + char *hostname; + char *username; + char *password; }; enum { @@ -57,6 +61,7 @@ enum { PRINTER_ADDED, PRINTER_REMOVED, PRINTER_STATUS_CHANGED, + REQUEST_PASSWORD, LAST_SIGNAL }; @@ -353,6 +358,10 @@ static void fallback_printer_get_hard_margins (GtkPrinter static GList * fallback_printer_list_papers (GtkPrinter *printer); static GtkPageSetup * fallback_printer_get_default_page_size (GtkPrinter *printer); static GtkPrintCapabilities fallback_printer_get_capabilities (GtkPrinter *printer); +static void request_password (GtkPrintBackend *backend, + const gchar *hostname, + const gchar *username, + const gchar *prompt); static void gtk_print_backend_class_init (GtkPrintBackendClass *class) @@ -372,6 +381,7 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class) class->printer_list_papers = fallback_printer_list_papers; class->printer_get_default_page_size = fallback_printer_get_default_page_size; class->printer_get_capabilities = fallback_printer_get_capabilities; + class->request_password = request_password; g_object_class_install_property (object_class, PROP_STATUS, @@ -425,6 +435,14 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class) NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GTK_TYPE_PRINTER); + signals[REQUEST_PASSWORD] = + g_signal_new (I_("request-password"), + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkPrintBackendClass, request_password), + NULL, NULL, + _gtk_marshal_VOID__STRING_STRING_STRING, + G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); } static void @@ -437,6 +455,9 @@ gtk_print_backend_init (GtkPrintBackend *backend) priv->printers = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_object_unref); + priv->hostname = NULL; + priv->username = NULL; + priv->password = NULL; } static void @@ -640,6 +661,167 @@ gtk_print_backend_print_stream (GtkPrintBackend *backend, dnotify); } +void +gtk_print_backend_set_password (GtkPrintBackend *backend, + const gchar *hostname, + const gchar *username, + const gchar *password) +{ + g_return_if_fail (GTK_IS_PRINT_BACKEND (backend)); + + if (GTK_PRINT_BACKEND_GET_CLASS (backend)->set_password) + GTK_PRINT_BACKEND_GET_CLASS (backend)->set_password (backend, hostname, username, password); +} + +static void +store_password (GtkEntry *entry, + GtkPrintBackend *backend) +{ + GtkPrintBackendPrivate *priv = backend->priv; + + if (priv->password != NULL) + { + memset (priv->password, 0, strlen (priv->password)); + g_free (priv->password); + } + + priv->password = g_strdup (gtk_entry_get_text (entry)); +} + +static void +store_username (GtkEntry *entry, + GtkPrintBackend *backend) +{ + GtkPrintBackendPrivate *priv = backend->priv; + + g_free (priv->username); + priv->username = g_strdup (gtk_entry_get_text (entry)); +} + +static void +password_dialog_response (GtkWidget *dialog, + gint response_id, + GtkPrintBackend *backend) +{ + GtkPrintBackendPrivate *priv = backend->priv; + + if (response_id == GTK_RESPONSE_OK) + gtk_print_backend_set_password (backend, priv->hostname, priv->username, priv->password); + else + gtk_print_backend_set_password (backend, priv->hostname, priv->username, NULL); + + if (priv->password != NULL) + { + memset (priv->password, 0, strlen (priv->password)); + g_free (priv->password); + priv->password = NULL; + } + + g_free (priv->username); + priv->username = NULL; + + gtk_widget_destroy (dialog); + + g_object_unref (backend); +} + +static void +request_password (GtkPrintBackend *backend, + const gchar *hostname, + const gchar *username, + const gchar *prompt) +{ + GtkPrintBackendPrivate *priv = backend->priv; + GtkWidget *dialog, *username_box, *password_box, *main_box, *label, *icon, *vbox, + *password_prompt, *username_prompt, + *password_entry, *username_entry; + gchar *markup; + + dialog = gtk_dialog_new_with_buttons ( _("Authentication"), NULL, GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); + gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); + + main_box = gtk_hbox_new (FALSE, 0); + + /* Left */ + icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION, GTK_ICON_SIZE_DIALOG); + gtk_misc_set_alignment (GTK_MISC (icon), 0.5, 0.0); + gtk_misc_set_padding (GTK_MISC (icon), 6, 6); + + + /* Right */ + vbox = gtk_vbox_new (FALSE, 0); + gtk_widget_set_size_request (GTK_WIDGET (vbox), 320, -1); + + /* Right - 1. */ + label = gtk_label_new (NULL); + markup = g_markup_printf_escaped ("%s", prompt); + gtk_label_set_markup (GTK_LABEL (label), markup); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_widget_set_size_request (GTK_WIDGET (label), 320, -1); + g_free (markup); + + + /* Right - 2. */ + username_box = gtk_hbox_new (TRUE, 0); + + username_prompt = gtk_label_new (_("Username:")); + gtk_misc_set_alignment (GTK_MISC (username_prompt), 0.0, 0.5); + + username_entry = gtk_entry_new (); + gtk_entry_set_text (GTK_ENTRY (username_entry), username); + + + /* Right - 3. */ + password_box = gtk_hbox_new (TRUE, 0); + + password_prompt = gtk_label_new (_("Password:")); + gtk_misc_set_alignment (GTK_MISC (password_prompt), 0.0, 0.5); + + password_entry = gtk_entry_new (); + gtk_entry_set_visibility (GTK_ENTRY (password_entry), FALSE); + gtk_entry_set_activates_default (GTK_ENTRY (password_entry), TRUE); + + + /* Packing */ + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), main_box, TRUE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (main_box), icon, FALSE, FALSE, 6); + gtk_box_pack_start (GTK_BOX (main_box), vbox, FALSE, FALSE, 6); + + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 6); + gtk_box_pack_start (GTK_BOX (vbox), username_box, FALSE, TRUE, 6); + gtk_box_pack_start (GTK_BOX (vbox), password_box, FALSE, TRUE, 6); + + gtk_box_pack_start (GTK_BOX (username_box), username_prompt, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (username_box), username_entry, TRUE, TRUE, 0); + + gtk_box_pack_start (GTK_BOX (password_box), password_prompt, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (password_box), password_entry, TRUE, TRUE, 0); + + + gtk_widget_grab_focus (password_entry); + + priv->hostname = g_strdup (hostname); + priv->username = g_strdup (username); + + g_signal_connect (password_entry, "changed", + G_CALLBACK (store_password), backend); + + g_signal_connect (username_entry, "changed", + G_CALLBACK (store_username), backend); + + g_object_ref (backend); + g_signal_connect (G_OBJECT (dialog), "response", + G_CALLBACK (password_dialog_response), backend); + + gtk_widget_show_all (dialog); +} + void gtk_print_backend_destroy (GtkPrintBackend *print_backend) { diff --git a/gtk/gtkprintbackend.h b/gtk/gtkprintbackend.h index 2305e32c31..7d75f8e417 100644 --- a/gtk/gtkprintbackend.h +++ b/gtk/gtkprintbackend.h @@ -120,14 +120,22 @@ struct _GtkPrintBackendClass GtkPrinter *printer); void (*printer_status_changed) (GtkPrintBackend *backend, GtkPrinter *printer); + void (*request_password) (GtkPrintBackend *backend, + const gchar *hostname, + const gchar *username, + const gchar *prompt); + + /* not a signal */ + void (*set_password) (GtkPrintBackend *backend, + const gchar *hostname, + const gchar *username, + const gchar *password); /* Padding for future expansion */ void (*_gtk_reserved1) (void); void (*_gtk_reserved2) (void); void (*_gtk_reserved3) (void); void (*_gtk_reserved4) (void); - void (*_gtk_reserved5) (void); - void (*_gtk_reserved6) (void); }; GType gtk_print_backend_get_type (void) G_GNUC_CONST; @@ -144,6 +152,10 @@ void gtk_print_backend_print_stream (GtkPrintBackend *pri GDestroyNotify dnotify); GList * gtk_print_backend_load_modules (void); void gtk_print_backend_destroy (GtkPrintBackend *print_backend); +void gtk_print_backend_set_password (GtkPrintBackend *backend, + const gchar *hostname, + const gchar *username, + const gchar *password); /* Backend-only functions for GtkPrintBackend */ diff --git a/gtk/gtkprintjob.c b/gtk/gtkprintjob.c index c59a27a741..51d41d1e08 100644 --- a/gtk/gtkprintjob.c +++ b/gtk/gtkprintjob.c @@ -205,6 +205,8 @@ gtk_print_job_init (GtkPrintJob *job) job->scale = 1.0; job->page_set = GTK_PAGE_SET_ALL; job->rotate_to_orientation = FALSE; + job->number_up = 1; + job->number_up_layout = GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM; } diff --git a/gtk/gtkprintjob.h b/gtk/gtkprintjob.h index 71ddfdc5ab..fd821840f9 100644 --- a/gtk/gtkprintjob.h +++ b/gtk/gtkprintjob.h @@ -66,6 +66,8 @@ struct _GtkPrintJob guint GSEAL (rotate_to_orientation) : 1; guint GSEAL (collate) : 1; guint GSEAL (reverse) : 1; + guint GSEAL (number_up); + GtkNumberUpLayout GSEAL (number_up_layout); }; struct _GtkPrintJobClass diff --git a/gtk/gtkprintoperation-private.h b/gtk/gtkprintoperation-private.h index 0e5f606c80..718f16df6f 100644 --- a/gtk/gtkprintoperation-private.h +++ b/gtk/gtkprintoperation-private.h @@ -43,6 +43,8 @@ struct _GtkPrintOperationPrivate GtkPrintSettings *print_settings; gchar *job_name; gint nr_of_pages; + gint nr_of_pages_to_print; + gint page_position; gint current_page; GtkUnit unit; gchar *export_filename; @@ -70,6 +72,9 @@ struct _GtkPrintOperationPrivate guint manual_orientation : 1; double manual_scale; GtkPageSet manual_page_set; + guint manual_number_up; + GtkNumberUpLayout manual_number_up_layout; + GtkWidget *custom_widget; gchar *custom_tab_label; diff --git a/gtk/gtkprintoperation-unix.c b/gtk/gtkprintoperation-unix.c index 99e047e419..ad8bc126f8 100644 --- a/gtk/gtkprintoperation-unix.c +++ b/gtk/gtkprintoperation-unix.c @@ -87,10 +87,14 @@ unix_start_page (GtkPrintOperation *op, type = cairo_surface_get_type (op_unix->surface); - if (type == CAIRO_SURFACE_TYPE_PS) - cairo_ps_surface_set_size (op_unix->surface, w, h); - else if (type == CAIRO_SURFACE_TYPE_PDF) - cairo_pdf_surface_set_size (op_unix->surface, w, h); + if ((op->priv->manual_number_up < 2) || + (op->priv->page_position % op->priv->manual_number_up == 0)) + { + if (type == CAIRO_SURFACE_TYPE_PS) + cairo_ps_surface_set_size (op_unix->surface, w, h); + else if (type == CAIRO_SURFACE_TYPE_PDF) + cairo_pdf_surface_set_size (op_unix->surface, w, h); + } } static void @@ -100,7 +104,11 @@ unix_end_page (GtkPrintOperation *op, cairo_t *cr; cr = gtk_print_context_get_cairo_context (print_context); - cairo_show_page (cr); + + if ((op->priv->manual_number_up < 2) || + ((op->priv->page_position + 1) % op->priv->manual_number_up == 0) || + (op->priv->page_position == op->priv->nr_of_pages_to_print - 1)) + cairo_show_page (cr); } static void @@ -183,6 +191,10 @@ _gtk_print_operation_platform_backend_launch_preview (GtkPrintOperation *op, gchar *preview_cmd; GtkSettings *settings; GtkPrintSettings *print_settings; + GtkPageSetup *page_setup; + GKeyFile *key_file = NULL; + gchar *data = NULL; + gsize data_len; gchar *settings_filename = NULL; gchar *quoted_filename; gchar *quoted_settings_filename; @@ -204,10 +216,21 @@ _gtk_print_operation_platform_backend_launch_preview (GtkPrintOperation *op, if (fd < 0) goto out; + key_file = g_key_file_new (); + print_settings = gtk_print_operation_get_print_settings (op); - retval = gtk_print_settings_to_file (print_settings, settings_filename, &error); - close (fd); + gtk_print_settings_to_key_file (print_settings, key_file, NULL); + page_setup = gtk_print_context_get_page_setup (op->priv->print_context); + gtk_page_setup_to_key_file (page_setup, key_file, NULL); + + g_key_file_set_string (key_file, "Print Job", "title", op->priv->job_name); + + data = g_key_file_to_data (key_file, &data_len, &error); + if (!data) + goto out; + + retval = g_file_set_contents (settings_filename, data, data_len, &error); if (!retval) goto out; @@ -259,6 +282,12 @@ _gtk_print_operation_platform_backend_launch_preview (GtkPrintOperation *op, if (!settings_used) g_unlink (settings_filename); + if (fd > 0) + close (fd); + + if (key_file) + g_key_file_free (key_file); + g_free (data); g_free (settings_filename); } @@ -342,6 +371,26 @@ job_status_changed_cb (GtkPrintJob *job, } +static void +printer_changed_cb (GtkPrintUnixDialog *print_dialog, + GParamSpec *pspec, + gpointer user_data) +{ + GtkPageSetup *page_setup; + GtkPrintSettings *print_settings; + GtkPrintOperation *op = user_data; + GtkPrintOperationPrivate *priv = op->priv; + + page_setup = gtk_print_unix_dialog_get_page_setup (print_dialog); + print_settings = gtk_print_unix_dialog_get_settings (print_dialog); + + g_signal_emit_by_name (op, + "update-custom-widget", + priv->custom_widget, + page_setup, + print_settings); +} + static GtkWidget * get_print_dialog (GtkPrintOperation *op, GtkWindow *parent) @@ -358,7 +407,9 @@ get_print_dialog (GtkPrintOperation *op, GTK_PRINT_CAPABILITY_COLLATE | GTK_PRINT_CAPABILITY_REVERSE | GTK_PRINT_CAPABILITY_SCALE | - GTK_PRINT_CAPABILITY_PREVIEW); + GTK_PRINT_CAPABILITY_PREVIEW | + GTK_PRINT_CAPABILITY_NUMBER_UP | + GTK_PRINT_CAPABILITY_NUMBER_UP_LAYOUT); if (priv->print_settings) gtk_print_unix_dialog_set_settings (GTK_PRINT_UNIX_DIALOG (pd), @@ -388,6 +439,8 @@ get_print_dialog (GtkPrintOperation *op, gtk_print_unix_dialog_add_custom_tab (GTK_PRINT_UNIX_DIALOG (pd), priv->custom_widget, label); + + g_signal_connect (pd, "notify::selected-printer", (GCallback) printer_changed_cb, op); } return pd; @@ -480,6 +533,8 @@ finish_print (PrintResponseData *rdata, priv->manual_page_set = job->page_set; priv->manual_scale = job->scale; priv->manual_orientation = job->rotate_to_orientation; + priv->manual_number_up = job->number_up; + priv->manual_number_up_layout = job->number_up_layout; } } out: diff --git a/gtk/gtkprintoperation-win32.c b/gtk/gtkprintoperation-win32.c index 7a9b559a93..3da48cb708 100644 --- a/gtk/gtkprintoperation-win32.c +++ b/gtk/gtkprintoperation-win32.c @@ -1598,6 +1598,8 @@ gtk_print_operation_run_without_dialog (GtkPrintOperation *op, op->priv->manual_orientation = FALSE; op->priv->manual_scale = 1.0; op->priv->manual_page_set = GTK_PAGE_SET_ALL; + op->priv->manual_number_up = 1; + op->priv->manual_number_up_layout = GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM; op->priv->start_page = win32_start_page; op->priv->end_page = win32_end_page; @@ -1821,6 +1823,8 @@ gtk_print_operation_run_with_dialog (GtkPrintOperation *op, op->priv->manual_orientation = FALSE; op->priv->manual_scale = 1.0; op->priv->manual_page_set = GTK_PAGE_SET_ALL; + op->priv->manual_number_up = 1; + op->priv->manual_number_up_layout = GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM; } op->priv->start_page = win32_start_page; diff --git a/gtk/gtkprintoperation.c b/gtk/gtkprintoperation.c index 05b8b9e4a7..d0e6fb9aae 100644 --- a/gtk/gtkprintoperation.c +++ b/gtk/gtkprintoperation.c @@ -22,6 +22,7 @@ #include #include +#include #include #include "gtkprintoperation-private.h" @@ -48,6 +49,7 @@ enum CREATE_CUSTOM_WIDGET, CUSTOM_WIDGET_APPLY, PREVIEW, + UPDATE_CUSTOM_WIDGET, LAST_SIGNAL }; @@ -153,6 +155,8 @@ gtk_print_operation_init (GtkPrintOperation *operation) priv->default_page_setup = NULL; priv->print_settings = NULL; priv->nr_of_pages = -1; + priv->nr_of_pages_to_print = -1; + priv->page_position = -1; priv->current_page = -1; priv->use_full_page = FALSE; priv->show_progress = FALSE; @@ -819,13 +823,35 @@ gtk_print_operation_class_init (GtkPrintOperationClass *class) _gtk_marshal_OBJECT__VOID, G_TYPE_OBJECT, 0); + /** + * GtkPrintOperation::update-custom-widget: + * @operation: the #GtkPrintOperation on which the signal was emitted + * @widget: the custom widget added in create-custom-widget + * @setup: actual page setup + * @settings: actual print settings + * + * Emmited after change of selected printer. The actual page setup and + * print settings are passed to the custom widget, which can actualize + * itself according to this change. + * + * Since: 2.18 + */ + signals[UPDATE_CUSTOM_WIDGET] = + g_signal_new (I_("update-custom-widget"), + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkPrintOperationClass, update_custom_widget), + NULL, NULL, + _gtk_marshal_VOID__OBJECT_OBJECT_OBJECT, + G_TYPE_NONE, 3, GTK_TYPE_WIDGET, GTK_TYPE_PAGE_SETUP, GTK_TYPE_PRINT_SETTINGS); + /** * GtkPrintOperation::custom-widget-apply: * @operation: the #GtkPrintOperation on which the signal was emitted * @widget: the custom widget added in create-custom-widget * * Emitted right before #GtkPrintOperation::begin-print if you added - * a custom widget in the #GtkPrintOperation:;create-custom-widget handler. + * a custom widget in the #GtkPrintOperation::create-custom-widget handler. * When you get this signal you should read the information from the * custom widgets, as the widgets are not guaraneed to be around at a * later time. @@ -1809,7 +1835,11 @@ pdf_end_page (GtkPrintOperation *op, cairo_t *cr; cr = gtk_print_context_get_cairo_context (print_context); - cairo_show_page (cr); + + if ((op->priv->manual_number_up < 2) || + ((op->priv->page_position + 1) % op->priv->manual_number_up == 0) || + (op->priv->page_position == op->priv->nr_of_pages_to_print - 1)) + cairo_show_page (cr); } static void @@ -1883,6 +1913,8 @@ run_pdf (GtkPrintOperation *op, priv->manual_page_set = GTK_PAGE_SET_ALL; priv->manual_scale = 1.0; priv->manual_orientation = TRUE; + priv->manual_number_up = 1; + priv->manual_number_up_layout = GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM; *do_print = TRUE; @@ -1904,33 +1936,20 @@ typedef struct GtkPageRange *ranges; GtkPageRange one_range; - gint page, start, end, inc; + gint page; + gint sheet; + gint first_position, last_position; + gint first_sheet; + gint num_of_sheets; + gint *pages; GtkWidget *progress; gboolean initialized; - gboolean is_preview; + gboolean is_preview; + gboolean done; } PrintPagesData; -static void -find_range (PrintPagesData *data) -{ - GtkPageRange *range; - - range = &data->ranges[data->range]; - - if (data->inc < 0) - { - data->start = range->end; - data->end = range->start - 1; - } - else - { - data->start = range->start; - data->end = range->end + 1; - } -} - static void clamp_page_ranges (PrintPagesData *data) { @@ -1971,32 +1990,91 @@ clamp_page_ranges (PrintPagesData *data) data->num_ranges = num_of_correct_ranges; } -static gboolean +static void increment_page_sequence (PrintPagesData *data) { GtkPrintOperationPrivate *priv = data->op->priv; + gint inc; - do { - data->page += data->inc; - if (data->page == data->end) - { - data->range += data->inc; - if (data->range == -1 || data->range == data->num_ranges) - { - data->uncollated++; - if (data->uncollated == data->uncollated_copies) - return FALSE; + /* check whether we reached last position */ + if (priv->page_position == data->last_position && + !(data->collated_copies > 1 && data->collated < (data->collated_copies - 1))) + { + if (data->uncollated_copies > 1 && data->uncollated < (data->uncollated_copies - 1)) + { + priv->page_position = data->first_position; + data->sheet = data->first_sheet; + data->uncollated++; + } + else + { + data->done = TRUE; + return; + } + } + else + { + if (priv->manual_reverse) + inc = -1; + else + inc = 1; - data->range = data->inc < 0 ? data->num_ranges - 1 : 0; - } - find_range (data); - data->page = data->start; - } - } - while ((priv->manual_page_set == GTK_PAGE_SET_EVEN && data->page % 2 == 0) || - (priv->manual_page_set == GTK_PAGE_SET_ODD && data->page % 2 == 1)); + /* changing sheet */ + if ((priv->page_position + 1) % priv->manual_number_up == 0 || + priv->page_position == data->last_position || + priv->page_position == priv->nr_of_pages_to_print - 1) + { + /* check whether to print the same sheet again */ + if (data->collated_copies > 1) + { + if (data->collated < (data->collated_copies - 1)) + { + data->collated++; + data->total++; + priv->page_position = data->sheet * priv->manual_number_up; - return TRUE; + if (priv->page_position < 0 || + priv->page_position >= priv->nr_of_pages_to_print || + data->sheet < 0 || + data->sheet >= data->num_of_sheets) + { + data->done = TRUE; + return; + } + else + data->page = data->pages[priv->page_position]; + + return; + } + else + data->collated = 0; + } + + if (priv->manual_page_set == GTK_PAGE_SET_ODD || + priv->manual_page_set == GTK_PAGE_SET_EVEN) + data->sheet += 2 * inc; + else + data->sheet += inc; + + priv->page_position = data->sheet * priv->manual_number_up; + } + else + priv->page_position += 1; + } + + /* general check */ + if (priv->page_position < 0 || + priv->page_position >= priv->nr_of_pages_to_print || + data->sheet < 0 || + data->sheet >= data->num_of_sheets) + { + data->done = TRUE; + return; + } + else + data->page = data->pages[priv->page_position]; + + data->total++; } static void @@ -2029,6 +2107,7 @@ print_pages_idle_done (gpointer user_data) GTK_PRINT_OPERATION_RESULT_APPLY); g_object_unref (data->op); + g_free (data->pages); g_free (data); } @@ -2044,13 +2123,13 @@ update_progress (PrintPagesData *data) { if (priv->status == GTK_PRINT_STATUS_PREPARING) { - if (priv->nr_of_pages > 0) - text = g_strdup_printf (_("Preparing %d"), priv->nr_of_pages); + if (priv->nr_of_pages_to_print > 0) + text = g_strdup_printf (_("Preparing %d"), priv->nr_of_pages_to_print); else text = g_strdup (_("Preparing")); } else if (priv->status == GTK_PRINT_STATUS_GENERATING_DATA) - text = g_strdup_printf (_("Printing %d"), data->total); + text = g_strdup_printf (_("Printing %d"), data->total - 1); if (text) { @@ -2141,16 +2220,193 @@ common_render_page (GtkPrintOperation *op, cr = gtk_print_context_get_cairo_context (print_context); cairo_save (cr); - if (priv->manual_scale != 1.0) + if (priv->manual_scale != 1.0 && priv->manual_number_up <= 1) cairo_scale (cr, priv->manual_scale, priv->manual_scale); if (priv->manual_orientation) _gtk_print_context_rotate_according_to_orientation (print_context); - - if (!priv->use_full_page) - _gtk_print_context_translate_into_margin (print_context); + + if (priv->manual_number_up > 1) + { + GtkPageOrientation orientation; + GtkPageSetup *page_setup; + gdouble paper_width, paper_height; + gdouble page_width, page_height; + gdouble context_width, context_height; + gdouble bottom_margin, top_margin, left_margin, right_margin; + gdouble x_step, y_step; + gdouble x_scale, y_scale, scale; + gdouble horizontal_offset = 0.0, vertical_offset = 0.0; + gint columns, rows, x, y, tmp_length; + + page_setup = gtk_print_context_get_page_setup (print_context); + orientation = gtk_page_setup_get_orientation (page_setup); + + top_margin = gtk_page_setup_get_top_margin (page_setup, GTK_UNIT_POINTS); + bottom_margin = gtk_page_setup_get_bottom_margin (page_setup, GTK_UNIT_POINTS); + left_margin = gtk_page_setup_get_left_margin (page_setup, GTK_UNIT_POINTS); + right_margin = gtk_page_setup_get_right_margin (page_setup, GTK_UNIT_POINTS); + + paper_width = gtk_page_setup_get_paper_width (page_setup, GTK_UNIT_POINTS); + paper_height = gtk_page_setup_get_paper_height (page_setup, GTK_UNIT_POINTS); + + context_width = gtk_print_context_get_width (print_context); + context_height = gtk_print_context_get_height (print_context); + + if (orientation == GTK_PAGE_ORIENTATION_PORTRAIT || + orientation == GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT) + { + page_width = paper_width - (left_margin + right_margin); + page_height = paper_height - (top_margin + bottom_margin); + } + else + { + page_width = paper_width - (top_margin + bottom_margin); + page_height = paper_height - (left_margin + right_margin); + } + + if (orientation == GTK_PAGE_ORIENTATION_PORTRAIT || + orientation == GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT) + cairo_translate (cr, left_margin, top_margin); + else + cairo_translate (cr, top_margin, left_margin); + + switch (priv->manual_number_up) + { + default: + columns = 1; + rows = 1; + break; + case 2: + columns = 2; + rows = 1; + break; + case 4: + columns = 2; + rows = 2; + break; + case 6: + columns = 3; + rows = 2; + break; + case 9: + columns = 3; + rows = 3; + break; + case 16: + columns = 4; + rows = 4; + break; + } + + if (orientation == GTK_PAGE_ORIENTATION_LANDSCAPE || + orientation == GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE) + { + tmp_length = columns; + columns = rows; + rows = tmp_length; + } + + switch (priv->manual_number_up_layout) + { + case GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM: + x = priv->page_position % columns; + y = (priv->page_position / columns) % rows; + break; + case GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP: + x = priv->page_position % columns; + y = rows - 1 - (priv->page_position / columns) % rows; + break; + case GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM: + x = columns - 1 - priv->page_position % columns; + y = (priv->page_position / columns) % rows; + break; + case GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_BOTTOM_TO_TOP: + x = columns - 1 - priv->page_position % columns; + y = rows - 1 - (priv->page_position / columns) % rows; + break; + case GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_LEFT_TO_RIGHT: + x = (priv->page_position / rows) % columns; + y = priv->page_position % rows; + break; + case GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_RIGHT_TO_LEFT: + x = columns - 1 - (priv->page_position / rows) % columns; + y = priv->page_position % rows; + break; + case GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_LEFT_TO_RIGHT: + x = (priv->page_position / rows) % columns; + y = rows - 1 - priv->page_position % rows; + break; + case GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_RIGHT_TO_LEFT: + x = columns - 1 - (priv->page_position / rows) % columns; + y = rows - 1 - priv->page_position % rows; + break; + } + + if (priv->manual_number_up == 4 || priv->manual_number_up == 9 || priv->manual_number_up == 16) + { + x_scale = page_width / (columns * paper_width); + y_scale = page_height / (rows * paper_height); + + scale = x_scale < y_scale ? x_scale : y_scale; + + x_step = paper_width * (x_scale / scale); + y_step = paper_height * (y_scale / scale); + + if ((left_margin + right_margin) > 0) + { + horizontal_offset = left_margin * (x_step - context_width) / (left_margin + right_margin); + vertical_offset = top_margin * (y_step - context_height) / (top_margin + bottom_margin); + } + else + { + horizontal_offset = (x_step - context_width) / 2.0; + vertical_offset = (y_step - context_height) / 2.0; + } + + cairo_scale (cr, scale, scale); + + cairo_translate (cr, + x * x_step + horizontal_offset, + y * y_step + vertical_offset); + + if (priv->manual_scale != 1.0) + cairo_scale (cr, priv->manual_scale, priv->manual_scale); + } + + if (priv->manual_number_up == 2 || priv->manual_number_up == 6) + { + x_scale = page_height / (columns * paper_width); + y_scale = page_width / (rows * paper_height); + + scale = x_scale < y_scale ? x_scale : y_scale; + + horizontal_offset = (paper_width * (x_scale / scale) - paper_width) / 2.0 * columns; + vertical_offset = (paper_height * (y_scale / scale) - paper_height) / 2.0 * rows; + + if (!priv->use_full_page) + { + horizontal_offset -= right_margin; + vertical_offset += top_margin; + } + + cairo_scale (cr, scale, scale); + + cairo_translate (cr, + y * paper_height + vertical_offset, + (columns - x) * paper_width + horizontal_offset); + + if (priv->manual_scale != 1.0) + cairo_scale (cr, priv->manual_scale, priv->manual_scale); + + cairo_rotate (cr, - M_PI / 2); + } + } + else + if (!priv->use_full_page) + _gtk_print_context_translate_into_margin (print_context); priv->page_drawing_state = GTK_PAGE_DRAWING_STATE_DRAWING; @@ -2166,7 +2422,7 @@ prepare_data (PrintPagesData *data) { GtkPrintOperationPrivate *priv; GtkPageSetup *page_setup; - gint i; + gint i, j, counter; priv = data->op->priv; @@ -2244,21 +2500,85 @@ prepare_data (PrintPagesData *data) return; } + priv->nr_of_pages_to_print = 0; + for (i = 0; i < data->num_ranges; i++) + priv->nr_of_pages_to_print += data->ranges[i].end - data->ranges[i].start + 1; + + data->pages = g_new (gint, priv->nr_of_pages_to_print); + counter = 0; + for (i = 0; i < data->num_ranges; i++) + for (j = data->ranges[i].start; j <= data->ranges[i].end; j++) + { + data->pages[counter] = j; + counter++; + } + + data->total = 0; + data->collated = 0; + data->uncollated = 0; + + if (priv->nr_of_pages_to_print % priv->manual_number_up == 0) + data->num_of_sheets = priv->nr_of_pages_to_print / priv->manual_number_up; + else + data->num_of_sheets = priv->nr_of_pages_to_print / priv->manual_number_up + 1; + if (priv->manual_reverse) { - data->range = data->num_ranges - 1; - data->inc = -1; + /* data->sheet is 0-based */ + if (priv->manual_page_set == GTK_PAGE_SET_ODD) + data->sheet = (data->num_of_sheets - 1) - (data->num_of_sheets - 1) % 2; + else if (priv->manual_page_set == GTK_PAGE_SET_EVEN) + data->sheet = (data->num_of_sheets - 1) - (1 - (data->num_of_sheets - 1) % 2); + else + data->sheet = data->num_of_sheets - 1; } else { - data->range = 0; - data->inc = 1; + /* data->sheet is 0-based */ + if (priv->manual_page_set == GTK_PAGE_SET_ODD) + data->sheet = 0; + else if (priv->manual_page_set == GTK_PAGE_SET_EVEN) + { + if (data->num_of_sheets > 1) + data->sheet = 1; + else + data->sheet = -1; + } + else + data->sheet = 0; + } + + priv->page_position = data->sheet * priv->manual_number_up; + + if (priv->page_position < 0 || priv->page_position >= priv->nr_of_pages_to_print) + { + priv->cancelled = TRUE; + return; + } + + data->page = data->pages[priv->page_position]; + data->first_position = priv->page_position; + data->first_sheet = data->sheet; + + if (priv->manual_reverse) + { + if (priv->manual_page_set == GTK_PAGE_SET_ODD) + data->last_position = MIN (priv->manual_number_up - 1, priv->nr_of_pages_to_print - 1); + else if (priv->manual_page_set == GTK_PAGE_SET_EVEN) + data->last_position = MIN (2 * priv->manual_number_up - 1, priv->nr_of_pages_to_print - 1); + else + data->last_position = MIN (priv->manual_number_up - 1, priv->nr_of_pages_to_print - 1); + } + else + { + if (priv->manual_page_set == GTK_PAGE_SET_ODD) + data->last_position = MIN (((data->num_of_sheets - 1) - ((data->num_of_sheets - 1) % 2)) * priv->manual_number_up - 1, priv->nr_of_pages_to_print - 1); + else if (priv->manual_page_set == GTK_PAGE_SET_EVEN) + data->last_position = MIN (((data->num_of_sheets - 1) - (1 - (data->num_of_sheets - 1) % 2)) * priv->manual_number_up - 1, priv->nr_of_pages_to_print - 1); + else + data->last_position = priv->nr_of_pages_to_print - 1; } - find_range (data); - /* go back one page, since we preincrement below */ - data->page = data->start - data->inc; - data->collated = data->collated_copies - 1; _gtk_print_operation_set_status (data->op, GTK_PRINT_STATUS_GENERATING_DATA, @@ -2269,7 +2589,7 @@ static gboolean print_pages_idle (gpointer user_data) { PrintPagesData *data; - GtkPrintOperationPrivate *priv; + GtkPrintOperationPrivate *priv; gboolean done = FALSE; data = (PrintPagesData*)user_data; @@ -2283,19 +2603,6 @@ print_pages_idle (gpointer user_data) goto out; } - data->total++; - data->collated++; - if (data->collated == data->collated_copies) - { - data->collated = 0; - if (!increment_page_sequence (data)) - { - done = TRUE; - - goto out; - } - } - if (data->is_preview && !priv->cancelled) { done = TRUE; @@ -2304,7 +2611,13 @@ print_pages_idle (gpointer user_data) goto out; } - common_render_page (data->op, data->page); + if (!data->done) + { + common_render_page (data->op, data->page); + increment_page_sequence (data); + } + else + done = priv->page_drawing_state == GTK_PAGE_DRAWING_STATE_READY; out: @@ -2445,6 +2758,8 @@ print_pages (GtkPrintOperation *op, priv->manual_page_set = GTK_PAGE_SET_ALL; priv->manual_scale = 1.0; priv->manual_orientation = TRUE; + priv->manual_number_up = 1; + priv->manual_number_up_layout = GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM; } priv->print_pages_idle_id = gdk_threads_add_idle_full (G_PRIORITY_DEFAULT_IDLE + 10, diff --git a/gtk/gtkprintoperation.h b/gtk/gtkprintoperation.h index a3f0410943..af46332fcf 100644 --- a/gtk/gtkprintoperation.h +++ b/gtk/gtkprintoperation.h @@ -105,13 +105,18 @@ struct _GtkPrintOperationClass GtkWidget *(*create_custom_widget) (GtkPrintOperation *operation); void (*custom_widget_apply) (GtkPrintOperation *operation, - GtkWidget *widget); + GtkWidget *widget); gboolean (*preview) (GtkPrintOperation *operation, GtkPrintOperationPreview *preview, GtkPrintContext *context, GtkWindow *parent); + void (*update_custom_widget) (GtkPrintOperation *operation, + GtkWidget *widget, + GtkPageSetup *setup, + GtkPrintSettings *settings); + /* Padding for future expansion */ void (*_gtk_reserved1) (void); void (*_gtk_reserved2) (void); @@ -119,7 +124,6 @@ struct _GtkPrintOperationClass void (*_gtk_reserved4) (void); void (*_gtk_reserved5) (void); void (*_gtk_reserved6) (void); - void (*_gtk_reserved7) (void); }; #define GTK_PRINT_ERROR gtk_print_error_quark () diff --git a/gtk/gtkprintunixdialog.c b/gtk/gtkprintunixdialog.c index 21c1efed69..92c93e9300 100644 --- a/gtk/gtkprintunixdialog.c +++ b/gtk/gtkprintunixdialog.c @@ -757,7 +757,10 @@ load_print_backends (GtkPrintUnixDialog *dialog) priv->print_backends = gtk_print_backend_load_modules (); for (node = priv->print_backends; node != NULL; node = node->next) - printer_list_initialize (dialog, GTK_PRINT_BACKEND (node->data)); + { + GtkPrintBackend *backend = node->data; + printer_list_initialize (dialog, backend); + } } static void @@ -1083,19 +1086,19 @@ update_print_at_option (GtkPrintUnixDialog *dialog) if (priv->updating_print_at) return; - + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->print_at_radio))) gtk_printer_option_set (option, "at"); else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->print_hold_radio))) gtk_printer_option_set (option, "on-hold"); else gtk_printer_option_set (option, "now"); - + option = gtk_printer_option_set_lookup (priv->options, "gtk-print-time-text"); if (option != NULL) { const char *text = gtk_entry_get_text (GTK_ENTRY (priv->print_at_entry)); - gtk_printer_option_set (option,text); + gtk_printer_option_set (option, text); } } @@ -1105,9 +1108,9 @@ setup_print_at (GtkPrintUnixDialog *dialog) { GtkPrintUnixDialogPrivate *priv = dialog->priv; GtkPrinterOption *option; - + option = gtk_printer_option_set_lookup (priv->options, "gtk-print-time"); - + if (option == NULL) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->print_now_radio), @@ -1120,18 +1123,11 @@ setup_print_at (GtkPrintUnixDialog *dialog) } priv->updating_print_at = TRUE; - - if (gtk_printer_option_has_choice (option, "at")) - { - gtk_widget_set_sensitive (priv->print_at_radio, TRUE); - gtk_widget_set_sensitive (priv->print_at_entry, TRUE); - } - else - { - gtk_widget_set_sensitive (priv->print_at_radio, FALSE); - gtk_widget_set_sensitive (priv->print_at_entry, FALSE); - } - + + gtk_widget_set_sensitive (priv->print_at_entry, FALSE); + gtk_widget_set_sensitive (priv->print_at_radio, + gtk_printer_option_has_choice (option, "at")); + gtk_widget_set_sensitive (priv->print_hold_radio, gtk_printer_option_has_choice (option, "on-hold")); @@ -1149,15 +1145,14 @@ setup_print_at (GtkPrintUnixDialog *dialog) option = gtk_printer_option_set_lookup (priv->options, "gtk-print-time-text"); if (option != NULL) - gtk_entry_set_text (GTK_ENTRY (priv->print_at_entry), - option->value); - + gtk_entry_set_text (GTK_ENTRY (priv->print_at_entry), option->value); + priv->updating_print_at = FALSE; return TRUE; } - + static void update_dialog_from_settings (GtkPrintUnixDialog *dialog) { @@ -1560,6 +1555,8 @@ selected_printer_changed (GtkTreeSelection *selection, update_dialog_from_settings (dialog); update_dialog_from_capabilities (dialog); + + g_object_notify ( G_OBJECT(dialog), "selected-printer"); } static void @@ -1679,15 +1676,15 @@ gtk_print_unix_dialog_style_set (GtkWidget *widget, &size, NULL); scale = size / 48.0; - - gtk_widget_set_size_request (priv->collate_image, + + gtk_widget_set_size_request (priv->collate_image, (50 + 20) * scale, (15 + 26) * scale); } } static void -update_range_sensitivity (GtkWidget *button, +update_entry_sensitivity (GtkWidget *button, GtkWidget *range) { gboolean active; @@ -1695,6 +1692,9 @@ update_range_sensitivity (GtkWidget *button, active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); gtk_widget_set_sensitive (range, active); + + if (active) + gtk_widget_grab_focus (range); } static void @@ -1837,13 +1837,15 @@ create_main_page (GtkPrintUnixDialog *dialog) 0, 0); entry = gtk_entry_new (); gtk_widget_set_tooltip_text (entry, range_tooltip); + atk_object_set_name (gtk_widget_get_accessible (entry), _("Pages")); + atk_object_set_description (gtk_widget_get_accessible (entry), range_tooltip); priv->page_range_entry = entry; gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3, GTK_FILL, 0, 0, 0); - g_signal_connect (radio, "toggled", G_CALLBACK (update_range_sensitivity), entry); - update_range_sensitivity (radio, entry); + g_signal_connect (radio, "toggled", G_CALLBACK (update_entry_sensitivity), entry); + update_entry_sensitivity (radio, entry); table = gtk_table_new (3, 2, FALSE); gtk_table_set_row_spacings (GTK_TABLE (table), 6); @@ -2426,6 +2428,7 @@ update_number_up_layout (GtkPrintUnixDialog *dialog) GtkNumberUpLayout layout; GtkPrinterOption *option; GtkPrinterOption *old_option; + GtkPageOrientation page_orientation; set = priv->options; @@ -2436,17 +2439,64 @@ update_number_up_layout (GtkPrintUnixDialog *dialog) if (priv->number_up_layout_n_option == NULL) { priv->number_up_layout_n_option = gtk_printer_option_set_lookup (set, "gtk-n-up-layout"); + if (priv->number_up_layout_n_option == NULL) + { + char *n_up_layout[] = { "lrtb", "lrbt", "rltb", "rlbt", "tblr", "tbrl", "btlr", "btrl" }; + /* Translators: These strings name the possible arrangements of + * multiple pages on a sheet when printing (same as in gtkprintbackendcups.c) + */ + 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") }; + int i; + + priv->number_up_layout_n_option = gtk_printer_option_new ("gtk-n-up-layout", + _("Page Ordering"), + GTK_PRINTER_OPTION_TYPE_PICKONE); + gtk_printer_option_allocate_choices (priv->number_up_layout_n_option, 8); + + for (i = 0; i < G_N_ELEMENTS (n_up_layout_display); i++) + { + priv->number_up_layout_n_option->choices[i] = g_strdup (n_up_layout[i]); + priv->number_up_layout_n_option->choices_display[i] = g_strdup (_(n_up_layout_display[i])); + } + } g_object_ref (priv->number_up_layout_n_option); priv->number_up_layout_2_option = gtk_printer_option_new ("gtk-n-up-layout", _("Page Ordering"), GTK_PRINTER_OPTION_TYPE_PICKONE); gtk_printer_option_allocate_choices (priv->number_up_layout_2_option, 2); + } - priv->number_up_layout_2_option->choices[0] = priv->number_up_layout_n_option->choices[0]; - priv->number_up_layout_2_option->choices[1] = priv->number_up_layout_n_option->choices[2]; - priv->number_up_layout_2_option->choices_display[0] = g_strdup ( _("Left to right")); - priv->number_up_layout_2_option->choices_display[1] = g_strdup ( _("Right to left")); + page_orientation = gtk_page_setup_get_orientation (priv->page_setup); + if (page_orientation == GTK_PAGE_ORIENTATION_PORTRAIT || + page_orientation == GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT) + { + if (! (priv->number_up_layout_2_option->choices[0] == priv->number_up_layout_n_option->choices[0] && + priv->number_up_layout_2_option->choices[1] == priv->number_up_layout_n_option->choices[2])) + { + g_free (priv->number_up_layout_2_option->choices_display[0]); + g_free (priv->number_up_layout_2_option->choices_display[1]); + priv->number_up_layout_2_option->choices[0] = priv->number_up_layout_n_option->choices[0]; + priv->number_up_layout_2_option->choices[1] = priv->number_up_layout_n_option->choices[2]; + priv->number_up_layout_2_option->choices_display[0] = g_strdup ( _("Left to right")); + priv->number_up_layout_2_option->choices_display[1] = g_strdup ( _("Right to left")); + } + } + else + { + if (! (priv->number_up_layout_2_option->choices[0] == priv->number_up_layout_n_option->choices[0] && + priv->number_up_layout_2_option->choices[1] == priv->number_up_layout_n_option->choices[1])) + { + g_free (priv->number_up_layout_2_option->choices_display[0]); + g_free (priv->number_up_layout_2_option->choices_display[1]); + priv->number_up_layout_2_option->choices[0] = priv->number_up_layout_n_option->choices[0]; + priv->number_up_layout_2_option->choices[1] = priv->number_up_layout_n_option->choices[1]; + priv->number_up_layout_2_option->choices_display[0] = g_strdup ( _("Top to bottom")); + priv->number_up_layout_2_option->choices_display[1] = g_strdup ( _("Bottom to top")); + } } layout = dialog_get_number_up_layout (dialog); @@ -2466,12 +2516,20 @@ update_number_up_layout (GtkPrintUnixDialog *dialog) option = priv->number_up_layout_2_option; if (layout == GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM || - layout == GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP || - layout == GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_LEFT_TO_RIGHT || - layout == GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_LEFT_TO_RIGHT) + layout == GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_LEFT_TO_RIGHT) enum_value = g_enum_get_value (enum_class, GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM); - else + + if (layout == GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP || + layout == GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_LEFT_TO_RIGHT) + enum_value = g_enum_get_value (enum_class, GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP); + + if (layout == GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM || + layout == GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_RIGHT_TO_LEFT) enum_value = g_enum_get_value (enum_class, GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM); + + if (layout == GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_BOTTOM_TO_TOP || + layout == GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_RIGHT_TO_LEFT) + enum_value = g_enum_get_value (enum_class, GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_BOTTOM_TO_TOP); } else { @@ -2748,7 +2806,7 @@ create_job_page (GtkPrintUnixDialog *dialog) 0, 0); gtk_widget_show (table); - /* Translators: this is one of the choices for the print at option + /* Translators: this is one of the choices for the print at option * in the print dialog */ radio = gtk_radio_button_new_with_mnemonic (NULL, _("_Now")); @@ -2757,7 +2815,7 @@ create_job_page (GtkPrintUnixDialog *dialog) gtk_table_attach (GTK_TABLE (table), radio, 0, 2, 0, 1, GTK_FILL, 0, 0, 0); - /* Translators: this is one of the choices for the print at option + /* Translators: this is one of the choices for the print at option * in the print dialog. It also serves as the label for an entry that * allows the user to enter a time. */ @@ -2765,8 +2823,9 @@ create_job_page (GtkPrintUnixDialog *dialog) _("A_t:")); /* Translators: Ability to parse the am/pm format depends on actual locale. - * You can remove the am/pm values below for your locale if they are not supported. - */ + * You can remove the am/pm values below for your locale if they are not + * supported. + */ at_tooltip = _("Specify the time of print,\n e.g. 15:30, 2:35 pm, 14:15:20, 11:46:30 am, 4 pm"); gtk_widget_set_tooltip_text (radio, at_tooltip); priv->print_at_radio = radio; @@ -2777,13 +2836,18 @@ create_job_page (GtkPrintUnixDialog *dialog) entry = gtk_entry_new (); gtk_widget_set_tooltip_text (entry, at_tooltip); + atk_object_set_name (gtk_widget_get_accessible (entry), _("Time of print")); + atk_object_set_description (gtk_widget_get_accessible (entry), at_tooltip); priv->print_at_entry = entry; gtk_widget_show (entry); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_FILL, 0, 0, 0); - /* Translators: this is one of the choices for the print at option + g_signal_connect (radio, "toggled", G_CALLBACK (update_entry_sensitivity), entry); + update_entry_sensitivity (radio, entry); + + /* Translators: this is one of the choices for the print at option * in the print dialog. It means that the print job will not be * printed until it explicitly gets 'released'. */ diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c index 0c1b313b5a..ce4e5e4282 100644 --- a/gtk/gtkrange.c +++ b/gtk/gtkrange.c @@ -990,6 +990,9 @@ gtk_range_set_range (GtkRange *range, value = MIN (value, MAX (range->adjustment->lower, range->layout->fill_level)); + value = CLAMP (value, range->adjustment->lower, + (range->adjustment->upper - range->adjustment->page_size)); + gtk_adjustment_set_value (range->adjustment, value); gtk_adjustment_changed (range->adjustment); } @@ -1014,6 +1017,9 @@ gtk_range_set_value (GtkRange *range, value = MIN (value, MAX (range->adjustment->lower, range->layout->fill_level)); + value = CLAMP (value, range->adjustment->lower, + (range->adjustment->upper - range->adjustment->page_size)); + gtk_adjustment_set_value (range->adjustment, value); } diff --git a/gtk/gtkscale.c b/gtk/gtkscale.c index 87ba227991..87aa469da4 100644 --- a/gtk/gtkscale.c +++ b/gtk/gtkscale.c @@ -38,6 +38,8 @@ #include "gtkbindings.h" #include "gtkprivate.h" #include "gtkintl.h" +#include "gtkbuildable.h" +#include "gtkbuilderprivate.h" #include "gtkalias.h" @@ -56,7 +58,7 @@ typedef struct _GtkScaleMark GtkScaleMark; struct _GtkScaleMark { gdouble value; - const gchar *markup; + gchar *markup; GtkPositionType position; }; @@ -110,8 +112,24 @@ static gboolean gtk_scale_expose (GtkWidget *widget, static void gtk_scale_real_get_layout_offsets (GtkScale *scale, gint *x, gint *y); +static void gtk_scale_buildable_interface_init (GtkBuildableIface *iface); +static gboolean gtk_scale_buildable_custom_tag_start (GtkBuildable *buildable, + GtkBuilder *builder, + GObject *child, + const gchar *tagname, + GMarkupParser *parser, + gpointer *data); +static void gtk_scale_buildable_custom_finished (GtkBuildable *buildable, + GtkBuilder *builder, + GObject *child, + const gchar *tagname, + gpointer user_data); + + +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GtkScale, gtk_scale, GTK_TYPE_RANGE, + G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, + gtk_scale_buildable_interface_init)) -G_DEFINE_ABSTRACT_TYPE (GtkScale, gtk_scale, GTK_TYPE_RANGE) static gboolean single_string_accumulator (GSignalInvocationHint *ihint, @@ -1293,6 +1311,8 @@ gtk_scale_clear_marks (GtkScale *scale) priv->marks = NULL; _gtk_range_set_stop_values (GTK_RANGE (scale), NULL, 0); + + gtk_widget_queue_resize (GTK_WIDGET (scale)); } /** @@ -1349,8 +1369,244 @@ gtk_scale_add_mark (GtkScale *scale, _gtk_range_set_stop_values (GTK_RANGE (scale), values, n); g_free (values); + + gtk_widget_queue_resize (GTK_WIDGET (scale)); } +static GtkBuildableIface *parent_buildable_iface; + +static void +gtk_scale_buildable_interface_init (GtkBuildableIface *iface) +{ + parent_buildable_iface = g_type_interface_peek_parent (iface); + iface->custom_tag_start = gtk_scale_buildable_custom_tag_start; + iface->custom_finished = gtk_scale_buildable_custom_finished; +} + +typedef struct +{ + GtkScale *scale; + GtkBuilder *builder; + GSList *marks; +} MarksSubparserData; + +typedef struct +{ + gdouble value; + GtkPositionType position; + GString *markup; + gchar *context; + gboolean translatable; +} MarkData; + +static void +mark_data_free (MarkData *data) +{ + g_string_free (data->markup, TRUE); + g_free (data->context); + g_slice_free (MarkData, data); +} + +static void +marks_start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **names, + const gchar **values, + gpointer user_data, + GError **error) +{ + MarksSubparserData *parser_data = (MarksSubparserData*)user_data; + guint i; + gint line_number, char_number; + + if (strcmp (element_name, "marks") == 0) + ; + else if (strcmp (element_name, "mark") == 0) + { + gdouble value; + gboolean has_value = FALSE; + GtkPositionType position = GTK_POS_BOTTOM; + const gchar *msg_context = NULL; + gboolean translatable = FALSE; + MarkData *mark; + + for (i = 0; names[i]; i++) + { + if (strcmp (names[i], "translatable") == 0) + { + if (!_gtk_builder_boolean_from_string (values[i], &translatable, error)) + return; + } + else if (strcmp (names[i], "comments") == 0) + { + /* do nothing, comments are for translators */ + } + else if (strcmp (names[i], "context") == 0) + msg_context = values[i]; + else if (strcmp (names[i], "value") == 0) + { + GValue gvalue = { 0, }; + + if (!gtk_builder_value_from_string_type (parser_data->builder, G_TYPE_DOUBLE, values[i], &gvalue, error)) + return; + + value = g_value_get_double (&gvalue); + has_value = TRUE; + } + else if (strcmp (names[i], "position") == 0) + { + GValue gvalue = { 0, }; + + if (!gtk_builder_value_from_string_type (parser_data->builder, GTK_TYPE_POSITION_TYPE, values[i], &gvalue, error)) + return; + + position = g_value_get_enum (&gvalue); + } + else + { + g_markup_parse_context_get_position (context, + &line_number, + &char_number); + g_set_error (error, + GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_INVALID_ATTRIBUTE, + "%s:%d:%d '%s' is not a valid attribute of <%s>", + "", + line_number, char_number, names[i], "mark"); + return; + } + } + + if (!has_value) + { + g_markup_parse_context_get_position (context, + &line_number, + &char_number); + g_set_error (error, + GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_MISSING_ATTRIBUTE, + "%s:%d:%d <%s> requires attribute \"%s\"", + "", + line_number, char_number, "mark", + "value"); + return; + } + + mark = g_slice_new (MarkData); + mark->value = value; + mark->position = position; + mark->markup = g_string_new (""); + mark->context = g_strdup (msg_context); + mark->translatable = translatable; + + parser_data->marks = g_slist_prepend (parser_data->marks, mark); + } + else + { + g_markup_parse_context_get_position (context, + &line_number, + &char_number); + g_set_error (error, + GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_MISSING_ATTRIBUTE, + "%s:%d:%d unsupported tag for GtkScale: \"%s\"", + "", + line_number, char_number, element_name); + return; + } +} + +static void +marks_text (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + MarksSubparserData *data = (MarksSubparserData*)user_data; + + if (strcmp (g_markup_parse_context_get_element (context), "mark") == 0) + { + MarkData *mark = data->marks->data; + + g_string_append_len (mark->markup, text, text_len); + } +} + +static const GMarkupParser marks_parser = + { + marks_start_element, + NULL, + marks_text, + }; + + +static gboolean +gtk_scale_buildable_custom_tag_start (GtkBuildable *buildable, + GtkBuilder *builder, + GObject *child, + const gchar *tagname, + GMarkupParser *parser, + gpointer *data) +{ + MarksSubparserData *parser_data; + + if (child) + return FALSE; + + if (strcmp (tagname, "marks") == 0) + { + parser_data = g_slice_new0 (MarksSubparserData); + parser_data->scale = GTK_SCALE (buildable); + parser_data->marks = NULL; + + *parser = marks_parser; + *data = parser_data; + return TRUE; + } + + return parent_buildable_iface->custom_tag_start (buildable, builder, child, + tagname, parser, data); +} + +static void +gtk_scale_buildable_custom_finished (GtkBuildable *buildable, + GtkBuilder *builder, + GObject *child, + const gchar *tagname, + gpointer user_data) +{ + GtkScale *scale = GTK_SCALE (buildable); + MarksSubparserData *marks_data; + GtkWidget *toplevel; + + if (strcmp (tagname, "marks") == 0) + { + GSList *m; + gchar *markup; + + marks_data = (MarksSubparserData *)user_data; + + for (m = marks_data->marks; m; m = m->next) + { + MarkData *mdata = m->data; + + if (mdata->translatable && mdata->markup->len) + markup = _gtk_builder_parser_translate (gtk_builder_get_translation_domain (builder), + mdata->context, + mdata->markup->str); + else + markup = mdata->markup->str; + + gtk_scale_add_mark (scale, mdata->value, mdata->position, markup); + + mark_data_free (mdata); + } + + g_slist_free (marks_data->marks); + g_slice_free (MarksSubparserData, marks_data); + } +} #define __GTK_SCALE_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index b1b4184396..e1ef6333bb 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -1190,6 +1190,8 @@ gtk_scrolled_window_scroll_child (GtkScrolledWindow *scrolled_window, break; } + value = CLAMP (value, adjustment->lower, adjustment->upper - adjustment->page_size); + gtk_adjustment_set_value (adjustment, value); return TRUE; @@ -1573,11 +1575,13 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget, if (range && GTK_WIDGET_VISIBLE (range)) { GtkAdjustment *adj = GTK_RANGE (range)->adjustment; - gdouble delta; + gdouble delta, new_value; delta = _gtk_range_get_wheel_delta (GTK_RANGE (range), event->direction); - gtk_adjustment_set_value (adj, adj->value + delta); + new_value = CLAMP (adj->value + delta, adj->lower, adj->upper - adj->page_size); + + gtk_adjustment_set_value (adj, new_value); return TRUE; } diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c index 6b22c32cc7..7195b86a51 100644 --- a/gtk/gtkselection.c +++ b/gtk/gtkselection.c @@ -94,6 +94,7 @@ enum { MULTIPLE, TARGETS, TIMESTAMP, + SAVE_TARGETS, LAST_ATOM }; @@ -2172,6 +2173,7 @@ gtk_selection_init (void) gtk_selection_atoms[MULTIPLE] = gdk_atom_intern_static_string ("MULTIPLE"); gtk_selection_atoms[TIMESTAMP] = gdk_atom_intern_static_string ("TIMESTAMP"); gtk_selection_atoms[TARGETS] = gdk_atom_intern_static_string ("TARGETS"); + gtk_selection_atoms[SAVE_TARGETS] = gdk_atom_intern_static_string ("SAVE_TARGETS"); initialize = FALSE; } @@ -2377,7 +2379,6 @@ _gtk_selection_request (GtkWidget *widget, #endif gtk_selection_invoke_handler (widget, &data, event->time); - if (data.length < 0) { info->conversions[i].property = GDK_NONE; @@ -2968,7 +2969,8 @@ gtk_selection_invoke_handler (GtkWidget *widget, g_return_if_fail (widget != NULL); target_list = gtk_selection_target_list_get (widget, data->selection); - if (target_list && + if (data->target != gtk_selection_atoms[SAVE_TARGETS] && + target_list && gtk_target_list_find (target_list, data->target, &info)) { g_signal_emit_by_name (widget, @@ -3061,6 +3063,12 @@ gtk_selection_default_handler (GtkWidget *widget, tmp_list = tmp_list->next; } } + else if (data->target == gtk_selection_atoms[SAVE_TARGETS]) + { + gtk_selection_data_set (data, + gdk_atom_intern_static_string ("NULL"), + 32, "", 0); + } else { data->length = -1; diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c index 836214b97b..a61ea841ec 100644 --- a/gtk/gtkspinbutton.c +++ b/gtk/gtkspinbutton.c @@ -1692,6 +1692,13 @@ gtk_spin_button_new_with_range (gdouble min, return GTK_WIDGET (spin); } +static void +warn_nonzero_page_size (GtkAdjustment *adjustment) +{ + if (gtk_adjustment_get_page_size (adjustment) != 0.0) + g_warning ("GtkSpinButton: setting an adjustment with non-zero page size is deprecated"); +} + /* Callback used when the spin button's adjustment changes. We need to redraw * the arrows when the adjustment's range changes, and reevaluate our size request. */ @@ -1703,6 +1710,7 @@ adjustment_changed_cb (GtkAdjustment *adjustment, gpointer data) spin_button = GTK_SPIN_BUTTON (data); spin_button->timer_step = spin_button->adjustment->step_increment; + warn_nonzero_page_size (adjustment); gtk_widget_queue_resize (GTK_WIDGET (spin_button)); } @@ -1742,6 +1750,7 @@ gtk_spin_button_set_adjustment (GtkSpinButton *spin_button, G_CALLBACK (adjustment_changed_cb), spin_button); spin_button->timer_step = spin_button->adjustment->step_increment; + warn_nonzero_page_size (adjustment); } gtk_widget_queue_resize (GTK_WIDGET (spin_button)); diff --git a/gtk/gtktextlayout.c b/gtk/gtktextlayout.c index 156503a506..319b8ce645 100644 --- a/gtk/gtktextlayout.c +++ b/gtk/gtktextlayout.c @@ -147,6 +147,16 @@ static void gtk_text_layout_buffer_delete_range (GtkTextBuffer *textbuffer, static void gtk_text_layout_update_cursor_line (GtkTextLayout *layout); +static void line_display_index_to_iter (GtkTextLayout *layout, + GtkTextLineDisplay *display, + GtkTextIter *iter, + gint index, + gint trailing); + +static gint line_display_iter_to_index (GtkTextLayout *layout, + GtkTextLineDisplay *display, + const GtkTextIter *iter); + enum { INVALIDATED, CHANGED, @@ -1800,49 +1810,59 @@ static void allocate_child_widgets (GtkTextLayout *text_layout, GtkTextLineDisplay *display) { - GSList *shaped = display->shaped_objects; PangoLayout *layout = display->layout; - PangoLayoutIter *iter; + PangoLayoutIter *run_iter; - iter = pango_layout_get_iter (layout); + run_iter = pango_layout_get_iter (layout); do { - PangoLayoutRun *run = pango_layout_iter_get_run_readonly (iter); - + PangoLayoutRun *run = pango_layout_iter_get_run_readonly (run_iter); + if (run && is_shape (run)) { - GObject *shaped_object = shaped->data; - shaped = shaped->next; - - /* shaped_object is NULL for child anchors with no - * widgets stored at them + gint byte_index; + GtkTextIter text_iter; + GtkTextChildAnchor *anchor = 0; + GList *widgets = 0; + + /* The pango iterator iterates in visual order. + * We use the byte index to find the child widget. */ - if (GTK_IS_WIDGET (shaped_object)) + + byte_index = pango_layout_iter_get_index (run_iter); + line_display_index_to_iter (text_layout, display, &text_iter, byte_index, 0); + anchor = gtk_text_iter_get_child_anchor (&text_iter); + widgets = gtk_text_child_anchor_get_widgets (anchor); + + if (widgets) { PangoRectangle extents; + GtkWidget *child = widgets->data; /* We emit "allocate_child" with the x,y of * the widget with respect to the top of the line * and the left side of the buffer */ - pango_layout_iter_get_run_extents (iter, + pango_layout_iter_get_run_extents (run_iter, NULL, &extents); g_signal_emit (text_layout, signals[ALLOCATE_CHILD], 0, - shaped_object, + child, PANGO_PIXELS (extents.x) + display->x_offset, PANGO_PIXELS (extents.y) + display->top_margin); + + g_list_free (widgets); } } } - while (pango_layout_iter_next_run (iter)); + while (pango_layout_iter_next_run (run_iter)); - pango_layout_iter_free (iter); + pango_layout_iter_free (run_iter); } static void diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 97e1433098..bf2d4b12b6 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -6452,9 +6452,9 @@ gtk_text_view_destroy_layout (GtkTextView *text_view) invalidated_handler, text_view); g_signal_handlers_disconnect_by_func (text_view->layout, - changed_handler, + changed_handler, text_view); - + /* Remove layout from all anchored children */ tmp_list = text_view->children; while (tmp_list != NULL) @@ -6469,7 +6469,7 @@ gtk_text_view_destroy_layout (GtkTextView *text_view) tmp_list = g_slist_next (tmp_list); } - + gtk_text_view_stop_cursor_blink (text_view); gtk_text_view_end_selection_drag (text_view); @@ -7269,7 +7269,7 @@ gtk_text_view_commit_text (GtkTextView *text_view, if (!had_selection && text_view->overwrite_mode) { GtkTextIter insert; - + gtk_text_buffer_get_iter_at_mark (get_buffer (text_view), &insert, gtk_text_buffer_get_insert (get_buffer (text_view))); @@ -7301,12 +7301,12 @@ gtk_text_view_preedit_changed_handler (GtkIMContext *context, gint cursor_pos; GtkTextIter iter; - gtk_text_buffer_get_iter_at_mark (text_view->buffer, &iter, + gtk_text_buffer_get_iter_at_mark (text_view->buffer, &iter, gtk_text_buffer_get_insert (text_view->buffer)); - /* Keypress events are passed to input method even if cursor position is not editable; - * so beep here if it's multi-key input sequence, input method will be reset in - * key-press-event handler. + /* Keypress events are passed to input method even if cursor position is + * not editable; so beep here if it's multi-key input sequence, input + * method will be reset in key-press-event handler. */ gtk_im_context_get_preedit_string (context, &str, &attrs, &cursor_pos); @@ -7316,7 +7316,8 @@ gtk_text_view_preedit_changed_handler (GtkIMContext *context, goto out; } - gtk_text_layout_set_preedit_string (text_view->layout, str, attrs, cursor_pos); + if (text_view->layout) + gtk_text_layout_set_preedit_string (text_view->layout, str, attrs, cursor_pos); if (GTK_WIDGET_HAS_FOCUS (text_view)) gtk_text_view_scroll_mark_onscreen (text_view, gtk_text_buffer_get_insert (get_buffer (text_view))); @@ -7335,7 +7336,7 @@ gtk_text_view_retrieve_surrounding_handler (GtkIMContext *context, gint pos; gchar *text; - gtk_text_buffer_get_iter_at_mark (text_view->buffer, &start, + gtk_text_buffer_get_iter_at_mark (text_view->buffer, &start, gtk_text_buffer_get_insert (text_view->buffer)); end = start; @@ -7359,7 +7360,7 @@ gtk_text_view_delete_surrounding_handler (GtkIMContext *context, GtkTextIter start; GtkTextIter end; - gtk_text_buffer_get_iter_at_mark (text_view->buffer, &start, + gtk_text_buffer_get_iter_at_mark (text_view->buffer, &start, gtk_text_buffer_get_insert (text_view->buffer)); end = start; diff --git a/gtk/gtktooltip.c b/gtk/gtktooltip.c index af733b7a65..77e47772cd 100644 --- a/gtk/gtktooltip.c +++ b/gtk/gtktooltip.c @@ -182,6 +182,7 @@ gtk_tooltip_finalize (GObject *object) tooltip->browse_mode_timeout_id = 0; } + gtk_tooltip_set_custom (tooltip, NULL); gtk_tooltip_set_last_window (tooltip, NULL); if (tooltip->window) @@ -333,12 +334,15 @@ gtk_tooltip_set_icon_from_icon_name(GtkTooltip *tooltip, /** * gtk_tooltip_set_custom: * @tooltip: a #GtkTooltip - * @custom_widget: a #GtkWidget + * @custom_widget: a #GtkWidget, or %NULL to unset the old custom widget. * - * Replaces the widget packed into the tooltip with @custom_widget. + * Replaces the widget packed into the tooltip with + * @custom_widget. @custom_widget does not get destroyed when the tooltip goes + * away. * By default a box with a #GtkImage and #GtkLabel is embedded in * the tooltip, which can be configured using gtk_tooltip_set_markup() * and gtk_tooltip_set_icon(). + * * Since: 2.12 */ diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 5078cdb8dc..caa517c07a 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -3620,6 +3620,7 @@ gtk_tree_view_vertical_autoscroll (GtkTreeView *tree_view) GdkRectangle visible_rect; gint y; gint offset; + gfloat value; gdk_window_get_pointer (tree_view->priv->bin_window, NULL, &y, NULL); y += tree_view->priv->dy; @@ -3635,8 +3636,9 @@ gtk_tree_view_vertical_autoscroll (GtkTreeView *tree_view) return; } - gtk_adjustment_set_value (tree_view->priv->vadjustment, - MAX (tree_view->priv->vadjustment->value + offset, 0.0)); + value = CLAMP (tree_view->priv->vadjustment->value + offset, 0.0, + tree_view->priv->vadjustment->upper - tree_view->priv->vadjustment->page_size); + gtk_adjustment_set_value (tree_view->priv->vadjustment, value); } static gboolean @@ -3645,6 +3647,7 @@ gtk_tree_view_horizontal_autoscroll (GtkTreeView *tree_view) GdkRectangle visible_rect; gint x; gint offset; + gfloat value; gdk_window_get_pointer (tree_view->priv->bin_window, &x, NULL, NULL); @@ -3660,8 +3663,9 @@ gtk_tree_view_horizontal_autoscroll (GtkTreeView *tree_view) } offset = offset/3; - gtk_adjustment_set_value (tree_view->priv->hadjustment, - MAX (tree_view->priv->hadjustment->value + offset, 0.0)); + value = CLAMP (tree_view->priv->hadjustment->value + offset, + 0.0, tree_view->priv->hadjustment->upper - tree_view->priv->hadjustment->page_size); + gtk_adjustment_set_value (tree_view->priv->hadjustment, value); return TRUE; @@ -8964,7 +8968,11 @@ gtk_tree_view_clamp_column_visible (GtkTreeView *tree_view, } } - gtk_adjustment_set_value (tree_view->priv->hadjustment, x); + gtk_adjustment_set_value (tree_view->priv->hadjustment, + CLAMP (x, + tree_view->priv->hadjustment->lower, + tree_view->priv->hadjustment->upper + - tree_view->priv->hadjustment->page_size)); } else { @@ -11613,9 +11621,9 @@ gtk_tree_view_scroll_to_point (GtkTreeView *tree_view, vadj = tree_view->priv->vadjustment; if (tree_x != -1) - gtk_adjustment_set_value (hadj, tree_x); + gtk_adjustment_set_value (hadj, CLAMP (tree_x, hadj->lower, hadj->upper - hadj->page_size)); if (tree_y != -1) - gtk_adjustment_set_value (vadj, tree_y); + gtk_adjustment_set_value (vadj, CLAMP (tree_y, vadj->lower, vadj->upper - vadj->page_size)); } /** diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 76be04fe5b..16fdc2b61c 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -8174,14 +8174,14 @@ gboolean _gtk_widget_is_pointer_widget (GtkWidget *widget) { if (GTK_WIDGET_HAS_POINTER (widget)) - { - GdkWindow *win; + { + GdkWindow *win; GtkWidget *wid; win = _gtk_widget_get_pointer_window (widget); if (win) - { - gdk_window_get_user_data (win, &wid); + { + gdk_window_get_user_data (win, (gpointer *)&wid); if (wid == widget) return TRUE; } @@ -9466,12 +9466,16 @@ gtk_widget_buildable_set_buildable_property (GtkBuildable *buildable, g_object_set_property (G_OBJECT (buildable), name, value); } -typedef struct { +typedef struct +{ gchar *action_name; - gchar *description; + GString *description; + gchar *context; + gboolean translatable; } AtkActionData; - -typedef struct { + +typedef struct +{ gchar *target; gchar *type; } AtkRelationData; @@ -9480,7 +9484,8 @@ static void free_action (AtkActionData *data, gpointer user_data) { g_free (data->action_name); - g_free (data->description); + g_string_free (data->description, TRUE); + g_free (data->context); g_slice_free (AtkActionData, data); } @@ -9497,7 +9502,7 @@ gtk_widget_buildable_parser_finished (GtkBuildable *buildable, GtkBuilder *builder) { GSList *atk_relations; - + if (g_object_get_qdata (G_OBJECT (buildable), quark_builder_has_default)) gtk_widget_grab_default (GTK_WIDGET (buildable)); if (g_object_get_qdata (G_OBJECT (buildable), quark_builder_has_focus)) @@ -9513,14 +9518,14 @@ gtk_widget_buildable_parser_finished (GtkBuildable *buildable, GObject *target; AtkRelationType relation_type; AtkObject *target_accessible; - + accessible = gtk_widget_get_accessible (GTK_WIDGET (buildable)); relation_set = atk_object_ref_relation_set (accessible); for (l = atk_relations; l; l = l->next) { AtkRelationData *relation = (AtkRelationData*)l->data; - + target = gtk_builder_get_object (builder, relation->target); if (!target) { @@ -9530,7 +9535,7 @@ gtk_widget_buildable_parser_finished (GtkBuildable *buildable, } target_accessible = gtk_widget_get_accessible (GTK_WIDGET (target)); g_assert (target_accessible != NULL); - + relation_type = atk_relation_type_for_name (relation->type); if (relation_type == ATK_RELATION_NULL) { @@ -9548,21 +9553,21 @@ gtk_widget_buildable_parser_finished (GtkBuildable *buildable, g_object_set_qdata (G_OBJECT (buildable), quark_builder_atk_relations, NULL); } - } -typedef struct { +typedef struct +{ GSList *actions; GSList *relations; } AccessibilitySubParserData; static void -accessibility_start_element (GMarkupParseContext *context, - const gchar *element_name, - const gchar **names, - const gchar **values, - gpointer user_data, - GError **error) +accessibility_start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **names, + const gchar **values, + gpointer user_data, + GError **error) { AccessibilitySubParserData *data = (AccessibilitySubParserData*)user_data; guint i; @@ -9573,7 +9578,7 @@ accessibility_start_element (GMarkupParseContext *context, gchar *target = NULL; gchar *type = NULL; AtkRelationData *relation; - + for (i = 0; names[i]; i++) { if (strcmp (names[i], "target") == 0) @@ -9617,21 +9622,34 @@ accessibility_start_element (GMarkupParseContext *context, relation = g_slice_new (AtkRelationData); relation->target = target; relation->type = type; - + data->relations = g_slist_prepend (data->relations, relation); } else if (strcmp (element_name, "action") == 0) { - gchar *action_name = NULL; - gchar *description = NULL; + const gchar *action_name = NULL; + const gchar *description = NULL; + const gchar *msg_context = NULL; + gboolean translatable = FALSE; AtkActionData *action; - + for (i = 0; names[i]; i++) { if (strcmp (names[i], "action_name") == 0) - action_name = g_strdup (values[i]); + action_name = values[i]; else if (strcmp (names[i], "description") == 0) - description = g_strdup (values[i]); + description = values[i]; + else if (strcmp (names[i], "translatable") == 0) + { + if (!_gtk_builder_boolean_from_string (values[i], &translatable, error)) + return; + } + else if (strcmp (names[i], "comments") == 0) + { + /* do nothing, comments are for translators */ + } + else if (strcmp (names[i], "context") == 0) + msg_context = values[i]; else { g_markup_parse_context_get_position (context, @@ -9643,13 +9661,11 @@ accessibility_start_element (GMarkupParseContext *context, "%s:%d:%d '%s' is not a valid attribute of <%s>", "", line_number, char_number, names[i], "action"); - g_free (action_name); - g_free (description); return; } } - if (!action_name || !description) + if (!action_name) { g_markup_parse_context_get_position (context, &line_number, @@ -9660,16 +9676,16 @@ accessibility_start_element (GMarkupParseContext *context, "%s:%d:%d <%s> requires attribute \"%s\"", "", line_number, char_number, "action", - description ? "action_name" : "description"); - g_free (action_name); - g_free (description); + "action_name"); return; } action = g_slice_new (AtkActionData); - action->action_name = action_name; - action->description = description; - + action->action_name = g_strdup (action_name); + action->description = g_string_new (description); + action->context = g_strdup (msg_context); + action->translatable = translatable; + data->actions = g_slist_prepend (data->actions, action); } else if (strcmp (element_name, "accessibility") == 0) @@ -9678,12 +9694,32 @@ accessibility_start_element (GMarkupParseContext *context, g_warning ("Unsupported tag for GtkWidget: %s\n", element_name); } +static void +accessibility_text (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + AccessibilitySubParserData *data = (AccessibilitySubParserData*)user_data; + + if (strcmp (g_markup_parse_context_get_element (context), "action") == 0) + { + AtkActionData *action = data->actions->data; + + g_string_append_len (action->description, text, text_len); + } +} + static const GMarkupParser accessibility_parser = { accessibility_start_element, + NULL, + accessibility_text, }; -typedef struct { +typedef struct +{ GObject *object; guint key; guint modifiers; @@ -9691,12 +9727,12 @@ typedef struct { } AccelGroupParserData; static void -accel_group_start_element (GMarkupParseContext *context, - const gchar *element_name, - const gchar **names, - const gchar **values, - gpointer user_data, - GError **error) +accel_group_start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **names, + const gchar **values, + gpointer user_data, + GError **error) { gint i; guint key = 0; @@ -9817,26 +9853,36 @@ gtk_widget_buildable_custom_finished (GtkBuildable *buildable, AtkAction *action; gint i, n_actions; GSList *l; - + accessible = gtk_widget_get_accessible (GTK_WIDGET (buildable)); - + action = ATK_ACTION (accessible); - n_actions = atk_action_get_n_actions (action); - + n_actions = atk_action_get_n_actions (action); + for (l = a11y_data->actions; l; l = l->next) { AtkActionData *action_data = (AtkActionData*)l->data; - + for (i = 0; i < n_actions; i++) if (strcmp (atk_action_get_name (action, i), action_data->action_name) == 0) break; if (i < n_actions) - atk_action_set_description (action, i, - action_data->description); + { + gchar *description; + + if (action_data->translatable && action_data->description->len) + description = _gtk_builder_parser_translate (gtk_builder_get_translation_domain (builder), + action_data->context, + action_data->description->str); + else + description = action_data->description->str; + + atk_action_set_description (action, i, description); + } } - + g_slist_foreach (a11y_data->actions, (GFunc)free_action, NULL); g_slist_free (a11y_data->actions); } @@ -9844,9 +9890,8 @@ gtk_widget_buildable_custom_finished (GtkBuildable *buildable, if (a11y_data->relations) g_object_set_qdata (G_OBJECT (buildable), quark_builder_atk_relations, a11y_data->relations); - + g_slice_free (AccessibilitySubParserData, a11y_data); - } } diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 1847039999..1238c2295c 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -395,7 +395,8 @@ extract_time_from_startup_id (const gchar* startup_id) /* Skip past the "_TIME" part */ timestr += 5; - + + errno = 0; timestamp = strtoul (timestr, &end, 0); if (end != timestr && errno == 0) retval = timestamp; @@ -1499,18 +1500,21 @@ gtk_window_set_startup_id (GtkWindow *window, g_free (priv->startup_id); priv->startup_id = g_strdup (startup_id); - + if (GTK_WIDGET_REALIZED (window)) { + guint32 timestamp = extract_time_from_startup_id (priv->startup_id); + +#ifdef GDK_WINDOWING_X11 + if (timestamp != GDK_CURRENT_TIME) + gdk_x11_window_set_user_time (GTK_WIDGET (window)->window, timestamp); +#endif + /* Here we differentiate real and "fake" startup notification IDs, * constructed on purpose just to pass interaction timestamp - */ + */ if (startup_id_is_fake (priv->startup_id)) - { - guint32 timestamp = extract_time_from_startup_id (priv->startup_id); - - gtk_window_present_with_time (window, timestamp); - } + gtk_window_present_with_time (window, timestamp); else { gdk_window_set_startup_id (GTK_WIDGET (window)->window, @@ -8330,9 +8334,9 @@ _gtk_window_set_is_toplevel (GtkWindow *window, gboolean is_toplevel) { if (GTK_WIDGET_TOPLEVEL (window)) - g_assert (g_list_find (toplevel_list, window) != NULL); + g_assert (g_slist_find (toplevel_list, window) != NULL); else - g_assert (g_list_find (toplevel_list, window) == NULL); + g_assert (g_slist_find (toplevel_list, window) == NULL); if (is_toplevel == GTK_WIDGET_TOPLEVEL (window)) return; diff --git a/gtk/tests/Makefile.am b/gtk/tests/Makefile.am index f36d5e5383..4c8ff1f1a6 100644 --- a/gtk/tests/Makefile.am +++ b/gtk/tests/Makefile.am @@ -77,3 +77,5 @@ defaultvalue_LDADD = $(progs_ldadd) TEST_PROGS += textbuffer textbuffer_SOURCES = textbuffer.c pixbuf-init.c textbuffer_LDADD = $(progs_ldadd) + +-include $(top_srcdir)/git.mk diff --git a/gtk/tests/builder.c b/gtk/tests/builder.c index 7a3162969d..7b2cc19b60 100644 --- a/gtk/tests/builder.c +++ b/gtk/tests/builder.c @@ -44,10 +44,18 @@ builder_new_from_string (const gchar *buffer, const gchar *domain) { GtkBuilder *builder; + GError *error = NULL; + builder = gtk_builder_new (); if (domain) gtk_builder_set_translation_domain (builder, domain); - gtk_builder_add_from_string (builder, buffer, length, NULL); + gtk_builder_add_from_string (builder, buffer, length, &error); + if (error) + { + g_print ("ERROR: %s", error->message); + g_error_free (error); + } + return builder; } @@ -784,7 +792,7 @@ test_spin_button (void) "10" "2" "3" - "5" + "0" "1" "" "" @@ -812,7 +820,7 @@ test_spin_button (void) g_object_get (adjustment, "page-increment", &value, NULL); g_assert (value == 3); g_object_get (adjustment, "page-size", &value, NULL); - g_assert (value == 5); + g_assert (value == 0); g_object_unref (builder); } @@ -1580,6 +1588,7 @@ test_widget (void) " " " " " " + " Sniff" " " " " " " diff --git a/gtk/theme-bits/Makefile.am b/gtk/theme-bits/Makefile.am index eb24bfc76c..4ad04978a4 100644 --- a/gtk/theme-bits/Makefile.am +++ b/gtk/theme-bits/Makefile.am @@ -11,3 +11,5 @@ decompose_bits_SOURCES = decompose-bits.c decompose_bits_LDADD = $(top_builddir)/gdk-pixbuf/libgdk_pixbuf-$(GTK_API_VERSION).la EXTRA_DIST += check-13.png check-13-inconsistent.png radio-13.png radio-13-inconsistent.png + +-include $(top_srcdir)/git.mk diff --git a/gtk/updateiconcache.c b/gtk/updateiconcache.c index f61291ef12..f6a5cfff20 100644 --- a/gtk/updateiconcache.c +++ b/gtk/updateiconcache.c @@ -1438,6 +1438,7 @@ build_cache (const gchar *path) struct utimbuf utime_buf; GList *directories = NULL; int fd; + int retry_count = 0; #ifndef G_OS_WIN32 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; #else @@ -1450,8 +1451,15 @@ build_cache (const gchar *path) tmp_cache_path = g_build_filename (path, "."CACHE_NAME, NULL); cache_path = g_build_filename (path, CACHE_NAME, NULL); +opentmp: if ((fd = g_open (tmp_cache_path, O_WRONLY | O_CREAT | O_EXCL | O_TRUNC | _O_BINARY, mode)) == -1) { + if (force_update && retry_count == 0) + { + retry_count++; + g_remove (tmp_cache_path); + goto opentmp; + } g_printerr (_("Failed to open file %s : %s\n"), tmp_cache_path, g_strerror (errno)); exit (1); } @@ -1497,7 +1505,7 @@ build_cache (const gchar *path) if (!validate_file (tmp_cache_path)) { g_printerr (_("The generated cache was invalid.\n")); - //g_unlink (tmp_cache_path); + /*g_unlink (tmp_cache_path);*/ exit (1); } diff --git a/m4macros/Makefile.am b/m4macros/Makefile.am index ad797d84cb..82cd07ea66 100644 --- a/m4macros/Makefile.am +++ b/m4macros/Makefile.am @@ -6,3 +6,5 @@ EXTRA_DIST += $(installed_m4) m4datadir = $(datadir)/aclocal m4data_DATA = $(installed_m4) + +-include $(top_srcdir)/git.mk diff --git a/modules/Makefile.am b/modules/Makefile.am index 86a89af3c7..40d5fa5fd1 100644 --- a/modules/Makefile.am +++ b/modules/Makefile.am @@ -5,3 +5,5 @@ SUBDIRS = input engines other if OS_UNIX SUBDIRS += printbackends endif + +-include $(top_srcdir)/git.mk diff --git a/modules/engines/Makefile.am b/modules/engines/Makefile.am index eb8a899e75..7f65239551 100644 --- a/modules/engines/Makefile.am +++ b/modules/engines/Makefile.am @@ -5,3 +5,5 @@ wimp = ms-windows endif SUBDIRS = $(wimp) pixbuf + +-include $(top_srcdir)/git.mk diff --git a/modules/engines/ms-windows/Makefile.am b/modules/engines/ms-windows/Makefile.am index 975d061c00..541bf9e8b2 100644 --- a/modules/engines/ms-windows/Makefile.am +++ b/modules/engines/ms-windows/Makefile.am @@ -36,3 +36,5 @@ libwimp_la_LDFLAGS = \ -avoid-version -module -no-undefined -export-dynamic libwimp_la_LIBADD = $(LDADDS) -lgdi32 + +-include $(top_srcdir)/git.mk diff --git a/modules/engines/ms-windows/Theme/Makefile.am b/modules/engines/ms-windows/Theme/Makefile.am index 59f4176450..e7fad20372 100644 --- a/modules/engines/ms-windows/Theme/Makefile.am +++ b/modules/engines/ms-windows/Theme/Makefile.am @@ -1,3 +1,5 @@ include $(top_srcdir)/Makefile.decl SUBDIRS=gtk-2.0 + +-include $(top_srcdir)/git.mk diff --git a/modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am b/modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am index 8957184ee4..a03371f4a7 100644 --- a/modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am +++ b/modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am @@ -4,3 +4,5 @@ themedir = $(datadir)/themes/MS-Windows/gtk-2.0 theme_DATA=gtkrc EXTRA_DIST += $(theme_DATA) + +-include $(top_srcdir)/git.mk diff --git a/modules/engines/pixbuf/Makefile.am b/modules/engines/pixbuf/Makefile.am index df50cba67a..f90bdd5532 100644 --- a/modules/engines/pixbuf/Makefile.am +++ b/modules/engines/pixbuf/Makefile.am @@ -33,3 +33,5 @@ libpixmap_la_SOURCES = \ libpixmap_la_LDFLAGS = -avoid-version -module $(no_undefined) libpixmap_la_LIBADD = $(LDADDS) + +-include $(top_srcdir)/git.mk diff --git a/modules/input/Makefile.am b/modules/input/Makefile.am index 0613d049a0..9a1bf2e861 100644 --- a/modules/input/Makefile.am +++ b/modules/input/Makefile.am @@ -248,3 +248,5 @@ if CROSS_COMPILING else all-local: gtk.immodules endif + +-include $(top_srcdir)/git.mk diff --git a/modules/other/Makefile.am b/modules/other/Makefile.am index a4fd2c92f8..5b647d66d1 100644 --- a/modules/other/Makefile.am +++ b/modules/other/Makefile.am @@ -1,3 +1,5 @@ include $(top_srcdir)/Makefile.decl SUBDIRS = gail + +-include $(top_srcdir)/git.mk diff --git a/modules/other/gail/Makefile.am b/modules/other/gail/Makefile.am index 24d0d58ffc..6ffe591db2 100644 --- a/modules/other/gail/Makefile.am +++ b/modules/other/gail/Makefile.am @@ -168,3 +168,5 @@ libgail_la_LDFLAGS = \ -rpath $(moduledir) -module -avoid-version \ $(no_undefined) \ $(LDFLAGS) + +-include $(top_srcdir)/git.mk diff --git a/modules/other/gail/gailbutton.c b/modules/other/gail/gailbutton.c index 01c6778f4b..b8ab7cd77d 100644 --- a/modules/other/gail/gailbutton.c +++ b/modules/other/gail/gailbutton.c @@ -889,9 +889,7 @@ gail_button_ref_state_set (AtkObject *obj) if (GTK_WIDGET_STATE (widget) == GTK_STATE_ACTIVE) atk_state_set_add_state (state_set, ATK_STATE_ARMED); - if (GTK_WIDGET_CAN_FOCUS(widget)) - atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE); - else + if (!GTK_WIDGET_CAN_FOCUS(widget)) atk_state_set_remove_state (state_set, ATK_STATE_SELECTABLE); diff --git a/modules/other/gail/gailcombobox.c b/modules/other/gail/gailcombobox.c index 82962a53a7..b90e7cc199 100644 --- a/modules/other/gail/gailcombobox.c +++ b/modules/other/gail/gailcombobox.c @@ -138,6 +138,7 @@ gail_combo_box_changed_gtk (GtkWidget *widget) if (gail_combo_box->old_selection != index) { gail_combo_box->old_selection = index; + g_object_notify (G_OBJECT (obj), "accessible-name"); g_signal_emit_by_name (obj, "selection_changed"); } } diff --git a/modules/other/gail/libgail-util/Makefile.am b/modules/other/gail/libgail-util/Makefile.am index 856a6c01a9..3145719b56 100644 --- a/modules/other/gail/libgail-util/Makefile.am +++ b/modules/other/gail/libgail-util/Makefile.am @@ -80,3 +80,5 @@ gailutil.lib: libgailutil.la gailutil.def install-data-local: install-ms-lib install-def-file uninstall-local: uninstall-ms-lib uninstall-def-file + +-include $(top_srcdir)/git.mk diff --git a/modules/other/gail/tests/Makefile.am b/modules/other/gail/tests/Makefile.am index aaa6389396..993249558a 100644 --- a/modules/other/gail/tests/Makefile.am +++ b/modules/other/gail/tests/Makefile.am @@ -269,3 +269,5 @@ libtestvalues_la_LDFLAGS = \ $(top_builddir)/gdk/$(gdktargetlib) \ $(GTK_DEP_LIBS) \ $(LDFLAGS) + +-include $(top_srcdir)/git.mk diff --git a/modules/printbackends/Makefile.am b/modules/printbackends/Makefile.am index 5b8981932c..43468a6264 100644 --- a/modules/printbackends/Makefile.am +++ b/modules/printbackends/Makefile.am @@ -10,4 +10,10 @@ if TEST_PRINT_BACKEND SUBDIRS += test endif -DIST_SUBDIRS = cups file lpr test +if HAVE_PAPI +SUBDIRS += papi +endif + +DIST_SUBDIRS = cups file lpr test papi + +-include $(top_srcdir)/git.mk diff --git a/modules/printbackends/cups/Makefile.am b/modules/printbackends/cups/Makefile.am index 22c0f349f3..463199e829 100644 --- a/modules/printbackends/cups/Makefile.am +++ b/modules/printbackends/cups/Makefile.am @@ -36,3 +36,5 @@ noinst_HEADERS = \ libprintbackend_cups_la_LDFLAGS = -avoid-version -module $(no_undefined) libprintbackend_cups_la_LIBADD = $(LDADDS) $(CUPS_LIBS) + +-include $(top_srcdir)/git.mk diff --git a/modules/printbackends/cups/gtkcupsutils.c b/modules/printbackends/cups/gtkcupsutils.c index 363f8f52e7..bcd03dc4be 100644 --- a/modules/printbackends/cups/gtkcupsutils.c +++ b/modules/printbackends/cups/gtkcupsutils.c @@ -39,10 +39,12 @@ static void _post_send (GtkCupsRequest *request); static void _post_write_request (GtkCupsRequest *request); static void _post_write_data (GtkCupsRequest *request); static void _post_check (GtkCupsRequest *request); +static void _post_auth (GtkCupsRequest *request); static void _post_read_response (GtkCupsRequest *request); static void _get_send (GtkCupsRequest *request); static void _get_check (GtkCupsRequest *request); +static void _get_auth (GtkCupsRequest *request); static void _get_read_data (GtkCupsRequest *request); struct _GtkCupsResult @@ -69,6 +71,7 @@ static GtkCupsRequestStateFunc post_states[] = { _post_write_request, _post_write_data, _post_check, + _post_auth, _post_read_response }; @@ -76,6 +79,7 @@ static GtkCupsRequestStateFunc get_states[] = { _connect, _get_send, _get_check, + _get_auth, _get_read_data }; @@ -101,12 +105,13 @@ gtk_cups_result_set_error (GtkCupsResult *result, } GtkCupsRequest * -gtk_cups_request_new (http_t *connection, - GtkCupsRequestType req_type, - gint operation_id, - GIOChannel *data_io, - const char *server, - const char *resource) +gtk_cups_request_new_with_username (http_t *connection, + GtkCupsRequestType req_type, + gint operation_id, + GIOChannel *data_io, + const char *server, + const char *resource, + const char *username) { GtkCupsRequest *request; cups_lang_t *language; @@ -123,6 +128,8 @@ gtk_cups_request_new (http_t *connection, request->type = req_type; request->state = GTK_CUPS_REQUEST_START; + request->password_state = GTK_CUPS_PASSWORD_NONE; + if (server) request->server = g_strdup (server); else @@ -171,15 +178,37 @@ gtk_cups_request_new (http_t *connection, "attributes-natural-language", NULL, language->language); - gtk_cups_request_ipp_add_string (request, IPP_TAG_OPERATION, IPP_TAG_NAME, - "requesting-user-name", - NULL, cupsUser ()); - + if (username != NULL) + gtk_cups_request_ipp_add_string (request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", + NULL, username); + else + gtk_cups_request_ipp_add_string (request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", + NULL, cupsUser ()); + cupsLangFree (language); return request; } +GtkCupsRequest * +gtk_cups_request_new (http_t *connection, + GtkCupsRequestType req_type, + gint operation_id, + GIOChannel *data_io, + const char *server, + const char *resource) +{ + return gtk_cups_request_new_with_username (connection, + req_type, + operation_id, + data_io, + server, + resource, + NULL); +} + static void gtk_cups_result_free (GtkCupsResult *result) { @@ -205,6 +234,13 @@ gtk_cups_request_free (GtkCupsRequest *request) g_free (request->server); g_free (request->resource); + if (request->password != NULL) + { + memset (request->password, 0, strlen (request->password)); + g_free (request->password); + } + + g_free (request->username); gtk_cups_result_free (request->result); @@ -290,6 +326,23 @@ gtk_cups_request_ipp_add_strings (GtkCupsRequest *request, values); } +const char * +gtk_cups_request_ipp_get_string (GtkCupsRequest *request, + ipp_tag_t tag, + const char *name) +{ + ipp_attribute_t *attribute = NULL; + + if (request != NULL && request->ipp_request != NULL) + attribute = ippFindAttribute (request->ipp_request, + name, + tag); + + if (attribute != NULL && attribute->values != NULL) + return attribute->values[0].string.text; + else + return NULL; +} typedef struct @@ -330,7 +383,8 @@ static const ipp_option_t ipp_options[] = { { "saturation", IPP_TAG_INTEGER }, { "scaling", IPP_TAG_INTEGER }, { "sides", IPP_TAG_KEYWORD }, - { "wrap", IPP_TAG_BOOLEAN } + { "wrap", IPP_TAG_BOOLEAN }, + { "number-up-layout", IPP_TAG_INTEGER } }; @@ -786,12 +840,83 @@ _post_write_data (GtkCupsRequest *request) return; } } - else + else if (http_status == HTTP_UNAUTHORIZED) + { + request->state = GTK_CUPS_POST_CHECK; + request->poll_state = GTK_CUPS_HTTP_READ; + + request->attempts = 0; + return; + } + else { request->attempts++; } } +static void +_post_auth (GtkCupsRequest *request) +{ + if (request->password_state == GTK_CUPS_PASSWORD_HAS) + { + if (request->password == NULL) + { + request->state = GTK_CUPS_POST_DONE; + request->poll_state = GTK_CUPS_HTTP_IDLE; + + gtk_cups_result_set_error (request->result, + GTK_CUPS_ERROR_AUTH, + 0, + 1, + "Canceled by user"); + } + else + request->state = GTK_CUPS_POST_CHECK; + } +} + +static void +_get_auth (GtkCupsRequest *request) +{ + if (request->password_state == GTK_CUPS_PASSWORD_HAS) + { + if (request->password == NULL) + { + request->state = GTK_CUPS_GET_DONE; + request->poll_state = GTK_CUPS_HTTP_IDLE; + + gtk_cups_result_set_error (request->result, + GTK_CUPS_ERROR_AUTH, + 0, + 1, + "Canceled by user"); + } + else + request->state = GTK_CUPS_GET_CHECK; + } +} + +/* Very ugly hack: cups has a stupid synchronous password callback + * that doesn't even take the request or user data parameters, so + * we have to use a static variable to pass the password to it. + * Not threadsafe ! + * The callback sets cups_password to NULL to signal that the + * password has been used. + */ +static char *cups_password; +static char *cups_username; + +static const char * +passwordCB (const char *prompt) +{ + char *pwd = cups_password; + cups_password = NULL; + + cupsSetUser (cups_username); + + return pwd; +} + static void _post_check (GtkCupsRequest *request) { @@ -810,18 +935,91 @@ _post_check (GtkCupsRequest *request) } else if (http_status == HTTP_UNAUTHORIZED) { - /* TODO: callout for auth */ - g_warning ("NOT IMPLEMENTED: We need to prompt for authorization"); - request->state = GTK_CUPS_POST_DONE; - request->poll_state = GTK_CUPS_HTTP_IDLE; + int auth_result = -1; + httpFlush (request->http); + + if (request->password_state == GTK_CUPS_PASSWORD_APPLIED) + { + request->password_state = GTK_CUPS_PASSWORD_NOT_VALID; + request->state = GTK_CUPS_POST_AUTH; + request->need_password = TRUE; + + return; + } + + /* Negotiate */ + if (strncmp (httpGetField (request->http, HTTP_FIELD_WWW_AUTHENTICATE), "Negotiate", 9) == 0) + { + auth_result = cupsDoAuthentication (request->http, "POST", request->resource); + } + /* Basic, BasicDigest, Digest and PeerCred */ + else + { + if (request->password_state == GTK_CUPS_PASSWORD_NONE) + { + cups_password = g_strdup (""); + cups_username = request->username; + cupsSetPasswordCB (passwordCB); + + /* This call success for PeerCred authentication */ + auth_result = cupsDoAuthentication (request->http, "POST", request->resource); + + if (auth_result != 0) + { + /* move to AUTH state to let the backend + * ask for a password + */ + request->state = GTK_CUPS_POST_AUTH; + request->need_password = TRUE; + + return; + } + } + else + { + cups_password = request->password; + cups_username = request->username; + + auth_result = cupsDoAuthentication (request->http, "POST", request->resource); + + if (cups_password != NULL) + return; + + if (request->password != NULL) + { + memset (request->password, 0, strlen (request->password)); + g_free (request->password); + request->password = NULL; + } + + request->password_state = GTK_CUPS_PASSWORD_APPLIED; + } + } + + if (auth_result || + httpReconnect (request->http)) + { + /* if the password has been used, reset password_state + * so that we ask for a new one next time around + */ + if (cups_password == NULL) + request->password_state = GTK_CUPS_PASSWORD_NONE; + + request->state = GTK_CUPS_POST_DONE; + request->poll_state = GTK_CUPS_HTTP_IDLE; + gtk_cups_result_set_error (request->result, + GTK_CUPS_ERROR_AUTH, + 0, + 0, + "Not authorized"); + return; + } - /* TODO: create a not implemented error code */ - gtk_cups_result_set_error (request->result, - GTK_CUPS_ERROR_GENERAL, - 0, - 0, - "Can't prompt for authorization"); - return; + if (request->data_io != NULL) + g_io_channel_seek_position (request->data_io, 0, G_SEEK_SET, NULL); + + request->state = GTK_CUPS_POST_CONNECT; + request->poll_state = GTK_CUPS_HTTP_WRITE; } else if (http_status == HTTP_ERROR) { @@ -883,7 +1081,7 @@ _post_check (GtkCupsRequest *request) http_errno, "HTTP Error in POST %s", g_strerror (http_errno)); - request->poll_state = GTK_CUPS_HTTP_IDLE; + request->poll_state = GTK_CUPS_HTTP_IDLE; httpFlush (request->http); return; @@ -975,8 +1173,12 @@ _get_send (GtkCupsRequest *request) } httpClearFields (request->http); +#ifdef HAVE_HTTPGETAUTHSTRING + httpSetField (request->http, HTTP_FIELD_AUTHORIZATION, httpGetAuthString (request->http)); +#else #ifdef HAVE_HTTP_AUTHSTRING httpSetField (request->http, HTTP_FIELD_AUTHORIZATION, request->http->authstring); +#endif #endif if (httpGet (request->http, request->resource)) @@ -997,6 +1199,9 @@ _get_send (GtkCupsRequest *request) request->attempts++; return; } + + if (httpCheck (request->http)) + request->last_status = httpUpdate (request->http); request->attempts = 0; @@ -1024,18 +1229,90 @@ _get_check (GtkCupsRequest *request) } else if (http_status == HTTP_UNAUTHORIZED) { - /* TODO: callout for auth */ - g_warning ("NOT IMPLEMENTED: We need to prompt for authorization in a non blocking manner"); - request->state = GTK_CUPS_GET_DONE; - request->poll_state = GTK_CUPS_HTTP_IDLE; + int auth_result = -1; + httpFlush (request->http); - /* TODO: should add a status or error code for not implemented */ - gtk_cups_result_set_error (request->result, - GTK_CUPS_ERROR_GENERAL, - 0, - 0, - "Can't prompt for authorization"); - return; + if (request->password_state == GTK_CUPS_PASSWORD_APPLIED) + { + request->password_state = GTK_CUPS_PASSWORD_NOT_VALID; + request->state = GTK_CUPS_GET_AUTH; + request->need_password = TRUE; + + return; + } + + /* Negotiate */ + if (strncmp (httpGetField (request->http, HTTP_FIELD_WWW_AUTHENTICATE), "Negotiate", 9) == 0) + { + auth_result = cupsDoAuthentication (request->http, "GET", request->resource); + } + /* Basic, BasicDigest, Digest and PeerCred */ + else + { + if (request->password_state == GTK_CUPS_PASSWORD_NONE) + { + cups_password = g_strdup (""); + cups_username = request->username; + cupsSetPasswordCB (passwordCB); + + /* This call success for PeerCred authentication */ + auth_result = cupsDoAuthentication (request->http, "GET", request->resource); + + if (auth_result != 0) + { + /* move to AUTH state to let the backend + * ask for a password + */ + request->state = GTK_CUPS_GET_AUTH; + request->need_password = TRUE; + + return; + } + } + else + { + cups_password = request->password; + cups_username = request->username; + + auth_result = cupsDoAuthentication (request->http, "GET", request->resource); + + if (cups_password != NULL) + return; + + if (request->password != NULL) + { + memset (request->password, 0, strlen (request->password)); + g_free (request->password); + request->password = NULL; + } + + request->password_state = GTK_CUPS_PASSWORD_APPLIED; + } + } + + if (auth_result || + httpReconnect (request->http)) + { + /* if the password has been used, reset password_state + * so that we ask for a new one next time around + */ + if (cups_password == NULL) + request->password_state = GTK_CUPS_PASSWORD_NONE; + + request->state = GTK_CUPS_GET_DONE; + request->poll_state = GTK_CUPS_HTTP_IDLE; + gtk_cups_result_set_error (request->result, + GTK_CUPS_ERROR_AUTH, + 0, + 0, + "Not authorized"); + return; + } + + request->state = GTK_CUPS_GET_SEND; + request->last_status = HTTP_CONTINUE; + + return; } else if (http_status == HTTP_UPGRADE_REQUIRED) { @@ -1043,7 +1320,7 @@ _get_check (GtkCupsRequest *request) httpFlush (request->http); cupsSetEncryption (HTTP_ENCRYPT_REQUIRED); - request->state = GTK_CUPS_POST_CONNECT; + request->state = GTK_CUPS_GET_CONNECT; /* Reconnect... */ httpReconnect (request->http); @@ -1143,7 +1420,7 @@ _get_read_data (GtkCupsRequest *request) if (io_status == G_IO_STATUS_ERROR) { - request->state = GTK_CUPS_POST_DONE; + request->state = GTK_CUPS_GET_DONE; request->poll_state = GTK_CUPS_HTTP_IDLE; gtk_cups_result_set_error (request->result, @@ -1290,7 +1567,7 @@ gtk_cups_connection_test_get_state (GtkCupsConnectionTest *test) error_code = errno; - if (code == 0) + if (code == 0 || error_code == EISCONN) { close (test->socket); test->socket = -1; diff --git a/modules/printbackends/cups/gtkcupsutils.h b/modules/printbackends/cups/gtkcupsutils.h index dcbb490ab6..47fd106e93 100644 --- a/modules/printbackends/cups/gtkcupsutils.h +++ b/modules/printbackends/cups/gtkcupsutils.h @@ -37,6 +37,7 @@ typedef enum GTK_CUPS_ERROR_HTTP, GTK_CUPS_ERROR_IPP, GTK_CUPS_ERROR_IO, + GTK_CUPS_ERROR_AUTH, GTK_CUPS_ERROR_GENERAL } GtkCupsErrorType; @@ -66,6 +67,15 @@ typedef enum GTK_CUPS_CONNECTION_IN_PROGRESS } GtkCupsConnectionState; +typedef enum +{ + GTK_CUPS_PASSWORD_NONE, + GTK_CUPS_PASSWORD_REQUESTED, + GTK_CUPS_PASSWORD_HAS, + GTK_CUPS_PASSWORD_APPLIED, + GTK_CUPS_PASSWORD_NOT_VALID +} GtkCupsPasswordState; + struct _GtkCupsRequest { GtkCupsRequestType type; @@ -84,7 +94,12 @@ struct _GtkCupsRequest gint state; GtkCupsPollState poll_state; - gint own_http : 1; + gchar *password; + gchar *username; + + gint own_http : 1; + gint need_password : 1; + GtkCupsPasswordState password_state; }; struct _GtkCupsConnectionTest @@ -108,6 +123,7 @@ enum GTK_CUPS_POST_WRITE_REQUEST, GTK_CUPS_POST_WRITE_DATA, GTK_CUPS_POST_CHECK, + GTK_CUPS_POST_AUTH, GTK_CUPS_POST_READ_RESPONSE, GTK_CUPS_POST_DONE = GTK_CUPS_REQUEST_DONE }; @@ -118,10 +134,18 @@ enum GTK_CUPS_GET_CONNECT = GTK_CUPS_REQUEST_START, GTK_CUPS_GET_SEND, GTK_CUPS_GET_CHECK, + GTK_CUPS_GET_AUTH, GTK_CUPS_GET_READ_DATA, GTK_CUPS_GET_DONE = GTK_CUPS_REQUEST_DONE }; +GtkCupsRequest * gtk_cups_request_new_with_username (http_t *connection, + GtkCupsRequestType req_type, + gint operation_id, + GIOChannel *data_io, + const char *server, + const char *resource, + const char *username); GtkCupsRequest * gtk_cups_request_new (http_t *connection, GtkCupsRequestType req_type, gint operation_id, @@ -141,6 +165,9 @@ void gtk_cups_request_ipp_add_strings (GtkCupsRequest * int num_values, const char *charset, const char * const *values); +const char * gtk_cups_request_ipp_get_string (GtkCupsRequest *request, + ipp_tag_t tag, + const char *name); gboolean gtk_cups_request_read_write (GtkCupsRequest *request); GtkCupsPollState gtk_cups_request_get_poll_state (GtkCupsRequest *request); void gtk_cups_request_free (GtkCupsRequest *request); diff --git a/modules/printbackends/cups/gtkprintbackendcups.c b/modules/printbackends/cups/gtkprintbackendcups.c index 0d2975f197..c63882c141 100644 --- a/modules/printbackends/cups/gtkprintbackendcups.c +++ b/modules/printbackends/cups/gtkprintbackendcups.c @@ -118,6 +118,11 @@ struct _GtkPrintBackendCups char *default_cover_before; char *default_cover_after; int number_of_covers; + + GList *requests; + GHashTable *auth; + gchar *username; + gboolean authentication_lock; }; static GObjectClass *backend_parent_class; @@ -176,6 +181,13 @@ static cairo_surface_t * cups_printer_create_cairo_surface (GtkPrinter gdouble height, GIOChannel *cache_io); +static void gtk_print_backend_cups_set_password (GtkPrintBackend *backend, + const gchar *hostname, + const gchar *username, + const gchar *password); + +void overwrite_and_free (gpointer data); +static gboolean is_address_local (const gchar *address); static void gtk_print_backend_cups_register_type (GTypeModule *module) @@ -271,6 +283,7 @@ gtk_print_backend_cups_class_init (GtkPrintBackendCupsClass *class) backend_class->printer_get_default_page_size = cups_printer_get_default_page_size; backend_class->printer_get_hard_margins = cups_printer_get_hard_margins; backend_class->printer_get_capabilities = cups_printer_get_capabilities; + backend_class->set_password = gtk_print_backend_cups_set_password; } static cairo_status_t @@ -511,12 +524,13 @@ gtk_print_backend_cups_print_stream (GtkPrintBackend *print_backend, cups_printer = GTK_PRINTER_CUPS (gtk_print_job_get_printer (job)); settings = gtk_print_job_get_settings (job); - request = gtk_cups_request_new (NULL, - GTK_CUPS_POST, - IPP_PRINT_JOB, - data_io, - NULL, - cups_printer->device_uri); + request = gtk_cups_request_new_with_username (NULL, + GTK_CUPS_POST, + IPP_PRINT_JOB, + data_io, + NULL, + cups_printer->device_uri, + GTK_PRINT_BACKEND_CUPS (print_backend)->username); #if (CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR >= 2) || CUPS_VERSION_MAJOR > 1 httpAssembleURIf (HTTP_URI_CODING_ALL, @@ -561,6 +575,16 @@ gtk_print_backend_cups_print_stream (GtkPrintBackend *print_backend, (GDestroyNotify)cups_free_print_stream_data); } +void overwrite_and_free (gpointer data) +{ + gchar *password = (gchar *) data; + + if (password != NULL) + { + memset (password, 0, strlen (password)); + g_free (password); + } +} static void gtk_print_backend_cups_init (GtkPrintBackendCups *backend_cups) @@ -569,6 +593,10 @@ gtk_print_backend_cups_init (GtkPrintBackendCups *backend_cups) backend_cups->got_default_printer = FALSE; backend_cups->list_printers_pending = FALSE; + backend_cups->requests = NULL; + backend_cups->auth = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, overwrite_and_free); + backend_cups->authentication_lock = FALSE; + backend_cups->covers = NULL; backend_cups->default_cover_before = NULL; backend_cups->default_cover_after = NULL; @@ -577,6 +605,8 @@ gtk_print_backend_cups_init (GtkPrintBackendCups *backend_cups) backend_cups->default_printer_poll = 0; backend_cups->cups_connection_test = NULL; + backend_cups->username = NULL; + cups_get_local_default_printer (backend_cups); } @@ -602,6 +632,10 @@ gtk_print_backend_cups_finalize (GObject *object) gtk_cups_connection_test_free (backend_cups->cups_connection_test); backend_cups->cups_connection_test = NULL; + g_hash_table_destroy (backend_cups->auth); + + g_free (backend_cups->username); + backend_parent_class->finalize (object); } @@ -626,6 +660,155 @@ gtk_print_backend_cups_dispose (GObject *object) backend_parent_class->dispose (object); } +static gboolean +is_address_local (const gchar *address) +{ + if (address[0] == '/' || + strcmp (address, "127.0.0.1") == 0 || + strcmp (address, "[::1]") == 0) + return TRUE; + else + return FALSE; +} + +static void +gtk_print_backend_cups_set_password (GtkPrintBackend *backend, + const gchar *hostname, + const gchar *username, + const gchar *password) +{ + GtkPrintBackendCups *cups_backend = GTK_PRINT_BACKEND_CUPS (backend); + GList *l; + char dispatch_hostname[HTTP_MAX_URI]; + gchar *key; + + key = g_strconcat (username, "@", hostname, NULL); + g_hash_table_insert (cups_backend->auth, key, g_strdup (password)); + + g_free (cups_backend->username); + cups_backend->username = g_strdup (username); + + GTK_NOTE (PRINTING, + g_print ("CUPS backend: storing password for %s\n", key)); + + for (l = cups_backend->requests; l; l = l->next) + { + GtkPrintCupsDispatchWatch *dispatch = l->data; + + httpGetHostname (dispatch->request->http, dispatch_hostname, sizeof (dispatch_hostname)); + if (is_address_local (dispatch_hostname)) + strcpy (dispatch_hostname, "localhost"); + + if (strcmp (hostname, dispatch_hostname) == 0) + { + overwrite_and_free (dispatch->request->password); + dispatch->request->password = g_strdup (password); + g_free (dispatch->request->username); + dispatch->request->username = g_strdup (username); + dispatch->request->password_state = GTK_CUPS_PASSWORD_HAS; + dispatch->backend->authentication_lock = FALSE; + } + } +} + +static gboolean +request_password (gpointer data) +{ + GtkPrintCupsDispatchWatch *dispatch = data; + const gchar *username; + gchar *password; + gchar *prompt = NULL; + gchar *key = NULL; + char hostname[HTTP_MAX_URI]; + + if (dispatch->backend->authentication_lock) + return FALSE; + + httpGetHostname (dispatch->request->http, hostname, sizeof (hostname)); + if (is_address_local (hostname)) + strcpy (hostname, "localhost"); + + if (dispatch->backend->username != NULL) + username = dispatch->backend->username; + else + username = cupsUser (); + + key = g_strconcat (username, "@", hostname, NULL); + password = g_hash_table_lookup (dispatch->backend->auth, key); + + if (password && dispatch->request->password_state != GTK_CUPS_PASSWORD_NOT_VALID) + { + GTK_NOTE (PRINTING, + g_print ("CUPS backend: using stored password for %s\n", key)); + + overwrite_and_free (dispatch->request->password); + dispatch->request->password = g_strdup (password); + g_free (dispatch->request->username); + dispatch->request->username = g_strdup (username); + dispatch->request->password_state = GTK_CUPS_PASSWORD_HAS; + } + else + { + const char *job_title = gtk_cups_request_ipp_get_string (dispatch->request, IPP_TAG_NAME, "job-name"); + const char *printer_uri = gtk_cups_request_ipp_get_string (dispatch->request, IPP_TAG_URI, "printer-uri"); + char *printer_name = NULL; + + if (printer_uri != NULL && strrchr (printer_uri, '/') != NULL) + printer_name = g_strdup (strrchr (printer_uri, '/') + 1); + + if (dispatch->request->password_state == GTK_CUPS_PASSWORD_NOT_VALID) + g_hash_table_remove (dispatch->backend->auth, key); + + dispatch->request->password_state = GTK_CUPS_PASSWORD_REQUESTED; + + dispatch->backend->authentication_lock = TRUE; + + switch (dispatch->request->ipp_request->request.op.operation_id) + { + case 0: + prompt = g_strdup_printf ( _("Authentication is required to get a file from %s"), hostname); + break; + case IPP_PRINT_JOB: + if (job_title != NULL && printer_name != NULL) + prompt = g_strdup_printf ( _("Authentication is required to print document '%s' on printer %s"), job_title, printer_name); + else + prompt = g_strdup_printf ( _("Authentication is required to print a document on %s"), hostname); + break; + case IPP_GET_JOB_ATTRIBUTES: + if (job_title != NULL) + prompt = g_strdup_printf ( _("Authentication is required to get attributes of job '%s'"), job_title); + else + prompt = g_strdup ( _("Authentication is required to get attributes of a job")); + break; + case IPP_GET_PRINTER_ATTRIBUTES: + if (printer_name != NULL) + prompt = g_strdup_printf ( _("Authentication is required to get attributes of printer %s"), printer_name); + else + prompt = g_strdup ( _("Authentication is required to get attributes of a printer")); + break; + case CUPS_GET_DEFAULT: + prompt = g_strdup_printf ( _("Authentication is required to get default printer of %s"), hostname); + break; + case CUPS_GET_PRINTERS: + prompt = g_strdup_printf ( _("Authentication is required to get printers from %s"), hostname); + break; + default: + prompt = g_strdup_printf ( _("Authentication is required on %s"), hostname); + break; + } + + g_free (printer_name); + + g_signal_emit_by_name (dispatch->backend, "request-password", + hostname, username, prompt); + + g_free (prompt); + } + + g_free (key); + + return FALSE; +} static gboolean cups_dispatch_watch_check (GSource *source) @@ -665,7 +848,7 @@ cups_dispatch_watch_check (GSource *source) #endif } - if (poll_state != GTK_CUPS_HTTP_IDLE) + if (poll_state != GTK_CUPS_HTTP_IDLE && !dispatch->request->need_password) if (!(dispatch->data_poll->revents & dispatch->data_poll->events)) return FALSE; @@ -676,6 +859,13 @@ cups_dispatch_watch_check (GSource *source) g_free (dispatch->data_poll); dispatch->data_poll = NULL; } + + if (dispatch->request->need_password && dispatch->request->password_state != GTK_CUPS_PASSWORD_REQUESTED) + { + dispatch->request->need_password = FALSE; + g_idle_add (request_password, dispatch); + result = FALSE; + } return result; } @@ -735,12 +925,39 @@ static void cups_dispatch_watch_finalize (GSource *source) { GtkPrintCupsDispatchWatch *dispatch; + GtkCupsResult *result; GTK_NOTE (PRINTING, g_print ("CUPS Backend: %s \n", G_STRFUNC, source)); dispatch = (GtkPrintCupsDispatchWatch *) source; + result = gtk_cups_request_get_result (dispatch->request); + if (gtk_cups_result_get_error_type (result) == GTK_CUPS_ERROR_AUTH) + { + const gchar *username; + gchar hostname[HTTP_MAX_URI]; + gchar *key; + + httpGetHostname (dispatch->request->http, hostname, sizeof (hostname)); + if (is_address_local (hostname)) + strcpy (hostname, "localhost"); + + if (dispatch->backend->username != NULL) + username = dispatch->backend->username; + else + username = cupsUser (); + + key = g_strconcat (username, "@", hostname, NULL); + GTK_NOTE (PRINTING, + g_print ("CUPS backend: removing stored password for %s\n", key)); + g_hash_table_remove (dispatch->backend->auth, key); + g_free (key); + + if (dispatch->backend) + dispatch->backend->authentication_lock = FALSE; + } + gtk_cups_request_free (dispatch->request); if (dispatch->backend) @@ -754,6 +971,10 @@ cups_dispatch_watch_finalize (GSource *source) * of print backends. See _gtk_print_backend_create for the * disabling. */ + + dispatch->backend->requests = g_list_remove (dispatch->backend->requests, dispatch); + + g_object_unref (dispatch->backend); dispatch->backend = NULL; } @@ -788,6 +1009,8 @@ cups_request_execute (GtkPrintBackendCups *print_backend, dispatch->backend = g_object_ref (print_backend); dispatch->data_poll = NULL; + print_backend->requests = g_list_prepend (print_backend->requests, dispatch); + g_source_set_callback ((GSource *) dispatch, (GSourceFunc) callback, user_data, notify); g_source_attach ((GSource *) dispatch, NULL); @@ -890,12 +1113,13 @@ cups_request_printer_info (GtkPrintBackendCups *print_backend, "job-sheets-default" }; - request = gtk_cups_request_new (NULL, - GTK_CUPS_POST, - IPP_GET_PRINTER_ATTRIBUTES, - NULL, - NULL, - NULL); + request = gtk_cups_request_new_with_username (NULL, + GTK_CUPS_POST, + IPP_GET_PRINTER_ATTRIBUTES, + NULL, + NULL, + NULL, + print_backend->username); printer_uri = g_strdup_printf ("ipp://localhost/printers/%s", printer_name); @@ -1029,12 +1253,13 @@ cups_request_job_info (CupsJobPollData *data) GtkCupsRequest *request; gchar *job_uri; - request = gtk_cups_request_new (NULL, - GTK_CUPS_POST, - IPP_GET_JOB_ATTRIBUTES, - NULL, - NULL, - NULL); + request = gtk_cups_request_new_with_username (NULL, + GTK_CUPS_POST, + IPP_GET_JOB_ATTRIBUTES, + NULL, + NULL, + NULL, + data->print_backend->username); job_uri = g_strdup_printf ("ipp://localhost/jobs/%d", data->job_id); gtk_cups_request_ipp_add_string (request, IPP_TAG_OPERATION, IPP_TAG_URI, @@ -1121,8 +1346,19 @@ cups_request_printer_list_cb (GtkPrintBackendCups *cups_backend, if (gtk_cups_result_is_error (result)) { GTK_NOTE (PRINTING, - g_warning ("CUPS Backend: Error getting printer list: %s", - gtk_cups_result_get_error_string (result))); + g_warning ("CUPS Backend: Error getting printer list: %s %d %d", + gtk_cups_result_get_error_string (result), + gtk_cups_result_get_error_type (result), + gtk_cups_result_get_error_code (result))); + + if (gtk_cups_result_get_error_type (result) == GTK_CUPS_ERROR_AUTH && + gtk_cups_result_get_error_code (result) == 1) + { + /* Canceled by user, stop popping up more password dialogs */ + if (cups_backend->list_printers_poll > 0) + g_source_remove (cups_backend->list_printers_poll); + cups_backend->list_printers_poll = 0; + } goto done; } @@ -1609,12 +1845,13 @@ cups_request_printer_list (GtkPrintBackendCups *cups_backend) cups_backend->list_printers_pending = TRUE; - request = gtk_cups_request_new (NULL, - GTK_CUPS_POST, - CUPS_GET_PRINTERS, - NULL, - NULL, - NULL); + request = gtk_cups_request_new_with_username (NULL, + GTK_CUPS_POST, + CUPS_GET_PRINTERS, + NULL, + NULL, + NULL, + cups_backend->username); gtk_cups_request_ipp_add_strings (request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", G_N_ELEMENTS (pattrs), @@ -1776,28 +2013,30 @@ cups_request_ppd (GtkPrinter *printer) resource = g_strdup_printf ("/printers/%s.ppd", gtk_printer_cups_get_ppd_name (GTK_PRINTER_CUPS (printer))); - request = gtk_cups_request_new (data->http, - GTK_CUPS_GET, - 0, - data->ppd_io, - cups_printer->hostname, - resource); + print_backend = gtk_printer_get_backend (printer); + + request = gtk_cups_request_new_with_username (data->http, + GTK_CUPS_GET, + 0, + data->ppd_io, + cups_printer->hostname, + resource, + GTK_PRINT_BACKEND_CUPS (print_backend)->username); GTK_NOTE (PRINTING, g_print ("CUPS Backend: Requesting resource %s to be written to temp file %s\n", resource, ppd_filename)); - g_free (resource); - g_free (ppd_filename); cups_printer->reading_ppd = TRUE; - print_backend = gtk_printer_get_backend (printer); - cups_request_execute (GTK_PRINT_BACKEND_CUPS (print_backend), request, (GtkPrintCupsResponseCallbackFunc) cups_request_ppd_cb, data, (GDestroyNotify)get_ppd_data_free); + + g_free (resource); + g_free (ppd_filename); } /* Ordering matters for default preference */ @@ -2018,6 +2257,20 @@ cups_request_default_printer_cb (GtkPrintBackendCups *print_backend, GDK_THREADS_ENTER (); + if (gtk_cups_result_is_error (result)) + { + if (gtk_cups_result_get_error_type (result) == GTK_CUPS_ERROR_AUTH && + gtk_cups_result_get_error_code (result) == 1) + { + /* Canceled by user, stop popping up more password dialogs */ + if (print_backend->list_printers_poll > 0) + g_source_remove (print_backend->list_printers_poll); + print_backend->list_printers_poll = 0; + } + + return; + } + response = gtk_cups_result_get_response (result); if ((attr = ippFindAttribute (response, "printer-name", IPP_TAG_NAME)) != NULL) @@ -2056,12 +2309,13 @@ cups_request_default_printer (GtkPrintBackendCups *print_backend) if (state == GTK_CUPS_CONNECTION_IN_PROGRESS || state == GTK_CUPS_CONNECTION_NOT_AVAILABLE) return TRUE; - request = gtk_cups_request_new (NULL, - GTK_CUPS_POST, - CUPS_GET_DEFAULT, - NULL, - NULL, - NULL); + request = gtk_cups_request_new_with_username (NULL, + GTK_CUPS_POST, + CUPS_GET_DEFAULT, + NULL, + NULL, + NULL, + print_backend->username); cups_request_execute (print_backend, request, diff --git a/modules/printbackends/file/Makefile.am b/modules/printbackends/file/Makefile.am index 3bc1407e06..904f7687d4 100644 --- a/modules/printbackends/file/Makefile.am +++ b/modules/printbackends/file/Makefile.am @@ -34,3 +34,5 @@ libprintbackend_file_la_LIBADD = \ noinst_HEADERS = \ gtkprintbackendfile.h + +-include $(top_srcdir)/git.mk diff --git a/modules/printbackends/file/gtkprintbackendfile.c b/modules/printbackends/file/gtkprintbackendfile.c index c44c24cfd6..7bdaaa7b99 100644 --- a/modules/printbackends/file/gtkprintbackendfile.c +++ b/modules/printbackends/file/gtkprintbackendfile.c @@ -647,6 +647,10 @@ file_printer_get_settings_from_options (GtkPrinter *printer, option = gtk_printer_option_set_lookup (options, "gtk-n-up"); if (option) gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_NUMBER_UP, option->value); + + option = gtk_printer_option_set_lookup (options, "gtk-n-up-layout"); + if (option) + gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_NUMBER_UP_LAYOUT, option->value); } static void @@ -669,6 +673,8 @@ file_printer_prepare_for_print (GtkPrinter *printer, print_job->collate = gtk_print_settings_get_collate (settings); print_job->reverse = gtk_print_settings_get_reverse (settings); print_job->num_copies = gtk_print_settings_get_n_copies (settings); + print_job->number_up = gtk_print_settings_get_number_up (settings); + print_job->number_up_layout = gtk_print_settings_get_number_up_layout (settings); scale = gtk_print_settings_get_scale (settings); if (scale != 100.0) diff --git a/modules/printbackends/lpr/Makefile.am b/modules/printbackends/lpr/Makefile.am index fbe10afb39..12b7fcefd6 100644 --- a/modules/printbackends/lpr/Makefile.am +++ b/modules/printbackends/lpr/Makefile.am @@ -30,3 +30,5 @@ noinst_HEADERS = \ libprintbackend_lpr_la_LDFLAGS = -avoid-version -module $(no_undefined) libprintbackend_lpr_la_LIBADD = $(LDADDS) + +-include $(top_srcdir)/git.mk diff --git a/modules/printbackends/lpr/gtkprintbackendlpr.c b/modules/printbackends/lpr/gtkprintbackendlpr.c index fa6196df76..9d9c932a0d 100644 --- a/modules/printbackends/lpr/gtkprintbackendlpr.c +++ b/modules/printbackends/lpr/gtkprintbackendlpr.c @@ -450,7 +450,16 @@ lpr_printer_get_settings_from_options (GtkPrinter *printer, GtkPrinterOption *option; option = gtk_printer_option_set_lookup (options, "gtk-main-page-custom-input"); - gtk_print_settings_set (settings, "lpr-commandline", option->value); + if (option) + gtk_print_settings_set (settings, "lpr-commandline", option->value); + + option = gtk_printer_option_set_lookup (options, "gtk-n-up"); + if (option) + gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_NUMBER_UP, option->value); + + option = gtk_printer_option_set_lookup (options, "gtk-n-up-layout"); + if (option) + gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_NUMBER_UP_LAYOUT, option->value); } static void @@ -473,6 +482,8 @@ lpr_printer_prepare_for_print (GtkPrinter *printer, print_job->collate = gtk_print_settings_get_collate (settings); print_job->reverse = gtk_print_settings_get_reverse (settings); print_job->num_copies = gtk_print_settings_get_n_copies (settings); + print_job->number_up = gtk_print_settings_get_number_up (settings); + print_job->number_up_layout = gtk_print_settings_get_number_up_layout (settings); scale = gtk_print_settings_get_scale (settings); if (scale != 100.0) diff --git a/modules/printbackends/papi/Makefile.am b/modules/printbackends/papi/Makefile.am new file mode 100644 index 0000000000..671055be59 --- /dev/null +++ b/modules/printbackends/papi/Makefile.am @@ -0,0 +1,34 @@ +if OS_WIN32 +no_undefined = -no-undefined +endif + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/gtk \ + -I$(top_builddir)/gtk \ + -I$(top_srcdir)/gdk \ + -I$(top_builddir)/gdk \ + -DGTK_PRINT_BACKEND_ENABLE_UNSUPPORTED \ + $(GTK_DEP_CFLAGS) \ + $(GTK_DEBUG_FLAGS) + +LDADDS = \ + $(GTK_DEP_LIBS) \ + $(top_builddir)/gtk/$(gtktargetlib) + +backenddir = $(libdir)/gtk-2.0/$(GTK_BINARY_VERSION)/printbackends + +backend_LTLIBRARIES = libprintbackend-papi.la + +libprintbackend_papi_la_SOURCES = \ + gtkprinterpapi.c \ + gtkprintbackendpapi.c + +noinst_HEADERS = \ + gtkprinterpapi.h \ + gtkprintbackendpapi.h + +libprintbackend_papi_la_LDFLAGS = -avoid-version -module $(no_undefined) +libprintbackend_papi_la_LIBADD = $(LDADDS) -lpapi + +-include $(top_srcdir)/git.mk diff --git a/modules/printbackends/papi/gtkprintbackendpapi.c b/modules/printbackends/papi/gtkprintbackendpapi.c new file mode 100644 index 0000000000..eb16e1553d --- /dev/null +++ b/modules/printbackends/papi/gtkprintbackendpapi.c @@ -0,0 +1,862 @@ +/* GTK - The GIMP Toolkit + * gtkprintbackendpapi.c: Default implementation of GtkPrintBackend + * for printing to papi + * Copyright (C) 2003, Red Hat, Inc. + * Copyright (C) 2009, Sun Microsystems, 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 +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "gtk.h" +#include "gtkprintbackendpapi.h" +#include "gtkprinterpapi.h" +#include "gtkprinter-private.h" + +typedef struct _GtkPrintBackendPapiClass GtkPrintBackendPapiClass; + +#define GTK_PRINT_BACKEND_PAPI_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PRINT_BACKEND_PAPI, GtkPrintBackendPapiClass)) +#define GTK_IS_PRINT_BACKEND_PAPI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PRINT_BACKEND_PAPI)) +#define GTK_PRINT_BACKEND_PAPI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PRINT_BACKEND_PAPI, GtkPrintBackendPapiClass)) + +#define _PAPI_MAX_CHUNK_SIZE 8192 + +static GType print_backend_papi_type = 0; + +struct _GtkPrintBackendPapiClass +{ + GtkPrintBackendClass parent_class; +}; + +struct _GtkPrintBackendPapi +{ + GtkPrintBackend parent_instance; + + char *default_printer; +}; + +typedef struct { + GtkPrinter *printer; +} _PrinterStatus; + +static GObjectClass *backend_parent_class; + +static void gtk_print_backend_papi_class_init (GtkPrintBackendPapiClass *class); +static void gtk_print_backend_papi_init (GtkPrintBackendPapi *impl); +static void gtk_print_backend_papi_finalize (GObject *object); +static void gtk_print_backend_papi_dispose (GObject *object); +static void papi_request_printer_list (GtkPrintBackend *print_backend); +static gboolean papi_get_printer_list (GtkPrintBackendPapi *papi_backend); +static void papi_printer_request_details (GtkPrinter *printer); +static GtkPrintCapabilities papi_printer_get_capabilities (GtkPrinter *printer); +static void papi_printer_get_settings_from_options (GtkPrinter *printer, + GtkPrinterOptionSet *options, + GtkPrintSettings *settings); +static GtkPrinterOptionSet *papi_printer_get_options (GtkPrinter *printer, + GtkPrintSettings *settings, + GtkPageSetup *page_setup, + GtkPrintCapabilities capabilities); +static void papi_printer_prepare_for_print (GtkPrinter *printer, + GtkPrintJob *print_job, + GtkPrintSettings *settings, + GtkPageSetup *page_setup); +static cairo_surface_t * papi_printer_create_cairo_surface (GtkPrinter *printer, + GtkPrintSettings *settings, + gdouble width, + gdouble height, + GIOChannel *cache_io); +static void gtk_print_backend_papi_print_stream (GtkPrintBackend *print_backend, + GtkPrintJob *job, + GIOChannel *data_io, + GtkPrintJobCompleteFunc callback, + gpointer user_data, + GDestroyNotify dnotify); + +static gboolean papi_display_printer_status (gpointer user_data); +static void papi_display_printer_status_done (gpointer user_data); + +static void +gtk_print_backend_papi_register_type (GTypeModule *module) +{ + static const GTypeInfo print_backend_papi_info = + { + sizeof (GtkPrintBackendPapiClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gtk_print_backend_papi_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GtkPrintBackendPapi), + 0, /* n_preallocs */ + (GInstanceInitFunc) gtk_print_backend_papi_init, + }; + + print_backend_papi_type = g_type_module_register_type (module, + GTK_TYPE_PRINT_BACKEND, + "GtkPrintBackendPapi", + &print_backend_papi_info, 0); +} + +G_MODULE_EXPORT void +pb_module_init (GTypeModule *module) +{ + gtk_print_backend_papi_register_type (module); + gtk_printer_papi_register_type (module); +} + +G_MODULE_EXPORT void +pb_module_exit (void) +{ + +} + +G_MODULE_EXPORT GtkPrintBackend * +pb_module_create (void) +{ + return gtk_print_backend_papi_new (); +} + +/* + * GtkPrintBackendPapi + */ +GType +gtk_print_backend_papi_get_type (void) +{ + return print_backend_papi_type; +} + +/** + * gtk_print_backend_papi_new: + * + * Creates a new #GtkPrintBackendPapi object. #GtkPrintBackendPapi + * implements the #GtkPrintBackend interface with direct access to + * the filesystem using Unix/Linux API calls + * + * Return value: the new #GtkPrintBackendPapi object + **/ +GtkPrintBackend * +gtk_print_backend_papi_new (void) +{ + return g_object_new (GTK_TYPE_PRINT_BACKEND_PAPI, NULL); +} + +static void +gtk_print_backend_papi_class_init (GtkPrintBackendPapiClass *class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + GtkPrintBackendClass *backend_class = GTK_PRINT_BACKEND_CLASS (class); + + backend_parent_class = g_type_class_peek_parent (class); + + gobject_class->finalize = gtk_print_backend_papi_finalize; + gobject_class->dispose = gtk_print_backend_papi_dispose; + + backend_class->request_printer_list = papi_request_printer_list; + backend_class->printer_request_details = papi_printer_request_details; + backend_class->printer_get_capabilities = papi_printer_get_capabilities; + backend_class->printer_get_options = papi_printer_get_options; + backend_class->printer_get_settings_from_options = papi_printer_get_settings_from_options; + backend_class->printer_prepare_for_print = papi_printer_prepare_for_print; + backend_class->printer_create_cairo_surface = papi_printer_create_cairo_surface; + backend_class->print_stream = gtk_print_backend_papi_print_stream; +} + +static cairo_status_t +_cairo_write (void *closure, + const unsigned char *data, + unsigned int length) +{ + GIOChannel *io = (GIOChannel *)closure; + gsize written; + GError *error = NULL; + + GTK_NOTE (PRINTING, + g_print ("PAPI Backend: Writting %i byte chunk to temp file\n", length)); + + while (length > 0) + { + g_io_channel_write_chars (io, (char *)data, length, &written, &error); + + if (error != NULL) + { + GTK_NOTE (PRINTING, + g_print ("PAPI Backend: Error writting to temp file, %s\n", error->message)); + + g_error_free (error); + return CAIRO_STATUS_WRITE_ERROR; + } + + GTK_NOTE (PRINTING, + g_print ("PAPI Backend: Wrote %i bytes to temp file\n", written)); + + data += written; + length -= written; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +papi_printer_create_cairo_surface (GtkPrinter *printer, + GtkPrintSettings *settings, + gdouble width, + gdouble height, + GIOChannel *cache_io) +{ + cairo_surface_t *surface; + + surface = cairo_ps_surface_create_for_stream (_cairo_write, cache_io, width, height); + + /* TODO: DPI from settings object? */ + cairo_surface_set_fallback_resolution (surface, 300, 300); + + return surface; +} + +typedef struct { + GtkPrintBackend *backend; + GtkPrintJobCompleteFunc callback; + GtkPrintJob *job; + gpointer user_data; + GDestroyNotify dnotify; + + papi_service_t service; + papi_stream_t stream; +} _PrintStreamData; + +static void +papi_print_cb (GtkPrintBackendPapi *print_backend, + GError *error, + gpointer user_data) +{ + _PrintStreamData *ps = (_PrintStreamData *) user_data; + + if (ps->callback) + ps->callback (ps->job, ps->user_data, error); + + if (ps->dnotify) + ps->dnotify (ps->user_data); + + gtk_print_job_set_status (ps->job, + error ? GTK_PRINT_STATUS_FINISHED_ABORTED + : GTK_PRINT_STATUS_FINISHED); + + if (ps->job) + g_object_unref (ps->job); + + g_free (ps); +} + +static gboolean +papi_write (GIOChannel *source, + GIOCondition con, + gpointer user_data) +{ + gchar buf[_PAPI_MAX_CHUNK_SIZE]; + gsize bytes_read; + GError *error; + GIOStatus status; + _PrintStreamData *ps = (_PrintStreamData *) user_data; + papi_job_t job = NULL; + + error = NULL; + status = g_io_channel_read_chars (source, + buf, + _PAPI_MAX_CHUNK_SIZE, + &bytes_read, + &error); + + /* Keep writing to PAPI input stream while there are data */ + if (status != G_IO_STATUS_ERROR) + { + papiJobStreamWrite (ps->service, ps->stream, buf, bytes_read); + } + + /* Finish reading input stream data. Closing the stream and handle to service */ + if (bytes_read == 0) { + papiJobStreamClose (ps->service, ps->stream, &job); + ps->stream = NULL; + papiJobFree (job); + papiServiceDestroy (ps->service); + ps->service = NULL; + } + + if (error != NULL || status == G_IO_STATUS_EOF) + { + papi_print_cb (GTK_PRINT_BACKEND_PAPI (ps->backend), + error, user_data); + + if (error) + g_error_free (error); + + if (error != NULL) + { + GTK_NOTE (PRINTING, + g_print ("PAPI Backend: %s\n", error->message)); + + g_error_free (error); + } + + return FALSE; + } + + GTK_NOTE (PRINTING, + g_print ("PAPI Backend: Writting %i byte chunk to papi pipe\n", bytes_read)); + + return TRUE; +} + +static void +gtk_print_backend_papi_print_stream (GtkPrintBackend *print_backend, + GtkPrintJob *job, + GIOChannel *data_io, + GtkPrintJobCompleteFunc callback, + gpointer user_data, + GDestroyNotify dnotify) +{ + GError *print_error = NULL; + GtkPrinterPapi *printer; + _PrintStreamData *ps; + GtkPrintSettings *settings; + gint argc; + gint in_fd; + gchar **argv = NULL; + const gchar *title; + char *prtnm = NULL; + GtkPrintDuplex val; + papi_status_t pstatus = NULL; + papi_attribute_t **attrs = NULL; + papi_job_ticket_t *ticket = NULL; + + printer = GTK_PRINTER_PAPI (gtk_print_job_get_printer (job)); + settings = gtk_print_job_get_settings (job); + + /* FIXME - the title should be set as the job-name */ + title = gtk_print_job_get_title (job); + + ps = g_new0 (_PrintStreamData, 1); + ps->callback = callback; + ps->user_data = user_data; + ps->dnotify = dnotify; + ps->job = g_object_ref (job); + ps->service = NULL; + ps->stream = NULL; + + /* This cannot be queried yet with the current API */ + papiAttributeListAddString (&attrs, PAPI_ATTR_EXCL, "document-format", "application/postscript"); + val = gtk_print_settings_get_duplex (settings) ; + if (val == GTK_PRINT_DUPLEX_HORIZONTAL) + papiAttributeListAddString (&attrs, PAPI_ATTR_EXCL, "Duplex", "DuplexNoTumble"); + else if (val == GTK_PRINT_DUPLEX_VERTICAL) + papiAttributeListAddString (&attrs, PAPI_ATTR_EXCL, "Duplex", "DuplexTumble"); + + if (job->num_copies > 1) + { + papiAttributeListAddInteger (&attrs, PAPI_ATTR_EXCL, "copies", job->num_copies); + } + + prtnm = strdup (gtk_printer_get_name (GTK_PRINTER(printer))); + + if (papiServiceCreate (&(ps->service), prtnm, NULL, NULL, NULL, + PAPI_ENCRYPT_NEVER, NULL) != PAPI_OK) + return; + + pstatus = papiJobStreamOpen (ps->service, prtnm, attrs, ticket, &(ps->stream)); + if (pstatus != PAPI_OK) + { + papiServiceDestroy (ps->service); + ps->service = NULL; + return; + } + + /* Everything set up fine, so get ready to wait for input data stream */ + g_io_add_watch (data_io, + G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP, + (GIOFunc) papi_write, + ps); +} + + +static void +_papi_set_default_printer (GtkPrintBackendPapi *backend) +{ + char *def_printer = NULL; + char *_default_attr[] = { "printer-name", NULL }; + papi_service_t service = NULL; + papi_printer_t default_printer = NULL; + papi_attribute_t **attrs = NULL; + + if (papiServiceCreate (&service, NULL, NULL, NULL, NULL, PAPI_ENCRYPT_NEVER, + NULL) != PAPI_OK) + return; + + if (papiPrinterQuery (service, "_default", _default_attr, NULL, + &default_printer) == PAPI_OK) + { + if (default_printer != NULL) + { + attrs = papiPrinterGetAttributeList (default_printer); + + if (attrs != NULL) + if (papiAttributeListGetString (attrs, NULL, "printer-name", + &def_printer) == PAPI_OK) + { + backend->default_printer = strdup (def_printer); + } + } + } + + papiPrinterFree (default_printer); + papiServiceDestroy (service); +} + +static void +gtk_print_backend_papi_init (GtkPrintBackendPapi *backend) +{ + _papi_set_default_printer (backend); +} + +static void +gtk_print_backend_papi_finalize (GObject *object) +{ + GtkPrintBackendPapi *backend_papi; + + GTK_NOTE (PRINTING, + g_print ("PAPI Backend: finalizing PAPI backend module\n")); + + backend_papi = GTK_PRINT_BACKEND_PAPI (object); + + g_free (backend_papi->default_printer); + backend_papi->default_printer = NULL; + + backend_parent_class->finalize (object); +} + + +static void +gtk_print_backend_papi_dispose (GObject *object) +{ + GtkPrintBackendPapi *backend_papi; + + GTK_NOTE (PRINTING, + g_print ("PAPI Backend: %s\n", G_STRFUNC)); + + backend_papi = GTK_PRINT_BACKEND_PAPI (object); + + backend_parent_class->dispose (object); +} + +char ** +get_all_list(papi_service_t svc) +{ + papi_status_t status; + papi_printer_t printer = NULL; + char *attr[] = { "member-names", NULL }; + char **names = NULL; + + status = papiPrinterQuery(svc, "_all", attr, NULL, &printer); + if ((status == PAPI_OK) && (printer != NULL)) { + papi_attribute_t **attributes = + papiPrinterGetAttributeList(printer); + if (attributes != NULL) { + void *iter = NULL; + char *member = NULL; + + for (status = papiAttributeListGetString(attributes, + &iter, "member-names", &member); + status == PAPI_OK; + status = papiAttributeListGetString(attributes, + &iter, NULL, &member)) + list_append(&names, strdup(member)); + } + papiPrinterFree(printer); + } + + return (names); +} + +static char ** +get_printers_list(papi_service_t svc) +{ + papi_status_t status; + papi_printer_t *printers = NULL; + char *keys[] = { "printer-name", "printer-uri-supported", NULL }; + char **names = NULL; + + status = papiPrintersList(svc, keys, NULL, &printers); + if ((status == PAPI_OK) && (printers != NULL)) { + int i; + + for (i = 0; printers[i] != NULL; i++) { + papi_attribute_t **attributes = + papiPrinterGetAttributeList(printers[i]); + char *name = NULL; + + (void) papiAttributeListGetString(attributes, NULL, + "printer-name", &name); + if ((name != NULL) && (strcmp(name, "_default") != 0)) + list_append(&names, strdup(name)); + } + papiPrinterListFree(printers); + } + + return (names); +} + +static void +papi_request_printer_list (GtkPrintBackend *backend) +{ + GtkPrintBackendPapi *papi_backend; + + papi_backend = GTK_PRINT_BACKEND_PAPI (backend); + + /* Get the list of printers using papi API */ + papi_get_printer_list (papi_backend); +} + +static gboolean +papi_get_printer_list (GtkPrintBackendPapi *papi_backend) +{ + int i; + const char *attributes[] = /* Attributes we're interested in */ + { + "printer-name", + "printer-uri-supported", + NULL + }; + papi_status_t status, status2; + papi_service_t service = NULL; + char **printers = NULL; + GtkPrinter *printer; + GtkPrinterPapi *papi_printer; + GList *current_printer_list; + GtkPrintBackend *backend = GTK_PRINT_BACKEND (papi_backend); + + if ((status = papiServiceCreate (&service, NULL, NULL, NULL, NULL, + PAPI_ENCRYPT_NEVER, NULL)) != PAPI_OK) + return FALSE; + + if ((printers = get_all_list (service)) == NULL) + { + printers = get_printers_list (service); + } + + if (printers == NULL) + { + papiServiceDestroy (service); + return FALSE; + } + + for (i = 0; printers[i] != NULL; i++) + { + GtkPrinter *printer; + char *name = NULL, *url = NULL; + papi_attribute_t **attrs = NULL; + + printer = gtk_print_backend_find_printer (backend, printers[i]); + + if (!printer) + { + /* skip null printer name just in case */ + if (printers[i] == NULL) + continue; + + /* skip the alias _default and _all printers */ + if (strcmp(printers[i], "_default")==0 || strcmp(printers[i], "_all")==0) + continue; + + papi_printer = gtk_printer_papi_new (printers[i], backend); + printer = GTK_PRINTER (papi_printer); + + /* Only marked default printer to not have details so that + the request_details method will be called at start up + */ + + if (papi_backend->default_printer != NULL) + if (strcmp (printers[i], papi_backend->default_printer)==0) + { + gtk_printer_set_is_default (printer, TRUE); + } + + gtk_printer_set_icon_name (printer, "gtk-print"); + gtk_print_backend_add_printer (backend, printer); + gtk_printer_set_is_active (printer, TRUE); + + /* gtk_printer_set_has_details (printer, TRUE); */ + } + else + g_object_ref (printer); + + if (!gtk_printer_is_active (printer)) + { + gtk_printer_set_is_active (printer, TRUE); + gtk_printer_set_is_new (printer, TRUE); + } + + if (gtk_printer_is_new (printer)) + { + g_signal_emit_by_name (backend, "printer-added", printer); + gtk_printer_set_is_new (printer, FALSE); + } + + g_object_unref (printer); + } + + free (printers); + papiServiceDestroy (service); + + /* To set that the list of printers added is complete */ + gtk_print_backend_set_list_done (backend); + + return TRUE; +} + +static void +update_printer_status (GtkPrinter *printer) +{ + GtkPrintBackend *backend; + GtkPrinterPapi *papi_printer; + gboolean status_changed = FALSE; + + backend = gtk_printer_get_backend (printer); + papi_printer = GTK_PRINTER_PAPI (printer); + + /* if (status_changed) */ + g_signal_emit_by_name (GTK_PRINT_BACKEND (backend), + "printer-status-changed", printer); + +} + + +static GtkPrinterOptionSet * +papi_printer_get_options (GtkPrinter *printer, + GtkPrintSettings *settings, + GtkPageSetup *page_setup, + GtkPrintCapabilities capabilities) +{ + GtkPrinterOptionSet *set; + GtkPrinterOption *option; + int i; + char *print_at[] = { "now", "on-hold" }; + char *n_up[] = {"1"}; + + /* Update the printer status before the printer options are displayed */ + update_printer_status (printer); + + set = gtk_printer_option_set_new (); + + /* non-ppd related settings */ + + /* This maps to number-up-supported in PAPI. FIXME + * number-up-default is the default value. + * number-up-supported is the list of number of able to print per page + */ + 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); + + /* This maps to job-priority-supported and job-priority-default in PAPI - FIXME*/ + + /* This relates to job-sheets-supported in PAPI FIXME*/ + + /* This relates to job-hold-until-supported in PAPI */ + 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); + + return set; +} + +static void +papi_printer_get_settings_from_options (GtkPrinter *printer, + GtkPrinterOptionSet *options, + GtkPrintSettings *settings) +{ + GtkPrinterOption *option; + + option = gtk_printer_option_set_lookup (options, "gtk-n-up"); + if (option) + gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_NUMBER_UP, option->value); + +} + +static void +papi_printer_prepare_for_print (GtkPrinter *printer, + GtkPrintJob *print_job, + GtkPrintSettings *settings, + GtkPageSetup *page_setup) +{ + GtkPageSet page_set; + double scale; + GtkPaperSize *papersize = NULL; + char *ppd_paper_name; + + print_job->print_pages = gtk_print_settings_get_print_pages (settings); + print_job->page_ranges = NULL; + print_job->num_page_ranges = 0; + + if (print_job->print_pages == GTK_PRINT_PAGES_RANGES) + print_job->page_ranges = + gtk_print_settings_get_page_ranges (settings, + &print_job->num_page_ranges); + + print_job->collate = gtk_print_settings_get_collate (settings); + print_job->reverse = gtk_print_settings_get_reverse (settings); + print_job->num_copies = gtk_print_settings_get_n_copies (settings); + + scale = gtk_print_settings_get_scale (settings); + if (scale != 100.0) + print_job->scale = scale/100.0; + + papersize = gtk_page_setup_get_paper_size (page_setup); + ppd_paper_name = gtk_paper_size_get_ppd_name (papersize); + + page_set = gtk_print_settings_get_page_set (settings); + if (page_set == GTK_PAGE_SET_EVEN) + print_job->page_set = GTK_PAGE_SET_EVEN; + else if (page_set == GTK_PAGE_SET_ODD) + print_job->page_set = GTK_PAGE_SET_ODD; + else + print_job->page_set = GTK_PAGE_SET_ALL; + + print_job->rotate_to_orientation = TRUE; + +} + +gboolean +is_local_printer (gchar *printer_uri) +{ + if (strncmp (printer_uri, "lpsched:", 8) == 0) + return TRUE; + else + return FALSE; +} + +void +merge_ppd_data (papi_attribute_t ***attributes, gchar *ppdfile) +{ + get_ppd_attrs (attributes, ppdfile); +} + + +static void +papi_display_printer_status_done (gpointer user_data) +{ + GtkPrinter *printer = (GtkPrinter *) user_data; + GtkPrinterPapi *papi_printer; + + g_signal_emit_by_name (printer, "details-acquired", TRUE); + papi_printer = GTK_PRINTER_PAPI (printer); + return; +} + +#define IDLE 3 +#define PROCESSING 4 +#define STOPPED 5 +static gboolean +papi_display_printer_status (gpointer user_data) +{ + GtkPrinter *printer = (GtkPrinter *) user_data; + GtkPrinterPapi *papi_printer; + gchar *loc, *printer_uri, *ppdfile; + int state; + papi_service_t service; + papi_attribute_t **attrs = NULL; + papi_printer_t current_printer = NULL; + static int count = 0; + + papi_printer = GTK_PRINTER_PAPI (printer); + if (papiServiceCreate (&service, NULL, NULL, NULL, NULL, PAPI_ENCRYPT_NEVER, + NULL) != PAPI_OK) + return FALSE; + + if (papiPrinterQuery (service, papi_printer->printer_name, NULL, NULL, + ¤t_printer) != PAPI_OK) + { + /* SUN_BRANDING */ + gtk_printer_set_state_message (printer, _("printer offline")); + } + + if (current_printer != NULL) + { + attrs = papiPrinterGetAttributeList (current_printer); + } + + if (papiAttributeListGetString (attrs, NULL, "printer-info", &loc) == PAPI_OK) + { + gtk_printer_set_location (printer, loc); + } + + if (papiAttributeListGetInteger (attrs, NULL, "printer-state", &state) == PAPI_OK) + { + switch (state) + { + /* SUN_BRANDING */ + case IDLE: gtk_printer_set_state_message (printer, _("ready to print")); + break; + /* SUN_BRANDING */ + case PROCESSING: gtk_printer_set_state_message (printer, _("processing job")); + break; + + /* SUN_BRANDING */ + case STOPPED: gtk_printer_set_state_message (printer, _("paused")); + break; + /* SUN_BRANDING */ + default: gtk_printer_set_state_message (printer, _("unknown")); + break; + } + } + + papiPrinterFree (current_printer); + papiServiceDestroy (service); + gtk_printer_set_has_details (printer, TRUE); + + return FALSE; +} + +static void +papi_printer_request_details (GtkPrinter *printer) +{ + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, papi_display_printer_status, printer, papi_display_printer_status_done); +} + + +static GtkPrintCapabilities +papi_printer_get_capabilities (GtkPrinter *printer) +{ + return GTK_PRINT_CAPABILITY_COPIES | GTK_PRINT_CAPABILITY_PAGE_SET ; +} + diff --git a/modules/printbackends/papi/gtkprintbackendpapi.h b/modules/printbackends/papi/gtkprintbackendpapi.h new file mode 100644 index 0000000000..4eba665e00 --- /dev/null +++ b/modules/printbackends/papi/gtkprintbackendpapi.h @@ -0,0 +1,44 @@ +/* GTK - The GIMP Toolkit + * gtkprintbackendpapi.h: Default implementation of GtkPrintBackend + * for printing to papi + * Copyright (C) 2003, Red Hat, Inc. + * Copyright (C) 2009, Sun Microsystems, 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. + */ + +#ifndef __GTK_PRINT_BACKEND_PAPI_H__ +#define __GTK_PRINT_BACKEND_PAPI_H__ + +#include +#include "gtkprintbackend.h" + +G_BEGIN_DECLS + +#define GTK_TYPE_PRINT_BACKEND_PAPI (gtk_print_backend_papi_get_type ()) +#define GTK_PRINT_BACKEND_PAPI(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_PRINT_BACKEND_PAPI, GtkPrintBackendPapi)) +#define GTK_IS_PRINT_BACKEND_PAPI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_PRINT_BACKEND_PAPI)) + +typedef struct _GtkPrintBackendPapi GtkPrintBackendPapi; + +GtkPrintBackend *gtk_print_backend_papi_new (void); +GType gtk_print_backend_papi_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __GTK_PRINT_BACKEND_PAPI_H__ */ + + diff --git a/modules/printbackends/papi/gtkprinterpapi.c b/modules/printbackends/papi/gtkprinterpapi.c new file mode 100644 index 0000000000..387bc30be7 --- /dev/null +++ b/modules/printbackends/papi/gtkprinterpapi.c @@ -0,0 +1,116 @@ +/* GtkPrinterPapi + * Copyright (C) 2006 John (J5) Palmieri + * Copyright (C) 2009 Ghee Teo + * + * 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 "gtkprinterpapi.h" + +static void gtk_printer_papi_init (GtkPrinterPapi *printer); +static void gtk_printer_papi_class_init (GtkPrinterPapiClass *class); +static void gtk_printer_papi_finalize (GObject *object); + +static GtkPrinterClass *gtk_printer_papi_parent_class; +static GType gtk_printer_papi_type = 0; + +void +gtk_printer_papi_register_type (GTypeModule *module) +{ + static const GTypeInfo object_info = + { + sizeof (GtkPrinterPapiClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) gtk_printer_papi_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GtkPrinterPapi), + 0, /* n_preallocs */ + (GInstanceInitFunc) gtk_printer_papi_init, + }; + + gtk_printer_papi_type = g_type_module_register_type (module, + GTK_TYPE_PRINTER, + "GtkPrinterPapi", + &object_info, 0); +} + +GType +gtk_printer_papi_get_type (void) +{ + return gtk_printer_papi_type; +} + +static void +gtk_printer_papi_class_init (GtkPrinterPapiClass *class) +{ + GObjectClass *object_class = (GObjectClass *) class; + + gtk_printer_papi_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gtk_printer_papi_finalize; +} + +static void +gtk_printer_papi_init (GtkPrinterPapi *printer) +{ + printer->printer_name = NULL; +} + +static void +gtk_printer_papi_finalize (GObject *object) +{ + GtkPrinterPapi *printer; + + g_return_if_fail (object != NULL); + + printer = GTK_PRINTER_PAPI (object); + + g_free(printer->printer_name); + + G_OBJECT_CLASS (gtk_printer_papi_parent_class)->finalize (object); +} + +/** + * gtk_printer_papi_new: + * + * Creates a new #GtkPrinterPapi. + * + * Return value: a new #GtkPrinterPapi + * + * Since: 2.10 + **/ +GtkPrinterPapi * +gtk_printer_papi_new (const char *name, + GtkPrintBackend *backend) +{ + GObject *result; + GtkPrinterPapi *pp; + + result = g_object_new (GTK_TYPE_PRINTER_PAPI, + "name", name, + "backend", backend, + "is-virtual", TRUE, + NULL); + pp = GTK_PRINTER_PAPI(result); + + pp->printer_name = g_strdup (name); + + return (GtkPrinterPapi *) pp; +} + diff --git a/modules/printbackends/papi/gtkprinterpapi.h b/modules/printbackends/papi/gtkprinterpapi.h new file mode 100644 index 0000000000..300cf17110 --- /dev/null +++ b/modules/printbackends/papi/gtkprinterpapi.h @@ -0,0 +1,61 @@ +/* GtkPrinterPapi + * Copyright (C) 2006 John (J5) Palmieri + * Copyright (C) 2009 Ghee Teo + * + * 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. + */ +#ifndef __GTK_PRINTER_PAPI_H__ +#define __GTK_PRINTER_PAPI_H__ + +#include +#include +#include + +#include "gtkunixprint.h" + +G_BEGIN_DECLS + +#define GTK_TYPE_PRINTER_PAPI (gtk_printer_papi_get_type ()) +#define GTK_PRINTER_PAPI(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_PRINTER_PAPI, GtkPrinterPapi)) +#define GTK_PRINTER_PAPI_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PRINTER_PAPI, GtkPrinterPapiClass)) +#define GTK_IS_PRINTER_PAPI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_PRINTER_PAPI)) +#define GTK_IS_PRINTER_PAPI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PRINTER_PAPI)) +#define GTK_PRINTER_PAPI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PRINTER_PAPI, GtkPrinterPapiClass)) + +typedef struct _GtkPrinterPapi GtkPrinterPapi; +typedef struct _GtkPrinterPapiClass GtkPrinterPapiClass; +typedef struct _GtkPrinterPapiPrivate GtkPrinterPapiPrivate; + +struct _GtkPrinterPapi +{ + GtkPrinter parent_instance; + + gchar *printer_name; +}; + +struct _GtkPrinterPapiClass +{ + GtkPrinterClass parent_class; + +}; + +GType gtk_printer_papi_get_type (void) G_GNUC_CONST; +void gtk_printer_papi_register_type (GTypeModule *module); +GtkPrinterPapi *gtk_printer_papi_new (const char *name, GtkPrintBackend *backend); + +G_END_DECLS + +#endif /* __GTK_PRINTER_PAPI_H__ */ diff --git a/modules/printbackends/test/Makefile.am b/modules/printbackends/test/Makefile.am index fd0839e826..20904fa517 100644 --- a/modules/printbackends/test/Makefile.am +++ b/modules/printbackends/test/Makefile.am @@ -33,3 +33,5 @@ libprintbackend_test_la_LIBADD = \ noinst_HEADERS = \ gtkprintbackendtest.h + +-include $(top_srcdir)/git.mk diff --git a/perf/Makefile.am b/perf/Makefile.am index 9fcf418951..934cf24da9 100644 --- a/perf/Makefile.am +++ b/perf/Makefile.am @@ -96,3 +96,5 @@ distclean-local: if test $(srcdir) != .; then \ rm -f $(MAINTAINERCLEANFILES); \ fi + +-include $(top_srcdir)/git.mk diff --git a/po-properties/af.po b/po-properties/af.po index 9935d930fa..6dc0aa185c 100644 --- a/po-properties/af.po +++ b/po-properties/af.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gtk+-properties 2.6-branch\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-03-13 10:29-0400\n" +"POT-Creation-Date: 2009-05-04 01:14-0400\n" "PO-Revision-Date: 2004-03-30 17:02+0200\n" "Last-Translator: Zuza Software Foundation \n" "Language-Team: Afrikaans \n" @@ -90,12 +90,12 @@ msgstr "Verstekvertoon" msgid "The default display for GDK" msgstr "Die verstekvertoon vir GDK" -#: gdk/gdkpango.c:490 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 -#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:613 +#: gdk/gdkpango.c:537 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 +#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:614 msgid "Screen" msgstr "Skerm" -#: gdk/gdkpango.c:491 +#: gdk/gdkpango.c:538 #, fuzzy msgid "the GdkScreen for the renderer" msgstr "Die model vir die boomaansig" @@ -120,121 +120,121 @@ msgstr "Fontpunte" msgid "The resolution for fonts on the screen" msgstr "Hoe die strekking op die skerm moet bygewerk word" -#: gtk/gtkaboutdialog.c:200 +#: gtk/gtkaboutdialog.c:239 #, fuzzy msgid "Program name" msgstr "Merkernaam" -#: gtk/gtkaboutdialog.c:201 +#: gtk/gtkaboutdialog.c:240 msgid "" "The name of the program. If this is not set, it defaults to " "g_get_application_name()" msgstr "" -#: gtk/gtkaboutdialog.c:215 +#: gtk/gtkaboutdialog.c:254 msgid "Program version" msgstr "" -#: gtk/gtkaboutdialog.c:216 +#: gtk/gtkaboutdialog.c:255 #, fuzzy msgid "The version of the program" msgstr "Die oriëntering van die nutsbalk" -#: gtk/gtkaboutdialog.c:230 +#: gtk/gtkaboutdialog.c:269 msgid "Copyright string" msgstr "" -#: gtk/gtkaboutdialog.c:231 +#: gtk/gtkaboutdialog.c:270 msgid "Copyright information for the program" msgstr "" -#: gtk/gtkaboutdialog.c:248 +#: gtk/gtkaboutdialog.c:287 #, fuzzy msgid "Comments string" msgstr "Kolomspasiëring" -#: gtk/gtkaboutdialog.c:249 +#: gtk/gtkaboutdialog.c:288 msgid "Comments about the program" msgstr "" -#: gtk/gtkaboutdialog.c:283 +#: gtk/gtkaboutdialog.c:322 msgid "Website URL" msgstr "" -#: gtk/gtkaboutdialog.c:284 +#: gtk/gtkaboutdialog.c:323 msgid "The URL for the link to the website of the program" msgstr "" -#: gtk/gtkaboutdialog.c:300 +#: gtk/gtkaboutdialog.c:339 #, fuzzy msgid "Website label" msgstr "Gebruik grootte in etiket" -#: gtk/gtkaboutdialog.c:301 +#: gtk/gtkaboutdialog.c:340 msgid "" "The label for the link to the website of the program. If this is not set, it " "defaults to the URL" msgstr "" -#: gtk/gtkaboutdialog.c:317 +#: gtk/gtkaboutdialog.c:356 msgid "Authors" msgstr "" -#: gtk/gtkaboutdialog.c:318 +#: gtk/gtkaboutdialog.c:357 #, fuzzy msgid "List of authors of the program" msgstr "Die oriëntering van die nutsbalk" -#: gtk/gtkaboutdialog.c:334 +#: gtk/gtkaboutdialog.c:373 msgid "Documenters" msgstr "" -#: gtk/gtkaboutdialog.c:335 +#: gtk/gtkaboutdialog.c:374 msgid "List of people documenting the program" msgstr "" -#: gtk/gtkaboutdialog.c:351 +#: gtk/gtkaboutdialog.c:390 msgid "Artists" msgstr "" -#: gtk/gtkaboutdialog.c:352 +#: gtk/gtkaboutdialog.c:391 msgid "List of people who have contributed artwork to the program" msgstr "" -#: gtk/gtkaboutdialog.c:369 +#: gtk/gtkaboutdialog.c:408 msgid "Translator credits" msgstr "" -#: gtk/gtkaboutdialog.c:370 +#: gtk/gtkaboutdialog.c:409 msgid "" "Credits to the translators. This string should be marked as translatable" msgstr "" -#: gtk/gtkaboutdialog.c:385 +#: gtk/gtkaboutdialog.c:424 msgid "Logo" msgstr "" -#: gtk/gtkaboutdialog.c:386 +#: gtk/gtkaboutdialog.c:425 msgid "" "A logo for the about box. If this is not set, it defaults to " "gtk_window_get_default_icon_list()" msgstr "" -#: gtk/gtkaboutdialog.c:401 +#: gtk/gtkaboutdialog.c:440 #, fuzzy msgid "Logo Icon Name" msgstr "Fontnaam" -#: gtk/gtkaboutdialog.c:402 +#: gtk/gtkaboutdialog.c:441 msgid "A named icon to use as the logo for the about box." msgstr "" -#: gtk/gtkaboutdialog.c:415 +#: gtk/gtkaboutdialog.c:454 #, fuzzy msgid "Wrap license" msgstr "Omvoumodusstel" -#: gtk/gtkaboutdialog.c:416 +#: gtk/gtkaboutdialog.c:455 #, fuzzy msgid "Whether to wrap the license text." msgstr "Of die teks deurgehaal moet word" @@ -311,7 +311,7 @@ msgid "The GIcon being displayed" msgstr "Ikonstel wat vertoon moet word" #: gtk/gtkaction.c:282 gtk/gtkcellrendererpixbuf.c:171 gtk/gtkimage.c:230 -#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:605 +#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:606 #, fuzzy msgid "Icon Name" msgstr "Fontnaam" @@ -419,7 +419,7 @@ msgid "Whether the action group is visible." msgstr "Of die aksiegroep sigbaar is." #: gtk/gtkadjustment.c:93 gtk/gtkcellrendererprogress.c:128 -#: gtk/gtkscalebutton.c:204 gtk/gtkspinbutton.c:269 +#: gtk/gtkscalebutton.c:206 gtk/gtkspinbutton.c:269 msgid "Value" msgstr "Waarde" @@ -604,70 +604,70 @@ msgstr "Gehoorsaam kind" msgid "Force aspect ratio to match that of the frame's child" msgstr "Forseer aspekratio om by die raam se kind s'n te pas" -#: gtk/gtkassistant.c:261 +#: gtk/gtkassistant.c:281 #, fuzzy msgid "Header Padding" msgstr "Linkeropvulling" -#: gtk/gtkassistant.c:262 +#: gtk/gtkassistant.c:282 #, fuzzy msgid "Number of pixels around the header." msgstr "Styl skuinskant rondom die kieslysstaaf" -#: gtk/gtkassistant.c:269 +#: gtk/gtkassistant.c:289 #, fuzzy msgid "Content Padding" msgstr "Onderkantopvulling" -#: gtk/gtkassistant.c:270 +#: gtk/gtkassistant.c:290 #, fuzzy msgid "Number of pixels around the content pages." msgstr "Styl van skuinskant rondom die inhoud" -#: gtk/gtkassistant.c:286 +#: gtk/gtkassistant.c:306 #, fuzzy msgid "Page type" msgstr "Paksoort" -#: gtk/gtkassistant.c:287 +#: gtk/gtkassistant.c:307 #, fuzzy msgid "The type of the assistant page" msgstr "Die soort boodskap" -#: gtk/gtkassistant.c:304 +#: gtk/gtkassistant.c:324 #, fuzzy msgid "Page title" msgstr "Bladsygrootte" -#: gtk/gtkassistant.c:305 +#: gtk/gtkassistant.c:325 #, fuzzy msgid "The title of the assistant page" msgstr "Die titel van die venster" -#: gtk/gtkassistant.c:321 +#: gtk/gtkassistant.c:341 #, fuzzy msgid "Header image" msgstr "Koppe kliekbaar" -#: gtk/gtkassistant.c:322 +#: gtk/gtkassistant.c:342 msgid "Header image for the assistant page" msgstr "" -#: gtk/gtkassistant.c:338 +#: gtk/gtkassistant.c:358 #, fuzzy msgid "Sidebar image" msgstr "Die waarde" -#: gtk/gtkassistant.c:339 +#: gtk/gtkassistant.c:359 msgid "Sidebar image for the assistant page" msgstr "" -#: gtk/gtkassistant.c:354 +#: gtk/gtkassistant.c:374 #, fuzzy msgid "Page complete" msgstr "Bladsyinkrement" -#: gtk/gtkassistant.c:355 +#: gtk/gtkassistant.c:375 msgid "Whether all required fields on the page have been filled out" msgstr "" @@ -931,7 +931,7 @@ msgid "" "rectangle" msgstr "" -#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1661 +#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1682 #, fuzzy msgid "Inner Border" msgstr "Oortjiegrens" @@ -1290,7 +1290,7 @@ msgstr "" msgid "Whether the rendered pixbuf should be colorized according to the state" msgstr "Of die grens vertoon moet word of nie" -#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:589 +#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:590 msgid "Icon" msgstr "Ikon" @@ -1352,7 +1352,7 @@ msgid "Orientation and growth direction of the progress bar" msgstr "Oriëntering en groeirigting van die vorderingstaaf" #: gtk/gtkcellrendererspin.c:93 gtk/gtkprogressbar.c:118 gtk/gtkrange.c:367 -#: gtk/gtkscalebutton.c:223 gtk/gtkspinbutton.c:208 +#: gtk/gtkscalebutton.c:225 gtk/gtkspinbutton.c:208 msgid "Adjustment" msgstr "Verstelling" @@ -1370,7 +1370,7 @@ msgstr "Klimkoers" msgid "The acceleration rate when you hold down a button" msgstr "Die versnellingskoers wanneer jy 'n knoppie inhou" -#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:200 gtk/gtkspinbutton.c:226 +#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:218 gtk/gtkspinbutton.c:226 msgid "Digits" msgstr "Syfers" @@ -2252,11 +2252,11 @@ msgid "" "Border between text and frame. Overrides the inner-border style property" msgstr "" -#: gtk/gtkentry.c:666 +#: gtk/gtkentry.c:666 gtk/gtkentry.c:1232 msgid "Invisible character" msgstr "Onsigbare karakter" -#: gtk/gtkentry.c:667 +#: gtk/gtkentry.c:667 gtk/gtkentry.c:1233 msgid "The character to use when masking entry contents (in \"password mode\")" msgstr "" "Die karakter om te gebruik wanneer inskrywingsinhoud verberg word (in " @@ -2571,34 +2571,34 @@ msgstr "Troggrens" msgid "Border around the progress bar" msgstr "Teks wat in die vorderingstaaf vertoon moet word" -#: gtk/gtkentry.c:1662 +#: gtk/gtkentry.c:1683 msgid "Border between text and frame." msgstr "" -#: gtk/gtkentry.c:1676 +#: gtk/gtkentry.c:1697 #, fuzzy msgid "State Hint" msgstr "Reëlsverwenking" -#: gtk/gtkentry.c:1677 +#: gtk/gtkentry.c:1698 #, fuzzy msgid "Whether to pass a proper state when drawing shadow or background" msgstr "Biskaart om as masker te gebruik wanneer teksagtergrond geteken word" -#: gtk/gtkentry.c:1682 gtk/gtklabel.c:695 +#: gtk/gtkentry.c:1703 gtk/gtklabel.c:695 msgid "Select on focus" msgstr "Merk by fokus" -#: gtk/gtkentry.c:1683 +#: gtk/gtkentry.c:1704 msgid "Whether to select the contents of an entry when it is focused" msgstr "" "Of die inhoud van 'n inskrywing gemerk moet word wanneer die fokus daarop is" -#: gtk/gtkentry.c:1697 +#: gtk/gtkentry.c:1718 msgid "Password Hint Timeout" msgstr "" -#: gtk/gtkentry.c:1698 +#: gtk/gtkentry.c:1719 msgid "How long to show the last input character in hidden entries" msgstr "" @@ -3218,7 +3218,7 @@ msgstr "Ikonstel" msgid "Icon set to display" msgstr "Ikonstel wat vertoon moet word" -#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:214 gtk/gtktoolbar.c:540 +#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:216 gtk/gtktoolbar.c:540 msgid "Icon size" msgstr "Ikongrootte" @@ -3289,7 +3289,7 @@ msgstr "Vertoon kieslysbeelde" msgid "Whether images should be shown in menus" msgstr "Of beelde in kieslyste vertoon moet word" -#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:614 +#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:615 msgid "The screen where this window will be displayed" msgstr "Die skerm waarop hierdie venster vertoon sal word" @@ -4326,7 +4326,7 @@ msgstr "" msgid "Page Setup" msgstr "Bladsygrootte" -#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1027 +#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1050 msgid "Track Print Status" msgstr "" @@ -4336,123 +4336,123 @@ msgid "" "print data has been sent to the printer or print server." msgstr "" -#: gtk/gtkprintoperation.c:899 +#: gtk/gtkprintoperation.c:922 #, fuzzy msgid "Default Page Setup" msgstr "Verstekhoogte" -#: gtk/gtkprintoperation.c:900 +#: gtk/gtkprintoperation.c:923 msgid "The GtkPageSetup used by default" msgstr "" -#: gtk/gtkprintoperation.c:918 gtk/gtkprintunixdialog.c:276 +#: gtk/gtkprintoperation.c:941 gtk/gtkprintunixdialog.c:276 msgid "Print Settings" msgstr "" -#: gtk/gtkprintoperation.c:919 gtk/gtkprintunixdialog.c:277 +#: gtk/gtkprintoperation.c:942 gtk/gtkprintunixdialog.c:277 msgid "The GtkPrintSettings used for initializing the dialog" msgstr "" -#: gtk/gtkprintoperation.c:937 +#: gtk/gtkprintoperation.c:960 #, fuzzy msgid "Job Name" msgstr "Fontnaam" -#: gtk/gtkprintoperation.c:938 +#: gtk/gtkprintoperation.c:961 msgid "A string used for identifying the print job." msgstr "" -#: gtk/gtkprintoperation.c:962 +#: gtk/gtkprintoperation.c:985 #, fuzzy msgid "Number of Pages" msgstr "Getal kanale" -#: gtk/gtkprintoperation.c:963 +#: gtk/gtkprintoperation.c:986 #, fuzzy msgid "The number of pages in the document." msgstr "Die getal rye in die tabel" -#: gtk/gtkprintoperation.c:984 gtk/gtkprintunixdialog.c:266 +#: gtk/gtkprintoperation.c:1007 gtk/gtkprintunixdialog.c:266 #, fuzzy msgid "Current Page" msgstr "Huidige alfa" -#: gtk/gtkprintoperation.c:985 gtk/gtkprintunixdialog.c:267 +#: gtk/gtkprintoperation.c:1008 gtk/gtkprintunixdialog.c:267 #, fuzzy msgid "The current page in the document" msgstr "Die bladsygrootte van die aanpassing" -#: gtk/gtkprintoperation.c:1006 +#: gtk/gtkprintoperation.c:1029 #, fuzzy msgid "Use full page" msgstr "Gebruik alfa" -#: gtk/gtkprintoperation.c:1007 +#: gtk/gtkprintoperation.c:1030 msgid "" "TRUE if the origin of the context should be at the corner of the page and " "not the corner of the imageable area" msgstr "" -#: gtk/gtkprintoperation.c:1028 +#: gtk/gtkprintoperation.c:1051 msgid "" "TRUE if the print operation will continue to report on the print job status " "after the print data has been sent to the printer or print server." msgstr "" -#: gtk/gtkprintoperation.c:1045 +#: gtk/gtkprintoperation.c:1068 msgid "Unit" msgstr "" -#: gtk/gtkprintoperation.c:1046 +#: gtk/gtkprintoperation.c:1069 msgid "The unit in which distances can be measured in the context" msgstr "" -#: gtk/gtkprintoperation.c:1063 +#: gtk/gtkprintoperation.c:1086 #, fuzzy msgid "Show Dialog" msgstr "Toon kop" -#: gtk/gtkprintoperation.c:1064 +#: gtk/gtkprintoperation.c:1087 msgid "TRUE if a progress dialog is shown while printing." msgstr "" -#: gtk/gtkprintoperation.c:1087 +#: gtk/gtkprintoperation.c:1110 #, fuzzy msgid "Allow Async" msgstr "Laat reëls toe" -#: gtk/gtkprintoperation.c:1088 +#: gtk/gtkprintoperation.c:1111 msgid "TRUE if print process may run asynchronous." msgstr "" -#: gtk/gtkprintoperation.c:1110 gtk/gtkprintoperation.c:1111 +#: gtk/gtkprintoperation.c:1133 gtk/gtkprintoperation.c:1134 #, fuzzy msgid "Export filename" msgstr "Lêernaam" -#: gtk/gtkprintoperation.c:1125 +#: gtk/gtkprintoperation.c:1148 msgid "Status" msgstr "" -#: gtk/gtkprintoperation.c:1126 +#: gtk/gtkprintoperation.c:1149 #, fuzzy msgid "The status of the print operation" msgstr "Die swikstaat van die knoppie" -#: gtk/gtkprintoperation.c:1146 +#: gtk/gtkprintoperation.c:1169 msgid "Status String" msgstr "" -#: gtk/gtkprintoperation.c:1147 +#: gtk/gtkprintoperation.c:1170 msgid "A human-readable description of the status" msgstr "" -#: gtk/gtkprintoperation.c:1165 +#: gtk/gtkprintoperation.c:1188 #, fuzzy msgid "Custom tab label" msgstr "Doelgemaakte palet" -#: gtk/gtkprintoperation.c:1166 +#: gtk/gtkprintoperation.c:1189 msgid "Label for the tab containing custom widgets." msgstr "" @@ -4974,64 +4974,64 @@ msgstr "Numeries" msgid "The metric used for the ruler" msgstr "Die model vir die boomaansig" -#: gtk/gtkscale.c:201 +#: gtk/gtkscale.c:219 msgid "The number of decimal places that are displayed in the value" msgstr "Die getal desimale plekke wat in die waarde vertoon word" -#: gtk/gtkscale.c:210 +#: gtk/gtkscale.c:228 msgid "Draw Value" msgstr "Tekenwaarde" -#: gtk/gtkscale.c:211 +#: gtk/gtkscale.c:229 msgid "Whether the current value is displayed as a string next to the slider" msgstr "Of die huidige waarde as 'n string langs die skuifknoppie vertoon word" -#: gtk/gtkscale.c:218 +#: gtk/gtkscale.c:236 msgid "Value Position" msgstr "Waardeposisie" -#: gtk/gtkscale.c:219 +#: gtk/gtkscale.c:237 msgid "The position in which the current value is displayed" msgstr "Die posisie waarin die huidige waarde vertoon word" -#: gtk/gtkscale.c:226 +#: gtk/gtkscale.c:244 msgid "Slider Length" msgstr "Skuifknoppielengte" -#: gtk/gtkscale.c:227 +#: gtk/gtkscale.c:245 msgid "Length of scale's slider" msgstr "Lengte van skaal se skuifknoppie" -#: gtk/gtkscale.c:235 +#: gtk/gtkscale.c:253 msgid "Value spacing" msgstr "Waardespasiëring" -#: gtk/gtkscale.c:236 +#: gtk/gtkscale.c:254 msgid "Space between value text and the slider/trough area" msgstr "Ruimte tussen waardeteks en die skuifknoppie/trog-streek" -#: gtk/gtkscalebutton.c:205 +#: gtk/gtkscalebutton.c:207 #, fuzzy msgid "The value of the scale" msgstr "Die waarde van die aanpassing" -#: gtk/gtkscalebutton.c:215 +#: gtk/gtkscalebutton.c:217 #, fuzzy msgid "The icon size" msgstr "Nutsbalkikongrootte" -#: gtk/gtkscalebutton.c:224 +#: gtk/gtkscalebutton.c:226 #, fuzzy msgid "" "The GtkAdjustment that contains the current value of this scale button object" msgstr "Die GtkAdjustment wat die huidige waarde van hierdie reikobjek bevat" -#: gtk/gtkscalebutton.c:252 +#: gtk/gtkscalebutton.c:254 #, fuzzy msgid "Icons" msgstr "Ikon" -#: gtk/gtkscalebutton.c:253 +#: gtk/gtkscalebutton.c:255 #, fuzzy msgid "List of icon names" msgstr "Fontnaam" @@ -6825,7 +6825,7 @@ msgstr "Stippelpatroon wat gebruik moet word om die fokusaanwyser te teken" msgid "Whether to display the column" msgstr "Of die kolom vertoon moet word" -#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:536 +#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:537 msgid "Resizable" msgstr "Skaleerbaar" @@ -7257,49 +7257,49 @@ msgstr "Vertikalerolstaaf-beleid" msgid "The length of vertical scroll arrows" msgstr "Wanneer die vertikale rolstaaf vertoon word" -#: gtk/gtkwindow.c:477 +#: gtk/gtkwindow.c:478 msgid "Window Type" msgstr "Venstersoort" -#: gtk/gtkwindow.c:478 +#: gtk/gtkwindow.c:479 msgid "The type of the window" msgstr "Die soort venster" -#: gtk/gtkwindow.c:486 +#: gtk/gtkwindow.c:487 msgid "Window Title" msgstr "Venstertitel" -#: gtk/gtkwindow.c:487 +#: gtk/gtkwindow.c:488 msgid "The title of the window" msgstr "Die titel van die venster" -#: gtk/gtkwindow.c:494 +#: gtk/gtkwindow.c:495 msgid "Window Role" msgstr "Vensterrol" -#: gtk/gtkwindow.c:495 +#: gtk/gtkwindow.c:496 msgid "Unique identifier for the window to be used when restoring a session" msgstr "" "Unieke identifiseerder vir die venster wat gebruik moet word wanneer 'n " "sessie herstel word" -#: gtk/gtkwindow.c:511 +#: gtk/gtkwindow.c:512 #, fuzzy msgid "Startup ID" msgstr "Groep" -#: gtk/gtkwindow.c:512 +#: gtk/gtkwindow.c:513 #, fuzzy msgid "Unique startup identifier for the window used by startup-notification" msgstr "" "Unieke identifiseerder vir die venster wat gebruik moet word wanneer 'n " "sessie herstel word" -#: gtk/gtkwindow.c:519 +#: gtk/gtkwindow.c:520 msgid "Allow Shrink" msgstr "Laat verklein toe" -#: gtk/gtkwindow.c:521 +#: gtk/gtkwindow.c:522 #, no-c-format msgid "" "If TRUE, the window has no mimimum size. Setting this to TRUE is 99% of the " @@ -7308,24 +7308,24 @@ msgstr "" "Indien WAAR het die venster geen minimum grootte nie Om dié waarde op WAAR " "te stel is 99% van die tyd 'n slegte idee" -#: gtk/gtkwindow.c:528 +#: gtk/gtkwindow.c:529 msgid "Allow Grow" msgstr "Laat vergroot toe" -#: gtk/gtkwindow.c:529 +#: gtk/gtkwindow.c:530 msgid "If TRUE, users can expand the window beyond its minimum size" msgstr "" "Indien WAAR kan gebruikers die venster buite die minimum grootte vergroot" -#: gtk/gtkwindow.c:537 +#: gtk/gtkwindow.c:538 msgid "If TRUE, users can resize the window" msgstr "Indien WAAR kan gebruikers die venster skaleer" -#: gtk/gtkwindow.c:544 +#: gtk/gtkwindow.c:545 msgid "Modal" msgstr "Modaal" -#: gtk/gtkwindow.c:545 +#: gtk/gtkwindow.c:546 msgid "" "If TRUE, the window is modal (other windows are not usable while this one is " "up)" @@ -7333,73 +7333,73 @@ msgstr "" "Indien WAAR is die venster modaal (ander vensters is nie bruikbaar terwyl " "hierdie een op is nie)" -#: gtk/gtkwindow.c:552 +#: gtk/gtkwindow.c:553 msgid "Window Position" msgstr "Vensterposisie" -#: gtk/gtkwindow.c:553 +#: gtk/gtkwindow.c:554 msgid "The initial position of the window" msgstr "Die aanvanklike posisie van die venster" -#: gtk/gtkwindow.c:561 +#: gtk/gtkwindow.c:562 msgid "Default Width" msgstr "Verstekwydte" -#: gtk/gtkwindow.c:562 +#: gtk/gtkwindow.c:563 msgid "The default width of the window, used when initially showing the window" msgstr "" "Die verstekwydte van die venster, gebruik wanneer die venster aanvanklik " "vertoon word" -#: gtk/gtkwindow.c:571 +#: gtk/gtkwindow.c:572 msgid "Default Height" msgstr "Verstekhoogte" -#: gtk/gtkwindow.c:572 +#: gtk/gtkwindow.c:573 msgid "" "The default height of the window, used when initially showing the window" msgstr "" "Die verstekhoogte van die venster, gebruik wanneer die venster aanvanklik " "vertoon word" -#: gtk/gtkwindow.c:581 +#: gtk/gtkwindow.c:582 msgid "Destroy with Parent" msgstr "Vernietig met ouer" -#: gtk/gtkwindow.c:582 +#: gtk/gtkwindow.c:583 msgid "If this window should be destroyed when the parent is destroyed" msgstr "Of hierdie venster vernietig moet word wanneer die ouer vernietig word" -#: gtk/gtkwindow.c:590 +#: gtk/gtkwindow.c:591 msgid "Icon for this window" msgstr "Ikon vir die venster" -#: gtk/gtkwindow.c:606 +#: gtk/gtkwindow.c:607 #, fuzzy msgid "Name of the themed icon for this window" msgstr "Ikon vir die venster" -#: gtk/gtkwindow.c:621 +#: gtk/gtkwindow.c:622 msgid "Is Active" msgstr "Is aktief" -#: gtk/gtkwindow.c:622 +#: gtk/gtkwindow.c:623 msgid "Whether the toplevel is the current active window" msgstr "Of die bokant die huidige aktiewe venster is" -#: gtk/gtkwindow.c:629 +#: gtk/gtkwindow.c:630 msgid "Focus in Toplevel" msgstr "Fokus in bokant" -#: gtk/gtkwindow.c:630 +#: gtk/gtkwindow.c:631 msgid "Whether the input focus is within this GtkWindow" msgstr "Of die toevoerfokus binne hierdie GtkWindow is" -#: gtk/gtkwindow.c:637 +#: gtk/gtkwindow.c:638 msgid "Type hint" msgstr "Soort wenk" -#: gtk/gtkwindow.c:638 +#: gtk/gtkwindow.c:639 msgid "" "Hint to help the desktop environment understand what kind of window this is " "and how to treat it." @@ -7407,89 +7407,89 @@ msgstr "" "Wenk om die werkskermomgewing te laat begryp watter soort venster dit is en " "hoe om dit te hanteer." -#: gtk/gtkwindow.c:646 +#: gtk/gtkwindow.c:647 msgid "Skip taskbar" msgstr "Slaan taakbalk oor" -#: gtk/gtkwindow.c:647 +#: gtk/gtkwindow.c:648 msgid "TRUE if the window should not be in the task bar." msgstr "WAAR indien die venster nie in die taakbalk moet wees nie." -#: gtk/gtkwindow.c:654 +#: gtk/gtkwindow.c:655 msgid "Skip pager" msgstr "Slaan roeper oor" -#: gtk/gtkwindow.c:655 +#: gtk/gtkwindow.c:656 msgid "TRUE if the window should not be in the pager." msgstr "WAAR indien die venster nie in die roeper moet wees nie." -#: gtk/gtkwindow.c:662 +#: gtk/gtkwindow.c:663 msgid "Urgent" msgstr "" -#: gtk/gtkwindow.c:663 +#: gtk/gtkwindow.c:664 #, fuzzy msgid "TRUE if the window should be brought to the user's attention." msgstr "WAAR indien die venster nie in die roeper moet wees nie." -#: gtk/gtkwindow.c:677 +#: gtk/gtkwindow.c:678 msgid "Accept focus" msgstr "Aanvaar fokus" -#: gtk/gtkwindow.c:678 +#: gtk/gtkwindow.c:679 msgid "TRUE if the window should receive the input focus." msgstr "WAAR indien die venster die toevoerfokus moet ontvang." -#: gtk/gtkwindow.c:692 +#: gtk/gtkwindow.c:693 #, fuzzy msgid "Focus on map" msgstr "Fokus op kliek" -#: gtk/gtkwindow.c:693 +#: gtk/gtkwindow.c:694 #, fuzzy msgid "TRUE if the window should receive the input focus when mapped." msgstr "WAAR indien die venster die toevoerfokus moet ontvang." -#: gtk/gtkwindow.c:707 +#: gtk/gtkwindow.c:708 msgid "Decorated" msgstr "Versier" -#: gtk/gtkwindow.c:708 +#: gtk/gtkwindow.c:709 msgid "Whether the window should be decorated by the window manager" msgstr "Of die venster deur die vensterbestuurder versier moet word" -#: gtk/gtkwindow.c:722 +#: gtk/gtkwindow.c:723 #, fuzzy msgid "Deletable" msgstr "Kiesbaar" -#: gtk/gtkwindow.c:723 +#: gtk/gtkwindow.c:724 #, fuzzy msgid "Whether the window frame should have a close button" msgstr "Of die venster deur die vensterbestuurder versier moet word" -#: gtk/gtkwindow.c:739 +#: gtk/gtkwindow.c:740 msgid "Gravity" msgstr "Gravitasie" -#: gtk/gtkwindow.c:740 +#: gtk/gtkwindow.c:741 msgid "The window gravity of the window" msgstr "Die venstergravitasie van die venster" -#: gtk/gtkwindow.c:757 +#: gtk/gtkwindow.c:758 msgid "Transient for Window" msgstr "" -#: gtk/gtkwindow.c:758 +#: gtk/gtkwindow.c:759 #, fuzzy msgid "The transient parent of the dialog" msgstr "Die knoppies wat in die boodskapdialoog vertoon word" -#: gtk/gtkwindow.c:773 +#: gtk/gtkwindow.c:774 msgid "Opacity for Window" msgstr "" -#: gtk/gtkwindow.c:774 +#: gtk/gtkwindow.c:775 #, fuzzy msgid "The opacity of the window, from 0 to 1" msgstr "Die soort venster" diff --git a/po-properties/am.po b/po-properties/am.po index 70c9ccfee3..722fb41575 100644 --- a/po-properties/am.po +++ b/po-properties/am.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gtk+ 2.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-03-13 10:29-0400\n" +"POT-Creation-Date: 2009-05-04 01:14-0400\n" "PO-Revision-Date: 2003-01-14 11:02+EDT\n" "Last-Translator: Ge'ez Frontier Foundation \n" "Language-Team: Amharic \n" @@ -91,12 +91,12 @@ msgstr "" msgid "The default display for GDK" msgstr "" -#: gdk/gdkpango.c:490 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 -#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:613 +#: gdk/gdkpango.c:537 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 +#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:614 msgid "Screen" msgstr "እስክሪን" -#: gdk/gdkpango.c:491 +#: gdk/gdkpango.c:538 msgid "the GdkScreen for the renderer" msgstr "" @@ -116,117 +116,117 @@ msgstr "" msgid "The resolution for fonts on the screen" msgstr "" -#: gtk/gtkaboutdialog.c:200 +#: gtk/gtkaboutdialog.c:239 msgid "Program name" msgstr "" -#: gtk/gtkaboutdialog.c:201 +#: gtk/gtkaboutdialog.c:240 msgid "" "The name of the program. If this is not set, it defaults to " "g_get_application_name()" msgstr "" -#: gtk/gtkaboutdialog.c:215 +#: gtk/gtkaboutdialog.c:254 msgid "Program version" msgstr "" -#: gtk/gtkaboutdialog.c:216 +#: gtk/gtkaboutdialog.c:255 #, fuzzy msgid "The version of the program" msgstr "የጽሑፉ መለያ" -#: gtk/gtkaboutdialog.c:230 +#: gtk/gtkaboutdialog.c:269 msgid "Copyright string" msgstr "" -#: gtk/gtkaboutdialog.c:231 +#: gtk/gtkaboutdialog.c:270 msgid "Copyright information for the program" msgstr "" -#: gtk/gtkaboutdialog.c:248 +#: gtk/gtkaboutdialog.c:287 msgid "Comments string" msgstr "" -#: gtk/gtkaboutdialog.c:249 +#: gtk/gtkaboutdialog.c:288 msgid "Comments about the program" msgstr "" -#: gtk/gtkaboutdialog.c:283 +#: gtk/gtkaboutdialog.c:322 msgid "Website URL" msgstr "" -#: gtk/gtkaboutdialog.c:284 +#: gtk/gtkaboutdialog.c:323 msgid "The URL for the link to the website of the program" msgstr "" -#: gtk/gtkaboutdialog.c:300 +#: gtk/gtkaboutdialog.c:339 msgid "Website label" msgstr "" -#: gtk/gtkaboutdialog.c:301 +#: gtk/gtkaboutdialog.c:340 msgid "" "The label for the link to the website of the program. If this is not set, it " "defaults to the URL" msgstr "" -#: gtk/gtkaboutdialog.c:317 +#: gtk/gtkaboutdialog.c:356 msgid "Authors" msgstr "" -#: gtk/gtkaboutdialog.c:318 +#: gtk/gtkaboutdialog.c:357 #, fuzzy msgid "List of authors of the program" msgstr "የጽሑፉ መለያ" -#: gtk/gtkaboutdialog.c:334 +#: gtk/gtkaboutdialog.c:373 msgid "Documenters" msgstr "" -#: gtk/gtkaboutdialog.c:335 +#: gtk/gtkaboutdialog.c:374 msgid "List of people documenting the program" msgstr "" -#: gtk/gtkaboutdialog.c:351 +#: gtk/gtkaboutdialog.c:390 msgid "Artists" msgstr "" -#: gtk/gtkaboutdialog.c:352 +#: gtk/gtkaboutdialog.c:391 msgid "List of people who have contributed artwork to the program" msgstr "" -#: gtk/gtkaboutdialog.c:369 +#: gtk/gtkaboutdialog.c:408 msgid "Translator credits" msgstr "" -#: gtk/gtkaboutdialog.c:370 +#: gtk/gtkaboutdialog.c:409 msgid "" "Credits to the translators. This string should be marked as translatable" msgstr "" -#: gtk/gtkaboutdialog.c:385 +#: gtk/gtkaboutdialog.c:424 msgid "Logo" msgstr "" -#: gtk/gtkaboutdialog.c:386 +#: gtk/gtkaboutdialog.c:425 msgid "" "A logo for the about box. If this is not set, it defaults to " "gtk_window_get_default_icon_list()" msgstr "" -#: gtk/gtkaboutdialog.c:401 +#: gtk/gtkaboutdialog.c:440 #, fuzzy msgid "Logo Icon Name" msgstr "የፊደሉ ቅርጽ ስም" -#: gtk/gtkaboutdialog.c:402 +#: gtk/gtkaboutdialog.c:441 msgid "A named icon to use as the logo for the about box." msgstr "" -#: gtk/gtkaboutdialog.c:415 +#: gtk/gtkaboutdialog.c:454 msgid "Wrap license" msgstr "" -#: gtk/gtkaboutdialog.c:416 +#: gtk/gtkaboutdialog.c:455 msgid "Whether to wrap the license text." msgstr "" @@ -302,7 +302,7 @@ msgid "The GIcon being displayed" msgstr "" #: gtk/gtkaction.c:282 gtk/gtkcellrendererpixbuf.c:171 gtk/gtkimage.c:230 -#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:605 +#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:606 #, fuzzy msgid "Icon Name" msgstr "የፊደሉ ቅርጽ ስም" @@ -404,7 +404,7 @@ msgid "Whether the action group is visible." msgstr "" #: gtk/gtkadjustment.c:93 gtk/gtkcellrendererprogress.c:128 -#: gtk/gtkscalebutton.c:204 gtk/gtkspinbutton.c:269 +#: gtk/gtkscalebutton.c:206 gtk/gtkspinbutton.c:269 msgid "Value" msgstr "ዕሴት" @@ -593,70 +593,70 @@ msgstr "" msgid "Force aspect ratio to match that of the frame's child" msgstr "" -#: gtk/gtkassistant.c:261 +#: gtk/gtkassistant.c:281 #, fuzzy msgid "Header Padding" msgstr "የግራ ህዳግ" -#: gtk/gtkassistant.c:262 +#: gtk/gtkassistant.c:282 #, fuzzy msgid "Number of pixels around the header." msgstr "የጽሑፉ መለያ" -#: gtk/gtkassistant.c:269 +#: gtk/gtkassistant.c:289 #, fuzzy msgid "Content Padding" msgstr "የግራ ህዳግ" -#: gtk/gtkassistant.c:270 +#: gtk/gtkassistant.c:290 #, fuzzy msgid "Number of pixels around the content pages." msgstr "የጽሑፉ መለያ" -#: gtk/gtkassistant.c:286 +#: gtk/gtkassistant.c:306 #, fuzzy msgid "Page type" msgstr "መጠን" -#: gtk/gtkassistant.c:287 +#: gtk/gtkassistant.c:307 #, fuzzy msgid "The type of the assistant page" msgstr "የመስኮቱ ዓይነት" -#: gtk/gtkassistant.c:304 +#: gtk/gtkassistant.c:324 #, fuzzy msgid "Page title" msgstr "መጠን" -#: gtk/gtkassistant.c:305 +#: gtk/gtkassistant.c:325 #, fuzzy msgid "The title of the assistant page" msgstr "የመስኮቱ አርእስት" -#: gtk/gtkassistant.c:321 +#: gtk/gtkassistant.c:341 #, fuzzy msgid "Header image" msgstr "የጭብጥ ስም" -#: gtk/gtkassistant.c:322 +#: gtk/gtkassistant.c:342 msgid "Header image for the assistant page" msgstr "" -#: gtk/gtkassistant.c:338 +#: gtk/gtkassistant.c:358 #, fuzzy msgid "Sidebar image" msgstr "የጭብጥ ስም" -#: gtk/gtkassistant.c:339 +#: gtk/gtkassistant.c:359 msgid "Sidebar image for the assistant page" msgstr "" -#: gtk/gtkassistant.c:354 +#: gtk/gtkassistant.c:374 #, fuzzy msgid "Page complete" msgstr "መጠን" -#: gtk/gtkassistant.c:355 +#: gtk/gtkassistant.c:375 msgid "Whether all required fields on the page have been filled out" msgstr "" @@ -900,7 +900,7 @@ msgid "" "rectangle" msgstr "" -#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1661 +#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1682 #, fuzzy msgid "Inner Border" msgstr "ቅደም ተከተል" @@ -1247,7 +1247,7 @@ msgstr "" msgid "Whether the rendered pixbuf should be colorized according to the state" msgstr "" -#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:589 +#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:590 msgid "Icon" msgstr "ምልክት" @@ -1305,7 +1305,7 @@ msgid "Orientation and growth direction of the progress bar" msgstr "" #: gtk/gtkcellrendererspin.c:93 gtk/gtkprogressbar.c:118 gtk/gtkrange.c:367 -#: gtk/gtkscalebutton.c:223 gtk/gtkspinbutton.c:208 +#: gtk/gtkscalebutton.c:225 gtk/gtkspinbutton.c:208 msgid "Adjustment" msgstr "" @@ -1321,7 +1321,7 @@ msgstr "" msgid "The acceleration rate when you hold down a button" msgstr "" -#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:200 gtk/gtkspinbutton.c:226 +#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:218 gtk/gtkspinbutton.c:226 msgid "Digits" msgstr "" @@ -2165,11 +2165,11 @@ msgid "" "Border between text and frame. Overrides the inner-border style property" msgstr "" -#: gtk/gtkentry.c:666 +#: gtk/gtkentry.c:666 gtk/gtkentry.c:1232 msgid "Invisible character" msgstr "" -#: gtk/gtkentry.c:667 +#: gtk/gtkentry.c:667 gtk/gtkentry.c:1233 msgid "The character to use when masking entry contents (in \"password mode\")" msgstr "" @@ -2451,31 +2451,31 @@ msgstr "ቅደም ተከተል" msgid "Border around the progress bar" msgstr "የጽሑፉ መለያ" -#: gtk/gtkentry.c:1662 +#: gtk/gtkentry.c:1683 msgid "Border between text and frame." msgstr "" -#: gtk/gtkentry.c:1676 +#: gtk/gtkentry.c:1697 msgid "State Hint" msgstr "" -#: gtk/gtkentry.c:1677 +#: gtk/gtkentry.c:1698 msgid "Whether to pass a proper state when drawing shadow or background" msgstr "" -#: gtk/gtkentry.c:1682 gtk/gtklabel.c:695 +#: gtk/gtkentry.c:1703 gtk/gtklabel.c:695 msgid "Select on focus" msgstr "" -#: gtk/gtkentry.c:1683 +#: gtk/gtkentry.c:1704 msgid "Whether to select the contents of an entry when it is focused" msgstr "" -#: gtk/gtkentry.c:1697 +#: gtk/gtkentry.c:1718 msgid "Password Hint Timeout" msgstr "" -#: gtk/gtkentry.c:1698 +#: gtk/gtkentry.c:1719 msgid "How long to show the last input character in hidden entries" msgstr "" @@ -3082,7 +3082,7 @@ msgstr "" msgid "Icon set to display" msgstr "" -#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:214 gtk/gtktoolbar.c:540 +#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:216 gtk/gtktoolbar.c:540 msgid "Icon size" msgstr "የምልክት መጠን" @@ -3149,7 +3149,7 @@ msgstr "ማስረጊያዎች አሳይ" msgid "Whether images should be shown in menus" msgstr "" -#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:614 +#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:615 msgid "The screen where this window will be displayed" msgstr "" @@ -4107,7 +4107,7 @@ msgstr "" msgid "Page Setup" msgstr "መጠን" -#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1027 +#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1050 msgid "Track Print Status" msgstr "" @@ -4117,120 +4117,120 @@ msgid "" "print data has been sent to the printer or print server." msgstr "" -#: gtk/gtkprintoperation.c:899 +#: gtk/gtkprintoperation.c:922 #, fuzzy msgid "Default Page Setup" msgstr "የነበረው እርዝማኔ" -#: gtk/gtkprintoperation.c:900 +#: gtk/gtkprintoperation.c:923 msgid "The GtkPageSetup used by default" msgstr "" -#: gtk/gtkprintoperation.c:918 gtk/gtkprintunixdialog.c:276 +#: gtk/gtkprintoperation.c:941 gtk/gtkprintunixdialog.c:276 msgid "Print Settings" msgstr "" -#: gtk/gtkprintoperation.c:919 gtk/gtkprintunixdialog.c:277 +#: gtk/gtkprintoperation.c:942 gtk/gtkprintunixdialog.c:277 msgid "The GtkPrintSettings used for initializing the dialog" msgstr "" -#: gtk/gtkprintoperation.c:937 +#: gtk/gtkprintoperation.c:960 #, fuzzy msgid "Job Name" msgstr "የፊደሉ ቅርጽ ስም" -#: gtk/gtkprintoperation.c:938 +#: gtk/gtkprintoperation.c:961 msgid "A string used for identifying the print job." msgstr "" -#: gtk/gtkprintoperation.c:962 +#: gtk/gtkprintoperation.c:985 #, fuzzy msgid "Number of Pages" msgstr "ዐምዶች" -#: gtk/gtkprintoperation.c:963 +#: gtk/gtkprintoperation.c:986 #, fuzzy msgid "The number of pages in the document." msgstr "የጽሑፉ መለያ" -#: gtk/gtkprintoperation.c:984 gtk/gtkprintunixdialog.c:266 +#: gtk/gtkprintoperation.c:1007 gtk/gtkprintunixdialog.c:266 #, fuzzy msgid "Current Page" msgstr "የአሁኑን ቀለም" -#: gtk/gtkprintoperation.c:985 gtk/gtkprintunixdialog.c:267 +#: gtk/gtkprintoperation.c:1008 gtk/gtkprintunixdialog.c:267 #, fuzzy msgid "The current page in the document" msgstr "የጽሑፉ መለያ" -#: gtk/gtkprintoperation.c:1006 +#: gtk/gtkprintoperation.c:1029 msgid "Use full page" msgstr "" -#: gtk/gtkprintoperation.c:1007 +#: gtk/gtkprintoperation.c:1030 msgid "" "TRUE if the origin of the context should be at the corner of the page and " "not the corner of the imageable area" msgstr "" -#: gtk/gtkprintoperation.c:1028 +#: gtk/gtkprintoperation.c:1051 msgid "" "TRUE if the print operation will continue to report on the print job status " "after the print data has been sent to the printer or print server." msgstr "" -#: gtk/gtkprintoperation.c:1045 +#: gtk/gtkprintoperation.c:1068 msgid "Unit" msgstr "" -#: gtk/gtkprintoperation.c:1046 +#: gtk/gtkprintoperation.c:1069 msgid "The unit in which distances can be measured in the context" msgstr "" -#: gtk/gtkprintoperation.c:1063 +#: gtk/gtkprintoperation.c:1086 #, fuzzy msgid "Show Dialog" msgstr "ማስረጊያዎች አሳይ" -#: gtk/gtkprintoperation.c:1064 +#: gtk/gtkprintoperation.c:1087 msgid "TRUE if a progress dialog is shown while printing." msgstr "" -#: gtk/gtkprintoperation.c:1087 +#: gtk/gtkprintoperation.c:1110 msgid "Allow Async" msgstr "" -#: gtk/gtkprintoperation.c:1088 +#: gtk/gtkprintoperation.c:1111 msgid "TRUE if print process may run asynchronous." msgstr "" -#: gtk/gtkprintoperation.c:1110 gtk/gtkprintoperation.c:1111 +#: gtk/gtkprintoperation.c:1133 gtk/gtkprintoperation.c:1134 #, fuzzy msgid "Export filename" msgstr "የፋይል ስም" -#: gtk/gtkprintoperation.c:1125 +#: gtk/gtkprintoperation.c:1148 msgid "Status" msgstr "" -#: gtk/gtkprintoperation.c:1126 +#: gtk/gtkprintoperation.c:1149 #, fuzzy msgid "The status of the print operation" msgstr "የመስኮቱ አርእስት" -#: gtk/gtkprintoperation.c:1146 +#: gtk/gtkprintoperation.c:1169 msgid "Status String" msgstr "" -#: gtk/gtkprintoperation.c:1147 +#: gtk/gtkprintoperation.c:1170 msgid "A human-readable description of the status" msgstr "" -#: gtk/gtkprintoperation.c:1165 +#: gtk/gtkprintoperation.c:1188 msgid "Custom tab label" msgstr "" -#: gtk/gtkprintoperation.c:1166 +#: gtk/gtkprintoperation.c:1189 msgid "Label for the tab containing custom widgets." msgstr "" @@ -4714,63 +4714,63 @@ msgstr "" msgid "The metric used for the ruler" msgstr "የጽሑፉ መለያ" -#: gtk/gtkscale.c:201 +#: gtk/gtkscale.c:219 msgid "The number of decimal places that are displayed in the value" msgstr "" -#: gtk/gtkscale.c:210 +#: gtk/gtkscale.c:228 msgid "Draw Value" msgstr "" -#: gtk/gtkscale.c:211 +#: gtk/gtkscale.c:229 msgid "Whether the current value is displayed as a string next to the slider" msgstr "" -#: gtk/gtkscale.c:218 +#: gtk/gtkscale.c:236 msgid "Value Position" msgstr "" -#: gtk/gtkscale.c:219 +#: gtk/gtkscale.c:237 msgid "The position in which the current value is displayed" msgstr "" -#: gtk/gtkscale.c:226 +#: gtk/gtkscale.c:244 msgid "Slider Length" msgstr "" -#: gtk/gtkscale.c:227 +#: gtk/gtkscale.c:245 msgid "Length of scale's slider" msgstr "" -#: gtk/gtkscale.c:235 +#: gtk/gtkscale.c:253 msgid "Value spacing" msgstr "" -#: gtk/gtkscale.c:236 +#: gtk/gtkscale.c:254 msgid "Space between value text and the slider/trough area" msgstr "" -#: gtk/gtkscalebutton.c:205 +#: gtk/gtkscalebutton.c:207 #, fuzzy msgid "The value of the scale" msgstr "የጽሑፉ መለያ" -#: gtk/gtkscalebutton.c:215 +#: gtk/gtkscalebutton.c:217 #, fuzzy msgid "The icon size" msgstr "የምልክት መጠን" -#: gtk/gtkscalebutton.c:224 +#: gtk/gtkscalebutton.c:226 msgid "" "The GtkAdjustment that contains the current value of this scale button object" msgstr "" -#: gtk/gtkscalebutton.c:252 +#: gtk/gtkscalebutton.c:254 #, fuzzy msgid "Icons" msgstr "ምልክት" -#: gtk/gtkscalebutton.c:253 +#: gtk/gtkscalebutton.c:255 #, fuzzy msgid "List of icon names" msgstr "የፊደሉ ቅርጽ ስም" @@ -6438,7 +6438,7 @@ msgstr "" msgid "Whether to display the column" msgstr "" -#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:536 +#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:537 msgid "Resizable" msgstr "" @@ -6849,220 +6849,220 @@ msgstr "" msgid "The length of vertical scroll arrows" msgstr "" -#: gtk/gtkwindow.c:477 +#: gtk/gtkwindow.c:478 msgid "Window Type" msgstr "የመስኮት ዓይነት" -#: gtk/gtkwindow.c:478 +#: gtk/gtkwindow.c:479 msgid "The type of the window" msgstr "የመስኮቱ ዓይነት" -#: gtk/gtkwindow.c:486 +#: gtk/gtkwindow.c:487 msgid "Window Title" msgstr "የመስኮት አርእስት" -#: gtk/gtkwindow.c:487 +#: gtk/gtkwindow.c:488 msgid "The title of the window" msgstr "የመስኮቱ አርእስት" -#: gtk/gtkwindow.c:494 +#: gtk/gtkwindow.c:495 #, fuzzy msgid "Window Role" msgstr "የመስኮት አርእስት" -#: gtk/gtkwindow.c:495 +#: gtk/gtkwindow.c:496 msgid "Unique identifier for the window to be used when restoring a session" msgstr "" -#: gtk/gtkwindow.c:511 +#: gtk/gtkwindow.c:512 #, fuzzy msgid "Startup ID" msgstr "መድረክ" -#: gtk/gtkwindow.c:512 +#: gtk/gtkwindow.c:513 msgid "Unique startup identifier for the window used by startup-notification" msgstr "" -#: gtk/gtkwindow.c:519 +#: gtk/gtkwindow.c:520 msgid "Allow Shrink" msgstr "" -#: gtk/gtkwindow.c:521 +#: gtk/gtkwindow.c:522 #, no-c-format msgid "" "If TRUE, the window has no mimimum size. Setting this to TRUE is 99% of the " "time a bad idea" msgstr "" -#: gtk/gtkwindow.c:528 +#: gtk/gtkwindow.c:529 msgid "Allow Grow" msgstr "" -#: gtk/gtkwindow.c:529 +#: gtk/gtkwindow.c:530 msgid "If TRUE, users can expand the window beyond its minimum size" msgstr "" -#: gtk/gtkwindow.c:537 +#: gtk/gtkwindow.c:538 msgid "If TRUE, users can resize the window" msgstr "" -#: gtk/gtkwindow.c:544 +#: gtk/gtkwindow.c:545 msgid "Modal" msgstr "አዛምድ" -#: gtk/gtkwindow.c:545 +#: gtk/gtkwindow.c:546 msgid "" "If TRUE, the window is modal (other windows are not usable while this one is " "up)" msgstr "" -#: gtk/gtkwindow.c:552 +#: gtk/gtkwindow.c:553 msgid "Window Position" msgstr "የመስኮት ቦታ" -#: gtk/gtkwindow.c:553 +#: gtk/gtkwindow.c:554 msgid "The initial position of the window" msgstr "" -#: gtk/gtkwindow.c:561 +#: gtk/gtkwindow.c:562 msgid "Default Width" msgstr "የነበረው ስፋት" -#: gtk/gtkwindow.c:562 +#: gtk/gtkwindow.c:563 msgid "The default width of the window, used when initially showing the window" msgstr "" -#: gtk/gtkwindow.c:571 +#: gtk/gtkwindow.c:572 msgid "Default Height" msgstr "የነበረው እርዝማኔ" -#: gtk/gtkwindow.c:572 +#: gtk/gtkwindow.c:573 msgid "" "The default height of the window, used when initially showing the window" msgstr "" -#: gtk/gtkwindow.c:581 +#: gtk/gtkwindow.c:582 msgid "Destroy with Parent" msgstr "" -#: gtk/gtkwindow.c:582 +#: gtk/gtkwindow.c:583 msgid "If this window should be destroyed when the parent is destroyed" msgstr "" -#: gtk/gtkwindow.c:590 +#: gtk/gtkwindow.c:591 msgid "Icon for this window" msgstr "ምልክት ለዚህን መስኮት" -#: gtk/gtkwindow.c:606 +#: gtk/gtkwindow.c:607 #, fuzzy msgid "Name of the themed icon for this window" msgstr "ምልክት ለዚህን መስኮት" -#: gtk/gtkwindow.c:621 +#: gtk/gtkwindow.c:622 msgid "Is Active" msgstr "" -#: gtk/gtkwindow.c:622 +#: gtk/gtkwindow.c:623 msgid "Whether the toplevel is the current active window" msgstr "" -#: gtk/gtkwindow.c:629 +#: gtk/gtkwindow.c:630 msgid "Focus in Toplevel" msgstr "" -#: gtk/gtkwindow.c:630 +#: gtk/gtkwindow.c:631 msgid "Whether the input focus is within this GtkWindow" msgstr "" -#: gtk/gtkwindow.c:637 +#: gtk/gtkwindow.c:638 msgid "Type hint" msgstr "" -#: gtk/gtkwindow.c:638 +#: gtk/gtkwindow.c:639 msgid "" "Hint to help the desktop environment understand what kind of window this is " "and how to treat it." msgstr "" -#: gtk/gtkwindow.c:646 +#: gtk/gtkwindow.c:647 msgid "Skip taskbar" msgstr "" -#: gtk/gtkwindow.c:647 +#: gtk/gtkwindow.c:648 msgid "TRUE if the window should not be in the task bar." msgstr "" -#: gtk/gtkwindow.c:654 +#: gtk/gtkwindow.c:655 msgid "Skip pager" msgstr "" -#: gtk/gtkwindow.c:655 +#: gtk/gtkwindow.c:656 msgid "TRUE if the window should not be in the pager." msgstr "" -#: gtk/gtkwindow.c:662 +#: gtk/gtkwindow.c:663 msgid "Urgent" msgstr "" -#: gtk/gtkwindow.c:663 +#: gtk/gtkwindow.c:664 msgid "TRUE if the window should be brought to the user's attention." msgstr "" -#: gtk/gtkwindow.c:677 +#: gtk/gtkwindow.c:678 msgid "Accept focus" msgstr "" -#: gtk/gtkwindow.c:678 +#: gtk/gtkwindow.c:679 msgid "TRUE if the window should receive the input focus." msgstr "" -#: gtk/gtkwindow.c:692 +#: gtk/gtkwindow.c:693 msgid "Focus on map" msgstr "" -#: gtk/gtkwindow.c:693 +#: gtk/gtkwindow.c:694 msgid "TRUE if the window should receive the input focus when mapped." msgstr "" -#: gtk/gtkwindow.c:707 +#: gtk/gtkwindow.c:708 msgid "Decorated" msgstr "" -#: gtk/gtkwindow.c:708 +#: gtk/gtkwindow.c:709 msgid "Whether the window should be decorated by the window manager" msgstr "" -#: gtk/gtkwindow.c:722 +#: gtk/gtkwindow.c:723 msgid "Deletable" msgstr "" -#: gtk/gtkwindow.c:723 +#: gtk/gtkwindow.c:724 msgid "Whether the window frame should have a close button" msgstr "" -#: gtk/gtkwindow.c:739 +#: gtk/gtkwindow.c:740 msgid "Gravity" msgstr "" -#: gtk/gtkwindow.c:740 +#: gtk/gtkwindow.c:741 #, fuzzy msgid "The window gravity of the window" msgstr "የመስኮቱ ዓይነት" -#: gtk/gtkwindow.c:757 +#: gtk/gtkwindow.c:758 msgid "Transient for Window" msgstr "" -#: gtk/gtkwindow.c:758 +#: gtk/gtkwindow.c:759 #, fuzzy msgid "The transient parent of the dialog" msgstr "የመስኮቱ አርእስት" -#: gtk/gtkwindow.c:773 +#: gtk/gtkwindow.c:774 msgid "Opacity for Window" msgstr "" -#: gtk/gtkwindow.c:774 +#: gtk/gtkwindow.c:775 #, fuzzy msgid "The opacity of the window, from 0 to 1" msgstr "የመስኮቱ ዓይነት" diff --git a/po-properties/ang.po b/po-properties/ang.po index 2b3be842f5..6cf814ec2f 100644 --- a/po-properties/ang.po +++ b/po-properties/ang.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gtk+-properties OE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-03-13 10:29-0400\n" +"POT-Creation-Date: 2009-05-04 01:14-0400\n" "PO-Revision-Date: 2004-08-26 16:32-0600\n" "Last-Translator: James Johnson \n" "Language-Team: Old English \n" @@ -88,12 +88,12 @@ msgstr "" msgid "The default display for GDK" msgstr "" -#: gdk/gdkpango.c:490 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 -#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:613 +#: gdk/gdkpango.c:537 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 +#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:614 msgid "Screen" msgstr "" -#: gdk/gdkpango.c:491 +#: gdk/gdkpango.c:538 msgid "the GdkScreen for the renderer" msgstr "" @@ -113,114 +113,114 @@ msgstr "" msgid "The resolution for fonts on the screen" msgstr "" -#: gtk/gtkaboutdialog.c:200 +#: gtk/gtkaboutdialog.c:239 msgid "Program name" msgstr "" -#: gtk/gtkaboutdialog.c:201 +#: gtk/gtkaboutdialog.c:240 msgid "" "The name of the program. If this is not set, it defaults to " "g_get_application_name()" msgstr "" -#: gtk/gtkaboutdialog.c:215 +#: gtk/gtkaboutdialog.c:254 msgid "Program version" msgstr "" -#: gtk/gtkaboutdialog.c:216 +#: gtk/gtkaboutdialog.c:255 msgid "The version of the program" msgstr "" -#: gtk/gtkaboutdialog.c:230 +#: gtk/gtkaboutdialog.c:269 msgid "Copyright string" msgstr "" -#: gtk/gtkaboutdialog.c:231 +#: gtk/gtkaboutdialog.c:270 msgid "Copyright information for the program" msgstr "" -#: gtk/gtkaboutdialog.c:248 +#: gtk/gtkaboutdialog.c:287 msgid "Comments string" msgstr "" -#: gtk/gtkaboutdialog.c:249 +#: gtk/gtkaboutdialog.c:288 msgid "Comments about the program" msgstr "" -#: gtk/gtkaboutdialog.c:283 +#: gtk/gtkaboutdialog.c:322 msgid "Website URL" msgstr "" -#: gtk/gtkaboutdialog.c:284 +#: gtk/gtkaboutdialog.c:323 msgid "The URL for the link to the website of the program" msgstr "" -#: gtk/gtkaboutdialog.c:300 +#: gtk/gtkaboutdialog.c:339 msgid "Website label" msgstr "" -#: gtk/gtkaboutdialog.c:301 +#: gtk/gtkaboutdialog.c:340 msgid "" "The label for the link to the website of the program. If this is not set, it " "defaults to the URL" msgstr "" -#: gtk/gtkaboutdialog.c:317 +#: gtk/gtkaboutdialog.c:356 msgid "Authors" msgstr "" -#: gtk/gtkaboutdialog.c:318 +#: gtk/gtkaboutdialog.c:357 msgid "List of authors of the program" msgstr "" -#: gtk/gtkaboutdialog.c:334 +#: gtk/gtkaboutdialog.c:373 msgid "Documenters" msgstr "" -#: gtk/gtkaboutdialog.c:335 +#: gtk/gtkaboutdialog.c:374 msgid "List of people documenting the program" msgstr "" -#: gtk/gtkaboutdialog.c:351 +#: gtk/gtkaboutdialog.c:390 msgid "Artists" msgstr "" -#: gtk/gtkaboutdialog.c:352 +#: gtk/gtkaboutdialog.c:391 msgid "List of people who have contributed artwork to the program" msgstr "" -#: gtk/gtkaboutdialog.c:369 +#: gtk/gtkaboutdialog.c:408 msgid "Translator credits" msgstr "" -#: gtk/gtkaboutdialog.c:370 +#: gtk/gtkaboutdialog.c:409 msgid "" "Credits to the translators. This string should be marked as translatable" msgstr "" -#: gtk/gtkaboutdialog.c:385 +#: gtk/gtkaboutdialog.c:424 msgid "Logo" msgstr "" -#: gtk/gtkaboutdialog.c:386 +#: gtk/gtkaboutdialog.c:425 msgid "" "A logo for the about box. If this is not set, it defaults to " "gtk_window_get_default_icon_list()" msgstr "" -#: gtk/gtkaboutdialog.c:401 +#: gtk/gtkaboutdialog.c:440 msgid "Logo Icon Name" msgstr "" -#: gtk/gtkaboutdialog.c:402 +#: gtk/gtkaboutdialog.c:441 msgid "A named icon to use as the logo for the about box." msgstr "" -#: gtk/gtkaboutdialog.c:415 +#: gtk/gtkaboutdialog.c:454 msgid "Wrap license" msgstr "" -#: gtk/gtkaboutdialog.c:416 +#: gtk/gtkaboutdialog.c:455 msgid "Whether to wrap the license text." msgstr "" @@ -294,7 +294,7 @@ msgid "The GIcon being displayed" msgstr "" #: gtk/gtkaction.c:282 gtk/gtkcellrendererpixbuf.c:171 gtk/gtkimage.c:230 -#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:605 +#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:606 #, fuzzy msgid "Icon Name" msgstr "Nama" @@ -393,7 +393,7 @@ msgid "Whether the action group is visible." msgstr "" #: gtk/gtkadjustment.c:93 gtk/gtkcellrendererprogress.c:128 -#: gtk/gtkscalebutton.c:204 gtk/gtkspinbutton.c:269 +#: gtk/gtkscalebutton.c:206 gtk/gtkspinbutton.c:269 msgid "Value" msgstr "" @@ -569,61 +569,61 @@ msgstr "" msgid "Force aspect ratio to match that of the frame's child" msgstr "" -#: gtk/gtkassistant.c:261 +#: gtk/gtkassistant.c:281 msgid "Header Padding" msgstr "" -#: gtk/gtkassistant.c:262 +#: gtk/gtkassistant.c:282 msgid "Number of pixels around the header." msgstr "" -#: gtk/gtkassistant.c:269 +#: gtk/gtkassistant.c:289 msgid "Content Padding" msgstr "" -#: gtk/gtkassistant.c:270 +#: gtk/gtkassistant.c:290 msgid "Number of pixels around the content pages." msgstr "" -#: gtk/gtkassistant.c:286 +#: gtk/gtkassistant.c:306 msgid "Page type" msgstr "" -#: gtk/gtkassistant.c:287 +#: gtk/gtkassistant.c:307 #, fuzzy msgid "The type of the assistant page" msgstr "Þæt cynn þæs éagþyrles" -#: gtk/gtkassistant.c:304 +#: gtk/gtkassistant.c:324 msgid "Page title" msgstr "" -#: gtk/gtkassistant.c:305 +#: gtk/gtkassistant.c:325 #, fuzzy msgid "The title of the assistant page" msgstr "Þæt cynn þæs éagþyrles" -#: gtk/gtkassistant.c:321 +#: gtk/gtkassistant.c:341 msgid "Header image" msgstr "" -#: gtk/gtkassistant.c:322 +#: gtk/gtkassistant.c:342 msgid "Header image for the assistant page" msgstr "" -#: gtk/gtkassistant.c:338 +#: gtk/gtkassistant.c:358 msgid "Sidebar image" msgstr "" -#: gtk/gtkassistant.c:339 +#: gtk/gtkassistant.c:359 msgid "Sidebar image for the assistant page" msgstr "" -#: gtk/gtkassistant.c:354 +#: gtk/gtkassistant.c:374 msgid "Page complete" msgstr "" -#: gtk/gtkassistant.c:355 +#: gtk/gtkassistant.c:375 msgid "Whether all required fields on the page have been filled out" msgstr "" @@ -864,7 +864,7 @@ msgid "" "rectangle" msgstr "" -#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1661 +#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1682 msgid "Inner Border" msgstr "" @@ -1203,7 +1203,7 @@ msgstr "" msgid "Whether the rendered pixbuf should be colorized according to the state" msgstr "" -#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:589 +#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:590 msgid "Icon" msgstr "Segn" @@ -1260,7 +1260,7 @@ msgid "Orientation and growth direction of the progress bar" msgstr "" #: gtk/gtkcellrendererspin.c:93 gtk/gtkprogressbar.c:118 gtk/gtkrange.c:367 -#: gtk/gtkscalebutton.c:223 gtk/gtkspinbutton.c:208 +#: gtk/gtkscalebutton.c:225 gtk/gtkspinbutton.c:208 msgid "Adjustment" msgstr "" @@ -1276,7 +1276,7 @@ msgstr "" msgid "The acceleration rate when you hold down a button" msgstr "" -#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:200 gtk/gtkspinbutton.c:226 +#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:218 gtk/gtkspinbutton.c:226 msgid "Digits" msgstr "" @@ -2110,11 +2110,11 @@ msgid "" "Border between text and frame. Overrides the inner-border style property" msgstr "" -#: gtk/gtkentry.c:666 +#: gtk/gtkentry.c:666 gtk/gtkentry.c:1232 msgid "Invisible character" msgstr "" -#: gtk/gtkentry.c:667 +#: gtk/gtkentry.c:667 gtk/gtkentry.c:1233 msgid "The character to use when masking entry contents (in \"password mode\")" msgstr "" @@ -2387,31 +2387,31 @@ msgstr "" msgid "Border around the progress bar" msgstr "" -#: gtk/gtkentry.c:1662 +#: gtk/gtkentry.c:1683 msgid "Border between text and frame." msgstr "" -#: gtk/gtkentry.c:1676 +#: gtk/gtkentry.c:1697 msgid "State Hint" msgstr "" -#: gtk/gtkentry.c:1677 +#: gtk/gtkentry.c:1698 msgid "Whether to pass a proper state when drawing shadow or background" msgstr "" -#: gtk/gtkentry.c:1682 gtk/gtklabel.c:695 +#: gtk/gtkentry.c:1703 gtk/gtklabel.c:695 msgid "Select on focus" msgstr "" -#: gtk/gtkentry.c:1683 +#: gtk/gtkentry.c:1704 msgid "Whether to select the contents of an entry when it is focused" msgstr "" -#: gtk/gtkentry.c:1697 +#: gtk/gtkentry.c:1718 msgid "Password Hint Timeout" msgstr "" -#: gtk/gtkentry.c:1698 +#: gtk/gtkentry.c:1719 msgid "How long to show the last input character in hidden entries" msgstr "" @@ -2993,7 +2993,7 @@ msgstr "" msgid "Icon set to display" msgstr "" -#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:214 gtk/gtktoolbar.c:540 +#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:216 gtk/gtktoolbar.c:540 msgid "Icon size" msgstr "" @@ -3057,7 +3057,7 @@ msgstr "" msgid "Whether images should be shown in menus" msgstr "" -#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:614 +#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:615 msgid "The screen where this window will be displayed" msgstr "" @@ -3989,7 +3989,7 @@ msgstr "" msgid "Page Setup" msgstr "" -#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1027 +#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1050 msgid "Track Print Status" msgstr "" @@ -3999,114 +3999,114 @@ msgid "" "print data has been sent to the printer or print server." msgstr "" -#: gtk/gtkprintoperation.c:899 +#: gtk/gtkprintoperation.c:922 msgid "Default Page Setup" msgstr "" -#: gtk/gtkprintoperation.c:900 +#: gtk/gtkprintoperation.c:923 msgid "The GtkPageSetup used by default" msgstr "" -#: gtk/gtkprintoperation.c:918 gtk/gtkprintunixdialog.c:276 +#: gtk/gtkprintoperation.c:941 gtk/gtkprintunixdialog.c:276 msgid "Print Settings" msgstr "" -#: gtk/gtkprintoperation.c:919 gtk/gtkprintunixdialog.c:277 +#: gtk/gtkprintoperation.c:942 gtk/gtkprintunixdialog.c:277 msgid "The GtkPrintSettings used for initializing the dialog" msgstr "" -#: gtk/gtkprintoperation.c:937 +#: gtk/gtkprintoperation.c:960 #, fuzzy msgid "Job Name" msgstr "Nama" -#: gtk/gtkprintoperation.c:938 +#: gtk/gtkprintoperation.c:961 msgid "A string used for identifying the print job." msgstr "" -#: gtk/gtkprintoperation.c:962 +#: gtk/gtkprintoperation.c:985 #, fuzzy msgid "Number of Pages" msgstr "Gerím channela" -#: gtk/gtkprintoperation.c:963 +#: gtk/gtkprintoperation.c:986 #, fuzzy msgid "The number of pages in the document." msgstr "Þæt gerím rǽwa þæs pixbuf" -#: gtk/gtkprintoperation.c:984 gtk/gtkprintunixdialog.c:266 +#: gtk/gtkprintoperation.c:1007 gtk/gtkprintunixdialog.c:266 msgid "Current Page" msgstr "" -#: gtk/gtkprintoperation.c:985 gtk/gtkprintunixdialog.c:267 +#: gtk/gtkprintoperation.c:1008 gtk/gtkprintunixdialog.c:267 msgid "The current page in the document" msgstr "" -#: gtk/gtkprintoperation.c:1006 +#: gtk/gtkprintoperation.c:1029 msgid "Use full page" msgstr "" -#: gtk/gtkprintoperation.c:1007 +#: gtk/gtkprintoperation.c:1030 msgid "" "TRUE if the origin of the context should be at the corner of the page and " "not the corner of the imageable area" msgstr "" -#: gtk/gtkprintoperation.c:1028 +#: gtk/gtkprintoperation.c:1051 msgid "" "TRUE if the print operation will continue to report on the print job status " "after the print data has been sent to the printer or print server." msgstr "" -#: gtk/gtkprintoperation.c:1045 +#: gtk/gtkprintoperation.c:1068 msgid "Unit" msgstr "" -#: gtk/gtkprintoperation.c:1046 +#: gtk/gtkprintoperation.c:1069 msgid "The unit in which distances can be measured in the context" msgstr "" -#: gtk/gtkprintoperation.c:1063 +#: gtk/gtkprintoperation.c:1086 msgid "Show Dialog" msgstr "" -#: gtk/gtkprintoperation.c:1064 +#: gtk/gtkprintoperation.c:1087 msgid "TRUE if a progress dialog is shown while printing." msgstr "" -#: gtk/gtkprintoperation.c:1087 +#: gtk/gtkprintoperation.c:1110 msgid "Allow Async" msgstr "" -#: gtk/gtkprintoperation.c:1088 +#: gtk/gtkprintoperation.c:1111 msgid "TRUE if print process may run asynchronous." msgstr "" -#: gtk/gtkprintoperation.c:1110 gtk/gtkprintoperation.c:1111 +#: gtk/gtkprintoperation.c:1133 gtk/gtkprintoperation.c:1134 msgid "Export filename" msgstr "" -#: gtk/gtkprintoperation.c:1125 +#: gtk/gtkprintoperation.c:1148 msgid "Status" msgstr "" -#: gtk/gtkprintoperation.c:1126 +#: gtk/gtkprintoperation.c:1149 msgid "The status of the print operation" msgstr "" -#: gtk/gtkprintoperation.c:1146 +#: gtk/gtkprintoperation.c:1169 msgid "Status String" msgstr "" -#: gtk/gtkprintoperation.c:1147 +#: gtk/gtkprintoperation.c:1170 msgid "A human-readable description of the status" msgstr "" -#: gtk/gtkprintoperation.c:1165 +#: gtk/gtkprintoperation.c:1188 msgid "Custom tab label" msgstr "" -#: gtk/gtkprintoperation.c:1166 +#: gtk/gtkprintoperation.c:1189 msgid "Label for the tab containing custom widgets." msgstr "" @@ -4574,62 +4574,62 @@ msgstr "" msgid "The metric used for the ruler" msgstr "" -#: gtk/gtkscale.c:201 +#: gtk/gtkscale.c:219 msgid "The number of decimal places that are displayed in the value" msgstr "" -#: gtk/gtkscale.c:210 +#: gtk/gtkscale.c:228 msgid "Draw Value" msgstr "" -#: gtk/gtkscale.c:211 +#: gtk/gtkscale.c:229 msgid "Whether the current value is displayed as a string next to the slider" msgstr "" -#: gtk/gtkscale.c:218 +#: gtk/gtkscale.c:236 msgid "Value Position" msgstr "" -#: gtk/gtkscale.c:219 +#: gtk/gtkscale.c:237 msgid "The position in which the current value is displayed" msgstr "" -#: gtk/gtkscale.c:226 +#: gtk/gtkscale.c:244 msgid "Slider Length" msgstr "" -#: gtk/gtkscale.c:227 +#: gtk/gtkscale.c:245 msgid "Length of scale's slider" msgstr "" -#: gtk/gtkscale.c:235 +#: gtk/gtkscale.c:253 msgid "Value spacing" msgstr "" -#: gtk/gtkscale.c:236 +#: gtk/gtkscale.c:254 msgid "Space between value text and the slider/trough area" msgstr "" -#: gtk/gtkscalebutton.c:205 +#: gtk/gtkscalebutton.c:207 #, fuzzy msgid "The value of the scale" msgstr "Þæt cynn þæs éagþyrles" -#: gtk/gtkscalebutton.c:215 +#: gtk/gtkscalebutton.c:217 msgid "The icon size" msgstr "" -#: gtk/gtkscalebutton.c:224 +#: gtk/gtkscalebutton.c:226 msgid "" "The GtkAdjustment that contains the current value of this scale button object" msgstr "" -#: gtk/gtkscalebutton.c:252 +#: gtk/gtkscalebutton.c:254 #, fuzzy msgid "Icons" msgstr "Segn" -#: gtk/gtkscalebutton.c:253 +#: gtk/gtkscalebutton.c:255 msgid "List of icon names" msgstr "" @@ -6269,7 +6269,7 @@ msgstr "" msgid "Whether to display the column" msgstr "" -#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:536 +#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:537 msgid "Resizable" msgstr "" @@ -6672,217 +6672,217 @@ msgstr "" msgid "The length of vertical scroll arrows" msgstr "" -#: gtk/gtkwindow.c:477 +#: gtk/gtkwindow.c:478 msgid "Window Type" msgstr "Éagþyrelcynn" -#: gtk/gtkwindow.c:478 +#: gtk/gtkwindow.c:479 msgid "The type of the window" msgstr "Þæt cynn þæs éagþyrles" -#: gtk/gtkwindow.c:486 +#: gtk/gtkwindow.c:487 msgid "Window Title" msgstr "" -#: gtk/gtkwindow.c:487 +#: gtk/gtkwindow.c:488 msgid "The title of the window" msgstr "" -#: gtk/gtkwindow.c:494 +#: gtk/gtkwindow.c:495 msgid "Window Role" msgstr "" -#: gtk/gtkwindow.c:495 +#: gtk/gtkwindow.c:496 msgid "Unique identifier for the window to be used when restoring a session" msgstr "" -#: gtk/gtkwindow.c:511 +#: gtk/gtkwindow.c:512 msgid "Startup ID" msgstr "" -#: gtk/gtkwindow.c:512 +#: gtk/gtkwindow.c:513 msgid "Unique startup identifier for the window used by startup-notification" msgstr "" -#: gtk/gtkwindow.c:519 +#: gtk/gtkwindow.c:520 msgid "Allow Shrink" msgstr "" -#: gtk/gtkwindow.c:521 +#: gtk/gtkwindow.c:522 #, no-c-format msgid "" "If TRUE, the window has no mimimum size. Setting this to TRUE is 99% of the " "time a bad idea" msgstr "" -#: gtk/gtkwindow.c:528 +#: gtk/gtkwindow.c:529 msgid "Allow Grow" msgstr "" -#: gtk/gtkwindow.c:529 +#: gtk/gtkwindow.c:530 msgid "If TRUE, users can expand the window beyond its minimum size" msgstr "" -#: gtk/gtkwindow.c:537 +#: gtk/gtkwindow.c:538 msgid "If TRUE, users can resize the window" msgstr "" -#: gtk/gtkwindow.c:544 +#: gtk/gtkwindow.c:545 msgid "Modal" msgstr "" -#: gtk/gtkwindow.c:545 +#: gtk/gtkwindow.c:546 msgid "" "If TRUE, the window is modal (other windows are not usable while this one is " "up)" msgstr "" -#: gtk/gtkwindow.c:552 +#: gtk/gtkwindow.c:553 msgid "Window Position" msgstr "" -#: gtk/gtkwindow.c:553 +#: gtk/gtkwindow.c:554 msgid "The initial position of the window" msgstr "" -#: gtk/gtkwindow.c:561 +#: gtk/gtkwindow.c:562 msgid "Default Width" msgstr "" -#: gtk/gtkwindow.c:562 +#: gtk/gtkwindow.c:563 msgid "The default width of the window, used when initially showing the window" msgstr "" -#: gtk/gtkwindow.c:571 +#: gtk/gtkwindow.c:572 msgid "Default Height" msgstr "" -#: gtk/gtkwindow.c:572 +#: gtk/gtkwindow.c:573 msgid "" "The default height of the window, used when initially showing the window" msgstr "" -#: gtk/gtkwindow.c:581 +#: gtk/gtkwindow.c:582 msgid "Destroy with Parent" msgstr "" -#: gtk/gtkwindow.c:582 +#: gtk/gtkwindow.c:583 msgid "If this window should be destroyed when the parent is destroyed" msgstr "" -#: gtk/gtkwindow.c:590 +#: gtk/gtkwindow.c:591 msgid "Icon for this window" msgstr "Segn þissum éagþyrle" -#: gtk/gtkwindow.c:606 +#: gtk/gtkwindow.c:607 #, fuzzy msgid "Name of the themed icon for this window" msgstr "Segn þissum éagþyrle" -#: gtk/gtkwindow.c:621 +#: gtk/gtkwindow.c:622 msgid "Is Active" msgstr "" -#: gtk/gtkwindow.c:622 +#: gtk/gtkwindow.c:623 msgid "Whether the toplevel is the current active window" msgstr "" -#: gtk/gtkwindow.c:629 +#: gtk/gtkwindow.c:630 msgid "Focus in Toplevel" msgstr "" -#: gtk/gtkwindow.c:630 +#: gtk/gtkwindow.c:631 msgid "Whether the input focus is within this GtkWindow" msgstr "" -#: gtk/gtkwindow.c:637 +#: gtk/gtkwindow.c:638 msgid "Type hint" msgstr "" -#: gtk/gtkwindow.c:638 +#: gtk/gtkwindow.c:639 msgid "" "Hint to help the desktop environment understand what kind of window this is " "and how to treat it." msgstr "" -#: gtk/gtkwindow.c:646 +#: gtk/gtkwindow.c:647 msgid "Skip taskbar" msgstr "" -#: gtk/gtkwindow.c:647 +#: gtk/gtkwindow.c:648 msgid "TRUE if the window should not be in the task bar." msgstr "" -#: gtk/gtkwindow.c:654 +#: gtk/gtkwindow.c:655 msgid "Skip pager" msgstr "" -#: gtk/gtkwindow.c:655 +#: gtk/gtkwindow.c:656 msgid "TRUE if the window should not be in the pager." msgstr "" -#: gtk/gtkwindow.c:662 +#: gtk/gtkwindow.c:663 msgid "Urgent" msgstr "" -#: gtk/gtkwindow.c:663 +#: gtk/gtkwindow.c:664 msgid "TRUE if the window should be brought to the user's attention." msgstr "" -#: gtk/gtkwindow.c:677 +#: gtk/gtkwindow.c:678 msgid "Accept focus" msgstr "" -#: gtk/gtkwindow.c:678 +#: gtk/gtkwindow.c:679 msgid "TRUE if the window should receive the input focus." msgstr "" -#: gtk/gtkwindow.c:692 +#: gtk/gtkwindow.c:693 msgid "Focus on map" msgstr "" -#: gtk/gtkwindow.c:693 +#: gtk/gtkwindow.c:694 msgid "TRUE if the window should receive the input focus when mapped." msgstr "" -#: gtk/gtkwindow.c:707 +#: gtk/gtkwindow.c:708 msgid "Decorated" msgstr "" -#: gtk/gtkwindow.c:708 +#: gtk/gtkwindow.c:709 msgid "Whether the window should be decorated by the window manager" msgstr "" -#: gtk/gtkwindow.c:722 +#: gtk/gtkwindow.c:723 msgid "Deletable" msgstr "" -#: gtk/gtkwindow.c:723 +#: gtk/gtkwindow.c:724 msgid "Whether the window frame should have a close button" msgstr "" -#: gtk/gtkwindow.c:739 +#: gtk/gtkwindow.c:740 msgid "Gravity" msgstr "" -#: gtk/gtkwindow.c:740 +#: gtk/gtkwindow.c:741 msgid "The window gravity of the window" msgstr "" -#: gtk/gtkwindow.c:757 +#: gtk/gtkwindow.c:758 msgid "Transient for Window" msgstr "" -#: gtk/gtkwindow.c:758 +#: gtk/gtkwindow.c:759 #, fuzzy msgid "The transient parent of the dialog" msgstr "Þæt cynn þæs éagþyrles" -#: gtk/gtkwindow.c:773 +#: gtk/gtkwindow.c:774 msgid "Opacity for Window" msgstr "" -#: gtk/gtkwindow.c:774 +#: gtk/gtkwindow.c:775 #, fuzzy msgid "The opacity of the window, from 0 to 1" msgstr "Þæt cynn þæs éagþyrles" diff --git a/po-properties/ar.po b/po-properties/ar.po index c10d102cea..be23cd0bdb 100644 --- a/po-properties/ar.po +++ b/po-properties/ar.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: gtk+-properties.HEAD.ar\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-03-13 10:29-0400\n" +"POT-Creation-Date: 2009-05-04 01:14-0400\n" "PO-Revision-Date: 2008-09-18 02:19+0300\n" "Last-Translator: Anas Afif Emad \n" "Language-Team: Arabic \n" @@ -96,12 +96,12 @@ msgstr "الشاشة الافتراضية" msgid "The default display for GDK" msgstr "شاشة GDK الافتراضية" -#: gdk/gdkpango.c:490 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 -#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:613 +#: gdk/gdkpango.c:537 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 +#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:614 msgid "Screen" msgstr "شاشة" -#: gdk/gdkpango.c:491 +#: gdk/gdkpango.c:538 msgid "the GdkScreen for the renderer" msgstr "الـ GdkScreen للرّاسم" @@ -121,96 +121,96 @@ msgstr "ميز الخط" msgid "The resolution for fonts on the screen" msgstr "ميز الخطوط على الشاشة" -#: gtk/gtkaboutdialog.c:200 +#: gtk/gtkaboutdialog.c:239 msgid "Program name" msgstr "اسم البرنامج" -#: gtk/gtkaboutdialog.c:201 +#: gtk/gtkaboutdialog.c:240 msgid "" "The name of the program. If this is not set, it defaults to " "g_get_application_name()" msgstr "اسم البرنامج. اذا لم يحدد ، الإفتراضي هو g_get_application_name()" -#: gtk/gtkaboutdialog.c:215 +#: gtk/gtkaboutdialog.c:254 msgid "Program version" msgstr "نسخة البرنامج" -#: gtk/gtkaboutdialog.c:216 +#: gtk/gtkaboutdialog.c:255 msgid "The version of the program" msgstr "نسخة البرنامج" -#: gtk/gtkaboutdialog.c:230 +#: gtk/gtkaboutdialog.c:269 msgid "Copyright string" msgstr "نصّ حقوق النسخ" -#: gtk/gtkaboutdialog.c:231 +#: gtk/gtkaboutdialog.c:270 msgid "Copyright information for the program" msgstr "معلومات حقوق نسخ للبرنامج" -#: gtk/gtkaboutdialog.c:248 +#: gtk/gtkaboutdialog.c:287 msgid "Comments string" msgstr "نصّ التعليقات" -#: gtk/gtkaboutdialog.c:249 +#: gtk/gtkaboutdialog.c:288 msgid "Comments about the program" msgstr "تعليقات عن البرنامج" -#: gtk/gtkaboutdialog.c:283 +#: gtk/gtkaboutdialog.c:322 msgid "Website URL" msgstr "موقع الانترنت" -#: gtk/gtkaboutdialog.c:284 +#: gtk/gtkaboutdialog.c:323 msgid "The URL for the link to the website of the program" msgstr "وصلة موقع البرنامج." -#: gtk/gtkaboutdialog.c:300 +#: gtk/gtkaboutdialog.c:339 msgid "Website label" msgstr "عنوان موقع الويب" -#: gtk/gtkaboutdialog.c:301 +#: gtk/gtkaboutdialog.c:340 msgid "" "The label for the link to the website of the program. If this is not set, it " "defaults to the URL" msgstr "تسمية الوصلة الى موقع البرنامج. إذا لم تكن محدّدة، الإفتراضي هو العنوان" -#: gtk/gtkaboutdialog.c:317 +#: gtk/gtkaboutdialog.c:356 msgid "Authors" msgstr "المؤلفين" -#: gtk/gtkaboutdialog.c:318 +#: gtk/gtkaboutdialog.c:357 msgid "List of authors of the program" msgstr "قائمة بمؤلفي البرنامج" -#: gtk/gtkaboutdialog.c:334 +#: gtk/gtkaboutdialog.c:373 msgid "Documenters" msgstr "الموثّقون" -#: gtk/gtkaboutdialog.c:335 +#: gtk/gtkaboutdialog.c:374 msgid "List of people documenting the program" msgstr "قائمة بموثّقي البرنامج" -#: gtk/gtkaboutdialog.c:351 +#: gtk/gtkaboutdialog.c:390 msgid "Artists" msgstr "الفنانين" -#: gtk/gtkaboutdialog.c:352 +#: gtk/gtkaboutdialog.c:391 msgid "List of people who have contributed artwork to the program" msgstr "قائمة بالأشخاص الذي شاركوا بأعمال فنية للبرنامج" -#: gtk/gtkaboutdialog.c:369 +#: gtk/gtkaboutdialog.c:408 msgid "Translator credits" msgstr "شكر للمترجمين" -#: gtk/gtkaboutdialog.c:370 +#: gtk/gtkaboutdialog.c:409 msgid "" "Credits to the translators. This string should be marked as translatable" msgstr "شكر للمترجمين. يجب تعليم هذا النصّ على انه قابل للترجمة" -#: gtk/gtkaboutdialog.c:385 +#: gtk/gtkaboutdialog.c:424 msgid "Logo" msgstr "الشعار" -#: gtk/gtkaboutdialog.c:386 +#: gtk/gtkaboutdialog.c:425 msgid "" "A logo for the about box. If this is not set, it defaults to " "gtk_window_get_default_icon_list()" @@ -218,19 +218,19 @@ msgstr "" "شعار لصندوق حوْل. لو لم يحدد سيستخدم الإفتراضي " "gtk_window_get_default_icon_list()" -#: gtk/gtkaboutdialog.c:401 +#: gtk/gtkaboutdialog.c:440 msgid "Logo Icon Name" msgstr "اسم أيقونة الشعار" -#: gtk/gtkaboutdialog.c:402 +#: gtk/gtkaboutdialog.c:441 msgid "A named icon to use as the logo for the about box." msgstr "أيقونة مسماة لتستخدم كشعار في صندوق حوْل." -#: gtk/gtkaboutdialog.c:415 +#: gtk/gtkaboutdialog.c:454 msgid "Wrap license" msgstr "لف الرخصة" -#: gtk/gtkaboutdialog.c:416 +#: gtk/gtkaboutdialog.c:455 msgid "Whether to wrap the license text." msgstr "اذا كان يتم لف الرخصة" @@ -303,7 +303,7 @@ msgid "The GIcon being displayed" msgstr "تم عرض GIcon" #: gtk/gtkaction.c:282 gtk/gtkcellrendererpixbuf.c:171 gtk/gtkimage.c:230 -#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:605 +#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:606 msgid "Icon Name" msgstr "اسم الأيقونة" @@ -408,7 +408,7 @@ msgid "Whether the action group is visible." msgstr "فيما إذا كانت مجموعة العمليات مرئية." #: gtk/gtkadjustment.c:93 gtk/gtkcellrendererprogress.c:128 -#: gtk/gtkscalebutton.c:204 gtk/gtkspinbutton.c:269 +#: gtk/gtkscalebutton.c:206 gtk/gtkspinbutton.c:269 msgid "Value" msgstr "القيمة" @@ -592,59 +592,59 @@ msgstr "ابن مطيع" msgid "Force aspect ratio to match that of the frame's child" msgstr "فرض نسبة الإشعاع حتى تناسب نسبة إطار الإبن" -#: gtk/gtkassistant.c:261 +#: gtk/gtkassistant.c:281 msgid "Header Padding" msgstr "حشو الرأس" -#: gtk/gtkassistant.c:262 +#: gtk/gtkassistant.c:282 msgid "Number of pixels around the header." msgstr "عدد البكسلات حول العنوان." -#: gtk/gtkassistant.c:269 +#: gtk/gtkassistant.c:289 msgid "Content Padding" msgstr "حشو المحتوى" -#: gtk/gtkassistant.c:270 +#: gtk/gtkassistant.c:290 msgid "Number of pixels around the content pages." msgstr "عدد البكسلات حول محتويات الصفحات" -#: gtk/gtkassistant.c:286 +#: gtk/gtkassistant.c:306 msgid "Page type" msgstr "نوع الصفحة" -#: gtk/gtkassistant.c:287 +#: gtk/gtkassistant.c:307 msgid "The type of the assistant page" msgstr "نوع الصفحة المساعدة" -#: gtk/gtkassistant.c:304 +#: gtk/gtkassistant.c:324 msgid "Page title" msgstr "عنوان الصفحة" -#: gtk/gtkassistant.c:305 +#: gtk/gtkassistant.c:325 msgid "The title of the assistant page" msgstr "عنوان الصورة المعاونة" -#: gtk/gtkassistant.c:321 +#: gtk/gtkassistant.c:341 msgid "Header image" msgstr "صورة الرأس" -#: gtk/gtkassistant.c:322 +#: gtk/gtkassistant.c:342 msgid "Header image for the assistant page" msgstr "الصورة الرأسية للصفحة المساعدة" -#: gtk/gtkassistant.c:338 +#: gtk/gtkassistant.c:358 msgid "Sidebar image" msgstr "الصورة الجانبية" -#: gtk/gtkassistant.c:339 +#: gtk/gtkassistant.c:359 msgid "Sidebar image for the assistant page" msgstr "الصورة الجانبية للصفحة المساعدة" -#: gtk/gtkassistant.c:354 +#: gtk/gtkassistant.c:374 msgid "Page complete" msgstr "صفحة كاملة" -#: gtk/gtkassistant.c:355 +#: gtk/gtkassistant.c:375 msgid "Whether all required fields on the page have been filled out" msgstr "إذا تم ملأ كل المجالات المطلوبة على الصفحة" @@ -891,7 +891,7 @@ msgid "" "rectangle" msgstr "إذا كانت خصائص child_displacement_x/_y تؤثر أيضا عل مستطيل التركيز" -#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1661 +#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1682 msgid "Inner Border" msgstr "الحد الداخلي" @@ -1226,7 +1226,7 @@ msgstr "اتبع الحالة" msgid "Whether the rendered pixbuf should be colorized according to the state" msgstr "فيما إذا كان يتم تلوين pixbuf المرسوم حسب الحالة" -#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:589 +#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:590 msgid "Icon" msgstr "أيقونة" @@ -1283,7 +1283,7 @@ msgid "Orientation and growth direction of the progress bar" msgstr "إتجاه و وجهة نموّ همود التطوّر" #: gtk/gtkcellrendererspin.c:93 gtk/gtkprogressbar.c:118 gtk/gtkrange.c:367 -#: gtk/gtkscalebutton.c:223 gtk/gtkspinbutton.c:208 +#: gtk/gtkscalebutton.c:225 gtk/gtkspinbutton.c:208 msgid "Adjustment" msgstr "الملائمة" @@ -1299,7 +1299,7 @@ msgstr "نسبة الزيادة" msgid "The acceleration rate when you hold down a button" msgstr "نسبة التسارع أثناء ضغطك للزر" -#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:200 gtk/gtkspinbutton.c:226 +#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:218 gtk/gtkspinbutton.c:226 msgid "Digits" msgstr "خانات رقمية" @@ -2138,11 +2138,11 @@ msgid "" "Border between text and frame. Overrides the inner-border style property" msgstr "الحد بين النص والاطار. تتجاوز خاصية أسلوب الحد-الداخلي" -#: gtk/gtkentry.c:666 +#: gtk/gtkentry.c:666 gtk/gtkentry.c:1232 msgid "Invisible character" msgstr "رمز مخفي" -#: gtk/gtkentry.c:667 +#: gtk/gtkentry.c:667 gtk/gtkentry.c:1233 msgid "The character to use when masking entry contents (in \"password mode\")" msgstr "الرمز الذي سيستخدم لاخفاء محتويات الخانة (في \"نمط كلمة السر\")" @@ -2448,33 +2448,33 @@ msgstr "حد منخفض" msgid "Border around the progress bar" msgstr "النص على عمود التقدم" -#: gtk/gtkentry.c:1662 +#: gtk/gtkentry.c:1683 msgid "Border between text and frame." msgstr "الحد بين النص والاطار." -#: gtk/gtkentry.c:1676 +#: gtk/gtkentry.c:1697 #, fuzzy msgid "State Hint" msgstr "نص الحالة" -#: gtk/gtkentry.c:1677 +#: gtk/gtkentry.c:1698 #, fuzzy msgid "Whether to pass a proper state when drawing shadow or background" msgstr "صورة بيتماب المستخدمة كغلاف أثناء رسم الواجهة الخلفية للنص" -#: gtk/gtkentry.c:1682 gtk/gtklabel.c:695 +#: gtk/gtkentry.c:1703 gtk/gtklabel.c:695 msgid "Select on focus" msgstr "اختيار عند التركيز" -#: gtk/gtkentry.c:1683 +#: gtk/gtkentry.c:1704 msgid "Whether to select the contents of an entry when it is focused" msgstr "فيما اذا سيقع انتقاء محتويات خانة عند تركيزها" -#: gtk/gtkentry.c:1697 +#: gtk/gtkentry.c:1718 msgid "Password Hint Timeout" msgstr "مدة عرض تلميحة كلمة السر" -#: gtk/gtkentry.c:1698 +#: gtk/gtkentry.c:1719 msgid "How long to show the last input character in hidden entries" msgstr "مدة ظهور الحرف المدخل الأخير في المداخل المخفية" @@ -3059,7 +3059,7 @@ msgstr "مجموعة الأيقونات" msgid "Icon set to display" msgstr "مجموعة الأيقونات للعرض" -#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:214 gtk/gtktoolbar.c:540 +#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:216 gtk/gtktoolbar.c:540 msgid "Icon size" msgstr "حجم الأيقونة" @@ -3126,7 +3126,7 @@ msgstr "اظهار صور القوائم" msgid "Whether images should be shown in menus" msgstr "فيما إذا سيتم إظهار صور في القوائم" -#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:614 +#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:615 msgid "The screen where this window will be displayed" msgstr "الشاشة التي ستعرض فيها هذه النافذة" @@ -4065,7 +4065,7 @@ msgstr "إعدادات الطابعة" msgid "Page Setup" msgstr "إعداد الصفحة" -#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1027 +#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1050 msgid "Track Print Status" msgstr "متابعة حالة الطبع" @@ -4077,51 +4077,51 @@ msgstr "" "صحيح اذا شغل الطبع سيظل يبعث إشارات تغيير الحالة بعد ارسال بيانات الطبع " "لخادوم الطباعة." -#: gtk/gtkprintoperation.c:899 +#: gtk/gtkprintoperation.c:922 msgid "Default Page Setup" msgstr "إعداد الصفحة الإفتراضي" -#: gtk/gtkprintoperation.c:900 +#: gtk/gtkprintoperation.c:923 msgid "The GtkPageSetup used by default" msgstr "الـ GtkPageSetup المستعمل افتراضيا" -#: gtk/gtkprintoperation.c:918 gtk/gtkprintunixdialog.c:276 +#: gtk/gtkprintoperation.c:941 gtk/gtkprintunixdialog.c:276 msgid "Print Settings" msgstr "إعدادات الطبع" -#: gtk/gtkprintoperation.c:919 gtk/gtkprintunixdialog.c:277 +#: gtk/gtkprintoperation.c:942 gtk/gtkprintunixdialog.c:277 msgid "The GtkPrintSettings used for initializing the dialog" msgstr "الـ GtkPrintSettings المستعمل لبدأ الحوار" -#: gtk/gtkprintoperation.c:937 +#: gtk/gtkprintoperation.c:960 msgid "Job Name" msgstr "اسم العمل" -#: gtk/gtkprintoperation.c:938 +#: gtk/gtkprintoperation.c:961 msgid "A string used for identifying the print job." msgstr "سلسلة تستخدم لتعريف وظيفة الطبع." -#: gtk/gtkprintoperation.c:962 +#: gtk/gtkprintoperation.c:985 msgid "Number of Pages" msgstr "عدد الصفحات" -#: gtk/gtkprintoperation.c:963 +#: gtk/gtkprintoperation.c:986 msgid "The number of pages in the document." msgstr "عدد الصفحات في المستند" -#: gtk/gtkprintoperation.c:984 gtk/gtkprintunixdialog.c:266 +#: gtk/gtkprintoperation.c:1007 gtk/gtkprintunixdialog.c:266 msgid "Current Page" msgstr "الصفحة الحالية" -#: gtk/gtkprintoperation.c:985 gtk/gtkprintunixdialog.c:267 +#: gtk/gtkprintoperation.c:1008 gtk/gtkprintunixdialog.c:267 msgid "The current page in the document" msgstr "الصفحة الحالية في المستند" -#: gtk/gtkprintoperation.c:1006 +#: gtk/gtkprintoperation.c:1029 msgid "Use full page" msgstr "استعمل صفحة كاملة" -#: gtk/gtkprintoperation.c:1007 +#: gtk/gtkprintoperation.c:1030 msgid "" "TRUE if the origin of the context should be at the corner of the page and " "not the corner of the imageable area" @@ -4129,7 +4129,7 @@ msgstr "" "صحيح إذا كان أصل السياق يجب أن يكون في زاوية الصفحة وليس عند زاوية المنطقة " "الصورية" -#: gtk/gtkprintoperation.c:1028 +#: gtk/gtkprintoperation.c:1051 msgid "" "TRUE if the print operation will continue to report on the print job status " "after the print data has been sent to the printer or print server." @@ -4137,55 +4137,55 @@ msgstr "" "صحيح اذا كانت عملية الطبع ستظل تبعث إشارات تغيير الحالة بعد ارسال بيانات " "الطبع لخادوم الطباعة." -#: gtk/gtkprintoperation.c:1045 +#: gtk/gtkprintoperation.c:1068 msgid "Unit" msgstr "الوحدة" -#: gtk/gtkprintoperation.c:1046 +#: gtk/gtkprintoperation.c:1069 msgid "The unit in which distances can be measured in the context" msgstr "الوحدة في المسافات التي يمكن قياسها" -#: gtk/gtkprintoperation.c:1063 +#: gtk/gtkprintoperation.c:1086 msgid "Show Dialog" msgstr "اظهر الحوار" -#: gtk/gtkprintoperation.c:1064 +#: gtk/gtkprintoperation.c:1087 msgid "TRUE if a progress dialog is shown while printing." msgstr "صحيح إذا كان حوار التقدم معروضا عند الطبع" -#: gtk/gtkprintoperation.c:1087 +#: gtk/gtkprintoperation.c:1110 msgid "Allow Async" msgstr "اسمح بـ Async" -#: gtk/gtkprintoperation.c:1088 +#: gtk/gtkprintoperation.c:1111 msgid "TRUE if print process may run asynchronous." msgstr "صحيح اذا يتم تشغيل تطبيق الطباعة لا تزامنيا" -#: gtk/gtkprintoperation.c:1110 gtk/gtkprintoperation.c:1111 +#: gtk/gtkprintoperation.c:1133 gtk/gtkprintoperation.c:1134 msgid "Export filename" msgstr "صدّر اسم الملف" -#: gtk/gtkprintoperation.c:1125 +#: gtk/gtkprintoperation.c:1148 msgid "Status" msgstr "الحالة" -#: gtk/gtkprintoperation.c:1126 +#: gtk/gtkprintoperation.c:1149 msgid "The status of the print operation" msgstr "حالة عملية الطباعة" -#: gtk/gtkprintoperation.c:1146 +#: gtk/gtkprintoperation.c:1169 msgid "Status String" msgstr "نص الحالة" -#: gtk/gtkprintoperation.c:1147 +#: gtk/gtkprintoperation.c:1170 msgid "A human-readable description of the status" msgstr "وصف للحالة بصورة مفهومة للبشر" -#: gtk/gtkprintoperation.c:1165 +#: gtk/gtkprintoperation.c:1188 msgid "Custom tab label" msgstr "عنوان لسان مخصص" -#: gtk/gtkprintoperation.c:1166 +#: gtk/gtkprintoperation.c:1189 msgid "Label for the tab containing custom widgets." msgstr "تسمية اللسان المحتوي على القطع المخصصة" @@ -4660,60 +4660,60 @@ msgstr "القياس" msgid "The metric used for the ruler" msgstr "القياس المستعمل للمسطرة" -#: gtk/gtkscale.c:201 +#: gtk/gtkscale.c:219 msgid "The number of decimal places that are displayed in the value" msgstr "عدد الخانات العشرية التي يتم عرضها في القيمة" -#: gtk/gtkscale.c:210 +#: gtk/gtkscale.c:228 msgid "Draw Value" msgstr "رسم القيمة" -#: gtk/gtkscale.c:211 +#: gtk/gtkscale.c:229 msgid "Whether the current value is displayed as a string next to the slider" msgstr "ما إذا سيتم عرض القيمة الحالية كسلسلة بجانب المتزحلق" -#: gtk/gtkscale.c:218 +#: gtk/gtkscale.c:236 msgid "Value Position" msgstr "موقع القيمة" -#: gtk/gtkscale.c:219 +#: gtk/gtkscale.c:237 msgid "The position in which the current value is displayed" msgstr "موقع عرض القيمة الحالية" -#: gtk/gtkscale.c:226 +#: gtk/gtkscale.c:244 msgid "Slider Length" msgstr "طول المتزحلق" -#: gtk/gtkscale.c:227 +#: gtk/gtkscale.c:245 msgid "Length of scale's slider" msgstr "طول متزحلق القياس" -#: gtk/gtkscale.c:235 +#: gtk/gtkscale.c:253 msgid "Value spacing" msgstr "فراغات القيمة" -#: gtk/gtkscale.c:236 +#: gtk/gtkscale.c:254 msgid "Space between value text and the slider/trough area" msgstr "الفراغ بين نص القيمة ومنطقة المتزحلق/المنخفض" -#: gtk/gtkscalebutton.c:205 +#: gtk/gtkscalebutton.c:207 msgid "The value of the scale" msgstr "قيمة المقياس" -#: gtk/gtkscalebutton.c:215 +#: gtk/gtkscalebutton.c:217 msgid "The icon size" msgstr "حجم الأيقونة" -#: gtk/gtkscalebutton.c:224 +#: gtk/gtkscalebutton.c:226 msgid "" "The GtkAdjustment that contains the current value of this scale button object" msgstr "GtkAdjustment المحتوي على القيمة الحالية لجسم التحجيم هذا" -#: gtk/gtkscalebutton.c:252 +#: gtk/gtkscalebutton.c:254 msgid "Icons" msgstr "أيقونات" -#: gtk/gtkscalebutton.c:253 +#: gtk/gtkscalebutton.c:255 msgid "List of icon names" msgstr "قائمة أسماء الإيقونات" @@ -6375,7 +6375,7 @@ msgstr "نمط الخط الفاصل لرسم أسطر مظهر الشجرة" msgid "Whether to display the column" msgstr "ما إذا يعرض العمود" -#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:536 +#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:537 msgid "Resizable" msgstr "قابل للتحجيم" @@ -6779,43 +6779,43 @@ msgstr "طول أسهم شريط التدرج العمودي" msgid "The length of vertical scroll arrows" msgstr "عرض أسهم شريط التدرج العمودي" -#: gtk/gtkwindow.c:477 +#: gtk/gtkwindow.c:478 msgid "Window Type" msgstr "نوع النافذة" -#: gtk/gtkwindow.c:478 +#: gtk/gtkwindow.c:479 msgid "The type of the window" msgstr "نوع النافذة" -#: gtk/gtkwindow.c:486 +#: gtk/gtkwindow.c:487 msgid "Window Title" msgstr "عنوان النافذة" -#: gtk/gtkwindow.c:487 +#: gtk/gtkwindow.c:488 msgid "The title of the window" msgstr "عنوان النافذة" -#: gtk/gtkwindow.c:494 +#: gtk/gtkwindow.c:495 msgid "Window Role" msgstr "دور النافذة" -#: gtk/gtkwindow.c:495 +#: gtk/gtkwindow.c:496 msgid "Unique identifier for the window to be used when restoring a session" msgstr "معرف وحيد للنافذة يستخدم عند استرجاع جلسة" -#: gtk/gtkwindow.c:511 +#: gtk/gtkwindow.c:512 msgid "Startup ID" msgstr "هوية البدأ" -#: gtk/gtkwindow.c:512 +#: gtk/gtkwindow.c:513 msgid "Unique startup identifier for the window used by startup-notification" msgstr "معرف وحيد لعملية البدأ للنافذة المستعملة من طرف startup-notification" -#: gtk/gtkwindow.c:519 +#: gtk/gtkwindow.c:520 msgid "Allow Shrink" msgstr "اسمح بالانكماش" -#: gtk/gtkwindow.c:521 +#: gtk/gtkwindow.c:522 #, no-c-format msgid "" "If TRUE, the window has no mimimum size. Setting this to TRUE is 99% of the " @@ -6824,23 +6824,23 @@ msgstr "" "إذا ضبط لـ TRUE فلن يكون للنافذة حجم أدنى. ضبط هذا لـ TRUE فكرة سيّئة في 99% " "من الحالات." -#: gtk/gtkwindow.c:528 +#: gtk/gtkwindow.c:529 msgid "Allow Grow" msgstr "اسمح بالنمو" -#: gtk/gtkwindow.c:529 +#: gtk/gtkwindow.c:530 msgid "If TRUE, users can expand the window beyond its minimum size" msgstr "اذا كان TRUE، فسيتمكن المستخدمون من تمديد النافذة فوق حجمها الأدنى" -#: gtk/gtkwindow.c:537 +#: gtk/gtkwindow.c:538 msgid "If TRUE, users can resize the window" msgstr "إذا كان TRUE، باستطاعة المستخدمين تحجيم النافذة." -#: gtk/gtkwindow.c:544 +#: gtk/gtkwindow.c:545 msgid "Modal" msgstr "سائدة" -#: gtk/gtkwindow.c:545 +#: gtk/gtkwindow.c:546 msgid "" "If TRUE, the window is modal (other windows are not usable while this one is " "up)" @@ -6848,150 +6848,150 @@ msgstr "" "إذا ضبط لـ TRUE فستكون النافذة سائدة (لن يمكن استخدام نوافذ أخرى عند تكيز " "هذه النافذة)" -#: gtk/gtkwindow.c:552 +#: gtk/gtkwindow.c:553 msgid "Window Position" msgstr "موقع النافذة" -#: gtk/gtkwindow.c:553 +#: gtk/gtkwindow.c:554 msgid "The initial position of the window" msgstr "موقع النافذة الأولي" -#: gtk/gtkwindow.c:561 +#: gtk/gtkwindow.c:562 msgid "Default Width" msgstr "العرض الافتراضي" -#: gtk/gtkwindow.c:562 +#: gtk/gtkwindow.c:563 msgid "The default width of the window, used when initially showing the window" msgstr "عرض النافذة الإفتراضي، مستخدم عند عرض النافذة في المرة الأولى" -#: gtk/gtkwindow.c:571 +#: gtk/gtkwindow.c:572 msgid "Default Height" msgstr "الإرتفاع الإفتراضي" -#: gtk/gtkwindow.c:572 +#: gtk/gtkwindow.c:573 msgid "" "The default height of the window, used when initially showing the window" msgstr "ارتفاع النافذة الإفتراضي، مستخدم عند عرض النافذة في المرة الأولى" -#: gtk/gtkwindow.c:581 +#: gtk/gtkwindow.c:582 msgid "Destroy with Parent" msgstr "تدمير مع الأم" -#: gtk/gtkwindow.c:582 +#: gtk/gtkwindow.c:583 msgid "If this window should be destroyed when the parent is destroyed" msgstr "فيما إذا وجب تدمير هذه النافذة عند تدمير النافذة الأم" -#: gtk/gtkwindow.c:590 +#: gtk/gtkwindow.c:591 msgid "Icon for this window" msgstr "أيقونة لهذه النافذة" -#: gtk/gtkwindow.c:606 +#: gtk/gtkwindow.c:607 msgid "Name of the themed icon for this window" msgstr "اسم أيقونة هذه النافذة" -#: gtk/gtkwindow.c:621 +#: gtk/gtkwindow.c:622 msgid "Is Active" msgstr "نشط" -#: gtk/gtkwindow.c:622 +#: gtk/gtkwindow.c:623 msgid "Whether the toplevel is the current active window" msgstr "فيما إذا كان المستوى الأعلى هو النافذة النشطة" -#: gtk/gtkwindow.c:629 +#: gtk/gtkwindow.c:630 msgid "Focus in Toplevel" msgstr "تركيز في المستوى الأعلى" -#: gtk/gtkwindow.c:630 +#: gtk/gtkwindow.c:631 msgid "Whether the input focus is within this GtkWindow" msgstr "ما اذا يكون تركيز الإدخال ضمن GtkWindow الحالي" -#: gtk/gtkwindow.c:637 +#: gtk/gtkwindow.c:638 msgid "Type hint" msgstr "أكتب التلميحة" -#: gtk/gtkwindow.c:638 +#: gtk/gtkwindow.c:639 msgid "" "Hint to help the desktop environment understand what kind of window this is " "and how to treat it." msgstr "تلميحة لمساعدة بيئة سطح المكتب في فهم نوع النافذة و طريقة التعاكل معها" -#: gtk/gtkwindow.c:646 +#: gtk/gtkwindow.c:647 msgid "Skip taskbar" msgstr "تخطي عمود المهام" -#: gtk/gtkwindow.c:647 +#: gtk/gtkwindow.c:648 msgid "TRUE if the window should not be in the task bar." msgstr "TRUE إذا وجب أن لا تكون النافذة في عمود المهام." -#: gtk/gtkwindow.c:654 +#: gtk/gtkwindow.c:655 msgid "Skip pager" msgstr "تخطي المتصفح" -#: gtk/gtkwindow.c:655 +#: gtk/gtkwindow.c:656 msgid "TRUE if the window should not be in the pager." msgstr "يضبط لـ TRUE إذا وجب أن لا تكون النافذة في المتصفح." -#: gtk/gtkwindow.c:662 +#: gtk/gtkwindow.c:663 msgid "Urgent" msgstr "إستعجالي" -#: gtk/gtkwindow.c:663 +#: gtk/gtkwindow.c:664 msgid "TRUE if the window should be brought to the user's attention." msgstr "يضبط لـ TRUE إذا وجب تنبيه المستخدم بالنافذة" -#: gtk/gtkwindow.c:677 +#: gtk/gtkwindow.c:678 msgid "Accept focus" msgstr "تقبل التركيز" -#: gtk/gtkwindow.c:678 +#: gtk/gtkwindow.c:679 msgid "TRUE if the window should receive the input focus." msgstr "يضبط لـ TRUE إذا وجب للنافذة أن تتلقى تركيز الإدخال." -#: gtk/gtkwindow.c:692 +#: gtk/gtkwindow.c:693 msgid "Focus on map" msgstr "تركيز على الخارطة" -#: gtk/gtkwindow.c:693 +#: gtk/gtkwindow.c:694 msgid "TRUE if the window should receive the input focus when mapped." msgstr "يضبط لـ TRUE إذا وجب للنافذة أن تتلقى تركيز الإدخال." -#: gtk/gtkwindow.c:707 +#: gtk/gtkwindow.c:708 msgid "Decorated" msgstr "مزوق" -#: gtk/gtkwindow.c:708 +#: gtk/gtkwindow.c:709 msgid "Whether the window should be decorated by the window manager" msgstr "ما إذا وجب تزويق النافذة بمدير النوافذ" -#: gtk/gtkwindow.c:722 +#: gtk/gtkwindow.c:723 msgid "Deletable" msgstr "قابل للحذف" -#: gtk/gtkwindow.c:723 +#: gtk/gtkwindow.c:724 msgid "Whether the window frame should have a close button" msgstr "ما إذا يكون لإطار النافذة زر إغلاق" -#: gtk/gtkwindow.c:739 +#: gtk/gtkwindow.c:740 msgid "Gravity" msgstr "الجاذبية" -#: gtk/gtkwindow.c:740 +#: gtk/gtkwindow.c:741 msgid "The window gravity of the window" msgstr "جاذيبة الشباك للشباك" -#: gtk/gtkwindow.c:757 +#: gtk/gtkwindow.c:758 msgid "Transient for Window" msgstr "عابر النافذة" -#: gtk/gtkwindow.c:758 +#: gtk/gtkwindow.c:759 msgid "The transient parent of the dialog" msgstr "العابر الوالد للنافذة" -#: gtk/gtkwindow.c:773 +#: gtk/gtkwindow.c:774 msgid "Opacity for Window" msgstr "شفافية النافذة" -#: gtk/gtkwindow.c:774 +#: gtk/gtkwindow.c:775 msgid "The opacity of the window, from 0 to 1" msgstr "شفافية النافذة، من 0 إلى 1" diff --git a/po-properties/as.po b/po-properties/as.po index 97e1cbc39e..104e9ebe20 100644 --- a/po-properties/as.po +++ b/po-properties/as.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: as\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-03-13 10:29-0400\n" +"POT-Creation-Date: 2009-05-04 01:14-0400\n" "PO-Revision-Date: 2009-03-16 17:51+0530\n" "Last-Translator: Amitakhya Phukan \n" "Language-Team: American English \n" @@ -72,7 +72,8 @@ msgid "Rowstride" msgstr "Rowstride" #: gdk-pixbuf/gdk-pixbuf.c:160 -msgid "The number of bytes between the start of a row and the start of the next row" +msgid "" +"The number of bytes between the start of a row and the start of the next row" msgstr "দুই শাৰীৰ মাজৰ বাইটৰ সংখ্যা" #: gdk-pixbuf/gdk-pixbuf.c:169 @@ -91,12 +92,12 @@ msgstr "অবিকল্পিত প্ৰদৰ্শন" msgid "The default display for GDK" msgstr "GDK ৰ অবিকল্পিত প্ৰদৰ্শন" -#: gdk/gdkpango.c:490 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 -#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:613 +#: gdk/gdkpango.c:537 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 +#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:614 msgid "Screen" msgstr "পৰ্দ্দা" -#: gdk/gdkpango.c:491 +#: gdk/gdkpango.c:538 msgid "the GdkScreen for the renderer" msgstr "ৰেন্ডাৰাৰৰ বাবে GdkScreen" @@ -116,53 +117,54 @@ msgstr "ফন্টৰ বিভাজন" msgid "The resolution for fonts on the screen" msgstr "পৰ্দ্দাৰ ফন্টৰ বিভাজন" -#: gtk/gtkaboutdialog.c:200 +#: gtk/gtkaboutdialog.c:239 msgid "Program name" msgstr "অনুপ্ৰয়োগৰ নাম" -#: gtk/gtkaboutdialog.c:201 +#: gtk/gtkaboutdialog.c:240 msgid "" "The name of the program. If this is not set, it defaults to " "g_get_application_name()" -msgstr "অনুপ্ৰয়োগৰ নাম । কোন নাম নিদিলে অবিকল্পিতৰূপে g_get_application_name() ব্যৱহৃত হয়।" +msgstr "" +"অনুপ্ৰয়োগৰ নাম । কোন নাম নিদিলে অবিকল্পিতৰূপে g_get_application_name() ব্যৱহৃত হয়।" -#: gtk/gtkaboutdialog.c:215 +#: gtk/gtkaboutdialog.c:254 msgid "Program version" msgstr "অনুপ্ৰয়োগৰ সংস্কৰণ" -#: gtk/gtkaboutdialog.c:216 +#: gtk/gtkaboutdialog.c:255 msgid "The version of the program" msgstr "অনুপ্ৰয়োগৰ সংস্কৰণ" -#: gtk/gtkaboutdialog.c:230 +#: gtk/gtkaboutdialog.c:269 msgid "Copyright string" msgstr "প্ৰতিলিপিস্বত্বৰ শব্দ" -#: gtk/gtkaboutdialog.c:231 +#: gtk/gtkaboutdialog.c:270 msgid "Copyright information for the program" msgstr "অনুপ্ৰয়োগৰ প্ৰতিলিপি স্বত্ব সংক্ৰান্ত তথ্য" -#: gtk/gtkaboutdialog.c:248 +#: gtk/gtkaboutdialog.c:287 msgid "Comments string" msgstr "মন্তব্য শব্দ" -#: gtk/gtkaboutdialog.c:249 +#: gtk/gtkaboutdialog.c:288 msgid "Comments about the program" msgstr "অনুপ্ৰয়োগ সম্পৰ্কিত মন্তব্য" -#: gtk/gtkaboutdialog.c:283 +#: gtk/gtkaboutdialog.c:322 msgid "Website URL" msgstr "ৱেবছাইটৰ URL" -#: gtk/gtkaboutdialog.c:284 +#: gtk/gtkaboutdialog.c:323 msgid "The URL for the link to the website of the program" msgstr "অনুপ্ৰয়োগৰ ৱেবছাইট নিৰ্দেশক সংযোগৰ URL" -#: gtk/gtkaboutdialog.c:300 +#: gtk/gtkaboutdialog.c:339 msgid "Website label" msgstr "ৱেবছাইট লেবেল" -#: gtk/gtkaboutdialog.c:301 +#: gtk/gtkaboutdialog.c:340 msgid "" "The label for the link to the website of the program. If this is not set, it " "defaults to the URL" @@ -170,43 +172,44 @@ msgstr "" "অনুপ্ৰয়োগৰ ৱেবছাইট নিৰ্দেশক সংযোগৰ লেবেল । ইয়াক নিৰ্ধাৰণ নকৰিলে অবিকল্পিতৰূপে URL " "ব্যৱহৃত হয়।" -#: gtk/gtkaboutdialog.c:317 +#: gtk/gtkaboutdialog.c:356 msgid "Authors" msgstr "লেখক" -#: gtk/gtkaboutdialog.c:318 +#: gtk/gtkaboutdialog.c:357 msgid "List of authors of the program" msgstr "অনুপ্ৰয়োগৰ লেখকসকলৰ তালিকা" -#: gtk/gtkaboutdialog.c:334 +#: gtk/gtkaboutdialog.c:373 msgid "Documenters" msgstr "আলেখ্যনৰ প্ৰস্তুতকাৰক" -#: gtk/gtkaboutdialog.c:335 +#: gtk/gtkaboutdialog.c:374 msgid "List of people documenting the program" msgstr "অনুপ্ৰয়োগৰ আলেখ্যন তৈয়াৰ কৰা প্ৰস্তুতকাৰকসকলৰ তালিকা" -#: gtk/gtkaboutdialog.c:351 +#: gtk/gtkaboutdialog.c:390 msgid "Artists" msgstr "শিল্পী" -#: gtk/gtkaboutdialog.c:352 +#: gtk/gtkaboutdialog.c:391 msgid "List of people who have contributed artwork to the program" msgstr "যি সকল ব্যক্তি এই অনুপ্ৰয়োগৰ বাবে শিল্পকৰ্মত সহায় আগবঢ়াইছে" -#: gtk/gtkaboutdialog.c:369 +#: gtk/gtkaboutdialog.c:408 msgid "Translator credits" msgstr "অমিতাক্ষ ফুকন (aphukan@fedoraproject.org)" -#: gtk/gtkaboutdialog.c:370 -msgid "Credits to the translators. This string should be marked as translatable" +#: gtk/gtkaboutdialog.c:409 +msgid "" +"Credits to the translators. This string should be marked as translatable" msgstr "অনুবাদকদের স্বীকৃতি। এই পংক্তিটি অনুবাদযোগ্য রূপে চিহ্নিত হওয়া আবশ্যক।" -#: gtk/gtkaboutdialog.c:385 +#: gtk/gtkaboutdialog.c:424 msgid "Logo" msgstr "প্ৰতীকচিহ্ন" -#: gtk/gtkaboutdialog.c:386 +#: gtk/gtkaboutdialog.c:425 msgid "" "A logo for the about box. If this is not set, it defaults to " "gtk_window_get_default_icon_list()" @@ -214,19 +217,19 @@ msgstr "" "বিষয়ক প্ৰদৰ্শক বক্সৰ লোগো । ইয়াক নিৰ্দিষ্ট নকৰিলে অবিকল্পিত হিচাপে " "gtk_window_get_default_icon_list() ব্যৱহৃত হয় ।" -#: gtk/gtkaboutdialog.c:401 +#: gtk/gtkaboutdialog.c:440 msgid "Logo Icon Name" msgstr "লোগো আইকনৰ নাম" -#: gtk/gtkaboutdialog.c:402 +#: gtk/gtkaboutdialog.c:441 msgid "A named icon to use as the logo for the about box." msgstr "পৰিচিতি প্ৰদৰ্শক বক্সৰ লোগো হিচাপে এটা নামযুক্ত আইকন ব্যৱহাৰ কৰা হ'ব।" -#: gtk/gtkaboutdialog.c:415 +#: gtk/gtkaboutdialog.c:454 msgid "Wrap license" msgstr "লাইছেঞ্চ মেৰাই দিয়ক" -#: gtk/gtkaboutdialog.c:416 +#: gtk/gtkaboutdialog.c:455 msgid "Whether to wrap the license text." msgstr "লাইছেঞ্চৰ শব্দক মেৰোৱা হ'ব নে নাই ।" @@ -299,7 +302,7 @@ msgid "The GIcon being displayed" msgstr "প্ৰদৰ্শন কৰা GIcon" #: gtk/gtkaction.c:282 gtk/gtkcellrendererpixbuf.c:171 gtk/gtkimage.c:230 -#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:605 +#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:606 msgid "Icon Name" msgstr "আইকনৰ নাম" @@ -401,7 +404,7 @@ msgid "Whether the action group is visible." msgstr "এই কামৰ গোট দৃশ্যমান নে নহয় ।" #: gtk/gtkadjustment.c:93 gtk/gtkcellrendererprogress.c:128 -#: gtk/gtkscalebutton.c:204 gtk/gtkspinbutton.c:269 +#: gtk/gtkscalebutton.c:206 gtk/gtkspinbutton.c:269 msgid "Value" msgstr "মান" @@ -587,59 +590,59 @@ msgstr "চাইল্ডক মানক" msgid "Force aspect ratio to match that of the frame's child" msgstr "দৃষ্টি কোণৰ অনুপাতক বলবৎভাবে ফ্ৰেমৰ চাইল্ডৰ সমান কৰক" -#: gtk/gtkassistant.c:261 +#: gtk/gtkassistant.c:281 msgid "Header Padding" msgstr "হেডাৰ পেডিং" -#: gtk/gtkassistant.c:262 +#: gtk/gtkassistant.c:282 msgid "Number of pixels around the header." msgstr "হেডাৰৰ কাষত থকা পিক্সেলৰ সংখ্যা ।" -#: gtk/gtkassistant.c:269 +#: gtk/gtkassistant.c:289 msgid "Content Padding" msgstr "বিসয়বস্তুৰ পেডিং" -#: gtk/gtkassistant.c:270 +#: gtk/gtkassistant.c:290 msgid "Number of pixels around the content pages." msgstr "বিষয়বস্তুৰ পৃষ্ঠাত থকা পিক্সেলৰ সংখ্যা ।" -#: gtk/gtkassistant.c:286 +#: gtk/gtkassistant.c:306 msgid "Page type" msgstr "পৃষ্ঠাৰ ধৰণ" -#: gtk/gtkassistant.c:287 +#: gtk/gtkassistant.c:307 msgid "The type of the assistant page" msgstr "সহায়ক পৃষ্ঠাৰ ধৰণ" -#: gtk/gtkassistant.c:304 +#: gtk/gtkassistant.c:324 msgid "Page title" msgstr "পৃষ্ঠাৰ শিৰোনামা" -#: gtk/gtkassistant.c:305 +#: gtk/gtkassistant.c:325 msgid "The title of the assistant page" msgstr "সহায়ক পৃষ্ঠাৰ শিৰোনামা" -#: gtk/gtkassistant.c:321 +#: gtk/gtkassistant.c:341 msgid "Header image" msgstr "হেডাৰ প্ৰতিমূৰ্ত্তি" -#: gtk/gtkassistant.c:322 +#: gtk/gtkassistant.c:342 msgid "Header image for the assistant page" msgstr "সহায়ক পৃষ্ঠাৰ বাবে হেডাৰৰ প্ৰতিমূৰ্ত্তি" -#: gtk/gtkassistant.c:338 +#: gtk/gtkassistant.c:358 msgid "Sidebar image" msgstr "Sidebar ৰ প্ৰতিমূৰ্ত্তি" -#: gtk/gtkassistant.c:339 +#: gtk/gtkassistant.c:359 msgid "Sidebar image for the assistant page" msgstr "সহায়ক পৃষ্ঠাৰ বাবে Sidebar ৰ প্ৰতিমূৰ্ত্তি" -#: gtk/gtkassistant.c:354 +#: gtk/gtkassistant.c:374 msgid "Page complete" msgstr "পৃষ্ঠা সম্পূৰ্ণ" -#: gtk/gtkassistant.c:355 +#: gtk/gtkassistant.c:375 msgid "Whether all required fields on the page have been filled out" msgstr "পৃষ্ঠাৰ প্ৰয়োজনীয় অংশসমূহ পূৰ্ণ কৰা হ'ল নে নাই" @@ -754,7 +757,8 @@ msgstr "Pack ৰ ধৰন" msgid "" "A GtkPackType indicating whether the child is packed with reference to the " "start or end of the parent" -msgstr "এটা GtkPackType যি নিৰ্দেশ কৰে যে চাইল্ড পেৰেন্টৰ আৰম্ভ নে শেষৰ সাপেক্ষে স্থাপিত" +msgstr "" +"এটা GtkPackType যি নিৰ্দেশ কৰে যে চাইল্ড পেৰেন্টৰ আৰম্ভ নে শেষৰ সাপেক্ষে স্থাপিত" #: gtk/gtkbox.c:176 gtk/gtknotebook.c:694 gtk/gtkpaned.c:241 #: gtk/gtkruler.c:148 @@ -798,7 +802,8 @@ msgid "Use stock" msgstr "Stock ব্যৱহাৰ কৰক" #: gtk/gtkbutton.c:236 -msgid "If set, the label is used to pick a stock item instead of being displayed" +msgid "" +"If set, the label is used to pick a stock item instead of being displayed" msgstr "" "নিৰ্ধাৰিত থাকিলে, প্ৰদৰ্শনৰ বিকল্পে লেবেলক এটা স্টকৰ বস্তু নিৰ্ব্বাচন কৰিবলৈ ব্যৱহৃত হয়" @@ -858,14 +863,16 @@ msgstr "অবিকল্পিত বহিস্থ স্থান স্থ msgid "" "Extra space to add for CAN_DEFAULT buttons that is always drawn outside the " "border" -msgstr "সৰ্বদা প্ৰান্তৰে বাহিৰে অঙ্কিত CAN_DEFAULT বুটামৰ বাবে অতিৰিক্ত স্থান যোগ কৰতে হ'ব" +msgstr "" +"সৰ্বদা প্ৰান্তৰে বাহিৰে অঙ্কিত CAN_DEFAULT বুটামৰ বাবে অতিৰিক্ত স্থান যোগ কৰতে হ'ব" #: gtk/gtkbutton.c:446 msgid "Child X Displacement" msgstr "চাইল্ডৰ এক্স অক্ষীয় বিচ্যুতি" #: gtk/gtkbutton.c:447 -msgid "How far in the x direction to move the child when the button is depressed" +msgid "" +"How far in the x direction to move the child when the button is depressed" msgstr "বুটামটি চাপা অবস্থায় চাইল্ডটিকে এক্স অক্ষ বৰাবৰ যি পৰিমাণ সৰানো হ'ব" #: gtk/gtkbutton.c:454 @@ -873,7 +880,8 @@ msgid "Child Y Displacement" msgstr "চাইল্ডৰ ওয়াই অক্ষীয় বিচ্যুতি" #: gtk/gtkbutton.c:455 -msgid "How far in the y direction to move the child when the button is depressed" +msgid "" +"How far in the y direction to move the child when the button is depressed" msgstr "বুটামটি চাপা অবস্থায় চাইল্ডটিকে ওয়াই অক্ষ বৰাবৰ যি পৰিমাণ সৰানো হ'ব" #: gtk/gtkbutton.c:471 @@ -884,9 +892,10 @@ msgstr "ফোকাস সৰাও" msgid "" "Whether the child_displacement_x/_y properties should also affect the focus " "rectangle" -msgstr "child_displacement_x/_y বৈশিষ্ট্য ফোকাসকাৰী আয়তক্ষেত্ৰকেও প্ৰভাবিত কৰবে নে নাই" +msgstr "" +"child_displacement_x/_y বৈশিষ্ট্য ফোকাসকাৰী আয়তক্ষেত্ৰকেও প্ৰভাবিত কৰবে নে নাই" -#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1661 +#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1682 msgid "Inner Border" msgstr "Border" @@ -1223,7 +1232,7 @@ msgstr "স্টেট অনুসৰণ কৰো" msgid "Whether the rendered pixbuf should be colorized according to the state" msgstr "অঙ্কিত পিক্সবাফকে স্টেট অনুসাৰে ৰং কৰা হ'ব নে নাই" -#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:589 +#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:590 msgid "Icon" msgstr "আইকন" @@ -1282,7 +1291,7 @@ msgid "Orientation and growth direction of the progress bar" msgstr "প্ৰগ্ৰেছ বাৰেৰ প্ৰাথমিক অবস্থান আৰু বৃদ্ধি পাওয়াৰ দিক" #: gtk/gtkcellrendererspin.c:93 gtk/gtkprogressbar.c:118 gtk/gtkrange.c:367 -#: gtk/gtkscalebutton.c:223 gtk/gtkspinbutton.c:208 +#: gtk/gtkscalebutton.c:225 gtk/gtkspinbutton.c:208 msgid "Adjustment" msgstr "সমন্বয়" @@ -1290,8 +1299,8 @@ msgstr "সমন্বয়" msgid "The adjustment that holds the value of the spinbutton." msgstr "সৰ্বমোট." -#: gtk/gtkcellrendererspin.c:109 # +#: gtk/gtkcellrendererspin.c:109 msgid "Climb rate" msgstr "ওপৰতে উঠাৰ গতি" @@ -1299,7 +1308,7 @@ msgstr "ওপৰতে উঠাৰ গতি" msgid "The acceleration rate when you hold down a button" msgstr "বুটাম চেপে ধৰে ৰাখলে গতিবৃদ্ধিৰ মান" -#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:200 gtk/gtkspinbutton.c:226 +#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:218 gtk/gtkspinbutton.c:226 msgid "Digits" msgstr "অংক" @@ -1443,7 +1452,8 @@ msgid "Rise" msgstr "উত্থিত" #: gtk/gtkcellrenderertext.c:362 -msgid "Offset of text above the baseline (below the baseline if rise is negative)" +msgid "" +"Offset of text above the baseline (below the baseline if rise is negative)" msgstr "ভিত্তিভূমিৰ ওপৰ টেক্সটৰ উচ্চতা (Offset) (উচ্চতা ঋনাত্মক হলে ভিত্তিভূমিৰ তলে)" #: gtk/gtkcellrenderertext.c:373 gtk/gtktexttag.c:458 @@ -1684,8 +1694,8 @@ msgstr "ৰেডিও অবস্থা" msgid "Draw the toggle button as a radio button" msgstr "টোগল বুটামটিকে ৰেডিও বুটাম হিচাপে আঁকা হোক" -#: gtk/gtkcellrenderertoggle.c:158 # +#: gtk/gtkcellrenderertoggle.c:158 msgid "Indicator size" msgstr "নিৰ্দেশকেৰ আকাৰ" @@ -1795,7 +1805,8 @@ msgstr "বৰ্তমান ৰংটি" #: gtk/gtkcolorsel.c:301 msgid "The current opacity value (0 fully transparent, 65535 fully opaque)" -msgstr "অস্বচ্ছতা (Opacity) বৰ্তমান মান (পূৰ্ণ স্বচ্ছতাৰ বাবে ০, পূৰ্ণ অস্বচ্ছতাৰ বাবে ৬৫৫৩৫)" +msgstr "" +"অস্বচ্ছতা (Opacity) বৰ্তমান মান (পূৰ্ণ স্বচ্ছতাৰ বাবে ০, পূৰ্ণ অস্বচ্ছতাৰ বাবে ৬৫৫৩৫)" #: gtk/gtkcolorsel.c:315 msgid "Custom palette" @@ -1805,13 +1816,13 @@ msgstr "স্বনিৰ্বাচিত পেলেট" msgid "Palette to use in the color selector" msgstr "ৰং নিৰ্বাচকে যি পেলেট ব্যৱহাৰ কৰা হ'ব" -#: gtk/gtkcolorseldialog.c:102 # +#: gtk/gtkcolorseldialog.c:102 msgid "Color Selection" msgstr "রং নির্বাচন" -#: gtk/gtkcolorseldialog.c:103 # +#: gtk/gtkcolorseldialog.c:103 msgid "The color selection embedded in the dialog." msgstr "ৰং বাছাইকাৰক ডায়ালগেৰ শিৰোনাম" @@ -1819,28 +1830,28 @@ msgstr "ৰং বাছাইকাৰক ডায়ালগেৰ শিৰো msgid "OK Button" msgstr "OK Button" -#: gtk/gtkcolorseldialog.c:110 # +#: gtk/gtkcolorseldialog.c:110 msgid "The OK button of the dialog." msgstr "মেসেজ বুটামত প্ৰদৰ্শিত বুটাম" -#: gtk/gtkcolorseldialog.c:116 # +#: gtk/gtkcolorseldialog.c:116 msgid "Cancel Button" msgstr "মেসেজ বুটাম" -#: gtk/gtkcolorseldialog.c:117 # +#: gtk/gtkcolorseldialog.c:117 msgid "The cancel button of the dialog." msgstr "parent সৰ্বমোট" -#: gtk/gtkcolorseldialog.c:123 # +#: gtk/gtkcolorseldialog.c:123 msgid "Help Button" msgstr "মেসেজ বুটাম" -#: gtk/gtkcolorseldialog.c:124 # +#: gtk/gtkcolorseldialog.c:124 msgid "The help button of the dialog." msgstr "মেসেজ বুটামত প্ৰদৰ্শিত বুটাম" @@ -1966,8 +1977,8 @@ msgstr "হলো" msgid "Button Sensitivity" msgstr "Button Sensitivity" -#: gtk/gtkcombobox.c:841 # +#: gtk/gtkcombobox.c:841 msgid "Whether the dropdown button is sensitive when the model is empty" msgstr "কোন বুটামৰ মাউসেৰ সাহায্যি ক্লিক কৰা হলে তা ফ'কাচ হয়ে যাবে নে নাই" @@ -2077,13 +2088,13 @@ msgstr "বস্তু ক্ষেত্ৰেৰ প্ৰান্ত" msgid "Width of border around the main dialog area" msgstr "মূল ডায়ালগ ক্ষেত্ৰেৰ চাৰপাশেৰ প্ৰান্তেৰ প্ৰস্থ" -#: gtk/gtkdialog.c:209 # +#: gtk/gtkdialog.c:209 msgid "Content area spacing" msgstr "বিসয়বস্তুৰ পেডিং" -#: gtk/gtkdialog.c:210 # +#: gtk/gtkdialog.c:210 msgid "Spacing between elements of the main dialog area" msgstr "মানসূচক টেক্সট আৰু স্লাইডাৰ/থ্ৰু অংশেৰ মধ্যবৰ্তী স্থান তৰ সংখ্যা" @@ -2116,7 +2127,8 @@ msgid "Selection Bound" msgstr "চিহ্নিত কৰাৰ সীমানা" #: gtk/gtkentry.c:616 gtk/gtklabel.c:473 -msgid "The position of the opposite end of the selection from the cursor in chars" +msgid "" +"The position of the opposite end of the selection from the cursor in chars" msgstr "অক্ষৰ হিচাপে চিহ্নিত অংশেৰ বিপৰীত প্ৰান্তেৰ অবস্থান" #: gtk/gtkentry.c:626 @@ -2148,14 +2160,15 @@ msgid "FALSE removes outside bevel from entry" msgstr "FASLE তালিকাৰ পৰা বহিঃস্থ বেভেলকে অপসাৰণ কৰে" #: gtk/gtkentry.c:659 -msgid "Border between text and frame. Overrides the inner-border style property" +msgid "" +"Border between text and frame. Overrides the inner-border style property" msgstr "Border" -#: gtk/gtkentry.c:666 +#: gtk/gtkentry.c:666 gtk/gtkentry.c:1232 msgid "Invisible character" msgstr "অদৃশ্য অক্ষৰ" -#: gtk/gtkentry.c:667 +#: gtk/gtkentry.c:667 gtk/gtkentry.c:1233 msgid "The character to use when masking entry contents (in \"password mode\")" msgstr "" "অন্তৰ্ভুক্তিৰ (Entry) বিষয়বস্তু আড়াল কৰাৰ বাবে ব্যৱহৃত অক্ষৰ (\"পাসওয়াৰ্ড মোড\" এ " @@ -2219,8 +2232,8 @@ msgstr "সৰ্বমোট হলো" msgid "Overwrite mode" msgstr "ওপৰ দিয়ে লেখাৰ মোড" -#: gtk/gtkentry.c:767 # +#: gtk/gtkentry.c:767 msgid "Whether new text overwrites existing text" msgstr "যি টেক্সট লেখা হ'ব তা বিদ্যমান টেক্সটৰ ওপৰ দিয়ে লেখা হ'ব নে নাই" @@ -2232,13 +2245,13 @@ msgstr "টেক্সটৰ দৈৰ্ঘ্য" msgid "Length of the text currently in the entry" msgstr "Length of the text currently in the entry" -#: gtk/gtkentry.c:797 # +#: gtk/gtkentry.c:797 msgid "Invisible char set" msgstr "অদৃশ্য সেট" -#: gtk/gtkentry.c:798 # +#: gtk/gtkentry.c:798 msgid "Whether the invisible char has been set" msgstr "কামটো দৃশ্যমান নে নাই।" @@ -2250,23 +2263,23 @@ msgstr "Caps Lock warning" msgid "Whether password entries will show a warning when Caps Lock is on" msgstr "Whether password entries will show a warning when Caps Lock is on" -#: gtk/gtkentry.c:831 # +#: gtk/gtkentry.c:831 msgid "Progress Fraction" msgstr "ভগ্নাংশ" -#: gtk/gtkentry.c:832 # +#: gtk/gtkentry.c:832 msgid "The current fraction of the task that's been completed" msgstr "পুৰো কাজটাৰ যি ভগ্নাংশ সম্পূৰ্ণ হৈছে" -#: gtk/gtkentry.c:849 # +#: gtk/gtkentry.c:849 msgid "Progress Pulse Step" msgstr "স্পন্দন ধাপ" -#: gtk/gtkentry.c:850 # +#: gtk/gtkentry.c:850 msgid "" "The fraction of total entry width to move the progress bouncing block for " "each call to gtk_entry_progress_pulse()" @@ -2274,23 +2287,23 @@ msgstr "" "মোট কামৰ যি ভগাংশ পৰিমাণ সম্পন্ন হলে স্পন্দনেৰ ফলে লাফাতে থাকা ব্লকটিকে সৰানো " "যাবে " -#: gtk/gtkentry.c:866 # +#: gtk/gtkentry.c:866 msgid "Primary pixbuf" msgstr "পিক্সবাফ" -#: gtk/gtkentry.c:867 # +#: gtk/gtkentry.c:867 msgid "Primary pixbuf for the entry" msgstr "খোলা প্ৰসাৰকেৰ বাবে Pixbuf" -#: gtk/gtkentry.c:881 # +#: gtk/gtkentry.c:881 msgid "Secondary pixbuf" msgstr "দ্বিতীয় Text" -#: gtk/gtkentry.c:882 # +#: gtk/gtkentry.c:882 msgid "Secondary pixbuf for the entry" msgstr "সম্মুখগামী গৌণ স্টেপাৰ" @@ -2302,8 +2315,8 @@ msgstr "Primary stock ID" msgid "Stock ID for primary icon" msgstr "Stock ID for primary icon" -#: gtk/gtkentry.c:911 # +#: gtk/gtkentry.c:911 msgid "Secondary stock ID" msgstr "দ্বিতীয় Text" @@ -2311,8 +2324,8 @@ msgstr "দ্বিতীয় Text" msgid "Stock ID for secondary icon" msgstr "Stock ID for secondary icon" -#: gtk/gtkentry.c:926 # +#: gtk/gtkentry.c:926 msgid "Primary icon name" msgstr "তালিকা সৰ্বমোট" @@ -2320,8 +2333,8 @@ msgstr "তালিকা সৰ্বমোট" msgid "Icon name for primary icon" msgstr "Icon name for primary icon" -#: gtk/gtkentry.c:941 # +#: gtk/gtkentry.c:941 msgid "Secondary icon name" msgstr "দ্বিতীয় Text" @@ -2333,13 +2346,13 @@ msgstr "Icon name for secondary icon" msgid "Primary GIcon" msgstr "Primary GIcon" -#: gtk/gtkentry.c:957 # +#: gtk/gtkentry.c:957 msgid "GIcon for primary icon" msgstr "এই উইন্ডোৰ বাবে আইকন" -#: gtk/gtkentry.c:971 # +#: gtk/gtkentry.c:971 msgid "Secondary GIcon" msgstr "দ্বিতীয়" @@ -2347,23 +2360,23 @@ msgstr "দ্বিতীয়" msgid "GIcon for secondary icon" msgstr "GIcon for secondary icon" -#: gtk/gtkentry.c:986 # +#: gtk/gtkentry.c:986 msgid "Primary storage type" msgstr "ভান্ডাৰেৰ (Storage) ধৰন" -#: gtk/gtkentry.c:987 # +#: gtk/gtkentry.c:987 msgid "The representation being used for primary icon" msgstr "তথ্যচিত্ৰে বাবে যি উপস্থাপনা ব্যৱহাৰ কৰা হচ্ছে" -#: gtk/gtkentry.c:1002 # +#: gtk/gtkentry.c:1002 msgid "Secondary storage type" msgstr "সম্মুখগামী গৌণ স্টেপাৰ" -#: gtk/gtkentry.c:1003 # +#: gtk/gtkentry.c:1003 msgid "The representation being used for secondary icon" msgstr "তথ্যচিত্ৰে বাবে যি উপস্থাপনা ব্যৱহাৰ কৰা হচ্ছে" @@ -2371,130 +2384,130 @@ msgstr "তথ্যচিত্ৰে বাবে যি উপস্থাপ msgid "Primary icon activatable" msgstr "Primary icon activatable" -#: gtk/gtkentry.c:1025 # +#: gtk/gtkentry.c:1025 msgid "Whether the primary icon is activatable" msgstr "কামটো সক্ৰিয় হয় নে নহয়" -#: gtk/gtkentry.c:1045 # +#: gtk/gtkentry.c:1045 msgid "Secondary icon activatable" msgstr "কাৰ্সাৰ আঁকায় ব্যৱহৃত দ্বিতীয় ৰং" -#: gtk/gtkentry.c:1046 # +#: gtk/gtkentry.c:1046 msgid "Whether the secondary icon is activatable" msgstr "কামটো সক্ৰিয় হয় নে নহয়" -#: gtk/gtkentry.c:1068 # +#: gtk/gtkentry.c:1068 msgid "Primary icon sensitive" msgstr "সেল sensitive প্ৰদৰ্শন কৰো" -#: gtk/gtkentry.c:1069 # +#: gtk/gtkentry.c:1069 msgid "Whether the primary icon is sensitive" msgstr "" "তালিকাৰ সদস্যদেৰ মিলিয়ে দেখাৰ সময় বড় বা ছোট হাতেৰ অক্ষৰ পৃথকভাবে বিবেচনা কৰা " "হ'ব নে নাই" -#: gtk/gtkentry.c:1090 # +#: gtk/gtkentry.c:1090 msgid "Secondary icon sensitive" msgstr "দ্বিতীয় Text" -#: gtk/gtkentry.c:1091 # +#: gtk/gtkentry.c:1091 msgid "Whether the secondary icon is sensitive" msgstr "কামটো সক্ৰিয় হয় নে নহয়" -#: gtk/gtkentry.c:1107 # +#: gtk/gtkentry.c:1107 msgid "Primary icon tooltip text" msgstr "সেল sensitive প্ৰদৰ্শন কৰো" -#: gtk/gtkentry.c:1108 gtk/gtkentry.c:1144 # +#: gtk/gtkentry.c:1108 gtk/gtkentry.c:1144 msgid "The contents of the tooltip on the primary icon" msgstr "সৰ্বমোট উল্লিখিত সময় অবধি" -#: gtk/gtkentry.c:1124 # +#: gtk/gtkentry.c:1124 msgid "Secondary icon tooltip text" msgstr "কাৰ্সাৰ আঁকায় ব্যৱহৃত দ্বিতীয় ৰং" -#: gtk/gtkentry.c:1125 gtk/gtkentry.c:1163 # +#: gtk/gtkentry.c:1125 gtk/gtkentry.c:1163 msgid "The contents of the tooltip on the secondary icon" msgstr "সৰ্বমোট উল্লিখিত সময় অবধি" -#: gtk/gtkentry.c:1143 # +#: gtk/gtkentry.c:1143 msgid "Primary icon tooltip markup" msgstr "তালিকা সৰ্বমোট" -#: gtk/gtkentry.c:1162 # +#: gtk/gtkentry.c:1162 msgid "Secondary icon tooltip markup" msgstr "দ্বিতীয় Text" -#: gtk/gtkentry.c:1182 gtk/gtktextview.c:681 # +#: gtk/gtkentry.c:1182 gtk/gtktextview.c:681 msgid "IM module" msgstr "অবিকল্পিত প্ৰস্থ" -#: gtk/gtkentry.c:1183 gtk/gtktextview.c:682 # +#: gtk/gtkentry.c:1183 gtk/gtktextview.c:682 msgid "Which IM module should be used" msgstr "পেলেট ব্যৱহৃত হ'ব নে নাই" -#: gtk/gtkentry.c:1197 # +#: gtk/gtkentry.c:1197 msgid "Icon Prelight" msgstr "উচ্চতা" -#: gtk/gtkentry.c:1198 # +#: gtk/gtkentry.c:1198 msgid "Whether activatable icons should prelight when hovered" msgstr "ট্যাব প্ৰদৰ্শন কৰা হ'ব নে নাই" -#: gtk/gtkentry.c:1211 # +#: gtk/gtkentry.c:1211 msgid "Progress Border" msgstr "দীৰ্ঘ বক্সৰ প্ৰান্ত" -#: gtk/gtkentry.c:1212 # +#: gtk/gtkentry.c:1212 msgid "Border around the progress bar" msgstr "প্ৰগ্ৰেছবাৰত যি লিপি প্ৰদৰ্শন কৰা হ'ব" -#: gtk/gtkentry.c:1662 +#: gtk/gtkentry.c:1683 msgid "Border between text and frame." msgstr "Border." -#: gtk/gtkentry.c:1676 # +#: gtk/gtkentry.c:1697 msgid "State Hint" msgstr "অবস্থা বাক্য" -#: gtk/gtkentry.c:1677 # +#: gtk/gtkentry.c:1698 msgid "Whether to pass a proper state when drawing shadow or background" msgstr "টেক্সটৰ পটভূমি আঁকাৰ সময় যি বিটম্যাপকে মাস্ক হিচাপে ব্যৱহাৰ কৰা হ'ব" -#: gtk/gtkentry.c:1682 gtk/gtklabel.c:695 +#: gtk/gtkentry.c:1703 gtk/gtklabel.c:695 msgid "Select on focus" msgstr "ফোকাস কৰলে চিহ্নিত হ'ব" -#: gtk/gtkentry.c:1683 +#: gtk/gtkentry.c:1704 msgid "Whether to select the contents of an entry when it is focused" msgstr "কোন অন্তৰ্ভুক্তিৰ (Entry) অভ্যন্তৰীণ বস্তুকে ফ'কাচ কৰলে তা চিহ্নিত হ'ব নে নাই" -#: gtk/gtkentry.c:1697 +#: gtk/gtkentry.c:1718 msgid "Password Hint Timeout" msgstr "গুপ্তশব্দ" -#: gtk/gtkentry.c:1698 +#: gtk/gtkentry.c:1719 msgid "How long to show the last input character in hidden entries" msgstr "শেষ" @@ -2674,7 +2687,8 @@ msgid "Preview Widget Active" msgstr "প্ৰাকদৰ্শনে ব্যৱহৃত উইজেট সক্ৰিয় আছে" #: gtk/gtkfilechooser.c:226 -msgid "Whether the application supplied widget for custom previews should be shown." +msgid "" +"Whether the application supplied widget for custom previews should be shown." msgstr "" "স্বনিৰ্বাচিত প্ৰাকদৰ্শনে ব্যৱহাৰেৰ বাবে অ্যাপলিকেশন কৰ্তৃক সৰবৰাহকৃত উইজেট প্ৰদৰ্শন কৰা " "হ'ব নে নাই।" @@ -2685,7 +2699,8 @@ msgstr "প্ৰাকদৰ্শনে ব্যৱহৃত লেবেল #: gtk/gtkfilechooser.c:232 msgid "Whether to display a stock label with the name of the previewed file." -msgstr "প্ৰাকদৰ্শনকৃত ফাইলেৰ নামেৰ সাহায্যি এটা স্টক (Stock) লেবেল প্ৰদৰ্শন কৰা হ'ব নে নাই।" +msgstr "" +"প্ৰাকদৰ্শনকৃত ফাইলেৰ নামেৰ সাহায্যি এটা স্টক (Stock) লেবেল প্ৰদৰ্শন কৰা হ'ব নে নাই।" #: gtk/gtkfilechooser.c:237 msgid "Extra widget" @@ -2818,8 +2833,8 @@ msgstr "আকাৰ প্ৰদৰ্শন কৰো" msgid "Whether selected font size is shown in the label" msgstr "নিৰ্বাচিত ফন্টৰ আকাৰ লেবেলে প্ৰদৰ্শন কৰা হ'ব নে নাই" -#: gtk/gtkfontsel.c:197 # +#: gtk/gtkfontsel.c:197 msgid "The string that represents this font" msgstr "যি এক্স অক্ষীয় পঙ্‌ক্তিটি এই ফন্টৰ প্ৰতিনিধিত্ব কৰে" @@ -2857,7 +2872,8 @@ msgstr "লেবেলেৰ উলম্ব সংৰেখন" #: gtk/gtkframe.c:131 gtk/gtkhandlebox.c:167 msgid "Deprecated property, use shadow_type instead" -msgstr "এই বৈশিষ্ট্যটি অনুমোদিত নয়, ইয়াৰ পৰিবৰ্তে ছায়া _ধৰন (Shadow type) ব্যৱহাৰ কৰক" +msgstr "" +"এই বৈশিষ্ট্যটি অনুমোদিত নয়, ইয়াৰ পৰিবৰ্তে ছায়া _ধৰন (Shadow type) ব্যৱহাৰ কৰক" #: gtk/gtkframe.c:138 msgid "Frame shadow" @@ -2901,7 +2917,8 @@ msgstr "উজ্জ্বল প্ৰান্তেৰ সেট" msgid "" "Whether to use the value from the snap_edge property or a value derived from " "handle_position" -msgstr "snap_edge নাকি handle_position ইয়াৰ বৈশিষ্ট্যৰ পৰা নেয়া মানটি ব্যৱহাৰ কৰা হ'ব" +msgstr "" +"snap_edge নাকি handle_position ইয়াৰ বৈশিষ্ট্যৰ পৰা নেয়া মানটি ব্যৱহাৰ কৰা হ'ব" #: gtk/gtkhandlebox.c:209 msgid "Child Detached" @@ -2996,7 +3013,8 @@ msgid "Space which is inserted at the edges of the icon view" msgstr "আইকন-ভিউ তৰ প্ৰান্তে যি সংখ্যক স্থান ভৰোৱা হয়" #: gtk/gtkiconview.c:730 -msgid "How the text and icon of each item are positioned relative to each other" +msgid "" +"How the text and icon of each item are positioned relative to each other" msgstr "প্ৰতিটি বস্তুৰ আইকন আৰু টেক্সটকে পৰস্পৰেৰ সাপেক্ষে যি ভাবে ৰাখা হয়" #: gtk/gtkiconview.c:746 gtk/gtktreeview.c:618 gtk/gtktreeviewcolumn.c:307 @@ -3079,13 +3097,14 @@ msgstr "আইকন সেট" msgid "Icon set to display" msgstr "প্ৰদৰ্শন কৰাৰ বাবে আইকন সেট" -#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:214 gtk/gtktoolbar.c:540 +#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:216 gtk/gtktoolbar.c:540 msgid "Icon size" msgstr "আইকনেৰ আয়তন" #: gtk/gtkimage.c:189 msgid "Symbolic size to use for stock icon, icon set or named icon" -msgstr "সাধাৰণ আইকন, আইকন সেট বা নামযুক্ত আইকনেৰ বাবে যি প্ৰতীকী আকাৰ ব্যৱহাৰ কৰা হ'ব" +msgstr "" +"সাধাৰণ আইকন, আইকন সেট বা নামযুক্ত আইকনেৰ বাবে যি প্ৰতীকী আকাৰ ব্যৱহাৰ কৰা হ'ব" #: gtk/gtkimage.c:205 msgid "Pixel size" @@ -3115,8 +3134,8 @@ msgstr "তথ্যচিত্ৰে বাবে যি উপস্থাপ msgid "Child widget to appear next to the menu text" msgstr "মেনু টেক্সটৰ পাশে যি চাইল্ড উইজেট দেখা যাবে" -#: gtk/gtkimagemenuitem.c:151 # +#: gtk/gtkimagemenuitem.c:151 msgid "Whether to use the label text to create a stock menu item" msgstr "মাউসেৰ সাহায্যি লেবেলেৰ টেক্সটকে চিহ্নিত কৰা যাবে নে নাই" @@ -3124,18 +3143,18 @@ msgstr "মাউসেৰ সাহায্যি লেবেলেৰ টে msgid "Always show image" msgstr "Always show image" -#: gtk/gtkimagemenuitem.c:170 # +#: gtk/gtkimagemenuitem.c:170 msgid "Whether the image will always be shown" msgstr "Whether the image will always be shown" -#: gtk/gtkimagemenuitem.c:184 gtk/gtkmenu.c:515 # +#: gtk/gtkimagemenuitem.c:184 gtk/gtkmenu.c:515 msgid "Accel Group" msgstr "Accel Group" -#: gtk/gtkimagemenuitem.c:185 # +#: gtk/gtkimagemenuitem.c:185 msgid "The Accel Group to use for stock accelerator keys" msgstr "The Accel Group to use for stock accelerator keys" @@ -3147,7 +3166,7 @@ msgstr "Show menu images" msgid "Whether images should be shown in menus" msgstr "Whether images should be shown in menus" -#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:614 +#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:615 msgid "The screen where this window will be displayed" msgstr "এই উইন্ডোটি যি পৰ্দ্দায় প্ৰদৰ্শিত হ'ব" @@ -3286,28 +3305,28 @@ msgstr "নকশাৰ (Layout) উচ্চতা" msgid "URI" msgstr "URI" -#: gtk/gtklinkbutton.c:146 # +#: gtk/gtklinkbutton.c:146 msgid "The URI bound to this button" msgstr "বুটামৰ টোগল (Toggle) অবস্থা" -#: gtk/gtklinkbutton.c:160 # +#: gtk/gtklinkbutton.c:160 msgid "Visited" msgstr "দৃশ্যমান" -#: gtk/gtklinkbutton.c:161 # +#: gtk/gtklinkbutton.c:161 msgid "Whether this link has been visited." msgstr "কামটো দৃশ্যমান নে নাই।" -#: gtk/gtkmenu.c:501 # +#: gtk/gtkmenu.c:501 msgid "The currently selected menu item" msgstr "বৰ্তমানে বাছাইকৃত ফাইলনাম" -#: gtk/gtkmenu.c:516 # +#: gtk/gtkmenu.c:516 msgid "The accel group holding accelerators for the menu" msgstr "এই লেবেলেৰ নেমোনিক গতিবৰ্ধক কী (Key)" @@ -3317,15 +3336,16 @@ msgstr "Accel Path" #: gtk/gtkmenu.c:531 msgid "An accel path used to conveniently construct accel paths of child items" -msgstr "An accel path used to conveniently construct accel paths of child items" +msgstr "" +"An accel path used to conveniently construct accel paths of child items" -#: gtk/gtkmenu.c:547 # +#: gtk/gtkmenu.c:547 msgid "Attach Widget" msgstr "অতিৰিক্ত উইজেট" -#: gtk/gtkmenu.c:548 # +#: gtk/gtkmenu.c:548 msgid "The widget the menu is attached to" msgstr "মেনুৰ বস্তুতে টিক দেয়া হৈছে নে নাই" @@ -3333,7 +3353,8 @@ msgstr "মেনুৰ বস্তুতে টিক দেয়া হৈছ msgid "" "A title that may be displayed by the window manager when this menu is torn-" "off" -msgstr "এই মেনুটি বিচ্ছিন্ন (???) থাকলে উইন্ডো ম্যানেজাৰ যি শিৰোনামটি প্ৰদৰ্শন কৰতে পাৰবে" +msgstr "" +"এই মেনুটি বিচ্ছিন্ন (???) থাকলে উইন্ডো ম্যানেজাৰ যি শিৰোনামটি প্ৰদৰ্শন কৰতে পাৰবে" #: gtk/gtkmenu.c:570 msgid "Tearoff State" @@ -3343,8 +3364,8 @@ msgstr "টিয়াৰ-অফ অবস্থা" msgid "A boolean that indicates whether the menu is torn-off" msgstr "এটা বুলিয়ান মান যা নিৰ্দেশ কৰে যি মেনুটি বিচ্ছিন্ন নে নাই (Torn-off)" -#: gtk/gtkmenu.c:585 # +#: gtk/gtkmenu.c:585 msgid "Monitor" msgstr "মণিটৰ" @@ -3396,8 +3417,8 @@ msgstr "Double Arrows" msgid "When scrolling, always show both arrows." msgstr "When scrolling, always show both arrows." -#: gtk/gtkmenu.c:642 # +#: gtk/gtkmenu.c:642 msgid "Arrow Placement" msgstr "এক্স অক্ষ বৰাবৰ তীৰচিহ্ন সৰানো" @@ -3446,7 +3467,8 @@ msgid "Can change accelerators" msgstr "চটপট কী (Key) পৰিবৰ্তন কৰতে পাৰে" #: gtk/gtkmenu.c:778 -msgid "Whether menu accelerators can be changed by pressing a key over the menu item" +msgid "" +"Whether menu accelerators can be changed by pressing a key over the menu item" msgstr "মেনু আইটেমেৰ ওপৰ চাপ দিয়ে চটপট কী (Key) পৰিবৰ্তন কৰা যাবে নে নাই" #: gtk/gtkmenu.c:783 @@ -3454,7 +3476,8 @@ msgid "Delay before submenus appear" msgstr "সাবমেনু দেখা যাওয়াৰ পূৰ্বে বিলম্ব" #: gtk/gtkmenu.c:784 -msgid "Minimum time the pointer must stay over a menu item before the submenu appear" +msgid "" +"Minimum time the pointer must stay over a menu item before the submenu appear" msgstr "" "সাবমেনু দেখা যাওয়াৰ পূৰ্বে সৰ্বনিম্ন যি সময় যাবত্‍ পয়েন্টাৰটি মেনুতে প্ৰদৰ্শিত সাবমেনুৰ " "নামেৰ ওপৰ থাকবে" @@ -3510,8 +3533,10 @@ msgid "Right Justified" msgstr "Right Justified" #: gtk/gtkmenuitem.c:253 -msgid "Sets whether the menu item appears justified at the right side of a menu bar" -msgstr "Sets whether the menu item appears justified at the right side of a menu bar" +msgid "" +"Sets whether the menu item appears justified at the right side of a menu bar" +msgstr "" +"Sets whether the menu item appears justified at the right side of a menu bar" #: gtk/gtkmenuitem.c:267 msgid "Submenu" @@ -3525,23 +3550,23 @@ msgstr "The submenu attached to the menu item, or NULL if it has none" msgid "Sets the accelerator path of the menu item" msgstr "Sets the accelerator path of the menu item" -#: gtk/gtkmenuitem.c:301 # +#: gtk/gtkmenuitem.c:301 msgid "The text for the child label" msgstr "লেবেলেৰ টেক্সট" -#: gtk/gtkmenuitem.c:364 # +#: gtk/gtkmenuitem.c:364 msgid "Amount of space used up by arrow, relative to the menu item's font size" msgstr "সৰ্বমোট" -#: gtk/gtkmenuitem.c:377 # +#: gtk/gtkmenuitem.c:377 msgid "Width in Characters" msgstr "অক্ষৰ হিচাপে প্ৰস্থ" -#: gtk/gtkmenuitem.c:378 # +#: gtk/gtkmenuitem.c:378 msgid "The minimum desired width of the menu item in characters" msgstr "অক্ষৰ হিচাপে লেবেলেৰ আকাঙ্খিত প্ৰস্থ" @@ -3574,7 +3599,8 @@ msgid "Use separator" msgstr "বিভাজক ব্যৱহাৰ কৰো" #: gtk/gtkmessagedialog.c:115 -msgid "Whether to put a separator between the message dialog's text and the buttons" +msgid "" +"Whether to put a separator between the message dialog's text and the buttons" msgstr "ডায়ালগেৰ টেক্সট আৰু বুটামৰ মধ্যবৰ্তী স্থানে কোন বিভাজক ব্যৱহাৰ কৰা হ'ব নে নাই" #: gtk/gtkmessagedialog.c:128 @@ -3638,7 +3664,8 @@ msgid "X pad" msgstr "এক্স অক্ষ বৰাবৰ পেড (Pad)" #: gtk/gtkmisc.c:94 -msgid "The amount of space to add on the left and right of the widget, in pixels" +msgid "" +"The amount of space to add on the left and right of the widget, in pixels" msgstr "উইজেটেৰ বাম আৰু ডানে যত পিক্সেল ৰিক্ত স্থান যোগ কৰা হ'ব" #: gtk/gtkmisc.c:103 @@ -3646,21 +3673,22 @@ msgid "Y pad" msgstr "ওয়াই অক্ষ বৰাবৰ পেড (Pad)" #: gtk/gtkmisc.c:104 -msgid "The amount of space to add on the top and bottom of the widget, in pixels" +msgid "" +"The amount of space to add on the top and bottom of the widget, in pixels" msgstr "উইজেটেৰ ওপৰত আৰু নীচে যত পিক্সেল ৰিক্ত স্থান যোগ কৰা হ'ব" -#: gtk/gtkmountoperation.c:139 # +#: gtk/gtkmountoperation.c:139 msgid "Parent" msgstr "পেৰেন্ট" -#: gtk/gtkmountoperation.c:140 # +#: gtk/gtkmountoperation.c:140 msgid "The parent window" msgstr "উইন্ডোৰ ধৰন " -#: gtk/gtkmountoperation.c:147 # +#: gtk/gtkmountoperation.c:147 msgid "Is Showing" msgstr "শিৰোনাম প্ৰদৰ্শন কৰো" @@ -3668,8 +3696,8 @@ msgstr "শিৰোনাম প্ৰদৰ্শন কৰো" msgid "Are we showing a dialog" msgstr "Are we showing a dialog" -#: gtk/gtkmountoperation.c:156 # +#: gtk/gtkmountoperation.c:156 msgid "The screen where this window will be displayed." msgstr "এই উইন্ডোটি যি পৰ্দ্দায় প্ৰদৰ্শিত হ'ব" @@ -3829,7 +3857,8 @@ msgid "Secondary backward stepper" msgstr "পশ্চাত্‍গামী গৌণ স্টেপাৰ" #: gtk/gtknotebook.c:746 -msgid "Display a second backward arrow button on the opposite end of the tab area" +msgid "" +"Display a second backward arrow button on the opposite end of the tab area" msgstr "" "ট্যাব অংশেৰ বিপৰীত প্ৰান্তে এটা পশ্চাত্‍গামী গৌণ স্টেপাৰ তীৰচিহ্নধাৰী বুটাম প্ৰদৰ্শন কৰো" @@ -3838,7 +3867,8 @@ msgid "Secondary forward stepper" msgstr "সম্মুখগামী গৌণ স্টেপাৰ" #: gtk/gtknotebook.c:762 -msgid "Display a second forward arrow button on the opposite end of the tab area" +msgid "" +"Display a second forward arrow button on the opposite end of the tab area" msgstr "" "ট্যাব অংশেৰ বিপৰীত প্ৰান্তে এটা সম্মুখগামী গৌণ স্টেপাৰ তীৰচিহ্নধাৰী বুটাম প্ৰদৰ্শন কৰো" @@ -3874,13 +3904,13 @@ msgstr "Tab curvature" msgid "Size of tab curvature" msgstr "মাপ সৰ্বমোট" -#: gtk/gtknotebook.c:839 # +#: gtk/gtknotebook.c:839 msgid "Arrow spacing" msgstr "প্ৰতি শাৰী স্থান তৰ সংখ্যা" -#: gtk/gtknotebook.c:840 # +#: gtk/gtknotebook.c:840 msgid "Scroll arrow spacing" msgstr "স্ক্ৰলবাৰে ৰিক্ত স্থানৰ সংখ্যা" @@ -3904,13 +3934,14 @@ msgstr "ড্ৰপডাউন নিৰ্দেশকেৰ আকাৰ" msgid "Spacing around indicator" msgstr "নিৰ্দেশকেৰ চাৰপাশে স্থান স্থাপন" -#: gtk/gtkorientable.c:75 # +#: gtk/gtkorientable.c:75 msgid "The orientation of the orientable" msgstr "সৰ্বমোট" #: gtk/gtkpaned.c:242 -msgid "Position of paned separator in pixels (0 means all the way to the left/top)" +msgid "" +"Position of paned separator in pixels (0 means all the way to the left/top)" msgstr "পিক্সেল হিচাপে পেন্‌ড বিভাজকেৰ অবস্থান (০ হলে ওপৰতে এবং বামপাৰ্শ্বে অবস্থিত)" #: gtk/gtkpaned.c:251 @@ -3961,10 +3992,11 @@ msgstr "সঙ্কোচন" #: gtk/gtkpaned.c:328 msgid "If TRUE, the child can be made smaller than its requisition" -msgstr "ইয়াৰ মান সত্য হলে (TRUE), চাইল্ড উইজেটেৰ আকাৰ ইয়াৰ প্ৰয়োজন অপেক্ষা ক্ষুদ্ৰতৰ কৰা যায়" +msgstr "" +"ইয়াৰ মান সত্য হলে (TRUE), চাইল্ড উইজেটেৰ আকাৰ ইয়াৰ প্ৰয়োজন অপেক্ষা ক্ষুদ্ৰতৰ কৰা যায়" -#: gtk/gtkplug.c:150 gtk/gtkstatusicon.c:309 # +#: gtk/gtkplug.c:150 gtk/gtkstatusicon.c:309 msgid "Embedded" msgstr "এমবেড করা" @@ -3976,13 +4008,14 @@ msgstr "হলো" msgid "Socket Window" msgstr "Socket Window" -#: gtk/gtkplug.c:166 # +#: gtk/gtkplug.c:166 msgid "The window of the socket the plug is embedded in" msgstr "হলো" #: gtk/gtkpreview.c:102 -msgid "Whether the preview widget should take up the entire space it is allocated" +msgid "" +"Whether the preview widget should take up the entire space it is allocated" msgstr "" "প্ৰাকদৰ্শন উইজেটেৰ বাবে যি পৰিমাণ স্থান বৰাদ্দ কৰা হ'ব তাৰ সম্পূৰ্ণ অংশই ব্যৱহৃত হ'ব " "নে নাই" @@ -4051,18 +4084,18 @@ msgstr "গণনা" msgid "Number of jobs queued in the printer" msgstr "সৰ্বমোট" -#: gtk/gtkprinter.c:198 # +#: gtk/gtkprinter.c:198 msgid "Paused Printer" msgstr "Selected" -#: gtk/gtkprinter.c:199 # +#: gtk/gtkprinter.c:199 msgid "TRUE if this printer is paused" msgstr "অবস্থানেৰ বৈশিষ্ট্য ব্যৱহাৰ কৰা হলে TRUE" -#: gtk/gtkprinter.c:212 # +#: gtk/gtkprinter.c:212 msgid "Accepting Jobs" msgstr "ফোকাস অনুমোদন কৰো" @@ -4082,8 +4115,8 @@ msgstr "The PrinterOption backing this widget" msgid "Title of the print job" msgstr "শিৰোনাম সৰ্বমোট" -#: gtk/gtkprintjob.c:125 # +#: gtk/gtkprintjob.c:125 msgid "Printer" msgstr "প্ৰিন্টাৰ" @@ -4091,13 +4124,13 @@ msgstr "প্ৰিন্টাৰ" msgid "Printer to print the job to" msgstr "Printer to print the job to" -#: gtk/gtkprintjob.c:134 # +#: gtk/gtkprintjob.c:134 msgid "Settings" msgstr "ন্যাট মানসমূহ" -#: gtk/gtkprintjob.c:135 # +#: gtk/gtkprintjob.c:135 msgid "Printer settings" msgstr "মুদ্ৰক ছেটিংছ..." @@ -4105,7 +4138,7 @@ msgstr "মুদ্ৰক ছেটিংছ..." msgid "Page Setup" msgstr "পৃষ্ঠাৰ বিন্যাস" -#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1027 +#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1050 msgid "Track Print Status" msgstr "প্ৰিন্ট কৰক অবস্থা" @@ -4115,111 +4148,111 @@ msgid "" "print data has been sent to the printer or print server." msgstr "পৰে." -#: gtk/gtkprintoperation.c:899 +#: gtk/gtkprintoperation.c:922 msgid "Default Page Setup" msgstr "অবিকল্পিত পৃষ্ঠা" -#: gtk/gtkprintoperation.c:900 +#: gtk/gtkprintoperation.c:923 msgid "The GtkPageSetup used by default" msgstr "The GtkPageSetup used by default" -#: gtk/gtkprintoperation.c:918 gtk/gtkprintunixdialog.c:276 +#: gtk/gtkprintoperation.c:941 gtk/gtkprintunixdialog.c:276 msgid "Print Settings" msgstr "প্ৰিন্ট কৰক" -#: gtk/gtkprintoperation.c:919 gtk/gtkprintunixdialog.c:277 +#: gtk/gtkprintoperation.c:942 gtk/gtkprintunixdialog.c:277 msgid "The GtkPrintSettings used for initializing the dialog" msgstr "উল্লিখিত সময় অবধি" -#: gtk/gtkprintoperation.c:937 +#: gtk/gtkprintoperation.c:960 msgid "Job Name" msgstr "নাম" -#: gtk/gtkprintoperation.c:938 +#: gtk/gtkprintoperation.c:961 msgid "A string used for identifying the print job." msgstr "উল্লিখিত সময় অবধি." -#: gtk/gtkprintoperation.c:962 +#: gtk/gtkprintoperation.c:985 msgid "Number of Pages" msgstr "সৰ্বমোট" -#: gtk/gtkprintoperation.c:963 +#: gtk/gtkprintoperation.c:986 msgid "The number of pages in the document." msgstr "সৰ্বমোট." -#: gtk/gtkprintoperation.c:984 gtk/gtkprintunixdialog.c:266 +#: gtk/gtkprintoperation.c:1007 gtk/gtkprintunixdialog.c:266 msgid "Current Page" msgstr "পৃষ্ঠা" -#: gtk/gtkprintoperation.c:985 gtk/gtkprintunixdialog.c:267 +#: gtk/gtkprintoperation.c:1008 gtk/gtkprintunixdialog.c:267 msgid "The current page in the document" msgstr "The current page in the document" -#: gtk/gtkprintoperation.c:1006 +#: gtk/gtkprintoperation.c:1029 msgid "Use full page" msgstr "Use full page" -#: gtk/gtkprintoperation.c:1007 +#: gtk/gtkprintoperation.c:1030 msgid "" "TRUE if the origin of the context should be at the corner of the page and " "not the corner of the imageable area" msgstr "সৰ্বমোট সৰ্বমোট সৰ্বমোট" -#: gtk/gtkprintoperation.c:1028 +#: gtk/gtkprintoperation.c:1051 msgid "" "TRUE if the print operation will continue to report on the print job status " "after the print data has been sent to the printer or print server." msgstr "সক্ৰিয় পৰে." -#: gtk/gtkprintoperation.c:1045 +#: gtk/gtkprintoperation.c:1068 msgid "Unit" msgstr "একক" -#: gtk/gtkprintoperation.c:1046 +#: gtk/gtkprintoperation.c:1069 msgid "The unit in which distances can be measured in the context" msgstr "The unit in which distances can be measured in the context" -#: gtk/gtkprintoperation.c:1063 +#: gtk/gtkprintoperation.c:1086 msgid "Show Dialog" msgstr "ডায়ালগ" -#: gtk/gtkprintoperation.c:1064 +#: gtk/gtkprintoperation.c:1087 msgid "TRUE if a progress dialog is shown while printing." msgstr "হলো." -#: gtk/gtkprintoperation.c:1087 +#: gtk/gtkprintoperation.c:1110 msgid "Allow Async" msgstr "Allow Async" -#: gtk/gtkprintoperation.c:1088 +#: gtk/gtkprintoperation.c:1111 msgid "TRUE if print process may run asynchronous." msgstr "TRUE if print process may run asynchronous." -#: gtk/gtkprintoperation.c:1110 gtk/gtkprintoperation.c:1111 +#: gtk/gtkprintoperation.c:1133 gtk/gtkprintoperation.c:1134 msgid "Export filename" msgstr "Export filename" -#: gtk/gtkprintoperation.c:1125 +#: gtk/gtkprintoperation.c:1148 msgid "Status" msgstr "অবস্থা" -#: gtk/gtkprintoperation.c:1126 +#: gtk/gtkprintoperation.c:1149 msgid "The status of the print operation" msgstr "সৰ্বমোট" -#: gtk/gtkprintoperation.c:1146 +#: gtk/gtkprintoperation.c:1169 msgid "Status String" msgstr "অবস্থা বাক্য" -#: gtk/gtkprintoperation.c:1147 +#: gtk/gtkprintoperation.c:1170 msgid "A human-readable description of the status" msgstr "বিবৰণ সৰ্বমোট" -#: gtk/gtkprintoperation.c:1165 +#: gtk/gtkprintoperation.c:1188 msgid "Custom tab label" msgstr "নিজস্ব" -#: gtk/gtkprintoperation.c:1166 +#: gtk/gtkprintoperation.c:1189 msgid "Label for the tab containing custom widgets." msgstr "Label উল্লিখিত সময় অবধি স্বনিৰ্বাচিত." @@ -4337,48 +4370,48 @@ msgstr "প্ৰস্থ সৰ্বমোট." msgid "YSpacing" msgstr "YSpacing" -#: gtk/gtkprogressbar.c:221 # +#: gtk/gtkprogressbar.c:221 msgid "Extra spacing applied to the height of a progress bar." msgstr "প্ৰস্থ সৰ্বমোট." -#: gtk/gtkprogressbar.c:234 # +#: gtk/gtkprogressbar.c:234 msgid "Min horizontal bar width" msgstr "পথালি বিভাজকেৰ প্ৰস্থ" -#: gtk/gtkprogressbar.c:235 # +#: gtk/gtkprogressbar.c:235 msgid "The minimum horizontal width of the progress bar" msgstr "লেবেলেৰ পথালি সংৰেখন" -#: gtk/gtkprogressbar.c:247 # +#: gtk/gtkprogressbar.c:247 msgid "Min horizontal bar height" msgstr "পথালি সংৰেখন" -#: gtk/gtkprogressbar.c:248 # +#: gtk/gtkprogressbar.c:248 msgid "Minimum horizontal height of the progress bar" msgstr "প্ৰগ্ৰেছবাৰেৰ মান" -#: gtk/gtkprogressbar.c:260 # +#: gtk/gtkprogressbar.c:260 msgid "Min vertical bar width" msgstr "উলম্ব বিভাজকেৰ প্ৰস্থ" -#: gtk/gtkprogressbar.c:261 # +#: gtk/gtkprogressbar.c:261 msgid "The minimum vertical width of the progress bar" msgstr "প্ৰগ্ৰেছবাৰে যি টেক্সট প্ৰদৰ্শন কৰা হ'ব" -#: gtk/gtkprogressbar.c:273 # +#: gtk/gtkprogressbar.c:273 msgid "Min vertical bar height" msgstr "চাইল্ডৰ সৰ্বনিম্ন উচ্চতা" -#: gtk/gtkprogressbar.c:274 # +#: gtk/gtkprogressbar.c:274 msgid "The minimum vertical height of the progress bar" msgstr "প্ৰগ্ৰেছবাৰেৰ মান" @@ -4416,8 +4449,8 @@ msgstr "এই উইজেটটি যি গ্ৰুপেৰ অংশ উ msgid "The radio menu item whose group this widget belongs to." msgstr "The radio menu item whose group this widget belongs to." -#: gtk/gtkradiotoolbutton.c:66 # +#: gtk/gtkradiotoolbutton.c:66 msgid "The radio tool button whose group this button belongs to." msgstr "এই উইজেটটি যি গ্ৰুপেৰ অংশ উক্ত গ্ৰুপেৰ ৰেডিও বুটাম" @@ -4499,7 +4532,8 @@ msgstr "দীৰ্ঘ বক্সৰ প্ৰান্ত" #: gtk/gtkrange.c:461 msgid "Spacing between thumb/steppers and outer trough bevel" -msgstr "থাম্ব/স্টেপাৰ এবং বহিঃস্থ দীৰ্ঘ বক্সৰ ন্যায় বেভেলেৰ মধ্যবৰ্তী ৰিক্ত স্থানৰ পৰিমাণ" +msgstr "" +"থাম্ব/স্টেপাৰ এবং বহিঃস্থ দীৰ্ঘ বক্সৰ ন্যায় বেভেলেৰ মধ্যবৰ্তী ৰিক্ত স্থানৰ পৰিমাণ" #: gtk/gtkrange.c:468 msgid "Stepper Size" @@ -4522,7 +4556,8 @@ msgid "Arrow X Displacement" msgstr "এক্স অক্ষ বৰাবৰ তীৰচিহ্ন সৰানো" #: gtk/gtkrange.c:493 -msgid "How far in the x direction to move the arrow when the button is depressed" +msgid "" +"How far in the x direction to move the arrow when the button is depressed" msgstr "বুটাম চাপা অবস্থায় তীৰচিহ্নকে এক্স অক্ষ বৰাবৰ যি পৰিমাণ সৰানো হ'ব" #: gtk/gtkrange.c:500 @@ -4530,7 +4565,8 @@ msgid "Arrow Y Displacement" msgstr "ওয়াই অক্ষ বৰাবৰ তীৰচিহ্ন সৰানো" #: gtk/gtkrange.c:501 -msgid "How far in the y direction to move the arrow when the button is depressed" +msgid "" +"How far in the y direction to move the arrow when the button is depressed" msgstr "বুটাম চাপা অবস্থায় তীৰচিহ্নকে ওয়াই অক্ষ বৰাবৰ যি পৰিমাণ সৰানো হ'ব" #: gtk/gtkrange.c:509 @@ -4565,8 +4601,8 @@ msgid "" "spacing" msgstr "উল্লিখিত সময় অবধি সৰ্বমোট" -#: gtk/gtkrange.c:555 # +#: gtk/gtkrange.c:555 msgid "Arrow scaling" msgstr "কাঁড়ৰ Scaling" @@ -4620,7 +4656,8 @@ msgstr "Show Not Found" #: gtk/gtkrecentchooser.c:191 msgid "Whether the items pointing to unavailable resources should be displayed" -msgstr "Whether the items pointing to unavailable resources should be displayed" +msgstr "" +"Whether the items pointing to unavailable resources should be displayed" #: gtk/gtkrecentchooser.c:204 msgid "Whether to allow multiple items to be selected" @@ -4659,7 +4696,8 @@ msgid "The full path to the file to be used to store and read the list" msgstr "ফাইল তালিকা" #: gtk/gtkrecentmanager.c:230 -msgid "The maximum number of items to be returned by gtk_recent_manager_get_items()" +msgid "" +"The maximum number of items to be returned by gtk_recent_manager_get_items()" msgstr "সৰ্বমোট" #: gtk/gtkrecentmanager.c:246 @@ -4702,60 +4740,61 @@ msgstr "পৰিমাপ-ব্যৱস্থা" msgid "The metric used for the ruler" msgstr "ৰুলাৰে ব্যৱহৃত পৰিমাপ-ব্যৱস্থা" -#: gtk/gtkscale.c:201 +#: gtk/gtkscale.c:219 msgid "The number of decimal places that are displayed in the value" msgstr "দশমিকেৰ পৰ যতটি অংক দেখানো হ'ব" -#: gtk/gtkscale.c:210 +#: gtk/gtkscale.c:228 msgid "Draw Value" msgstr "আঁকাৰ মান" -#: gtk/gtkscale.c:211 +#: gtk/gtkscale.c:229 msgid "Whether the current value is displayed as a string next to the slider" msgstr "স্লাইডাৰেৰ পাশে বৰ্তমান মানটিকে পংক্তি হিচাপে প্ৰদৰ্শন কৰা হ'ব নে নাই" -#: gtk/gtkscale.c:218 +#: gtk/gtkscale.c:236 msgid "Value Position" msgstr "মানেৰ অবস্থান" -#: gtk/gtkscale.c:219 +#: gtk/gtkscale.c:237 msgid "The position in which the current value is displayed" msgstr "যি অবস্থানে বৰ্তমান মানটি প্ৰদৰ্শন কৰা হ'ব" -#: gtk/gtkscale.c:226 +#: gtk/gtkscale.c:244 msgid "Slider Length" msgstr "স্লাইডাৰেৰ দৈৰ্ঘ্য" -#: gtk/gtkscale.c:227 +#: gtk/gtkscale.c:245 msgid "Length of scale's slider" msgstr "মাপদন্ডেৰ স্লাইডাৰেৰ দৈৰ্ঘ্য" -#: gtk/gtkscale.c:235 +#: gtk/gtkscale.c:253 msgid "Value spacing" msgstr "স্পেসিং তৰ মান" -#: gtk/gtkscale.c:236 +#: gtk/gtkscale.c:254 msgid "Space between value text and the slider/trough area" msgstr "মানসূচক টেক্সট আৰু স্লাইডাৰ/থ্ৰু অংশেৰ মধ্যবৰ্তী স্থান তৰ সংখ্যা" -#: gtk/gtkscalebutton.c:205 +#: gtk/gtkscalebutton.c:207 msgid "The value of the scale" msgstr "সৰ্বমোট" -#: gtk/gtkscalebutton.c:215 +#: gtk/gtkscalebutton.c:217 msgid "The icon size" msgstr "The icon size" -#: gtk/gtkscalebutton.c:224 -msgid "The GtkAdjustment that contains the current value of this scale button object" +#: gtk/gtkscalebutton.c:226 +msgid "" +"The GtkAdjustment that contains the current value of this scale button object" msgstr "ধাৰন কৰে সৰ্বমোট" -#: gtk/gtkscalebutton.c:252 # +#: gtk/gtkscalebutton.c:254 msgid "Icons" msgstr "আইকন" -#: gtk/gtkscalebutton.c:253 +#: gtk/gtkscalebutton.c:255 msgid "List of icon names" msgstr "তালিকা সৰ্বমোট" @@ -4776,11 +4815,13 @@ msgid "Don't change slider size, just lock it to the minimum length" msgstr "স্লাইডাৰেৰ দৈৰ্ঘ্য পৰিবৰ্তন না কৰে সৰ্বনিম্ন দৈৰ্ঘ্যি স্থিৰ ৰাখা হোক" #: gtk/gtkscrollbar.c:82 -msgid "Display a second backward arrow button on the opposite end of the scrollbar" +msgid "" +"Display a second backward arrow button on the opposite end of the scrollbar" msgstr "স্ক্ৰলবাৰেৰ বিপৰীত প্ৰান্তে এটা পশ্চাত্‍গামী তীৰচিহ্নধাৰী বুটাম প্ৰদৰ্শন কৰো" #: gtk/gtkscrollbar.c:89 -msgid "Display a second forward arrow button on the opposite end of the scrollbar" +msgid "" +"Display a second forward arrow button on the opposite end of the scrollbar" msgstr "প্ৰদৰ্শন দ্বিতীয় সক্ৰিয় সৰ্বমোট" #: gtk/gtkscrolledwindow.c:218 gtk/gtktext.c:545 gtk/gtktreeview.c:578 @@ -5022,7 +5063,8 @@ msgid "Xft Hint Style" msgstr "Xft হিন্টেৰ ধৰন" #: gtk/gtksettings.c:401 -msgid "What degree of hinting to use; hintnone, hintslight, hintmedium, or hintfull" +msgid "" +"What degree of hinting to use; hintnone, hintslight, hintmedium, or hintfull" msgstr "যি মাত্ৰাৰ হিন্টিং ব্যৱহাৰ কৰা হ'ব; কিছুই না, স্বল্প, মধ্যম, বা সম্পূৰ্ণ" #: gtk/gtksettings.c:410 @@ -5039,7 +5081,8 @@ msgstr "Xft ডিপিএএই" #: gtk/gtksettings.c:421 msgid "Resolution for Xft, in 1024 * dots/inch. -1 to use default value" -msgstr "১০২৪ * ডট/ইঞ্চি হিচাপে Xft তৰ বিভাজন। -১ হলে অবিকল্পিত মান ব্যৱহাৰ কৰা হ'ব" +msgstr "" +"১০২৪ * ডট/ইঞ্চি হিচাপে Xft তৰ বিভাজন। -১ হলে অবিকল্পিত মান ব্যৱহাৰ কৰা হ'ব" #: gtk/gtksettings.c:430 msgid "Cursor theme name" @@ -5251,23 +5294,23 @@ msgstr "Recent Files Limit" msgid "Number of recently used files" msgstr "সৰ্বমোট" -#: gtk/gtksettings.c:845 # +#: gtk/gtksettings.c:845 msgid "Default IM module" msgstr "অবিকল্পিত প্ৰস্থ" -#: gtk/gtksettings.c:846 # +#: gtk/gtksettings.c:846 msgid "Which IM module should be used by default" msgstr "পেলেট ব্যৱহৃত হ'ব নে নাই" -#: gtk/gtksettings.c:864 # +#: gtk/gtksettings.c:864 msgid "Recent Files Max Age" msgstr "মেনেজাৰ" -#: gtk/gtksettings.c:865 # +#: gtk/gtksettings.c:865 msgid "Maximum age of recently used files, in days" msgstr "সৰ্বমোট" @@ -5279,13 +5322,13 @@ msgstr "Fontconfig configuration timestamp" msgid "Timestamp of current fontconfig configuration" msgstr "Timestamp of current fontconfig configuration" -#: gtk/gtksettings.c:897 # +#: gtk/gtksettings.c:897 msgid "Sound Theme Name" msgstr "শব্দের থিমের নাম" -#: gtk/gtksettings.c:898 # +#: gtk/gtksettings.c:898 msgid "XDG sound theme name" msgstr "কাৰ্সাৰ থিমেৰ নাম" @@ -5294,28 +5337,28 @@ msgstr "কাৰ্সাৰ থিমেৰ নাম" msgid "Audible Input Feedback" msgstr "Audible Input Feedback" -#: gtk/gtksettings.c:921 # +#: gtk/gtksettings.c:921 msgid "Whether to play event sounds as feedback to user input" msgstr "ইনপুটেৰ প্ৰতি উইজেট সাড়া দেয় নে নাই" -#: gtk/gtksettings.c:942 # +#: gtk/gtksettings.c:942 msgid "Enable Event Sounds" msgstr "অ্যানিমেশন সক্ৰিয় কৰা হ'ব" -#: gtk/gtksettings.c:943 # +#: gtk/gtksettings.c:943 msgid "Whether to play any event sounds at all" msgstr "\"অসামঞ্জস্যপূৰ্ণ\" অবস্থা প্ৰদৰ্শন কৰা হ'ব নে নাই" -#: gtk/gtksettings.c:958 # +#: gtk/gtksettings.c:958 msgid "Enable Tooltips" msgstr "টুল-টিপ সক্ৰিয় কৰা হ'ব" -#: gtk/gtksettings.c:959 # +#: gtk/gtksettings.c:959 msgid "Whether tooltips should be shown on widgets" msgstr "ট্যাব প্ৰদৰ্শন কৰা হ'ব নে নাই" @@ -5334,7 +5377,8 @@ msgid "Ignore hidden" msgstr "লুকানো উইজেটকে অগ্ৰাহ্য কৰো" #: gtk/gtksizegroup.c:311 -msgid "If TRUE, unmapped widgets are ignored when determining the size of the group" +msgid "" +"If TRUE, unmapped widgets are ignored when determining the size of the group" msgstr "সৰ্বমোট" #: gtk/gtkspinbutton.c:209 @@ -5378,7 +5422,8 @@ msgid "Update Policy" msgstr "আপডেট কৰাৰ নীতি" #: gtk/gtkspinbutton.c:261 -msgid "Whether the spin button should update always, or only when the value is legal" +msgid "" +"Whether the spin button should update always, or only when the value is legal" msgstr "স্পিন বুটাম কখন আপডেট কৰবে - সৰ্বদা নাকি কেবল মানটি বৈধ হলেই" #: gtk/gtkspinbutton.c:270 @@ -5409,8 +5454,8 @@ msgstr "সৰ্বমোট" msgid "The screen where this status icon will be displayed" msgstr "The screen where this status icon will be displayed" -#: gtk/gtkstatusicon.c:285 # +#: gtk/gtkstatusicon.c:285 msgid "Blinking" msgstr "ঢিমিক-ঢামাক " @@ -5434,8 +5479,8 @@ msgstr "সৰ্বমোট" msgid "Has tooltip" msgstr "Has tooltip" -#: gtk/gtkstatusicon.c:354 # +#: gtk/gtkstatusicon.c:354 msgid "Whether this tray icon has a tooltip" msgstr "এই ট্যাগ (tag) ফন্ট আকাৰকে প্ৰভাবিত কৰে নে নাই" @@ -5451,8 +5496,8 @@ msgstr "সৰ্বমোট উল্লিখিত সময় অবধি" msgid "Tooltip markup" msgstr "টুলটিপ" -#: gtk/gtkstatusicon.c:400 # +#: gtk/gtkstatusicon.c:400 msgid "The contents of the tooltip for this tray icon" msgstr "সৰ্বমোট উল্লিখিত সময় অবধি" @@ -5605,7 +5650,8 @@ msgid "Cursor position" msgstr "কাৰ্সাৰেৰ অবস্থান" #: gtk/gtktextbuffer.c:231 -msgid "The position of the insert mark (as offset from the beginning of the buffer)" +msgid "" +"The position of the insert mark (as offset from the beginning of the buffer)" msgstr "সৰ্বমোট সৰ্বমোট" #: gtk/gtktextbuffer.c:246 @@ -5613,7 +5659,8 @@ msgid "Copy target list" msgstr "কপি কৰক তালিকা" #: gtk/gtktextbuffer.c:247 -msgid "The list of targets this buffer supports for clipboard copying and DND source" +msgid "" +"The list of targets this buffer supports for clipboard copying and DND source" msgstr "তালিকা সৰ্বমোট উল্লিখিত সময় অবধি" #: gtk/gtktextbuffer.c:262 @@ -5792,7 +5839,8 @@ msgid "Pixels of blank space between wrapped lines in a paragraph" msgstr "কোন অনুচ্ছেদেৰ গুটিয়ে যাওয়া দুটি লাইনেৰ মাজত যত পিক্সেল ফাঁক থাকবে" #: gtk/gtktexttag.c:476 gtk/gtktextview.c:582 -msgid "Whether to wrap lines never, at word boundaries, or at character boundaries" +msgid "" +"Whether to wrap lines never, at word boundaries, or at character boundaries" msgstr "" "লাইন কখনোই গুটিয়ে নেয়া নহ'ব, শব্দ শেষ হলে গুটিয়ে নেয়া নহ'বকি অক্ষৰ শেষ হলে গুটিয়ে " "নেয়া হ'ব" @@ -5903,7 +5951,8 @@ msgstr "গুটিয়ে যাওয়াৰ সেটেৰ মাজত প #: gtk/gtktexttag.c:645 msgid "Whether this tag affects the number of pixels between wrapped lines" -msgstr "এই ট্যাগটি গুটিয়ে যাওয়া লাইনসমূহেৰ মাজত অবস্থিত পিক্ছেলৰসংখ্যাকে প্ৰভাবিত কৰে নে নাই" +msgstr "" +"এই ট্যাগটি গুটিয়ে যাওয়া লাইনসমূহেৰ মাজত অবস্থিত পিক্ছেলৰসংখ্যাকে প্ৰভাবিত কৰে নে নাই" #: gtk/gtktexttag.c:652 msgid "Right margin set" @@ -6122,8 +6171,10 @@ msgid "Toolbar style" msgstr "টুলবাৰেৰ ধৰন" #: gtk/gtktoolbar.c:631 -msgid "Whether default toolbars have text only, text and icons, icons only, etc." -msgstr "অবিকল্পিত টুলবাৰে অকল টেক্সট বা টেক্সট আৰু আইকন বা অকল আইকন, ইত্যাদি থাকবে নে নাই" +msgid "" +"Whether default toolbars have text only, text and icons, icons only, etc." +msgstr "" +"অবিকল্পিত টুলবাৰে অকল টেক্সট বা টেক্সট আৰু আইকন বা অকল আইকন, ইত্যাদি থাকবে নে নাই" #: gtk/gtktoolbar.c:637 msgid "Toolbar icon size" @@ -6243,7 +6294,8 @@ msgstr "নিয়ম সংক্ৰান্ত ইঙ্গিত" #: gtk/gtktreeview.c:627 msgid "Set a hint to the theme engine to draw rows in alternating colors" -msgstr "পৰিবৰ্তনশীল ৰঙে শাৰী আঁকাৰ উদ্দেশ্যি থিম ইঞ্জিনেৰ বাবেি এটা ইঙ্গিত নিৰ্ধাৰণ কৰো" +msgstr "" +"পৰিবৰ্তনশীল ৰঙে শাৰী আঁকাৰ উদ্দেশ্যি থিম ইঞ্জিনেৰ বাবেি এটা ইঙ্গিত নিৰ্ধাৰণ কৰো" #: gtk/gtktreeview.c:634 msgid "Enable Search" @@ -6259,8 +6311,8 @@ msgstr "" msgid "Search Column" msgstr "অনুসন্ধানেৰ স্তম্ভ" -#: gtk/gtktreeview.c:643 # +#: gtk/gtktreeview.c:643 msgid "Model column to search through during interactive search" msgstr "কোড অনুসন্ধানেৰ সময় যি মডেল স্তম্ভে অনুসন্ধান চালানো হ'ব" @@ -6285,7 +6337,8 @@ msgid "Hover Expand" msgstr "ভাসমান (Hover) সম্প্ৰসাৰণ" #: gtk/gtktreeview.c:705 -msgid "Whether rows should be expanded/collapsed when the pointer moves over them" +msgid "" +"Whether rows should be expanded/collapsed when the pointer moves over them" msgstr "কোন শাৰীৰ ওপৰ পয়েন্টাৰ ৰাখা হলে তাকে সম্প্ৰসাৰিত-কৰা/খোলা হ'ব নে নাই" #: gtk/gtktreeview.c:719 @@ -6309,7 +6362,8 @@ msgid "Rubber Banding" msgstr "Rubber Banding" #: gtk/gtktreeview.c:745 -msgid "Whether to enable selection of multiple items by dragging the mouse pointer" +msgid "" +"Whether to enable selection of multiple items by dragging the mouse pointer" msgstr "সৰ্বমোট" #: gtk/gtktreeview.c:752 @@ -6424,7 +6478,7 @@ msgstr "খানি পংক্তিৰ বাবে" msgid "Whether to display the column" msgstr "স্তম্ভ প্ৰদৰ্শন কৰা হ'ব নে নাই" -#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:536 +#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:537 msgid "Resizable" msgstr "পৰিবৰ্তনযোগ্য আকাৰ" @@ -6676,7 +6730,8 @@ msgstr "ঘটনাসমূহ " #: gtk/gtkwidget.c:594 msgid "The event mask that decides what kind of GdkEvents this widget gets" -msgstr "যি ইভেন্ট মাস্কটি নিৰ্ধাৰণ কৰে এই উইজেটটি কি ধৰনেৰ GdkEvents গ্ৰহণ কৰতে পাৰে" +msgstr "" +"যি ইভেন্ট মাস্কটি নিৰ্ধাৰণ কৰে এই উইজেটটি কি ধৰনেৰ GdkEvents গ্ৰহণ কৰতে পাৰে" #: gtk/gtkwidget.c:601 msgid "Extension events" @@ -6698,8 +6753,8 @@ msgstr "gtk_widget_show_all() এই উইজেটকে প্ৰভাবি msgid "Whether this widget has a tooltip" msgstr "Whether this widget has a tooltip" -#: gtk/gtkwidget.c:689 # +#: gtk/gtkwidget.c:689 msgid "Window" msgstr "সংযোগ পথ" @@ -6835,43 +6890,43 @@ msgstr "Vertical Scroll Arrow Length" msgid "The length of vertical scroll arrows" msgstr "সৰ্বমোট" -#: gtk/gtkwindow.c:477 +#: gtk/gtkwindow.c:478 msgid "Window Type" msgstr "উইন্ডোৰ ধৰন" -#: gtk/gtkwindow.c:478 +#: gtk/gtkwindow.c:479 msgid "The type of the window" msgstr "উইন্ডোৰ ধৰন " -#: gtk/gtkwindow.c:486 +#: gtk/gtkwindow.c:487 msgid "Window Title" msgstr "উইন্ডোৰ শিৰোনাম " -#: gtk/gtkwindow.c:487 +#: gtk/gtkwindow.c:488 msgid "The title of the window" msgstr "উইন্ডোৰ শিৰোনাম " -#: gtk/gtkwindow.c:494 +#: gtk/gtkwindow.c:495 msgid "Window Role" msgstr "উইন্ডোৰ ভূমিকা" -#: gtk/gtkwindow.c:495 +#: gtk/gtkwindow.c:496 msgid "Unique identifier for the window to be used when restoring a session" msgstr "কোন সেশন পুনৰুদ্ধাৰেৰ সময় উইন্ডোৰ বাবে যি একক (Unique) নিৰ্দেশক ব্যৱহৃত হ'ব" -#: gtk/gtkwindow.c:511 +#: gtk/gtkwindow.c:512 msgid "Startup ID" msgstr "Startup ID" -#: gtk/gtkwindow.c:512 +#: gtk/gtkwindow.c:513 msgid "Unique startup identifier for the window used by startup-notification" msgstr "উল্লিখিত সময় অবধি" -#: gtk/gtkwindow.c:519 +#: gtk/gtkwindow.c:520 msgid "Allow Shrink" msgstr "সঙ্কোচন অনুমোদন কৰো" -#: gtk/gtkwindow.c:521 +#: gtk/gtkwindow.c:522 #, no-c-format msgid "" "If TRUE, the window has no mimimum size. Setting this to TRUE is 99% of the " @@ -6880,25 +6935,25 @@ msgstr "" "যদি TRUE হয় তেন্তে উইন্ডোটিৰ কোন সৰ্বনিম্ন আকাৰ নেই। ইয়াৰ মান TRUE নিৰ্ধাৰণ কৰাটা " "৯৯% ক্ষেত্ৰে এটা বাজে সিদ্ধান্ত" -#: gtk/gtkwindow.c:528 +#: gtk/gtkwindow.c:529 msgid "Allow Grow" msgstr "বড় হতে দেয়া হোক" -#: gtk/gtkwindow.c:529 +#: gtk/gtkwindow.c:530 msgid "If TRUE, users can expand the window beyond its minimum size" msgstr "" "যদি TRUE হয় তেন্তে ব্যৱহাৰকাৰীগণ উইন্ডোটিকে তাৰ সৰ্বনিম্ন আকাৰ অপেক্ষা বড় কৰতে " "পাৰবেন" -#: gtk/gtkwindow.c:537 +#: gtk/gtkwindow.c:538 msgid "If TRUE, users can resize the window" msgstr "যদি TRUE হয় তেন্তে ব্যৱহাৰকাৰীগণ উইন্ডোৰ আকাৰ পৰিবৰ্তন কৰতে পাৰবেন" -#: gtk/gtkwindow.c:544 +#: gtk/gtkwindow.c:545 msgid "Modal" msgstr "মোডাল (Modal)" -#: gtk/gtkwindow.c:545 +#: gtk/gtkwindow.c:546 msgid "" "If TRUE, the window is modal (other windows are not usable while this one is " "up)" @@ -6906,67 +6961,68 @@ msgstr "" "যদি TRUE হয় তেন্তে উইন্ডোটো মোডাল (এই উইন্ডোটি যখন দেখা যাবে থাকবে তখন অন্যান্য " "উইন্ডো ব্যৱহাৰ কৰা যাবে না)" -#: gtk/gtkwindow.c:552 +#: gtk/gtkwindow.c:553 msgid "Window Position" msgstr "উইন্ডোৰ অবস্থান" -#: gtk/gtkwindow.c:553 +#: gtk/gtkwindow.c:554 msgid "The initial position of the window" msgstr "উইন্ডোৰ প্ৰাথমিক অবস্থান" -#: gtk/gtkwindow.c:561 +#: gtk/gtkwindow.c:562 msgid "Default Width" msgstr "অবিকল্পিত প্ৰস্থ" -#: gtk/gtkwindow.c:562 +#: gtk/gtkwindow.c:563 msgid "The default width of the window, used when initially showing the window" msgstr "উইন্ডোটি প্ৰথমবাৰ প্ৰদৰ্শনেৰ সময় যি অবিকল্পিত প্ৰস্থ ব্যৱহাৰ কৰা হ'ব" -#: gtk/gtkwindow.c:571 +#: gtk/gtkwindow.c:572 msgid "Default Height" msgstr "অবিকল্পিত উচ্চতা" -#: gtk/gtkwindow.c:572 -msgid "The default height of the window, used when initially showing the window" +#: gtk/gtkwindow.c:573 +msgid "" +"The default height of the window, used when initially showing the window" msgstr "উইন্ডোটি প্ৰথমবাৰ প্ৰদৰ্শনেৰ সময় যি অবিকল্পিত উচ্চতা ব্যৱহাৰ কৰা হ'ব" -#: gtk/gtkwindow.c:581 +#: gtk/gtkwindow.c:582 msgid "Destroy with Parent" msgstr "পেৰেন্ট সাথেই বন্ধ কৰো" -#: gtk/gtkwindow.c:582 +#: gtk/gtkwindow.c:583 msgid "If this window should be destroyed when the parent is destroyed" msgstr "পেৰেন্ট উইন্ডো বন্ধ কৰে দিলে এই উইন্ডোটিও বন্ধ কৰা হ'ব নে নাই" -#: gtk/gtkwindow.c:590 +#: gtk/gtkwindow.c:591 msgid "Icon for this window" msgstr "এই উইন্ডোৰ বাবে আইকন" -#: gtk/gtkwindow.c:606 +#: gtk/gtkwindow.c:607 msgid "Name of the themed icon for this window" msgstr "এই উইন্ডোৰ বাবে থিমযুক্ত আইকনেৰ নাম" -#: gtk/gtkwindow.c:621 +#: gtk/gtkwindow.c:622 msgid "Is Active" msgstr "সক্ৰিয় অবস্থায় আছে" -#: gtk/gtkwindow.c:622 +#: gtk/gtkwindow.c:623 msgid "Whether the toplevel is the current active window" msgstr "সৰ্বোচ্চ স্তৰটি বৰ্তমানে সক্ৰিয় উইন্ডো নে নাই" -#: gtk/gtkwindow.c:629 +#: gtk/gtkwindow.c:630 msgid "Focus in Toplevel" msgstr "ওপৰতেৰ স্তৰেৰ ফোকাস" -#: gtk/gtkwindow.c:630 +#: gtk/gtkwindow.c:631 msgid "Whether the input focus is within this GtkWindow" msgstr "ইনপুটেৰ ফ'কাচ GtkWindow'ৰ মাজত আছে নে নাই" -#: gtk/gtkwindow.c:637 +#: gtk/gtkwindow.c:638 msgid "Type hint" msgstr "ধৰন সংক্ৰান্ত ইঙ্গিত" -#: gtk/gtkwindow.c:638 +#: gtk/gtkwindow.c:639 msgid "" "Hint to help the desktop environment understand what kind of window this is " "and how to treat it." @@ -6974,83 +7030,83 @@ msgstr "" "এটি কি ধৰনেৰ উইন্ডো এবং ইয়াক কিভাবে ব্যৱহাৰ কৰতে হ'ব সে ব্যাপাৰে ডেস্কটপকে " "সাহায্য কৰাৰ বাবে ইঙ্গিত।" -#: gtk/gtkwindow.c:646 +#: gtk/gtkwindow.c:647 msgid "Skip taskbar" msgstr "টাস্কবাৰ এড়িয়ে যাওয়া হোক" -#: gtk/gtkwindow.c:647 +#: gtk/gtkwindow.c:648 msgid "TRUE if the window should not be in the task bar." msgstr "উইন্ডোটি টাস্কবাৰে না থাকলে TRUE ।" -#: gtk/gtkwindow.c:654 +#: gtk/gtkwindow.c:655 msgid "Skip pager" msgstr "পেজাৰ এড়িয়ে যাওয়া হোক" -#: gtk/gtkwindow.c:655 +#: gtk/gtkwindow.c:656 msgid "TRUE if the window should not be in the pager." msgstr "পেজাৰে উইন্ডোটি না থাকলে TRUE ।" -#: gtk/gtkwindow.c:662 +#: gtk/gtkwindow.c:663 msgid "Urgent" msgstr "জৰুৰি" -#: gtk/gtkwindow.c:663 +#: gtk/gtkwindow.c:664 msgid "TRUE if the window should be brought to the user's attention." msgstr "এটিৰ মান সত্য (TRUE) হলে, উইন্ডোকে ব্যৱহাৰকাৰীৰ গোচৰে আনা হ'ব।" -#: gtk/gtkwindow.c:677 +#: gtk/gtkwindow.c:678 msgid "Accept focus" msgstr "ফোকাস অনুমোদন কৰো" -#: gtk/gtkwindow.c:678 +#: gtk/gtkwindow.c:679 msgid "TRUE if the window should receive the input focus." msgstr "উইন্ডোটি ইনপুট ফোকাসেৰ লক্ষ্য হলে ইয়াৰ মান TRUE ।" -#: gtk/gtkwindow.c:692 +#: gtk/gtkwindow.c:693 msgid "Focus on map" msgstr "মানচিত্ৰেৰ ওপৰ ফ'কাচ কৰো" -#: gtk/gtkwindow.c:693 +#: gtk/gtkwindow.c:694 msgid "TRUE if the window should receive the input focus when mapped." msgstr "ইয়াৰ মান সত্য (TRUE) হলে উইন্ডোটি ইনপুট ফোকাসেৰ লক্ষ্য হ'ব।" -#: gtk/gtkwindow.c:707 +#: gtk/gtkwindow.c:708 msgid "Decorated" msgstr "সজ্জিত" -#: gtk/gtkwindow.c:708 +#: gtk/gtkwindow.c:709 msgid "Whether the window should be decorated by the window manager" msgstr "উইন্ডো ব্যৱস্থাপক উইন্ডোটি সজ্জিত কৰবে নে নাই" -#: gtk/gtkwindow.c:722 +#: gtk/gtkwindow.c:723 msgid "Deletable" msgstr "Deletable" -#: gtk/gtkwindow.c:723 +#: gtk/gtkwindow.c:724 msgid "Whether the window frame should have a close button" msgstr "Whether the window frame should have a close button" -#: gtk/gtkwindow.c:739 +#: gtk/gtkwindow.c:740 msgid "Gravity" msgstr "মাধ্যাকৰ্ষণ" -#: gtk/gtkwindow.c:740 +#: gtk/gtkwindow.c:741 msgid "The window gravity of the window" msgstr "এই উইন্ডোটিৰ উইন্ডো মাধ্যাকৰ্ষণ" -#: gtk/gtkwindow.c:757 +#: gtk/gtkwindow.c:758 msgid "Transient for Window" msgstr "উল্লিখিত সময় অবধি" -#: gtk/gtkwindow.c:758 +#: gtk/gtkwindow.c:759 msgid "The transient parent of the dialog" msgstr "parent সৰ্বমোট" -#: gtk/gtkwindow.c:773 +#: gtk/gtkwindow.c:774 msgid "Opacity for Window" msgstr "উল্লিখিত সময় অবধি" -#: gtk/gtkwindow.c:774 +#: gtk/gtkwindow.c:775 msgid "The opacity of the window, from 0 to 1" msgstr "সৰ্বমোট ১" diff --git a/po-properties/ast.po b/po-properties/ast.po index 6e697325e6..618c5260c6 100644 --- a/po-properties/ast.po +++ b/po-properties/ast.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ast\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-03-13 10:29-0400\n" +"POT-Creation-Date: 2009-05-04 01:14-0400\n" "PO-Revision-Date: 2009-01-25 13:10+0200\n" "Last-Translator: Esbardu \n" "Language-Team: Asturian \n" @@ -88,12 +88,12 @@ msgstr "" msgid "The default display for GDK" msgstr "" -#: gdk/gdkpango.c:490 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 -#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:613 +#: gdk/gdkpango.c:537 gtk/gtkinvisible.c:86 gtk/gtkmountoperation.c:155 +#: gtk/gtkstatusicon.c:277 gtk/gtkwindow.c:614 msgid "Screen" msgstr "" -#: gdk/gdkpango.c:491 +#: gdk/gdkpango.c:538 msgid "the GdkScreen for the renderer" msgstr "" @@ -113,114 +113,114 @@ msgstr "" msgid "The resolution for fonts on the screen" msgstr "" -#: gtk/gtkaboutdialog.c:200 +#: gtk/gtkaboutdialog.c:239 msgid "Program name" msgstr "" -#: gtk/gtkaboutdialog.c:201 +#: gtk/gtkaboutdialog.c:240 msgid "" "The name of the program. If this is not set, it defaults to " "g_get_application_name()" msgstr "" -#: gtk/gtkaboutdialog.c:215 +#: gtk/gtkaboutdialog.c:254 msgid "Program version" msgstr "" -#: gtk/gtkaboutdialog.c:216 +#: gtk/gtkaboutdialog.c:255 msgid "The version of the program" msgstr "" -#: gtk/gtkaboutdialog.c:230 +#: gtk/gtkaboutdialog.c:269 msgid "Copyright string" msgstr "" -#: gtk/gtkaboutdialog.c:231 +#: gtk/gtkaboutdialog.c:270 msgid "Copyright information for the program" msgstr "" -#: gtk/gtkaboutdialog.c:248 +#: gtk/gtkaboutdialog.c:287 msgid "Comments string" msgstr "" -#: gtk/gtkaboutdialog.c:249 +#: gtk/gtkaboutdialog.c:288 msgid "Comments about the program" msgstr "" -#: gtk/gtkaboutdialog.c:283 +#: gtk/gtkaboutdialog.c:322 msgid "Website URL" msgstr "" -#: gtk/gtkaboutdialog.c:284 +#: gtk/gtkaboutdialog.c:323 msgid "The URL for the link to the website of the program" msgstr "" -#: gtk/gtkaboutdialog.c:300 +#: gtk/gtkaboutdialog.c:339 msgid "Website label" msgstr "" -#: gtk/gtkaboutdialog.c:301 +#: gtk/gtkaboutdialog.c:340 msgid "" "The label for the link to the website of the program. If this is not set, it " "defaults to the URL" msgstr "" -#: gtk/gtkaboutdialog.c:317 +#: gtk/gtkaboutdialog.c:356 msgid "Authors" msgstr "" -#: gtk/gtkaboutdialog.c:318 +#: gtk/gtkaboutdialog.c:357 msgid "List of authors of the program" msgstr "" -#: gtk/gtkaboutdialog.c:334 +#: gtk/gtkaboutdialog.c:373 msgid "Documenters" msgstr "" -#: gtk/gtkaboutdialog.c:335 +#: gtk/gtkaboutdialog.c:374 msgid "List of people documenting the program" msgstr "" -#: gtk/gtkaboutdialog.c:351 +#: gtk/gtkaboutdialog.c:390 msgid "Artists" msgstr "" -#: gtk/gtkaboutdialog.c:352 +#: gtk/gtkaboutdialog.c:391 msgid "List of people who have contributed artwork to the program" msgstr "" -#: gtk/gtkaboutdialog.c:369 +#: gtk/gtkaboutdialog.c:408 msgid "Translator credits" msgstr "" -#: gtk/gtkaboutdialog.c:370 +#: gtk/gtkaboutdialog.c:409 msgid "" "Credits to the translators. This string should be marked as translatable" msgstr "" -#: gtk/gtkaboutdialog.c:385 +#: gtk/gtkaboutdialog.c:424 msgid "Logo" msgstr "" -#: gtk/gtkaboutdialog.c:386 +#: gtk/gtkaboutdialog.c:425 msgid "" "A logo for the about box. If this is not set, it defaults to " "gtk_window_get_default_icon_list()" msgstr "" -#: gtk/gtkaboutdialog.c:401 +#: gtk/gtkaboutdialog.c:440 msgid "Logo Icon Name" msgstr "" -#: gtk/gtkaboutdialog.c:402 +#: gtk/gtkaboutdialog.c:441 msgid "A named icon to use as the logo for the about box." msgstr "" -#: gtk/gtkaboutdialog.c:415 +#: gtk/gtkaboutdialog.c:454 msgid "Wrap license" msgstr "" -#: gtk/gtkaboutdialog.c:416 +#: gtk/gtkaboutdialog.c:455 msgid "Whether to wrap the license text." msgstr "" @@ -293,7 +293,7 @@ msgid "The GIcon being displayed" msgstr "" #: gtk/gtkaction.c:282 gtk/gtkcellrendererpixbuf.c:171 gtk/gtkimage.c:230 -#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:605 +#: gtk/gtkprinter.c:172 gtk/gtkstatusicon.c:234 gtk/gtkwindow.c:606 msgid "Icon Name" msgstr "" @@ -391,7 +391,7 @@ msgid "Whether the action group is visible." msgstr "" #: gtk/gtkadjustment.c:93 gtk/gtkcellrendererprogress.c:128 -#: gtk/gtkscalebutton.c:204 gtk/gtkspinbutton.c:269 +#: gtk/gtkscalebutton.c:206 gtk/gtkspinbutton.c:269 msgid "Value" msgstr "" @@ -567,59 +567,59 @@ msgstr "" msgid "Force aspect ratio to match that of the frame's child" msgstr "" -#: gtk/gtkassistant.c:261 +#: gtk/gtkassistant.c:281 msgid "Header Padding" msgstr "" -#: gtk/gtkassistant.c:262 +#: gtk/gtkassistant.c:282 msgid "Number of pixels around the header." msgstr "" -#: gtk/gtkassistant.c:269 +#: gtk/gtkassistant.c:289 msgid "Content Padding" msgstr "" -#: gtk/gtkassistant.c:270 +#: gtk/gtkassistant.c:290 msgid "Number of pixels around the content pages." msgstr "" -#: gtk/gtkassistant.c:286 +#: gtk/gtkassistant.c:306 msgid "Page type" msgstr "" -#: gtk/gtkassistant.c:287 +#: gtk/gtkassistant.c:307 msgid "The type of the assistant page" msgstr "" -#: gtk/gtkassistant.c:304 +#: gtk/gtkassistant.c:324 msgid "Page title" msgstr "" -#: gtk/gtkassistant.c:305 +#: gtk/gtkassistant.c:325 msgid "The title of the assistant page" msgstr "" -#: gtk/gtkassistant.c:321 +#: gtk/gtkassistant.c:341 msgid "Header image" msgstr "" -#: gtk/gtkassistant.c:322 +#: gtk/gtkassistant.c:342 msgid "Header image for the assistant page" msgstr "" -#: gtk/gtkassistant.c:338 +#: gtk/gtkassistant.c:358 msgid "Sidebar image" msgstr "" -#: gtk/gtkassistant.c:339 +#: gtk/gtkassistant.c:359 msgid "Sidebar image for the assistant page" msgstr "" -#: gtk/gtkassistant.c:354 +#: gtk/gtkassistant.c:374 msgid "Page complete" msgstr "" -#: gtk/gtkassistant.c:355 +#: gtk/gtkassistant.c:375 msgid "Whether all required fields on the page have been filled out" msgstr "" @@ -860,7 +860,7 @@ msgid "" "rectangle" msgstr "" -#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1661 +#: gtk/gtkbutton.c:485 gtk/gtkentry.c:658 gtk/gtkentry.c:1682 msgid "Inner Border" msgstr "" @@ -1195,7 +1195,7 @@ msgstr "" msgid "Whether the rendered pixbuf should be colorized according to the state" msgstr "" -#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:589 +#: gtk/gtkcellrendererpixbuf.c:205 gtk/gtkimage.c:247 gtk/gtkwindow.c:590 msgid "Icon" msgstr "" @@ -1252,7 +1252,7 @@ msgid "Orientation and growth direction of the progress bar" msgstr "" #: gtk/gtkcellrendererspin.c:93 gtk/gtkprogressbar.c:118 gtk/gtkrange.c:367 -#: gtk/gtkscalebutton.c:223 gtk/gtkspinbutton.c:208 +#: gtk/gtkscalebutton.c:225 gtk/gtkspinbutton.c:208 msgid "Adjustment" msgstr "" @@ -1268,7 +1268,7 @@ msgstr "" msgid "The acceleration rate when you hold down a button" msgstr "" -#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:200 gtk/gtkspinbutton.c:226 +#: gtk/gtkcellrendererspin.c:123 gtk/gtkscale.c:218 gtk/gtkspinbutton.c:226 msgid "Digits" msgstr "" @@ -2099,11 +2099,11 @@ msgid "" "Border between text and frame. Overrides the inner-border style property" msgstr "" -#: gtk/gtkentry.c:666 +#: gtk/gtkentry.c:666 gtk/gtkentry.c:1232 msgid "Invisible character" msgstr "" -#: gtk/gtkentry.c:667 +#: gtk/gtkentry.c:667 gtk/gtkentry.c:1233 msgid "The character to use when masking entry contents (in \"password mode\")" msgstr "" @@ -2369,31 +2369,31 @@ msgstr "" msgid "Border around the progress bar" msgstr "" -#: gtk/gtkentry.c:1662 +#: gtk/gtkentry.c:1683 msgid "Border between text and frame." msgstr "" -#: gtk/gtkentry.c:1676 +#: gtk/gtkentry.c:1697 msgid "State Hint" msgstr "" -#: gtk/gtkentry.c:1677 +#: gtk/gtkentry.c:1698 msgid "Whether to pass a proper state when drawing shadow or background" msgstr "" -#: gtk/gtkentry.c:1682 gtk/gtklabel.c:695 +#: gtk/gtkentry.c:1703 gtk/gtklabel.c:695 msgid "Select on focus" msgstr "" -#: gtk/gtkentry.c:1683 +#: gtk/gtkentry.c:1704 msgid "Whether to select the contents of an entry when it is focused" msgstr "" -#: gtk/gtkentry.c:1697 +#: gtk/gtkentry.c:1718 msgid "Password Hint Timeout" msgstr "" -#: gtk/gtkentry.c:1698 +#: gtk/gtkentry.c:1719 msgid "How long to show the last input character in hidden entries" msgstr "" @@ -2972,7 +2972,7 @@ msgstr "" msgid "Icon set to display" msgstr "" -#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:214 gtk/gtktoolbar.c:540 +#: gtk/gtkimage.c:188 gtk/gtkscalebutton.c:216 gtk/gtktoolbar.c:540 msgid "Icon size" msgstr "" @@ -3036,7 +3036,7 @@ msgstr "" msgid "Whether images should be shown in menus" msgstr "" -#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:614 +#: gtk/gtkinvisible.c:87 gtk/gtkwindow.c:615 msgid "The screen where this window will be displayed" msgstr "" @@ -3960,7 +3960,7 @@ msgstr "" msgid "Page Setup" msgstr "" -#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1027 +#: gtk/gtkprintjob.c:152 gtk/gtkprintoperation.c:1050 msgid "Track Print Status" msgstr "" @@ -3970,111 +3970,111 @@ msgid "" "print data has been sent to the printer or print server." msgstr "" -#: gtk/gtkprintoperation.c:899 +#: gtk/gtkprintoperation.c:922 msgid "Default Page Setup" msgstr "" -#: gtk/gtkprintoperation.c:900 +#: gtk/gtkprintoperation.c:923 msgid "The GtkPageSetup used by default" msgstr "" -#: gtk/gtkprintoperation.c:918 gtk/gtkprintunixdialog.c:276 +#: gtk/gtkprintoperation.c:941 gtk/gtkprintunixdialog.c:276 msgid "Print Settings" msgstr "" -#: gtk/gtkprintoperation.c:919 gtk/gtkprintunixdialog.c:277 +#: gtk/gtkprintoperation.c:942 gtk/gtkprintunixdialog.c:277 msgid "The GtkPrintSettings used for initializing the dialog" msgstr "" -#: gtk/gtkprintoperation.c:937 +#: gtk/gtkprintoperation.c:960 msgid "Job Name" msgstr "" -#: gtk/gtkprintoperation.c:938 +#: gtk/gtkprintoperation.c:961 msgid "A string used for identifying the print job." msgstr "" -#: gtk/gtkprintoperation.c:962 +#: gtk/gtkprintoperation.c:985 msgid "Number of Pages" msgstr "" -#: gtk/gtkprintoperation.c:963 +#: gtk/gtkprintoperation.c:986 msgid "The number of pages in the document." msgstr "" -#: gtk/gtkprintoperation.c:984 gtk/gtkprintunixdialog.c:266 +#: gtk/gtkprintoperation.c:1007 gtk/gtkprintunixdialog.c:266 msgid "Current Page" msgstr "" -#: gtk/gtkprintoperation.c:985 gtk/gtkprintunixdialog.c:267 +#: gtk/gtkprintoperation.c:1008 gtk/gtkprintunixdialog.c:267 msgid "The current page in the document" msgstr "" -#: gtk/gtkprintoperation.c:1006 +#: gtk/gtkprintoperation.c:1029 msgid "Use full page" msgstr "" -#: gtk/gtkprintoperation.c:1007 +#: gtk/gtkprintoperation.c:1030 msgid "" "TRUE if the origin of the context should be at the corner of the page and " "not the corner of the imageable area" msgstr "" -#: gtk/gtkprintoperation.c:1028 +#: gtk/gtkprintoperation.c:1051 msgid "" "TRUE if the print operation will continue to report on the print job status " "after the print data has been sent to the printer or print server." msgstr "" -#: gtk/gtkprintoperation.c:1045 +#: gtk/gtkprintoperation.c:1068 msgid "Unit" msgstr "" -#: gtk/gtkprintoperation.c:1046 +#: gtk/gtkprintoperation.c:1069 msgid "The unit in which distances can be measured in the context" msgstr "" -#: gtk/gtkprintoperation.c:1063 +#: gtk/gtkprintoperation.c:1086 msgid "Show Dialog" msgstr "" -#: gtk/gtkprintoperation.c:1064 +#: gtk/gtkprintoperation.c:1087 msgid "TRUE if a progress dialog is shown while printing." msgstr "" -#: gtk/gtkprintoperation.c:1087 +#: gtk/gtkprintoperation.c:1110 msgid "Allow Async" msgstr "" -#: gtk/gtkprintoperation.c:1088 +#: gtk/gtkprintoperation.c:1111 msgid "TRUE if print process may run asynchronous." msgstr "" -#: gtk/gtkprintoperation.c:1110 gtk/gtkprintoperation.c:1111 +#: gtk/gtkprintoperation.c:1133 gtk/gtkprintoperation.c:1134 msgid "Export filename" msgstr "" -#: gtk/gtkprintoperation.c:1125 +#: gtk/gtkprintoperation.c:1148 msgid "Status" msgstr "" -#: gtk/gtkprintoperation.c:1126 +#: gtk/gtkprintoperation.c:1149 msgid "The status of the print operation" msgstr "" -#: gtk/gtkprintoperation.c:1146 +#: gtk/gtkprintoperation.c:1169 msgid "Status String" msgstr "" -#: gtk/gtkprintoperation.c:1147 +#: gtk/gtkprintoperation.c:1170 msgid "A human-readable description of the status" msgstr "" -#: gtk/gtkprintoperation.c:1165 +#: gtk/gtkprintoperation.c:1188 msgid "Custom tab label" msgstr "" -#: gtk/gtkprintoperation.c:1166 +#: gtk/gtkprintoperation.c:1189 msgid "Label for the tab containing custom widgets." msgstr "" @@ -4540,60 +4540,60 @@ msgstr "" msgid "The metric used for the ruler" msgstr "" -#: gtk/gtkscale.c:201 +#: gtk/gtkscale.c:219 msgid "The number of decimal places that are displayed in the value" msgstr "" -#: gtk/gtkscale.c:210 +#: gtk/gtkscale.c:228 msgid "Draw Value" msgstr "" -#: gtk/gtkscale.c:211 +#: gtk/gtkscale.c:229 msgid "Whether the current value is displayed as a string next to the slider" msgstr "" -#: gtk/gtkscale.c:218 +#: gtk/gtkscale.c:236 msgid "Value Position" msgstr "" -#: gtk/gtkscale.c:219 +#: gtk/gtkscale.c:237 msgid "The position in which the current value is displayed" msgstr "" -#: gtk/gtkscale.c:226 +#: gtk/gtkscale.c:244 msgid "Slider Length" msgstr "" -#: gtk/gtkscale.c:227 +#: gtk/gtkscale.c:245 msgid "Length of scale's slider" msgstr "" -#: gtk/gtkscale.c:235 +#: gtk/gtkscale.c:253 msgid "Value spacing" msgstr "" -#: gtk/gtkscale.c:236 +#: gtk/gtkscale.c:254 msgid "Space between value text and the slider/trough area" msgstr "" -#: gtk/gtkscalebutton.c:205 +#: gtk/gtkscalebutton.c:207 msgid "The value of the scale" msgstr "" -#: gtk/gtkscalebutton.c:215 +#: gtk/gtkscalebutton.c:217 msgid "The icon size" msgstr "" -#: gtk/gtkscalebutton.c:224 +#: gtk/gtkscalebutton.c:226 msgid "" "The GtkAdjustment that contains the current value of this scale button object" msgstr "" -#: gtk/gtkscalebutton.c:252 +#: gtk/gtkscalebutton.c:254 msgid "Icons" msgstr "" -#: gtk/gtkscalebutton.c:253 +#: gtk/gtkscalebutton.c:255 msgid "List of icon names" msgstr "" @@ -6224,7 +6224,7 @@ msgstr "" msgid "Whether to display the column" msgstr "" -#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:536 +#: gtk/gtktreeviewcolumn.c:199 gtk/gtkwindow.c:537 msgid "Resizable" msgstr "" @@ -6626,215 +6626,215 @@ msgstr "" msgid "The length of vertical scroll arrows" msgstr "" -#: gtk/gtkwindow.c:477 +#: gtk/gtkwindow.c:478 msgid "Window Type" msgstr "" -#: gtk/gtkwindow.c:478 +#: gtk/gtkwindow.c:479 msgid "The type of the window" msgstr "" -#: gtk/gtkwindow.c:486 +#: gtk/gtkwindow.c:487 msgid "Window Title" msgstr "" -#: gtk/gtkwindow.c:487 +#: gtk/gtkwindow.c:488 msgid "The title of the window" msgstr "" -#: gtk/gtkwindow.c:494 +#: gtk/gtkwindow.c:495 msgid "Window Role" msgstr "" -#: gtk/gtkwindow.c:495 +#: gtk/gtkwindow.c:496 msgid "Unique identifier for the window to be used when restoring a session" msgstr "" -#: gtk/gtkwindow.c:511 +#: gtk/gtkwindow.c:512 msgid "Startup ID" msgstr "" -#: gtk/gtkwindow.c:512 +#: gtk/gtkwindow.c:513 msgid "Unique startup identifier for the window used by startup-notification" msgstr "" -#: gtk/gtkwindow.c:519 +#: gtk/gtkwindow.c:520 msgid "Allow Shrink" msgstr "" -#: gtk/gtkwindow.c:521 +#: gtk/gtkwindow.c:522 #, no-c-format msgid "" "If TRUE, the window has no mimimum size. Setting this to TRUE is 99% of the " "time a bad idea" msgstr "" -#: gtk/gtkwindow.c:528 +#: gtk/gtkwindow.c:529 msgid "Allow Grow" msgstr "" -#: gtk/gtkwindow.c:529 +#: gtk/gtkwindow.c:530 msgid "If TRUE, users can expand the window beyond its minimum size" msgstr "" -#: gtk/gtkwindow.c:537 +#: gtk/gtkwindow.c:538 msgid "If TRUE, users can resize the window" msgstr "" -#: gtk/gtkwindow.c:544 +#: gtk/gtkwindow.c:545 msgid "Modal" msgstr "" -#: gtk/gtkwindow.c:545 +#: gtk/gtkwindow.c:546 msgid "" "If TRUE, the window is modal (other windows are not usable while this one is " "up)" msgstr "" -#: gtk/gtkwindow.c:552 +#: gtk/gtkwindow.c:553 msgid "Window Position" msgstr "" -#: gtk/gtkwindow.c:553 +#: gtk/gtkwindow.c:554 msgid "The initial position of the window" msgstr "" -#: gtk/gtkwindow.c:561 +#: gtk/gtkwindow.c:562 msgid "Default Width" msgstr "" -#: gtk/gtkwindow.c:562 +#: gtk/gtkwindow.c:563 msgid "The default width of the window, used when initially showing the window" msgstr "" -#: gtk/gtkwindow.c:571 +#: gtk/gtkwindow.c:572 msgid "Default Height" msgstr "" -#: gtk/gtkwindow.c:572 +#: gtk/gtkwindow.c:573 msgid "" "The default height of the window, used when initially showing the window" msgstr "" -#: gtk/gtkwindow.c:581 +#: gtk/gtkwindow.c:582 msgid "Destroy with Parent" msgstr "" -#: gtk/gtkwindow.c:582 +#: gtk/gtkwindow.c:583 msgid "If this window should be destroyed when the parent is destroyed" msgstr "" -#: gtk/gtkwindow.c:590 +#: gtk/gtkwindow.c:591 msgid "Icon for this window" msgstr "" -#: gtk/gtkwindow.c:606 +#: gtk/gtkwindow.c:607 msgid "Name of the themed icon for this window" msgstr "" -#: gtk/gtkwindow.c:621 +#: gtk/gtkwindow.c:622 msgid "Is Active" msgstr "" -#: gtk/gtkwindow.c:622 +#: gtk/gtkwindow.c:623 msgid "Whether the toplevel is the current active window" msgstr "" -#: gtk/gtkwindow.c:629 +#: gtk/gtkwindow.c:630 msgid "Focus in Toplevel" msgstr "" -#: gtk/gtkwindow.c:630 +#: gtk/gtkwindow.c:631 msgid "Whether the input focus is within this GtkWindow" msgstr "" -#: gtk/gtkwindow.c:637 +#: gtk/gtkwindow.c:638 msgid "Type hint" msgstr "" -#: gtk/gtkwindow.c:638 +#: gtk/gtkwindow.c:639 msgid "" "Hint to help the desktop environment understand what kind of window this is " "and how to treat it." msgstr "" -#: gtk/gtkwindow.c:646 +#: gtk/gtkwindow.c:647 msgid "Skip taskbar" msgstr "" -#: gtk/gtkwindow.c:647 +#: gtk/gtkwindow.c:648 msgid "TRUE if the window should not be in the task bar." msgstr "" -#: gtk/gtkwindow.c:654 +#: gtk/gtkwindow.c:655 msgid "Skip pager" msgstr "" -#: gtk/gtkwindow.c:655 +#: gtk/gtkwindow.c:656 msgid "TRUE if the window should not be in the pager." msgstr "" -#: gtk/gtkwindow.c:662 +#: gtk/gtkwindow.c:663 msgid "Urgent" msgstr "" -#: gtk/gtkwindow.c:663 +#: gtk/gtkwindow.c:664 msgid "TRUE if the window should be brought to the user's attention." msgstr "" -#: gtk/gtkwindow.c:677 +#: gtk/gtkwindow.c:678 msgid "Accept focus" msgstr "" -#: gtk/gtkwindow.c:678 +#: gtk/gtkwindow.c:679 msgid "TRUE if the window should receive the input focus." msgstr "" -#: gtk/gtkwindow.c:692 +#: gtk/gtkwindow.c:693 msgid "Focus on map" msgstr "" -#: gtk/gtkwindow.c:693 +#: gtk/gtkwindow.c:694 msgid "TRUE if the window should receive the input focus when mapped." msgstr "" -#: gtk/gtkwindow.c:707 +#: gtk/gtkwindow.c:708 msgid "Decorated" msgstr "" -#: gtk/gtkwindow.c:708 +#: gtk/gtkwindow.c:709 msgid "Whether the window should be decorated by the window manager" msgstr "" -#: gtk/gtkwindow.c:722 +#: gtk/gtkwindow.c:723 msgid "Deletable" msgstr "" -#: gtk/gtkwindow.c:723 +#: gtk/gtkwindow.c:724 msgid "Whether the window frame should have a close button" msgstr "" -#: gtk/gtkwindow.c:739 +#: gtk/gtkwindow.c:740 msgid "Gravity" msgstr "" -#: gtk/gtkwindow.c:740 +#: gtk/gtkwindow.c:741 msgid "The window gravity of the window" msgstr "" -#: gtk/gtkwindow.c:757 +#: gtk/gtkwindow.c:758 msgid "Transient for Window" msgstr "" -#: gtk/gtkwindow.c:758 +#: gtk/gtkwindow.c:759 msgid "The transient parent of the dialog" msgstr "" -#: gtk/gtkwindow.c:773 +#: gtk/gtkwindow.c:774 msgid "Opacity for Window" msgstr "" -#: gtk/gtkwindow.c:774 +#: gtk/gtkwindow.c:775 msgid "The opacity of the window, from 0 to 1" msgstr "" diff --git a/po-properties/az.po b/po-properties/az.po index c8fb7b5ec0..63799c486e 100644 --- a/po-properties/az.po +++ b/po-properties/az.po @@ -32,7 +32,7 @@ msgid "" msgstr "" "Project-Id-Version: gtk+-properties.HEAD\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-03-13 10:29-0400\n" +"POT-Creation-Date: 2009-05-04 01:14-0400\n" "PO-Revision-Date: 2004-03-07 18:05+0200\n" "Last-Translator: Mətin Əmirov \n" "Language-Team: Azerbaijani Turkish