summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS62
-rw-r--r--config.h.meson5
-rw-r--r--demos/gtk-demo/constraints.c17
-rw-r--r--demos/gtk-demo/constraints.ui106
-rw-r--r--demos/gtk-demo/constraints2.c7
-rw-r--r--demos/gtk-demo/constraints3.c7
-rw-r--r--demos/gtk-demo/constraints4.c72
-rw-r--r--demos/gtk-demo/demo.gresource.xml7
-rw-r--r--demos/gtk-demo/demo.ui13
-rw-r--r--demos/gtk-demo/demotaggedentry.c20
-rw-r--r--demos/gtk-demo/drawingarea.c10
-rw-r--r--demos/gtk-demo/entry_completion.c10
-rw-r--r--demos/gtk-demo/entry_undo.c12
-rw-r--r--demos/gtk-demo/errorstates.c2
-rw-r--r--demos/gtk-demo/errorstates.ui2
-rw-r--r--demos/gtk-demo/fontrendering.c2
-rw-r--r--demos/gtk-demo/gltransition.c5
-rw-r--r--demos/gtk-demo/images.c37
-rw-r--r--demos/gtk-demo/layoutmanager.c2
-rw-r--r--demos/gtk-demo/layoutmanager2.c2
-rw-r--r--demos/gtk-demo/listbox.c6
-rw-r--r--demos/gtk-demo/main.ui12
-rw-r--r--demos/gtk-demo/meson.build4
-rw-r--r--demos/gtk-demo/paintable.c2
-rw-r--r--demos/gtk-demo/paintable_animated.c2
-rw-r--r--demos/gtk-demo/paintable_mediastream.c2
-rw-r--r--demos/gtk-demo/panes.c166
-rw-r--r--demos/gtk-demo/pixbufpaintable.c187
-rw-r--r--demos/gtk-demo/pixbufpaintable.h13
-rw-r--r--demos/gtk-demo/search_entry.c23
-rw-r--r--demos/gtk-demo/search_entry2.c102
-rw-r--r--demos/gtk-demo/tagged_entry.c1
-rw-r--r--demos/gtk-demo/tagstyle.css6
-rw-r--r--demos/gtk-demo/themes.ui1
-rw-r--r--demos/widget-factory/widget-factory.c23
-rw-r--r--demos/widget-factory/widget-factory.ui4
-rw-r--r--docs/reference/gtk/gtk4-sections.txt3
-rw-r--r--docs/reference/gtk/migrating-3to4.md12
-rw-r--r--docs/reference/gtk/running.md8
-rw-r--r--docs/reference/gtk/section-accessibility.md24
-rw-r--r--gdk/broadway/gdkeventsource.c2
-rw-r--r--gdk/gdkcursor.c8
-rw-r--r--gdk/gdksurface.c29
-rw-r--r--gdk/macos/GdkMacosCairoSubview.c31
-rw-r--r--gdk/macos/GdkMacosCairoSubview.h2
-rw-r--r--gdk/macos/GdkMacosCairoView.c12
-rw-r--r--gdk/macos/gdkmacosdisplay-private.h2
-rw-r--r--gdk/macos/gdkmacosdisplay-translate.c35
-rw-r--r--gdk/macos/gdkmacosdisplay.c2
-rw-r--r--gdk/macos/gdkmacosglcontext-private.h3
-rw-r--r--gdk/macos/gdkmacosglcontext.c110
-rw-r--r--gdk/macos/gdkmacossurface.c2
-rw-r--r--gdk/macos/gdkmacostoplevelsurface-private.h17
-rw-r--r--gdk/macos/gdkmacostoplevelsurface.c11
-rw-r--r--gdk/wayland/gdksurface-wayland.c1
-rw-r--r--gdk/win32/gdksurface-win32.c35
-rw-r--r--gsk/gl/gskglprofiler.c16
-rw-r--r--gsk/gl/gskglrenderer.c596
-rw-r--r--gsk/gskrenderer.c6
-rw-r--r--gsk/meson.build2
-rw-r--r--gtk/a11y/gtkatspicache.c5
-rw-r--r--gtk/a11y/gtkatspicontext.c286
-rw-r--r--gtk/a11y/gtkatspiroot.c46
-rw-r--r--gtk/a11y/gtkatspirootprivate.h3
-rw-r--r--gtk/a11y/gtkatspiutils.c2
-rw-r--r--gtk/css/gtkcsstokenizer.c2
-rw-r--r--gtk/css/meson.build1
-rw-r--r--gtk/gtkatcontext.c72
-rw-r--r--gtk/gtkatcontextprivate.h9
-rw-r--r--gtk/gtkbuildable.c29
-rw-r--r--gtk/gtkbuildableprivate.h4
-rw-r--r--gtk/gtkbuilderscope.h2
-rw-r--r--gtk/gtkbutton.c5
-rw-r--r--gtk/gtkconstraintlayout.c54
-rw-r--r--gtk/gtkdragicon.c1
-rw-r--r--gtk/gtkdragicon.h1
-rw-r--r--gtk/gtkenums.h60
-rw-r--r--gtk/gtkeventcontroller.c2
-rw-r--r--gtk/gtkexpression.c4
-rw-r--r--gtk/gtkfilter.h4
-rw-r--r--gtk/gtkhsla.c18
-rw-r--r--gtk/gtkhslaprivate.h5
-rw-r--r--gtk/gtkimcontextime.c357
-rw-r--r--gtk/gtkimcontextwayland.c1
-rw-r--r--gtk/gtkmagnifier.c2
-rw-r--r--gtk/gtkmenusectionbox.c2
-rw-r--r--gtk/gtkplacessidebar.c193
-rw-r--r--gtk/gtkplacessidebarprivate.h49
-rw-r--r--gtk/gtkplacesview.c1
-rw-r--r--gtk/gtkpopover.c4
-rw-r--r--gtk/gtkpopovermenu.c1
-rw-r--r--gtk/gtkprintoperation.c2
-rw-r--r--gtk/gtkprivate.h1
-rw-r--r--gtk/gtkrender.c1
-rw-r--r--gtk/gtksettings.c1
-rw-r--r--gtk/gtksidebarrow.c51
-rw-r--r--gtk/gtkstringlist.c22
-rw-r--r--gtk/gtktextbuffer.h20
-rw-r--r--gtk/gtktexthandle.c181
-rw-r--r--gtk/gtktextview.c21
-rw-r--r--gtk/gtktreeexpander.c47
-rw-r--r--gtk/gtktreemodel.c4
-rw-r--r--gtk/gtktreestore.c2
-rw-r--r--gtk/gtktreeviewcolumn.h2
-rw-r--r--gtk/gtkversion.c8
-rw-r--r--gtk/gtkwidget.c27
-rw-r--r--gtk/gtkwindowcontrols.c21
-rw-r--r--gtk/meson.build1
-rw-r--r--gtk/theme/Adwaita/_common.scss3
-rw-r--r--gtk/tools/gtk-builder-tool-simplify.c467
-rw-r--r--gtk/tools/gtk-builder-tool-validate.c2
-rw-r--r--gtk/tools/gtk-builder-tool.c55
-rw-r--r--meson.build2
-rw-r--r--po-properties/POTFILES.skip3
-rw-r--r--po/POTFILES.skip3
-rw-r--r--po/de.po2180
-rw-r--r--po/pl.po320
-rw-r--r--testsuite/css/change/meson.build11
-rw-r--r--testsuite/css/data.c37
-rw-r--r--testsuite/css/nodes/meson.build11
-rw-r--r--testsuite/css/parser/cdo-cdc.css7
-rw-r--r--testsuite/css/parser/cdo-cdc.ref.css3
-rw-r--r--testsuite/css/parser/meson.build16
-rw-r--r--testsuite/css/parser/url-invalid1.css4
-rw-r--r--testsuite/css/parser/url-invalid1.errors1
-rw-r--r--testsuite/css/parser/url-invalid1.ref.css0
-rw-r--r--testsuite/css/parser/url-invalid2.css4
-rw-r--r--testsuite/css/parser/url-invalid2.errors1
-rw-r--r--testsuite/css/parser/url-invalid2.ref.css0
-rw-r--r--testsuite/css/parser/url-valid1.css3
-rw-r--r--testsuite/css/parser/url-valid1.ref.css3
-rw-r--r--testsuite/css/parser/url-valid2.css4
-rw-r--r--testsuite/css/parser/url-valid2.ref.css3
-rw-r--r--testsuite/css/parser/url-valid3.css4
-rw-r--r--testsuite/css/parser/url-valid3.ref.css3
-rw-r--r--testsuite/css/style/meson.build11
-rw-r--r--testsuite/gdk/cursor.c69
-rw-r--r--testsuite/gdk/displaymanager.c55
-rw-r--r--testsuite/gdk/keysyms.c74
-rw-r--r--testsuite/gdk/meson.build3
-rw-r--r--testsuite/gdk/rectangle.c44
-rw-r--r--testsuite/gdk/seat.c39
-rw-r--r--testsuite/gdk/texture.c120
-rw-r--r--testsuite/gtk/expression.c70
-rw-r--r--testsuite/gtk/filter.c30
-rw-r--r--testsuite/gtk/main.c16
-rw-r--r--testsuite/gtk/sorter.c7
-rw-r--r--testsuite/gtk/stringlist.c13
-rw-r--r--testsuite/gtk/ui/constraints.expected1
-rw-r--r--testsuite/gtk/ui/constraints.ui107
-rw-r--r--testsuite/tools/meson.build3
-rwxr-xr-xtestsuite/tools/simplify-3to4.in16
-rw-r--r--testsuite/tools/simplify-data-3to4/actionbar.expected13
-rw-r--r--testsuite/tools/simplify-data-3to4/actionbar.ui14
-rw-r--r--testsuite/tools/simplify-data-3to4/fixed.expected14
-rw-r--r--testsuite/tools/simplify-data-3to4/fixed.ui16
-rw-r--r--testsuite/tools/simplify-data-3to4/headerbar.expected5
-rw-r--r--testsuite/tools/simplify-data-3to4/headerbar.ui9
-rw-r--r--testsuite/tools/simplify-data-3to4/overlay.expected17
-rw-r--r--testsuite/tools/simplify-data-3to4/overlay.ui20
-rw-r--r--testsuite/tools/simplify-data-3to4/paned.expected14
-rw-r--r--testsuite/tools/simplify-data-3to4/paned.ui25
-rw-r--r--testsuite/tools/simplify-data-3to4/test1.expected10
-rw-r--r--testsuite/tools/simplify-data-3to4/toolbar.expected24
-rw-r--r--testsuite/tools/simplify-data-3to4/toolbar.ui27
-rwxr-xr-xtestsuite/tools/simplify.in16
-rw-r--r--testsuite/tools/validate-data/invalid1.expected1
-rw-r--r--testsuite/tools/validate-data/invalid1.ui5
-rw-r--r--testsuite/tools/validate-data/invalid2.expected1
-rw-r--r--testsuite/tools/validate-data/invalid2.ui6
-rw-r--r--testsuite/tools/validate-data/invalid3.expected1
-rw-r--r--testsuite/tools/validate-data/invalid3.ui4
-rw-r--r--testsuite/tools/validate-data/invalid4.expected1
-rw-r--r--testsuite/tools/validate-data/invalid4.ui7
-rw-r--r--testsuite/tools/validate-data/valid1.expected0
-rw-r--r--testsuite/tools/validate-data/valid1.ui3
-rw-r--r--testsuite/tools/validate-data/valid2.expected0
-rw-r--r--testsuite/tools/validate-data/valid2.ui4
-rwxr-xr-xtestsuite/tools/validate.in35
179 files changed, 5006 insertions, 2674 deletions
diff --git a/NEWS b/NEWS
index c1c3eb7c75..6d85b8c38d 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-Overview of Changes in master
+Overview of Changes in 3.99.4
=============================
* GtkColumnView:
@@ -9,21 +9,79 @@ Overview of Changes in master
* GtkSearchEntry:
- Add an icon
+* GtkDropDown:
+ - Polish the appearance
+
+* GtkColorChooser:
+ - Accessibility improvements
+
+* GtkPopoverMenu:
+ - Add accessibility support
+ - Allow custom items. This adds new API:
+ gtk_popover_menu_add/remove_child
+ gtk_popover_menu_bar_add/remove_child
+
+* GtkTextView:
+ - Fix rendering and positioning of anchored children
+ - Fix positioning of touch handles
+
+* Constraints:
+ - Fix loading constraints from ui files
+
+* Media support:
+ - Use cubic instead of linear volume
+
* Accessibility:
- Implement Component for all widgets
- Implement Text and EditableText for all editables
- Rework accessible name/description computation
- Add documentation for app and widget developers
- - Initial accessibility support for menus
+ - Handle HIDDEN state changes by adding/removing elements
+ - Support setting accessibility attributes in ui files
+ - Make window controls accessible
* Introspection:
- Add some missing annotations
+* gdk:
+ - Deliver events on flush
+ - Drop the unused GdkPoint struct from the API
+ - Improve popup autohide behavior
+
+* Demos:
+ - Add another constraints demo
+ - Tweak various demos to improve consistency
+ - Small accessibility improvements
+
+* Tools:
+ - Improve gtk4-builder-tool handling of various
+ widgets when converting ui files from GTK 3
+
* Documentation:
- Use GtkApplication in all examples
+ - Improve and expand the widget gallery
+
+* Testsuite:
+ - Improve coverage of GDK
+ - Improve coverage of gtk4-builder-tool
+
+* Build:
+ - Fix the build with cups 2.2.12
+ - Make cloudprint support build without warnings
+
+* Broadway:
+ - Support modifiers for scroll events
+
+* Windows:
+ - Improve IME support
* OS X:
- Fix various input issues
+ - Make GtkGLArea work (with the cairo backend)
+
+* Translation updates:
+ German
+ Polish
Overview of Changes in 3.99.3
diff --git a/config.h.meson b/config.h.meson
index 1968bb9cbe..549a677379 100644
--- a/config.h.meson
+++ b/config.h.meson
@@ -1,8 +1,9 @@
-/* config.h.in. Generated from configure.ac by autoheader. */
-
/* always defined to indicate that i18n is enabled */
#define ENABLE_NLS 1
+/* Use structured logging */
+#define G_LOG_STRUCTURED 1
+
/* The prefix for our gettext translation domains. */
#mesondefine GETTEXT_PACKAGE
diff --git a/demos/gtk-demo/constraints.c b/demos/gtk-demo/constraints.c
index 2e31f22462..a295c91d44 100644
--- a/demos/gtk-demo/constraints.c
+++ b/demos/gtk-demo/constraints.c
@@ -1,9 +1,16 @@
-/* Constraints/Simple
+/* Constraints/Simple Constraints
* #Keywords: GtkLayoutManager
*
* GtkConstraintLayout provides a layout manager that uses relations
- * between widgets (also known as "constraints") to compute the position
+ * between widgets (also known as “constraints”) to compute the position
* and size of each child.
+ *
+ * In addition to child widgets, the constraints can involve spacer
+ * objects (also known as “guides”). This example has a guide between
+ * the two buttons in the top row.
+ *
+ * Try resizing the window to see how the constraints react to update
+ * the layout.
*/
#include <glib/gi18n.h>
@@ -234,15 +241,12 @@ simple_grid_init (SimpleGrid *self)
self->button1 = gtk_button_new_with_label ("Child 1");
gtk_widget_set_parent (self->button1, widget);
- gtk_widget_set_name (self->button1, "button1");
self->button2 = gtk_button_new_with_label ("Child 2");
gtk_widget_set_parent (self->button2, widget);
- gtk_widget_set_name (self->button2, "button2");
self->button3 = gtk_button_new_with_label ("Child 3");
gtk_widget_set_parent (self->button3, widget);
- gtk_widget_set_name (self->button3, "button3");
GtkLayoutManager *manager = gtk_widget_get_layout_manager (GTK_WIDGET (self));
build_constraints (self, GTK_CONSTRAINT_LAYOUT (manager));
@@ -259,7 +263,8 @@ do_constraints (GtkWidget *do_widget)
window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
- gtk_window_set_title (GTK_WINDOW (window), "Constraints");
+ gtk_window_set_title (GTK_WINDOW (window), "Simple Constraints");
+ gtk_window_set_default_size (GTK_WINDOW (window), 260, -1);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
diff --git a/demos/gtk-demo/constraints.ui b/demos/gtk-demo/constraints.ui
new file mode 100644
index 0000000000..1766f931c7
--- /dev/null
+++ b/demos/gtk-demo/constraints.ui
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <object class="GtkWindow" id="window1">
+ <property name="title" translatable="yes">Constraints — Builder</property>
+ <property name="default-width">260</property>
+ <child>
+ <object class="ConstraintsGrid">
+ <property name="layout-manager">
+ <object class="GtkConstraintLayout">
+ <constraints>
+ <guide name="space"
+ min-width="10" min-height="10"
+ nat-width="100" nat-height="10"
+ max-width="200" max-height="20"
+ strength="strong"/>
+ <constraint target="button1" target-attribute="width"
+ relation="le"
+ constant="200"
+ strength="required"/>
+ <constraint target="super" target-attribute="start"
+ relation="eq"
+ source="button1" source-attribute="start"
+ constant="-8"
+ strength="required"/>
+ <constraint target="button1" target-attribute="width"
+ relation="eq"
+ source="button2" source-attribute="width"
+ strength="required"/>
+ <constraint target="button1" target-attribute="end"
+ relation="eq"
+ source="space" source-attribute="start"
+ strength="required"/>
+ <constraint target="space" target-attribute="end"
+ relation="eq"
+ source="button2" source-attribute="start"
+ strength="required"/>
+ <constraint target="super" target-attribute="end"
+ relation="eq"
+ source="button2" source-attribute="end"
+ constant="8"
+ strength="required"/>
+ <constraint target="super" target-attribute="start"
+ relation="eq"
+ source="button3" source-attribute="start"
+ constant="-8"
+ strength="required"/>
+ <constraint target="super" target-attribute="end"
+ relation="eq"
+ source="button3" source-attribute="end"
+ constant="8"
+ strength="required"/>
+ <constraint target="super" target-attribute="top"
+ relation="eq"
+ source="button1" source-attribute="top"
+ constant="-8"
+ strength="required"/>
+ <constraint target="super" target-attribute="top"
+ relation="eq"
+ source="button2" source-attribute="top"
+ constant="-8"
+ strength="required"/>
+ <constraint target="button1" target-attribute="bottom"
+ relation="eq"
+ source="button3" source-attribute="top"
+ constant="-12"
+ strength="required"/>
+ <constraint target="button2" target-attribute="bottom"
+ relation="eq"
+ source="button3" source-attribute="top"
+ constant="-12"
+ strength="required"/>
+ <constraint target="button3" target-attribute="height"
+ relation="eq"
+ source="button1" source-attribute="height"
+ strength="required"/>
+ <constraint target="button3" target-attribute="height"
+ relation="eq"
+ source="button2" source-attribute="height"
+ strength="required"/>
+ <constraint target="super" target-attribute="bottom"
+ relation="eq"
+ source="button3" source-attribute="bottom"
+ constant="8"
+ strength="required"/>
+ </constraints>
+ </object>
+ </property>
+ <child>
+ <object class="GtkButton" id="button1">
+ <property name="label">Child 1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button2">
+ <property name="label">Child 2</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button3">
+ <property name="label">Child 3</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/demos/gtk-demo/constraints2.c b/demos/gtk-demo/constraints2.c
index d63b369739..782ade175b 100644
--- a/demos/gtk-demo/constraints2.c
+++ b/demos/gtk-demo/constraints2.c
@@ -1,7 +1,7 @@
-/* Constraints/Interactive
+/* Constraints/Interactive Constraints
* #Keywords: GtkConstraintLayout
*
- * Demonstrate how constraints can be updates during user interaction.
+ * This example shows how constraints can be updated during user interaction.
* The vertical edge between the buttons can be dragged with the mouse.
*/
@@ -215,7 +215,8 @@ do_constraints2 (GtkWidget *do_widget)
window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
- gtk_window_set_title (GTK_WINDOW (window), "Constraints");
+ gtk_window_set_title (GTK_WINDOW (window), "Interactive Constraints");
+ gtk_window_set_default_size (GTK_WINDOW (window), 260, -1);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
diff --git a/demos/gtk-demo/constraints3.c b/demos/gtk-demo/constraints3.c
index 0cb9b97702..b0d15dc2ac 100644
--- a/demos/gtk-demo/constraints3.c
+++ b/demos/gtk-demo/constraints3.c
@@ -2,6 +2,10 @@
*
* GtkConstraintLayout allows defining constraints using a
* compact syntax called Visual Format Language, or VFL.
+ *
+ * A typical example of a VFL specification looks like this:
+ *
+ * H:|-[button1(==button2)]-12-[button2]-|
*/
#include <glib/gi18n.h>
@@ -134,7 +138,8 @@ do_constraints3 (GtkWidget *do_widget)
window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
- gtk_window_set_title (GTK_WINDOW (window), "Constraints");
+ gtk_window_set_title (GTK_WINDOW (window), "Constraints — VFL");
+ gtk_window_set_default_size (GTK_WINDOW (window), 260, -1);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
diff --git a/demos/gtk-demo/constraints4.c b/demos/gtk-demo/constraints4.c
new file mode 100644
index 0000000000..4b4ca49643
--- /dev/null
+++ b/demos/gtk-demo/constraints4.c
@@ -0,0 +1,72 @@
+/* Constraints/Builder
+ *
+ * GtkConstraintLayouts can be created in .ui files, and constraints can be
+ * set up at that time as well, as this example demonstrates. It uses the
+ * same setup as the “Simple” constraints demo.
+ */
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+G_DECLARE_FINAL_TYPE (ConstraintsGrid, constraints_grid, CONSTRAINTS, GRID, GtkWidget)
+
+struct _ConstraintsGrid
+{
+ GtkWidget parent_instance;
+};
+
+G_DEFINE_TYPE (ConstraintsGrid, constraints_grid, GTK_TYPE_WIDGET)
+
+static void
+constraints_grid_init (ConstraintsGrid *grid)
+{
+}
+
+static void
+constraints_grid_dispose (GObject *object)
+{
+ GtkWidget *widget = GTK_WIDGET (object);
+ GtkWidget *child;
+
+ while ((child = gtk_widget_get_first_child (widget)))
+ gtk_widget_unparent (child);
+
+ G_OBJECT_CLASS (constraints_grid_parent_class)->dispose (object);
+}
+
+static void
+constraints_grid_class_init (ConstraintsGridClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->dispose = constraints_grid_dispose;
+}
+
+GtkWidget *
+do_constraints4 (GtkWidget *do_widget)
+{
+ static GtkWidget *window;
+
+ if (!window)
+ {
+ GtkBuilder *builder;
+
+ g_type_ensure (constraints_grid_get_type ());
+
+ builder = gtk_builder_new_from_resource ("/constraints4/constraints.ui");
+
+ window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
+ gtk_window_set_display (GTK_WINDOW (window),
+ gtk_widget_get_display (do_widget));
+ g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
+
+ g_object_unref (builder);
+ }
+
+ if (!gtk_widget_get_visible (window))
+ gtk_widget_show (window);
+ else
+ gtk_window_destroy (GTK_WINDOW (window));
+
+ return window;
+}
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml
index bcb2ebc3b5..32b830a67b 100644
--- a/demos/gtk-demo/demo.gresource.xml
+++ b/demos/gtk-demo/demo.gresource.xml
@@ -18,6 +18,9 @@
<file>demoimage.c</file>
<file>demoimage.h</file>
</gresource>
+ <gresource prefix="/constraints4">
+ <file>constraints.ui</file>
+ </gresource>
<gresource prefix="/css_accordion">
<file>css_accordion.css</file>
<file>reset.css</file>
@@ -226,9 +229,12 @@
<file>revealer.ui</file>
</gresource>
<gresource prefix="/images">
+ <file>pixbufpaintable.h</file>
+ <file>pixbufpaintable.c</file>
<file>alphatest.png</file>
<file>floppybuddy.gif</file>
<file>gtk-logo.webm</file>
+ <file alias="org.gtk.Demo4.svg">data/scalable/apps/org.gtk.Demo4.svg</file>
</gresource>
<gresource prefix="/video-player">
<file>bbb.png</file>
@@ -242,6 +248,7 @@
<file>constraints.c</file>
<file>constraints2.c</file>
<file>constraints3.c</file>
+ <file>constraints4.c</file>
<file>css_accordion.c</file>
<file>css_basics.c</file>
<file>css_blendmodes.c</file>
diff --git a/demos/gtk-demo/demo.ui b/demos/gtk-demo/demo.ui
index 01847f8b92..d268f7fe1e 100644
--- a/demos/gtk-demo/demo.ui
+++ b/demos/gtk-demo/demo.ui
@@ -83,7 +83,7 @@
</menu>
<object class="GtkAboutDialog" id="aboutdialog1">
<property name="program-name" translatable="yes">Builder demo</property>
- <property name="logo-icon-name" translatable="yes">gtk3-demo</property>
+ <property name="logo-icon-name" translatable="yes">org.gtk.Demo4</property>
<property name="modal">True</property>
</object>
<object class="GtkWindow" id="window1">
@@ -96,13 +96,18 @@
<child>
<object class="GtkPopoverMenuBar" id="menubar1">
<property name="menu-model">menubar</property>
+ <accessibility>
+ <property name="label">Main Menu</property>
+ </accessibility>
</object>
</child>
<child>
<object class="GtkBox" id="toolbar1">
- <style>
- <class name="toolbar"/>
- </style>
+ <property name="accessible-role">toolbar</property>
+ <property name="css-classes">toolbar</property>
+ <accessibility>
+ <property name="label">Toolbar</property>
+ </accessibility>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">New</property>
diff --git a/demos/gtk-demo/demotaggedentry.c b/demos/gtk-demo/demotaggedentry.c
index 8d5c93edff..8a3ca5e9a3 100644
--- a/demos/gtk-demo/demotaggedentry.c
+++ b/demos/gtk-demo/demotaggedentry.c
@@ -44,11 +44,23 @@ G_DEFINE_TYPE_WITH_CODE (DemoTaggedEntry, demo_tagged_entry, GTK_TYPE_WIDGET,
static void
demo_tagged_entry_init (DemoTaggedEntry *entry)
{
+ GtkCssProvider *provider;
+
entry->text = gtk_text_new ();
gtk_widget_set_hexpand (entry->text, TRUE);
gtk_widget_set_vexpand (entry->text, TRUE);
gtk_widget_set_parent (entry->text, GTK_WIDGET (entry));
gtk_editable_init_delegate (GTK_EDITABLE (entry));
+ gtk_editable_set_width_chars (GTK_EDITABLE (entry->text), 6);
+ gtk_editable_set_max_width_chars (GTK_EDITABLE (entry->text), 6);
+ gtk_widget_add_css_class (GTK_WIDGET (entry), "tagged");
+
+ provider = gtk_css_provider_new ();
+ gtk_css_provider_load_from_resource (provider, "/tagged_entry/tagstyle.css");
+ gtk_style_context_add_provider_for_display (gdk_display_get_default (),
+ GTK_STYLE_PROVIDER (provider),
+ 800);
+ g_object_unref (provider);
}
static void
@@ -212,7 +224,6 @@ static void
demo_tagged_entry_tag_init (DemoTaggedEntryTag *tag)
{
GtkGesture *gesture;
- GtkCssProvider *provider;
tag->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_set_parent (tag->box, GTK_WIDGET (tag));
@@ -222,13 +233,6 @@ demo_tagged_entry_tag_init (DemoTaggedEntryTag *tag)
gesture = gtk_gesture_click_new ();
g_signal_connect (gesture, "released", G_CALLBACK (on_released), tag);
gtk_widget_add_controller (GTK_WIDGET (tag), GTK_EVENT_CONTROLLER (gesture));
-
- provider = gtk_css_provider_new ();
- gtk_css_provider_load_from_resource (provider, "/tagged_entry/tagstyle.css");
- gtk_style_context_add_provider_for_display (gdk_display_get_default (),
- GTK_STYLE_PROVIDER (provider),
- 800);
- g_object_unref (provider);
}
static void
diff --git a/demos/gtk-demo/drawingarea.c b/demos/gtk-demo/drawingarea.c
index 14b87f64d3..39254c67f5 100644
--- a/demos/gtk-demo/drawingarea.c
+++ b/demos/gtk-demo/drawingarea.c
@@ -325,9 +325,8 @@ do_drawingarea (GtkWidget *do_widget)
/*
* Create the groups area
*/
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label),
- "<u>Knockout groups</u>");
+ label = gtk_label_new ("Knockout groups");
+ gtk_widget_add_css_class (label, "heading");
gtk_box_append (GTK_BOX (vbox), label);
frame = gtk_frame_new (NULL);
@@ -344,9 +343,8 @@ do_drawingarea (GtkWidget *do_widget)
* Create the scribble area
*/
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label),
- "<u>Scribble area</u>");
+ label = gtk_label_new ("Scribble area");
+ gtk_widget_add_css_class (label, "heading");
gtk_box_append (GTK_BOX (vbox), label);
frame = gtk_frame_new (NULL);
diff --git a/demos/gtk-demo/entry_completion.c b/demos/gtk-demo/entry_completion.c
index 40d64bd8b6..9afa30f22b 100644
--- a/demos/gtk-demo/entry_completion.c
+++ b/demos/gtk-demo/entry_completion.c
@@ -78,11 +78,11 @@ do_entry_completion (GtkWidget *do_widget)
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
- vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
- gtk_widget_set_margin_start (vbox, 5);
- gtk_widget_set_margin_end (vbox, 5);
- gtk_widget_set_margin_top (vbox, 5);
- gtk_widget_set_margin_bottom (vbox, 5);
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_widget_set_margin_start (vbox, 18);
+ gtk_widget_set_margin_end (vbox, 18);
+ gtk_widget_set_margin_top (vbox, 18);
+ gtk_widget_set_margin_bottom (vbox, 18);
gtk_window_set_child (GTK_WINDOW (window), vbox);
label = gtk_label_new (NULL);
diff --git a/demos/gtk-demo/entry_undo.c b/demos/gtk-demo/entry_undo.c
index 41c4965ecf..37cbe7037b 100644
--- a/demos/gtk-demo/entry_undo.c
+++ b/demos/gtk-demo/entry_undo.c
@@ -27,16 +27,16 @@ do_entry_undo (GtkWidget *do_widget)
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
- vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
- gtk_widget_set_margin_start (vbox, 5);
- gtk_widget_set_margin_end (vbox, 5);
- gtk_widget_set_margin_top (vbox, 5);
- gtk_widget_set_margin_bottom (vbox, 5);
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_widget_set_margin_start (vbox, 18);
+ gtk_widget_set_margin_end (vbox, 18);
+ gtk_widget_set_margin_top (vbox, 18);
+ gtk_widget_set_margin_bottom (vbox, 18);
gtk_window_set_child (GTK_WINDOW (window), vbox);
label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label),
- "Use Primary+z or Primary+Shift+z to undo or redo changes");
+ "Use Control+z or Control+Shift+z to undo or redo changes");
gtk_box_append (GTK_BOX (vbox), label);
/* Create our entry */
diff --git a/demos/gtk-demo/errorstates.c b/demos/gtk-demo/errorstates.c
index 3dc3b50f3b..5cd35d6467 100644
--- a/demos/gtk-demo/errorstates.c
+++ b/demos/gtk-demo/errorstates.c
@@ -1,4 +1,4 @@
-/* Error states
+/* Error States
*
* GtkLabel and GtkEntry can indicate errors if you set the .error
* style class on them.
diff --git a/demos/gtk-demo/errorstates.ui b/demos/gtk-demo/errorstates.ui
index dd4a95b8fc..c1f423e2ed 100644
--- a/demos/gtk-demo/errorstates.ui
+++ b/demos/gtk-demo/errorstates.ui
@@ -5,7 +5,7 @@
<property name="modal">1</property>
<property name="resizable">0</property>
<property name="use-header-bar">1</property>
- <property name="title" translatable="yes">Settings</property>
+ <property name="title" translatable="yes">Error States</property>
<property name="hide-on-close">1</property>
<child internal-child="content_area">
<object class="GtkBox">
diff --git a/demos/gtk-demo/fontrendering.c b/demos/gtk-demo/fontrendering.c
index fc6fb1b1ee..005f3637c6 100644
--- a/demos/gtk-demo/fontrendering.c
+++ b/demos/gtk-demo/fontrendering.c
@@ -1,4 +1,4 @@
-/* Pango/Font rendering
+/* Pango/Font Rendering
*
* Demonstrates various aspects of font rendering.
*/
diff --git a/demos/gtk-demo/gltransition.c b/demos/gtk-demo/gltransition.c
index 96ccf9acac..0ad67cc8ec 100644
--- a/demos/gtk-demo/gltransition.c
+++ b/demos/gtk-demo/gltransition.c
@@ -1,4 +1,4 @@
-/* OpenGL/Transitions
+/* OpenGL/Transitions and Effects
* #Keywords: OpenGL, shader, effect
*
* Create transitions between pages using a custom fragment shader.
@@ -282,11 +282,12 @@ create_gltransition_window (GtkWidget *do_widget)
window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
- gtk_window_set_title (GTK_WINDOW (window), "Transitions");
+ gtk_window_set_title (GTK_WINDOW (window), "Transitions and Effects");
headerbar = gtk_header_bar_new ();
scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, NULL);
gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
gtk_widget_set_size_request (scale, 100, -1);
+ gtk_widget_set_tooltip_text (scale, "Transition duration");
gtk_header_bar_pack_end (GTK_HEADER_BAR (headerbar), scale);
gtk_window_set_titlebar (GTK_WINDOW (window), headerbar);
gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);
diff --git a/demos/gtk-demo/images.c b/demos/gtk-demo/images.c
index 22177a7f5c..39b01103b2 100644
--- a/demos/gtk-demo/images.c
+++ b/demos/gtk-demo/images.c
@@ -17,6 +17,7 @@
#include <glib/gstdio.h>
#include <stdio.h>
#include <errno.h>
+#include "pixbufpaintable.h"
static GtkWidget *window = NULL;
static GdkPixbufLoader *pixbuf_loader = NULL;
@@ -346,9 +347,8 @@ do_images (GtkWidget *do_widget)
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
gtk_box_append (GTK_BOX (hbox), vbox);
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label),
- "<u>Image loaded from a file</u>");
+ label = gtk_label_new ("Image from a resource");
+ gtk_widget_add_css_class (label, "heading");
gtk_box_append (GTK_BOX (vbox), label);
frame = gtk_frame_new (NULL);
@@ -356,7 +356,7 @@ do_images (GtkWidget *do_widget)
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
gtk_box_append (GTK_BOX (vbox), frame);
- image = gtk_image_new_from_icon_name ("gtk3-demo");
+ image = gtk_image_new_from_resource ("/images/org.gtk.Demo4.svg");
gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE);
gtk_frame_set_child (GTK_FRAME (frame), image);
@@ -364,9 +364,8 @@ do_images (GtkWidget *do_widget)
/* Animation */
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label),
- "<u>Animation loaded from a file</u>");
+ label = gtk_label_new ("Animation from a resource");
+ gtk_widget_add_css_class (label, "heading");
gtk_box_append (GTK_BOX (vbox), label);
frame = gtk_frame_new (NULL);
@@ -374,15 +373,16 @@ do_images (GtkWidget *do_widget)
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
gtk_box_append (GTK_BOX (vbox), frame);
- picture = gtk_picture_new_for_resource ("/images/floppybuddy.gif");
+ paintable = pixbuf_paintable_new_from_resource ("/images/floppybuddy.gif");
+ picture = gtk_picture_new_for_paintable (paintable);
+ g_object_unref (paintable);
gtk_frame_set_child (GTK_FRAME (frame), picture);
/* Symbolic icon */
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label),
- "<u>Symbolic themed icon</u>");
+ label = gtk_label_new ("Symbolic themed icon");
+ gtk_widget_add_css_class (label, "heading");
gtk_box_append (GTK_BOX (vbox), label);
frame = gtk_frame_new (NULL);
@@ -401,9 +401,8 @@ do_images (GtkWidget *do_widget)
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
gtk_box_append (GTK_BOX (hbox), vbox);
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label),
- "<u>Progressive image loading</u>");
+ label = gtk_label_new ("Progressive image loading");
+ gtk_widget_add_css_class (label, "heading");
gtk_box_append (GTK_BOX (vbox), label);
frame = gtk_frame_new (NULL);
@@ -424,9 +423,8 @@ do_images (GtkWidget *do_widget)
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
gtk_box_append (GTK_BOX (hbox), vbox);
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label),
- "<u>Displaying video</u>");
+ label = gtk_label_new ("Displaying video");
+ gtk_widget_add_css_class (label, "heading");
gtk_box_append (GTK_BOX (vbox), label);
frame = gtk_frame_new (NULL);
@@ -442,9 +440,8 @@ do_images (GtkWidget *do_widget)
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
gtk_box_append (GTK_BOX (hbox), vbox);
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label),
- "<u>GtkWidgetPaintable</u>");
+ label = gtk_label_new ("GtkWidgetPaintable");
+ gtk_widget_add_css_class (label, "heading");
gtk_box_append (GTK_BOX (vbox), label);
paintable = gtk_widget_paintable_new (do_widget);
diff --git a/demos/gtk-demo/layoutmanager.c b/demos/gtk-demo/layoutmanager.c
index b03bc040a1..6af308957d 100644
--- a/demos/gtk-demo/layoutmanager.c
+++ b/demos/gtk-demo/layoutmanager.c
@@ -34,7 +34,7 @@ do_layoutmanager (GtkWidget *parent)
int i;
window = gtk_window_new ();
- gtk_window_set_title (GTK_WINDOW (window), "Layout Manager—Transition");
+ gtk_window_set_title (GTK_WINDOW (window), "Layout Manager — Transition");
gtk_window_set_default_size (GTK_WINDOW (window), 600, 600);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
diff --git a/demos/gtk-demo/layoutmanager2.c b/demos/gtk-demo/layoutmanager2.c
index 83691c3dfe..cc4b60d653 100644
--- a/demos/gtk-demo/layoutmanager2.c
+++ b/demos/gtk-demo/layoutmanager2.c
@@ -170,7 +170,7 @@ do_layoutmanager2 (GtkWidget *parent)
int i;
window = gtk_window_new ();
- gtk_window_set_title (GTK_WINDOW (window), "Layout Manager—Transformation");
+ gtk_window_set_title (GTK_WINDOW (window), "Layout Manager — Transformation");
gtk_window_set_default_size (GTK_WINDOW (window), 600, 620);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
diff --git a/demos/gtk-demo/listbox.c b/demos/gtk-demo/listbox.c
index 4905fecd79..750f5f480c 100644
--- a/demos/gtk-demo/listbox.c
+++ b/demos/gtk-demo/listbox.c
@@ -1,4 +1,4 @@
-/* List Box/Complex list
+/* List Box/Complex
*
* GtkListBox allows lists with complicated layouts, using
* regular widgets supporting sorting and filtering.
@@ -197,7 +197,7 @@ gtk_message_row_update (GtkMessageRow *row)
if (strcmp (priv->message->sender_nick, "@GTKtoolkit") == 0)
{
- gtk_image_set_from_icon_name (priv->avatar_image, "gtk3-demo");
+ gtk_image_set_from_icon_name (priv->avatar_image, "org.gtk.Demo4");
gtk_image_set_icon_size (priv->avatar_image, GTK_ICON_SIZE_LARGE);
}
else
@@ -349,7 +349,7 @@ do_listbox (GtkWidget *do_widget)
window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
- gtk_window_set_title (GTK_WINDOW (window), "List Box");
+ gtk_window_set_title (GTK_WINDOW (window), "List Box — Complex");
gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
diff --git a/demos/gtk-demo/main.ui b/demos/gtk-demo/main.ui
index b685b93ce8..60f2d7e0a5 100644
--- a/demos/gtk-demo/main.ui
+++ b/demos/gtk-demo/main.ui
@@ -28,14 +28,7 @@
<object class="GtkButton">
<property name="valign">center</property>
<property name="action-name">win.run</property>
- <style>
- <class name="text-button"/>
- </style>
- <child>
- <object class="GtkLabel">
- <property name="label" translatable="yes">Run</property>
- </object>
- </child>
+ <property name="label" translatable="yes">Run</property>
</object>
</child>
<child type="end">
@@ -43,6 +36,9 @@
<property name="valign">center</property>
<property name="menu-model">gear_menu</property>
<property name="icon-name">open-menu-symbolic</property>
+ <accessibility>
+ <property name="label" translatable="yes">Primary menu</property>
+ </accessibility>
</object>
</child>
</object>
diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build
index 2d1efc4170..49f37c7130 100644
--- a/demos/gtk-demo/meson.build
+++ b/demos/gtk-demo/meson.build
@@ -9,6 +9,7 @@ demos = files([
'constraints.c',
'constraints2.c',
'constraints3.c',
+ 'constraints4.c',
'css_accordion.c',
'css_basics.c',
'css_blendmodes.c',
@@ -118,7 +119,8 @@ extra_demo_sources = files(['main.c',
'singular_value_decomposition.c',
'four_point_transform.c',
'demo2widget.c',
- 'demo3widget.c'])
+ 'demo3widget.c',
+ 'pixbufpaintable.c'])
if harfbuzz_dep.found() and pangoft_dep.found()
demos += files(['font_features.c', 'listview_ucd.c'])
diff --git a/demos/gtk-demo/paintable.c b/demos/gtk-demo/paintable.c
index 933e7abd48..8ed5e51dde 100644
--- a/demos/gtk-demo/paintable.c
+++ b/demos/gtk-demo/paintable.c
@@ -1,4 +1,4 @@
-/* Paintable/A simple paintable
+/* Paintable/Simple Paintable
*
* GdkPaintable is an interface used by GTK for drawings of any sort
* that do not require layouting or positioning.
diff --git a/demos/gtk-demo/paintable_animated.c b/demos/gtk-demo/paintable_animated.c
index 93a51d492c..5d72483c96 100644
--- a/demos/gtk-demo/paintable_animated.c
+++ b/demos/gtk-demo/paintable_animated.c
@@ -1,4 +1,4 @@
-/* Paintable/An animated paintable
+/* Paintable/Animated Paintable
*
* GdkPaintable also allows paintables to change.
*
diff --git a/demos/gtk-demo/paintable_mediastream.c b/demos/gtk-demo/paintable_mediastream.c
index 6374087b96..ea1b374b76 100644
--- a/demos/gtk-demo/paintable_mediastream.c
+++ b/demos/gtk-demo/paintable_mediastream.c
@@ -1,4 +1,4 @@
-/* Paintable/A media stream
+/* Paintable/Media Stream
*
* GdkPaintable is also used by the GtkMediaStream class.
*
diff --git a/demos/gtk-demo/panes.c b/demos/gtk-demo/panes.c
index 9879d30bfa..00109ad3ce 100644
--- a/demos/gtk-demo/panes.c
+++ b/demos/gtk-demo/panes.c
@@ -3,100 +3,16 @@
* The GtkPaned Widget divides its content area into two panes
* with a divider in between that the user can adjust. A separate
* child is placed into each pane. GtkPaned widgets can be split
- * horizontally or vertially.
+ * horizontally or vertically. This test contains both a horizontal
+ * and a vertical GtkPaned widget.
*
* There are a number of options that can be set for each pane.
- * This test contains both a horizontal and a vertical GtkPaned
- * widget, and allows you to adjust the options for each side of
- * each widget.
+ * You can use the Inspector to adjust the options for each side
+ * of each widget.
*/
#include <gtk/gtk.h>
-static void
-toggle_resize (GtkWidget *widget,
- GtkWidget *child)
-{
- GtkWidget *parent;
- GtkPaned *paned;
-
- parent = gtk_widget_get_parent (child);
- paned = GTK_PANED (parent);
-
- if (child == gtk_paned_get_start_child (paned))
- gtk_paned_set_resize_start_child (paned, !gtk_paned_get_resize_start_child (paned));
- else
- gtk_paned_set_resize_end_child (paned, !gtk_paned_get_resize_end_child (paned));
-}
-
-static void
-toggle_shrink (GtkWidget *widget,
- GtkWidget *child)
-{
- GtkWidget *parent;
- GtkPaned *paned;
-
- parent = gtk_widget_get_parent (child);
- paned = GTK_PANED (parent);
-
- if (child == gtk_paned_get_start_child (paned))
- gtk_paned_set_shrink_start_child (paned, !gtk_paned_get_shrink_start_child (paned));
- else
- gtk_paned_set_shrink_end_child (paned, !gtk_paned_get_shrink_end_child (paned));
-}
-
-static GtkWidget *
-create_pane_options (GtkPaned *paned,
- const char *frame_label,
- const char *label1,
- const char *label2)
-{
- GtkWidget *child1, *child2;
- GtkWidget *frame;
- GtkWidget *table;
- GtkWidget *label;
- GtkWidget *check_button;
-
- child1 = gtk_paned_get_start_child (paned);
- child2 = gtk_paned_get_end_child (paned);
-
- frame = gtk_frame_new (frame_label);
-
- table = gtk_grid_new ();
- gtk_frame_set_child (GTK_FRAME (frame), table);
-
- label = gtk_label_new (label1);
- gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
-
- check_button = gtk_check_button_new_with_mnemonic ("_Resize");
- gtk_grid_attach (GTK_GRID (table), check_button, 0, 1, 1, 1);
- g_signal_connect (check_button, "toggled",
- G_CALLBACK (toggle_resize), child1);
-
- check_button = gtk_check_button_new_with_mnemonic ("_Shrink");
- gtk_grid_attach (GTK_GRID (table), check_button, 0, 2, 1, 1);
- gtk_check_button_set_active (GTK_CHECK_BUTTON (check_button), TRUE);
- g_signal_connect (check_button, "toggled",
- G_CALLBACK (toggle_shrink), child1);
-
- label = gtk_label_new (label2);
- gtk_grid_attach (GTK_GRID (table), label, 1, 0, 1, 1);
-
- check_button = gtk_check_button_new_with_mnemonic ("_Resize");
- gtk_grid_attach (GTK_GRID (table), check_button, 1, 1, 1, 1);
- gtk_check_button_set_active (GTK_CHECK_BUTTON (check_button), TRUE);
- g_signal_connect (check_button, "toggled",
- G_CALLBACK (toggle_resize), child2);
-
- check_button = gtk_check_button_new_with_mnemonic ("_Shrink");
- gtk_grid_attach (GTK_GRID (table), check_button, 1, 2, 1, 1);
- gtk_check_button_set_active (GTK_CHECK_BUTTON (check_button), TRUE);
- g_signal_connect (check_button, "toggled",
- G_CALLBACK (toggle_shrink), child2);
-
- return frame;
-}
-
GtkWidget *
do_panes (GtkWidget *do_widget)
{
@@ -104,19 +20,19 @@ do_panes (GtkWidget *do_widget)
GtkWidget *frame;
GtkWidget *hpaned;
GtkWidget *vpaned;
- GtkWidget *button;
+ GtkWidget *label;
GtkWidget *vbox;
- GtkWidget *box;
if (!window)
{
window = gtk_window_new ();
+ gtk_window_set_title (GTK_WINDOW (window), "Paned Widgets");
+ gtk_window_set_default_size (GTK_WINDOW (window), 330, 250);
+ gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
- gtk_window_set_title (GTK_WINDOW (window), "Paned Widgets");
-
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
gtk_widget_set_margin_start (vbox, 8);
gtk_widget_set_margin_end (vbox, 8);
@@ -132,41 +48,37 @@ do_panes (GtkWidget *do_widget)
hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
gtk_paned_set_start_child (GTK_PANED (vpaned), hpaned);
-
- box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
- gtk_widget_set_size_request (box, 60, 60);
- gtk_paned_set_start_child (GTK_PANED (hpaned), box);
-
- button = gtk_button_new_with_mnemonic ("_Hi there");
- gtk_widget_set_margin_start (button, 4);
- gtk_widget_set_margin_end (button, 4);
- gtk_widget_set_margin_top (button, 4);
- gtk_widget_set_margin_bottom (button, 4);
- gtk_widget_set_hexpand (button, TRUE);
- gtk_widget_set_vexpand (button, TRUE);
- gtk_box_append (GTK_BOX (box), button);
-
- box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
- gtk_widget_set_size_request (box, 80, 60);
- gtk_paned_set_end_child (GTK_PANED (hpaned), box);
-
- box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
- gtk_widget_set_size_request (box, 60, 80);
- gtk_paned_set_end_child (GTK_PANED (vpaned), box);
-
- /* Now create toggle buttons to control sizing */
-
- gtk_box_append (GTK_BOX (vbox),
- create_pane_options (GTK_PANED (hpaned),
- "Horizontal",
- "Left",
- "Right"));
-
- gtk_box_append (GTK_BOX (vbox),
- create_pane_options (GTK_PANED (vpaned),
- "Vertical",
- "Top",
- "Bottom"));
+ gtk_paned_set_shrink_start_child (GTK_PANED (vpaned), FALSE);
+
+ label = gtk_label_new ("Hi there");
+ gtk_widget_set_margin_start (label, 4);
+ gtk_widget_set_margin_end (label, 4);
+ gtk_widget_set_margin_top (label, 4);
+ gtk_widget_set_margin_bottom (label, 4);
+ gtk_widget_set_hexpand (label, TRUE);
+ gtk_widget_set_vexpand (label, TRUE);
+ gtk_paned_set_start_child (GTK_PANED (hpaned), label);
+ gtk_paned_set_shrink_start_child (GTK_PANED (hpaned), FALSE);
+
+ label = gtk_label_new ("Hello");
+ gtk_widget_set_margin_start (label, 4);
+ gtk_widget_set_margin_end (label, 4);
+ gtk_widget_set_margin_top (label, 4);
+ gtk_widget_set_margin_bottom (label, 4);
+ gtk_widget_set_hexpand (label, TRUE);
+ gtk_widget_set_vexpand (label, TRUE);
+ gtk_paned_set_end_child (GTK_PANED (hpaned), label);
+ gtk_paned_set_shrink_end_child (GTK_PANED (hpaned), FALSE);
+
+ label = gtk_label_new ("Goodbye");
+ gtk_widget_set_margin_start (label, 4);
+ gtk_widget_set_margin_end (label, 4);
+ gtk_widget_set_margin_top (label, 4);
+ gtk_widget_set_margin_bottom (label, 4);
+ gtk_widget_set_hexpand (label, TRUE);
+ gtk_widget_set_vexpand (label, TRUE);
+ gtk_paned_set_end_child (GTK_PANED (vpaned), label);
+ gtk_paned_set_shrink_end_child (GTK_PANED (vpaned), FALSE);
}
if (!gtk_widget_get_visible (window))
diff --git a/demos/gtk-demo/pixbufpaintable.c b/demos/gtk-demo/pixbufpaintable.c
new file mode 100644
index 0000000000..11685b726d
--- /dev/null
+++ b/demos/gtk-demo/pixbufpaintable.c
@@ -0,0 +1,187 @@
+#include <gtk/gtk.h>
+#include "pixbufpaintable.h"
+
+struct _PixbufPaintable {
+ GObject parent_instance;
+
+ char *resource_path;
+ GdkPixbufAnimation *anim;
+ GdkPixbufAnimationIter *iter;
+
+ guint timeout;
+};
+
+enum {
+ PROP_RESOURCE_PATH = 1,
+ NUM_PROPERTIES
+};
+
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+static void
+pixbuf_paintable_snapshot (GdkPaintable *paintable,
+ GdkSnapshot *snapshot,
+ double width,
+ double height)
+{
+ PixbufPaintable *self = PIXBUF_PAINTABLE (paintable);
+ GTimeVal val;
+ GdkPixbuf *pixbuf;
+ GdkTexture *texture;
+
+ g_get_current_time (&val);
+ gdk_pixbuf_animation_iter_advance (self->iter, &val);
+ pixbuf = gdk_pixbuf_animation_iter_get_pixbuf (self->iter);
+ texture = gdk_texture_new_for_pixbuf (pixbuf);
+
+ gdk_paintable_snapshot (GDK_PAINTABLE (texture), snapshot, width, height);
+
+ g_object_unref (texture);
+}
+G_GNUC_END_IGNORE_DEPRECATIONS;
+
+static int
+pixbuf_paintable_get_intrinsic_width (GdkPaintable *paintable)
+{
+ PixbufPaintable *self = PIXBUF_PAINTABLE (paintable);
+
+ return gdk_pixbuf_animation_get_width (self->anim);
+}
+
+static int
+pixbuf_paintable_get_intrinsic_height (GdkPaintable *paintable)
+{
+ PixbufPaintable *self = PIXBUF_PAINTABLE (paintable);
+
+ return gdk_pixbuf_animation_get_height (self->anim);
+}
+
+static void
+pixbuf_paintable_init_interface (GdkPaintableInterface *iface)
+{
+ iface->snapshot = pixbuf_paintable_snapshot;
+ iface->get_intrinsic_width = pixbuf_paintable_get_intrinsic_width;
+ iface->get_intrinsic_height = pixbuf_paintable_get_intrinsic_height;
+}
+
+G_DEFINE_TYPE_WITH_CODE(PixbufPaintable, pixbuf_paintable, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GDK_TYPE_PAINTABLE,
+ pixbuf_paintable_init_interface))
+
+static void
+pixbuf_paintable_init (PixbufPaintable *paintable)
+{
+}
+
+static gboolean
+delay_cb (gpointer data)
+{
+ PixbufPaintable *self = data;
+ int delay;
+
+ delay = gdk_pixbuf_animation_iter_get_delay_time (self->iter);
+ self->timeout = g_timeout_add (delay, delay_cb, self);
+
+ gdk_paintable_invalidate_contents (GDK_PAINTABLE (self));
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+pixbuf_paintable_set_resource_path (PixbufPaintable *self,
+ const char *resource_path)
+{
+ int delay;
+
+ g_free (self->resource_path);
+ self->resource_path = g_strdup (resource_path);
+
+ g_clear_object (&self->anim);
+ self->anim = gdk_pixbuf_animation_new_from_resource (resource_path, NULL);
+ g_clear_object (&self->iter);
+ self->iter = gdk_pixbuf_animation_get_iter (self->anim, NULL);
+
+ delay = gdk_pixbuf_animation_iter_get_delay_time (self->iter);
+ self->timeout = g_timeout_add (delay, delay_cb, self);
+
+ gdk_paintable_invalidate_contents (GDK_PAINTABLE (self));
+
+ g_object_notify (G_OBJECT (self), "resource-path");
+}
+
+static void
+pixbuf_paintable_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ PixbufPaintable *self = PIXBUF_PAINTABLE (object);
+
+ switch (prop_id)
+ {
+ case PROP_RESOURCE_PATH:
+ pixbuf_paintable_set_resource_path (self, g_value_get_string (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+pixbuf_paintable_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ PixbufPaintable *self = PIXBUF_PAINTABLE (object);
+
+ switch (prop_id)
+ {
+ case PROP_RESOURCE_PATH:
+ g_value_set_string (value, self->resource_path);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+pixbuf_paintable_dispose (GObject *object)
+{
+ PixbufPaintable *self = PIXBUF_PAINTABLE (object);
+
+ g_clear_pointer (&self->resource_path, g_free);
+ g_clear_object (&self->anim);
+ g_clear_object (&self->iter);
+ if (self->timeout)
+ {
+ g_source_remove (self->timeout);
+ self->timeout = 0;
+ }
+
+ G_OBJECT_CLASS (pixbuf_paintable_parent_class)->dispose (object);
+}
+
+static void
+pixbuf_paintable_class_init (PixbufPaintableClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+ object_class->dispose = pixbuf_paintable_dispose;
+ object_class->get_property = pixbuf_paintable_get_property;
+ object_class->set_property = pixbuf_paintable_set_property;
+
+ g_object_class_install_property (object_class, PROP_RESOURCE_PATH,
+ g_param_spec_string ("resource-path", "Resource path", "Resource path",
+ NULL, G_PARAM_READWRITE));
+
+}
+
+GdkPaintable *
+pixbuf_paintable_new_from_resource (const char *path)
+{
+ return g_object_new (PIXBUF_TYPE_PAINTABLE,
+ "resource-path", path,
+ NULL);
+}
diff --git a/demos/gtk-demo/pixbufpaintable.h b/demos/gtk-demo/pixbufpaintable.h
new file mode 100644
index 0000000000..5e075e3fb1
--- /dev/null
+++ b/demos/gtk-demo/pixbufpaintable.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define PIXBUF_TYPE_PAINTABLE (pixbuf_paintable_get_type ())
+
+G_DECLARE_FINAL_TYPE(PixbufPaintable, pixbuf_paintable, PIXBUF, PAINTABLE, GObject)
+
+GdkPaintable * pixbuf_paintable_new_from_resource (const char *path);
+
+G_END_DECLS
diff --git a/demos/gtk-demo/search_entry.c b/demos/gtk-demo/search_entry.c
index 7e2f1d8f76..ce92b85c01 100644
--- a/demos/gtk-demo/search_entry.c
+++ b/demos/gtk-demo/search_entry.c
@@ -110,17 +110,17 @@ set_search_by (GSimpleAction *action,
if (g_str_equal (term, "name"))
{
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, "Search by name");
- gtk_entry_set_placeholder_text (entry, "name");
+ gtk_entry_set_placeholder_text (entry, "Name…");
}
else if (g_str_equal (term, "description"))
{
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, "Search by description");
- gtk_entry_set_placeholder_text (entry, "description");
+ gtk_entry_set_placeholder_text (entry, "Description…");
}
else if (g_str_equal (term, "filename"))
{
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, "Search by file name");
- gtk_entry_set_placeholder_text (entry, "file name");
+ gtk_entry_set_placeholder_text (entry, "File name…");
}
}
@@ -254,7 +254,6 @@ do_search_entry (GtkWidget *do_widget)
{
GtkWidget *vbox;
GtkWidget *hbox;
- GtkWidget *label;
GtkWidget *entry;
GtkWidget *find_button;
GtkWidget *cancel_button;
@@ -268,18 +267,14 @@ do_search_entry (GtkWidget *do_widget)
g_object_weak_ref (G_OBJECT (window), search_entry_destroyed, &window);
- vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
- gtk_widget_set_margin_start (vbox, 5);
- gtk_widget_set_margin_end (vbox, 5);
- gtk_widget_set_margin_top (vbox, 5);
- gtk_widget_set_margin_bottom (vbox, 5);
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_widget_set_margin_start (vbox, 18);
+ gtk_widget_set_margin_end (vbox, 18);
+ gtk_widget_set_margin_top (vbox, 18);
+ gtk_widget_set_margin_bottom (vbox, 18);
gtk_window_set_child (GTK_WINDOW (window), vbox);
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label), "Search entry demo");
- gtk_box_append (GTK_BOX (vbox), label);
-
- hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
gtk_box_append (GTK_BOX (vbox), hbox);
/* Create our entry */
diff --git a/demos/gtk-demo/search_entry2.c b/demos/gtk-demo/search_entry2.c
index f6027196b7..4e8315ba2c 100644
--- a/demos/gtk-demo/search_entry2.c
+++ b/demos/gtk-demo/search_entry2.c
@@ -1,10 +1,10 @@
-/* Entry/Delayed Search Entry
+/* Entry/Type to Search
*
* GtkSearchEntry provides an entry that is ready for search.
*
- * Search entries have their "changed" signal delayed and should
- * be used when the searched operation is slow such as loads of
- * entries to search, or online searches.
+ * Search entries have their "search-changed" signal delayed and
+ * should be used when the search operation is slow, such as big
+ * datasets to search, or online searches.
*
* GtkSearchBar allows have a hidden search entry that 'springs
* into action' upon keyboard input.
@@ -18,101 +18,69 @@ search_changed_cb (GtkSearchEntry *entry,
{
const char *text;
text = gtk_editable_get_text (GTK_EDITABLE (entry));
- g_message ("search changed: %s", text);
gtk_label_set_text (result_label, text ? text : "");
}
-static void
-changed_cb (GtkEditable *editable)
-{
- const char *text;
- text = gtk_editable_get_text (GTK_EDITABLE (editable));
- g_message ("changed: %s", text);
-}
-
-static void
-search_changed (GtkSearchEntry *entry,
- GtkLabel *label)
-{
- gtk_label_set_text (label, "search-changed");
-}
-
-static void
-next_match (GtkSearchEntry *entry,
- GtkLabel *label)
-{
- gtk_label_set_text (label, "next-match");
-}
-
-static void
-previous_match (GtkSearchEntry *entry,
- GtkLabel *label)
-{
- gtk_label_set_text (label, "previous-match");
-}
-
-static void
-stop_search (GtkSearchEntry *entry,
- GtkLabel *label)
-{
- gtk_label_set_text (label, "stop-search");
-}
-
GtkWidget *
do_search_entry2 (GtkWidget *do_widget)
{
static GtkWidget *window = NULL;
GtkWidget *vbox;
GtkWidget *hbox;
+ GtkWidget *box;
GtkWidget *label;
GtkWidget *entry;
- GtkWidget *container;
GtkWidget *searchbar;
GtkWidget *button;
+ GtkWidget *header;
if (!window)
{
window = gtk_window_new ();
- gtk_window_set_title (GTK_WINDOW (window), "Delayed Search Entry");
+ gtk_window_set_title (GTK_WINDOW (window), "Type to Search");
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
- gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
+ gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
gtk_widget_set_size_request (window, 200, -1);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
+ header = gtk_header_bar_new ();
+ gtk_window_set_titlebar (GTK_WINDOW (window), header);
+
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_window_set_child (GTK_WINDOW (window), vbox);
entry = gtk_search_entry_new ();
- container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
- gtk_widget_set_halign (container, GTK_ALIGN_CENTER);
- gtk_box_append (GTK_BOX (container), entry);
+ gtk_widget_set_halign (entry, GTK_ALIGN_CENTER);
searchbar = gtk_search_bar_new ();
gtk_search_bar_connect_entry (GTK_SEARCH_BAR (searchbar), GTK_EDITABLE (entry));
gtk_search_bar_set_show_close_button (GTK_SEARCH_BAR (searchbar), FALSE);
- gtk_search_bar_set_child (GTK_SEARCH_BAR (searchbar), container);
+ gtk_search_bar_set_child (GTK_SEARCH_BAR (searchbar), entry);
gtk_box_append (GTK_BOX (vbox), searchbar);
/* Hook the search bar to key presses */
gtk_search_bar_set_key_capture_widget (GTK_SEARCH_BAR (searchbar), window);
- /* Help */
- label = gtk_label_new ("Start Typing to search");
- gtk_box_append (GTK_BOX (vbox), label);
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 18);
+ gtk_widget_set_margin_start (box, 18);
+ gtk_widget_set_margin_end (box, 18);
+ gtk_widget_set_margin_top (box, 18);
+ gtk_widget_set_margin_bottom (box, 18);
+ gtk_box_append (GTK_BOX (vbox), box);
/* Toggle button */
- button = gtk_toggle_button_new_with_label ("Search");
+ button = gtk_toggle_button_new ();
+ gtk_button_set_icon_name (GTK_BUTTON (button), "system-search-symbolic");
g_object_bind_property (button, "active",
searchbar, "search-mode-enabled",
G_BINDING_BIDIRECTIONAL);
- gtk_box_append (GTK_BOX (vbox), button);
+ gtk_header_bar_pack_end (GTK_HEADER_BAR (header), button);
/* Result */
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
- gtk_box_append (GTK_BOX (vbox), hbox);
+ gtk_box_append (GTK_BOX (box), hbox);
- label = gtk_label_new ("Result:");
+ label = gtk_label_new ("Searching for:");
gtk_label_set_xalign (GTK_LABEL (label), 0.0);
- gtk_widget_set_margin_start (label, 6);
gtk_box_append (GTK_BOX (hbox), label);
label = gtk_label_new ("");
@@ -120,28 +88,6 @@ do_search_entry2 (GtkWidget *do_widget)
g_signal_connect (entry, "search-changed",
G_CALLBACK (search_changed_cb), label);
- g_signal_connect (entry, "changed",
- G_CALLBACK (changed_cb), label);
-
- hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
- gtk_box_append (GTK_BOX (vbox), hbox);
-
- label = gtk_label_new ("Signal:");
- gtk_label_set_xalign (GTK_LABEL (label), 0.0);
- gtk_widget_set_margin_start (label, 6);
- gtk_box_append (GTK_BOX (hbox), label);
-
- label = gtk_label_new ("");
- gtk_box_append (GTK_BOX (hbox), label);
-
- g_signal_connect (entry, "search-changed",
- G_CALLBACK (search_changed), label);
- g_signal_connect (entry, "next-match",
- G_CALLBACK (next_match), label);
- g_signal_connect (entry, "previous-match",
- G_CALLBACK (previous_match), label);
- g_signal_connect (entry, "stop-search",
- G_CALLBACK (stop_search), label);
}
if (!gtk_widget_get_visible (window))
diff --git a/demos/gtk-demo/tagged_entry.c b/demos/gtk-demo/tagged_entry.c
index c07858b546..02c336a4c6 100644
--- a/demos/gtk-demo/tagged_entry.c
+++ b/demos/gtk-demo/tagged_entry.c
@@ -66,6 +66,7 @@ do_tagged_entry (GtkWidget *do_widget)
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Tagged Entry");
+ gtk_window_set_default_size (GTK_WINDOW (window), 260, -1);
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
diff --git a/demos/gtk-demo/tagstyle.css b/demos/gtk-demo/tagstyle.css
index c470a5e2e2..0d1eacb30f 100644
--- a/demos/gtk-demo/tagstyle.css
+++ b/demos/gtk-demo/tagstyle.css
@@ -1,5 +1,5 @@
tag {
- margin: 4px;
+ margin: 4px 0px;
padding: 4px;
border-radius: 4px;
background: lightskyblue;
@@ -17,3 +17,7 @@ tag button {
padding: 0;
border: 1px solid white;
}
+
+entry.tagged {
+ border-spacing: 4px;
+}
diff --git a/demos/gtk-demo/themes.ui b/demos/gtk-demo/themes.ui
index c3f6ddbe79..3ccd832e4e 100644
--- a/demos/gtk-demo/themes.ui
+++ b/demos/gtk-demo/themes.ui
@@ -11,6 +11,7 @@
</object>
<object class="GtkWindow" id="window">
<property name="resizable">0</property>
+ <property name="title">Themes</property>
<child type="titlebar">
<object class="GtkHeaderBar" id="header">
<child type="start">
diff --git a/demos/widget-factory/widget-factory.c b/demos/widget-factory/widget-factory.c
index 1d81031a8e..6d022bb203 100644
--- a/demos/widget-factory/widget-factory.c
+++ b/demos/widget-factory/widget-factory.c
@@ -260,6 +260,8 @@ activate_about (GSimpleAction *action,
gpointer user_data)
{
GtkApplication *app = user_data;
+ GtkWindow *window;
+ GtkWidget *button;
const char *authors[] = {
"Andrea Cimitan",
"Cosimo Cecchi",
@@ -277,6 +279,10 @@ activate_about (GSimpleAction *action,
s = g_string_new ("");
+ window = gtk_application_get_active_window (app);
+ button = GTK_WIDGET (g_object_get_data (G_OBJECT (window), "open_menubutton"));
+ gtk_menu_button_popdown (GTK_MENU_BUTTON (button));
+
os_name = g_get_os_info (G_OS_INFO_KEY_NAME);
os_version = g_get_os_info (G_OS_INFO_KEY_VERSION_ID);
if (os_name && os_version)
@@ -302,6 +308,7 @@ activate_about (GSimpleAction *action,
dialog = g_object_new (GTK_TYPE_ABOUT_DIALOG,
"transient-for", gtk_application_get_active_window (app),
+ "modal", TRUE,
"program-name", "GTK Widget Factory",
"version", version,
"copyright", "© 1997—2020 The GTK Team",
@@ -326,6 +333,21 @@ activate_about (GSimpleAction *action,
}
static void
+activate_shortcuts_window (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ GtkApplication *app = user_data;
+ GtkWindow *window;
+ GtkWidget *button;
+
+ window = gtk_application_get_active_window (app);
+ button = GTK_WIDGET (g_object_get_data (G_OBJECT (window), "open_menubutton"));
+ gtk_menu_button_popdown (GTK_MENU_BUTTON (button));
+ gtk_widget_activate_action (GTK_WIDGET (window), "win.show-help-overlay", NULL);
+}
+
+static void
activate_quit (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
@@ -2370,6 +2392,7 @@ main (int argc, char *argv[])
GAction *action;
static GActionEntry app_entries[] = {
{ "about", activate_about, NULL, NULL, NULL },
+ { "shortcuts", activate_shortcuts_window, NULL, NULL, NULL },
{ "quit", activate_quit, NULL, NULL, NULL },
{ "inspector", activate_inspector, NULL, NULL, NULL },
{ "main", NULL, "s", "'steak'", NULL },
diff --git a/demos/widget-factory/widget-factory.ui b/demos/widget-factory/widget-factory.ui
index 36bee582cf..3a7e2533fa 100644
--- a/demos/widget-factory/widget-factory.ui
+++ b/demos/widget-factory/widget-factory.ui
@@ -51,7 +51,7 @@
</item>
<item>
<attribute name="label" translatable="yes">_Keyboard Shortcuts</attribute>
- <attribute name="action">win.show-help-overlay</attribute>
+ <attribute name="action">app.shortcuts</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_About Widget Factory</attribute>
@@ -3220,7 +3220,7 @@ bad things might happen.</property>
<object class="GtkMenuButton">
<property name="halign">end</property>
<property name="icon-name">emblem-system-symbolic</property>
- <property name="menu-model">gear_menu</property>
+ <property name="menu-model">gear_menu_model</property>
<property name="tooltip-text">This is a menu button</property>
<layout>
<property name="column">1</property>
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index b6f7cf2d25..c968de3cbe 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -1432,6 +1432,7 @@ GTK_TYPE_BOOKMARK_LIST
<FILE>gtkfilter</FILE>
<TITLE>GtkFilter</TITLE>
GtkFilter
+GtkFilterMatch
gtk_filter_match
gtk_filter_get_strictness
<SUBSECTION>
@@ -2107,6 +2108,7 @@ gtk_native_dialog_get_type
<TITLE>GtkNotebook</TITLE>
GtkNotebook
GtkNotebookPage
+GtkNotebookTab
gtk_notebook_new
gtk_notebook_get_page
gtk_notebook_get_pages
@@ -2163,7 +2165,6 @@ GTK_NOTEBOOK_GET_CLASS
<SUBSECTION Private>
gtk_notebook_get_type
gtk_notebook_page_get_type
-GtkNotebookTab
GtkNotebookPrivate
</SECTION>
diff --git a/docs/reference/gtk/migrating-3to4.md b/docs/reference/gtk/migrating-3to4.md
index 7a70e21bc0..e3975d8517 100644
--- a/docs/reference/gtk/migrating-3to4.md
+++ b/docs/reference/gtk/migrating-3to4.md
@@ -1080,12 +1080,12 @@ gtk_icon_paintable_get_icon_name() and set the icon name on a #GtkImage.
### Update to GtkFileChooser API changes
-GtkFileChooser moved to a GFile-based API. If you need to convert a
-path or a URI, use g_file_new_for_path(), g_file_new_for_commandline_arg(),
-or g_file_new_for_uri(); similarly, if you need to get a path or a URI
-from a GFile, use g_file_get_path(), or g_file_get_uri(). With the
-removal or path and URI-based functions, the "local-only" property has
-been removed; GFile can be used to access non-local as well as local
+GtkFileChooser moved to a GFile-based API. If you need to convert a path
+or a URI, use g_file_new_for_path(), g_file_new_for_commandline_arg(),
+or g_file_new_for_uri(); similarly, if you need to get a path, name or URI
+from a GFile, use g_file_get_path(), g_file_get_basename() or g_file_get_uri().
+With the removal or path and URI-based functions, the "local-only" property
+has been removed; GFile can be used to access non-local as well as local
resources.
The GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER action has been removed. Use
diff --git a/docs/reference/gtk/running.md b/docs/reference/gtk/running.md
index 2135eaa8d5..d0da90a5df 100644
--- a/docs/reference/gtk/running.md
+++ b/docs/reference/gtk/running.md
@@ -98,6 +98,14 @@ be used for the default IM module. This also can be a colon-separated
list of input-methods, which GTK will try in turn until it finds one
available on the system.
+### GTK_MEDIA
+
+Specifies what backend to load for #GtkMediaFile. The possible values
+depend on what options GTK was built with, and can include 'gstreamer',
+'ffmpeg' and 'none'. If set to 'none', media playback will be unavailable.
+The special value 'help' can be used to obtain a list of all supported
+media backends.
+
### GTK_EXE_PREFIX
If set, GTK uses `$GTK_EXE_PREFIX/lib` instead of the libdir
diff --git a/docs/reference/gtk/section-accessibility.md b/docs/reference/gtk/section-accessibility.md
index c86eb3c3c1..b86aac419b 100644
--- a/docs/reference/gtk/section-accessibility.md
+++ b/docs/reference/gtk/section-accessibility.md
@@ -292,12 +292,36 @@ The power of hiding and enhancing can be a double-edged sword, as it can
lead to inadvertently overriding the accessible semantics of existing
widgets.
+## Hiding UI elements from the accessible tree
+
+The accessibility API is mainly used to express semantics useful for
+assistive technologies, but it can also be used to hide elements. The
+canonical way to do so is to use the %GTK_ACCESSIBLE_ROLE_PRESENTATION,
+which declares that a UI element is purely meant for presentation purposes,
+and as such it has no meaningful impact on the accessibility of the
+interface.
+
+A "presentation" role should not be confused with the
+%GTK_ACCESSIBLE_STATE_HIDDEN state; the "hidden" state is transient, and is
+typically controlled by showing and hiding a widget using the #GtkWidget
+API.
+
## Design patterns and custom widgets
When creating custom widgets, following established patterns can help
ensuring that the widgets work well for users of accessible technologies
as well.
+### Buttons
+
+A button is a widget that enables users to trigger an action. While it is
+recommended you use #GtkButton for anything that looks and behaves like a
+button, it is possible to apply a button behavior to UI elements like images
+by using a #GtkGestureClick gesture. When doing so, you should:
+
+ - Give your widget the role %GTK_ACCESSIBLE_ROLE_BUTTON
+ - Install an action with no parameters, which will activate the widget
+
### Custom entries
For custom entries, it is highly recommended that you implement the
diff --git a/gdk/broadway/gdkeventsource.c b/gdk/broadway/gdkeventsource.c
index 4eef497cb4..3aab5583fa 100644
--- a/gdk/broadway/gdkeventsource.c
+++ b/gdk/broadway/gdkeventsource.c
@@ -185,7 +185,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
display_broadway->core_pointer,
NULL,
message->base.time,
- 0,
+ message->pointer.state,
message->scroll.dir == 0
? GDK_SCROLL_UP
: GDK_SCROLL_DOWN,
diff --git a/gdk/gdkcursor.c b/gdk/gdkcursor.c
index 8fd33d1d7b..a0d5bc276d 100644
--- a/gdk/gdkcursor.c
+++ b/gdk/gdkcursor.c
@@ -272,9 +272,9 @@ gdk_cursor_equal (gconstpointer a,
/**
* gdk_cursor_new_from_name:
+ * @name: the name of the cursor
* @fallback: (allow-none): %NULL or the #GdkCursor to fall back to when
* this one cannot be supported
- * @name: the name of the cursor
*
* Creates a new cursor by looking up @name in the current cursor
* theme.
@@ -321,9 +321,9 @@ gdk_cursor_equal (gconstpointer a,
* Returns: (nullable): a new #GdkCursor, or %NULL if there is no
* cursor with the given name
*/
-GdkCursor*
+GdkCursor *
gdk_cursor_new_from_name (const char *name,
- GdkCursor *fallback)
+ GdkCursor *fallback)
{
g_return_val_if_fail (name != NULL, NULL);
g_return_val_if_fail (fallback == NULL || GDK_IS_CURSOR (fallback), NULL);
@@ -357,7 +357,7 @@ gdk_cursor_new_from_texture (GdkTexture *texture,
g_return_val_if_fail (0 <= hotspot_y && hotspot_y < gdk_texture_get_height (texture), NULL);
g_return_val_if_fail (fallback == NULL || GDK_IS_CURSOR (fallback), NULL);
- return g_object_new (GDK_TYPE_CURSOR,
+ return g_object_new (GDK_TYPE_CURSOR,
"texture", texture,
"hotspot-x", hotspot_x,
"hotspot-y", hotspot_y,
diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c
index 43d3371609..93e61d5c68 100644
--- a/gdk/gdksurface.c
+++ b/gdk/gdksurface.c
@@ -2659,18 +2659,6 @@ gdk_synthesize_surface_state (GdkSurface *surface,
gdk_surface_set_state (surface, (surface->state | set_flags) & ~unset_flags);
}
-static void
-hide_popup_chain (GdkSurface *surface)
-{
- GdkSurface *parent;
-
- gdk_surface_hide (surface);
-
- parent = surface->parent;
- if (parent->autohide)
- hide_popup_chain (parent);
-}
-
static gboolean
check_autohide (GdkEvent *event)
{
@@ -2697,10 +2685,23 @@ check_autohide (GdkEvent *event)
device = gdk_event_get_device (event);
if (gdk_device_grab_info (display, device, &grab_surface, NULL))
{
- if (grab_surface != gdk_event_get_surface (event) &&
+ GdkSurface *event_surface;
+
+ event_surface = gdk_event_get_surface (event);
+
+ if (grab_surface != event_surface &&
+ grab_surface != event_surface->parent &&
grab_surface->autohide)
{
- hide_popup_chain (grab_surface);
+ GdkSurface *surface = grab_surface;
+
+ do
+ {
+ gdk_surface_hide (surface);
+ surface = surface->parent;
+ }
+ while (surface->autohide && surface != event_surface);
+
return TRUE;
}
}
diff --git a/gdk/macos/GdkMacosCairoSubview.c b/gdk/macos/GdkMacosCairoSubview.c
index 425b52ac78..e52acdf168 100644
--- a/gdk/macos/GdkMacosCairoSubview.c
+++ b/gdk/macos/GdkMacosCairoSubview.c
@@ -32,6 +32,12 @@
@implementation GdkMacosCairoSubview
+-(void)dealloc
+{
+ g_clear_pointer (&self->clip, cairo_region_destroy);
+ [super dealloc];
+}
+
-(BOOL)isOpaque
{
return _isOpaque;
@@ -95,6 +101,21 @@
cr = cairo_create (dest);
cairo_translate (cr, -abs_bounds.origin.x, -abs_bounds.origin.y);
+ /* Apply the clip if provided one */
+ if (self->clip != NULL)
+ {
+ cairo_rectangle_int_t area;
+
+ n_rects = cairo_region_num_rectangles (self->clip);
+ for (guint i = 0; i < n_rects; i++)
+ {
+ cairo_region_get_rectangle (self->clip, i, &area);
+ cairo_rectangle (cr, area.x, area.y, area.width, area.height);
+ }
+
+ cairo_clip (cr);
+ }
+
/* Clip the cairo context based on the rectangles to be drawn
* within the bounding box :rect.
*/
@@ -168,4 +189,14 @@
self->_isOpaque = opaque;
}
+-(void)setClip:(cairo_region_t*)region
+{
+ if (region != self->clip)
+ {
+ g_clear_pointer (&self->clip, cairo_region_destroy);
+ if (region != NULL)
+ self->clip = cairo_region_reference (region);
+ }
+}
+
@end
diff --git a/gdk/macos/GdkMacosCairoSubview.h b/gdk/macos/GdkMacosCairoSubview.h
index 9255347566..5eae734f8f 100644
--- a/gdk/macos/GdkMacosCairoSubview.h
+++ b/gdk/macos/GdkMacosCairoSubview.h
@@ -26,10 +26,12 @@
{
BOOL _isOpaque;
cairo_surface_t *cairoSurface;
+ cairo_region_t *clip;
}
-(void)setOpaque:(BOOL)opaque;
-(void)setCairoSurface:(cairo_surface_t *)cairoSurface
withDamage:(cairo_region_t *)region;
+-(void)setClip:(cairo_region_t*)region;
@end
diff --git a/gdk/macos/GdkMacosCairoView.c b/gdk/macos/GdkMacosCairoView.c
index 2f82488912..81ac8af6a3 100644
--- a/gdk/macos/GdkMacosCairoView.c
+++ b/gdk/macos/GdkMacosCairoView.c
@@ -78,6 +78,7 @@
-(void)setOpaqueRegion:(cairo_region_t *)region
{
+ cairo_region_t *transparent_clip;
NSRect abs_bounds;
guint n_rects;
@@ -87,6 +88,17 @@
abs_bounds = [self convertRect:[self bounds] toView:nil];
n_rects = cairo_region_num_rectangles (region);
+ /* First, we create a clip region for the transparent region to use so that
+ * we dont end up exposing too much other than the corners on CSD.
+ */
+ transparent_clip = cairo_region_create_rectangle (&(cairo_rectangle_int_t) {
+ abs_bounds.origin.x, abs_bounds.origin.y,
+ abs_bounds.size.width, abs_bounds.size.height
+ });
+ cairo_region_subtract (transparent_clip, region);
+ [(GdkMacosCairoSubview *)self->transparent setClip:transparent_clip];
+ cairo_region_destroy (transparent_clip);
+
/* The common case (at least for opaque windows and CSD) is that we will
* have either one or two opaque rectangles. If we detect that the same
* number of them are available as the previous, we can just resize the
diff --git a/gdk/macos/gdkmacosdisplay-private.h b/gdk/macos/gdkmacosdisplay-private.h
index 9f45a2e200..630daceae0 100644
--- a/gdk/macos/gdkmacosdisplay-private.h
+++ b/gdk/macos/gdkmacosdisplay-private.h
@@ -136,8 +136,6 @@ void _gdk_macos_display_add_frame_callback (GdkMacosDisp
GdkMacosSurface *surface);
void _gdk_macos_display_remove_frame_callback (GdkMacosDisplay *self,
GdkMacosSurface *surface);
-void _gdk_macos_display_synthesize_motion (GdkMacosDisplay *self,
- GdkMacosSurface *surface);
NSWindow *_gdk_macos_display_find_native_under_pointer (GdkMacosDisplay *self,
int *x,
int *y);
diff --git a/gdk/macos/gdkmacosdisplay-translate.c b/gdk/macos/gdkmacosdisplay-translate.c
index 849d433634..f895db9686 100644
--- a/gdk/macos/gdkmacosdisplay-translate.c
+++ b/gdk/macos/gdkmacosdisplay-translate.c
@@ -1156,41 +1156,6 @@ _gdk_macos_display_translate (GdkMacosDisplay *self,
}
void
-_gdk_macos_display_synthesize_motion (GdkMacosDisplay *self,
- GdkMacosSurface *surface)
-{
- GdkModifierType state;
- GdkEvent *event;
- GdkSeat *seat;
- NSPoint point;
- GList *node;
- int x;
- int y;
-
- g_return_if_fail (GDK_IS_MACOS_DISPLAY (self));
- g_return_if_fail (GDK_IS_MACOS_SURFACE (surface));
-
- seat = gdk_display_get_default_seat (GDK_DISPLAY (self));
- point = [NSEvent mouseLocation];
- _gdk_macos_display_from_display_coords (self, point.x, point.y, &x, &y);
-
- state = _gdk_macos_display_get_current_keyboard_modifiers (self) |
- _gdk_macos_display_get_current_mouse_modifiers (self);
-
- event = gdk_motion_event_new (GDK_SURFACE (surface),
- gdk_seat_get_pointer (seat),
- NULL,
- get_time_from_ns_event ([NSApp currentEvent]),
- state,
- x,
- y,
- NULL);
- node = _gdk_event_queue_append (GDK_DISPLAY (self), event);
- _gdk_windowing_got_event (GDK_DISPLAY (self), node, event,
- _gdk_display_get_next_serial (GDK_DISPLAY (self)));
-}
-
-void
_gdk_macos_display_send_button_event (GdkMacosDisplay *self,
NSEvent *nsevent)
{
diff --git a/gdk/macos/gdkmacosdisplay.c b/gdk/macos/gdkmacosdisplay.c
index 665a567e70..f042b4a358 100644
--- a/gdk/macos/gdkmacosdisplay.c
+++ b/gdk/macos/gdkmacosdisplay.c
@@ -512,7 +512,7 @@ _gdk_macos_display_surface_became_key (GdkMacosDisplay *self,
* ("is not key"). We send a dummy motion notify event now, so that
* everything in the window is set to correct state.
*/
- _gdk_macos_display_synthesize_motion (self, surface);
+ gdk_surface_request_motion (surface);
}
void
diff --git a/gdk/macos/gdkmacosglcontext-private.h b/gdk/macos/gdkmacosglcontext-private.h
index e47a3e2eec..f3499ab1ca 100644
--- a/gdk/macos/gdkmacosglcontext-private.h
+++ b/gdk/macos/gdkmacosglcontext-private.h
@@ -44,6 +44,9 @@ struct _GdkMacosGLContext
NSWindow *dummy_window;
NSView *dummy_view;
+ cairo_region_t *damage;
+ cairo_rectangle_int_t flush_rect;
+
guint is_attached : 1;
guint needs_resize : 1;
};
diff --git a/gdk/macos/gdkmacosglcontext.c b/gdk/macos/gdkmacosglcontext.c
index e1d792a41e..c01ec28937 100644
--- a/gdk/macos/gdkmacosglcontext.c
+++ b/gdk/macos/gdkmacosglcontext.c
@@ -21,6 +21,7 @@
#include "gdkmacosglcontext-private.h"
#include "gdkmacossurface-private.h"
+#include "gdkmacostoplevelsurface-private.h"
#include "gdkinternals.h"
#include "gdkintl.h"
@@ -99,6 +100,9 @@ create_pixel_format (int major,
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersionLegacy,
NSOpenGLPFAAccelerated,
NSOpenGLPFADoubleBuffer,
+ NSOpenGLPFABackingStore,
+ NSOpenGLPFAColorSize, 32,
+ NSOpenGLPFAAlphaSize, 8,
(NSOpenGLPixelFormatAttribute)nil
};
@@ -143,6 +147,18 @@ ensure_gl_view (GdkMacosGLContext *self)
[nsview setNeedsDisplay:YES];
[nswindow setContentView:nsview];
[nsview release];
+
+ if (self->dummy_view != NULL)
+ {
+ NSView *nsview = g_steal_pointer (&self->dummy_view);
+ [nsview release];
+ }
+
+ if (self->dummy_window != NULL)
+ {
+ NSWindow *nswindow = g_steal_pointer (&self->dummy_window);
+ [nswindow release];
+ }
}
return [nswindow contentView];
@@ -159,9 +175,8 @@ gdk_macos_gl_context_real_realize (GdkGLContext *context,
NSOpenGLPixelFormat *pixelFormat;
GdkGLContext *shared;
GdkGLContext *shared_data;
- GdkGLContext *existing;
+ NSOpenGLContext *existing;
GLint sync_to_framerate = 1;
- GLint opaque = 0;
GLint validate = 0;
int major, minor;
@@ -170,7 +185,7 @@ gdk_macos_gl_context_real_realize (GdkGLContext *context,
if (self->gl_context != nil)
return TRUE;
- existing = gdk_gl_context_get_current ();
+ existing = [NSOpenGLContext currentContext];
gdk_gl_context_get_required_version (context, &major, &minor);
@@ -212,24 +227,17 @@ gdk_macos_gl_context_real_realize (GdkGLContext *context,
}
[gl_context setValues:&sync_to_framerate forParameter:NSOpenGLCPSwapInterval];
- [gl_context setValues:&opaque forParameter:NSOpenGLCPSurfaceOpacity];
[gl_context setValues:&validate forParameter:NSOpenGLContextParameterStateValidation];
- if (self->is_attached || shared == NULL)
- {
- NSRect frame = NSMakeRect (0, 0, 1, 1);
-
- self->dummy_window = [[NSWindow alloc] initWithContentRect:frame
- styleMask:0
- backing:NSBackingStoreBuffered
- defer:NO
- screen:nil];
- self->dummy_view = [[NSView alloc] initWithFrame:frame];
- [self->dummy_window setContentView:self->dummy_view];
- [gl_context setView:self->dummy_view];
- }
+ self->dummy_window = [[NSWindow alloc] initWithContentRect:NSZeroRect
+ styleMask:0
+ backing:NSBackingStoreBuffered
+ defer:NO
+ screen:nil];
+ self->dummy_view = [[NSView alloc] initWithFrame:NSZeroRect];
+ [self->dummy_window setContentView:self->dummy_view];
+ [gl_context setView:self->dummy_view];
- [gl_context makeCurrentContext];
GLint renderer_id = 0;
[gl_context getValues:&renderer_id forParameter:NSOpenGLContextParameterCurrentRendererID];
GDK_DISPLAY_NOTE (gdk_draw_context_get_display (GDK_DRAW_CONTEXT (context)),
@@ -237,12 +245,11 @@ gdk_macos_gl_context_real_realize (GdkGLContext *context,
g_message ("Created NSOpenGLContext[%p] using %s",
gl_context,
get_renderer_name (renderer_id)));
- [NSOpenGLContext clearCurrentContext];
self->gl_context = g_steal_pointer (&gl_context);
if (existing != NULL)
- [GDK_MACOS_GL_CONTEXT (existing)->gl_context makeCurrentContext];
+ [existing makeCurrentContext];
return TRUE;
}
@@ -257,24 +264,47 @@ gdk_macos_gl_context_begin_frame (GdkDrawContext *context,
/* If begin frame is called, that means we are trying to draw to
* the NSWindow using our view. That might be a GdkMacosCairoView
- * but we need it to be a GL view.
+ * but we need it to be a GL view. Also, only in this case do we
+ * want to replace our damage region for the next frame (to avoid
+ * doing it multiple times).
*/
if (!self->is_attached &&
gdk_gl_context_get_shared_context (GDK_GL_CONTEXT (context)))
- ensure_gl_view (self);
+ {
+ ensure_gl_view (self);
+
+ g_clear_pointer (&self->damage, cairo_region_destroy);
+ self->damage = cairo_region_copy (painted);
+
+ cairo_region_get_extents (painted, &self->flush_rect);
+ }
if (self->needs_resize)
{
+ GdkSurface *surface = gdk_draw_context_get_surface (context);
+ GLint opaque;
+
self->needs_resize = FALSE;
if (self->dummy_view != NULL)
{
GdkSurface *surface = gdk_draw_context_get_surface (context);
- GLint vals[2] = { surface->width, surface->height };
+ NSRect frame = NSMakeRect (0, 0, surface->width, surface->height);
- [self->gl_context setValues:vals forParameter:NSOpenGLContextParameterSurfaceBackingSize];
+ [self->dummy_window setFrame:frame display:NO];
+ [self->dummy_view setFrame:frame];
}
+ /* Possibly update our opaque setting depending on a resize. We can
+ * rely on getting a resize if decoarated is changed, so this reduces
+ * how much we adjust the parameter.
+ */
+ if (GDK_IS_MACOS_TOPLEVEL_SURFACE (surface))
+ opaque = GDK_MACOS_TOPLEVEL_SURFACE (surface)->decorated;
+ else
+ opaque = FALSE;
+ [self->gl_context setValues:&opaque forParameter:NSOpenGLCPSurfaceOpacity];
+
[self->gl_context update];
}
@@ -311,13 +341,14 @@ gdk_macos_gl_context_end_frame (GdkDrawContext *context,
GDK_DRAW_CONTEXT_CLASS (gdk_macos_gl_context_parent_class)->end_frame (context, painted);
+ /* We want to limit how much gets moved to the front buffer so here
+ * we adjust the clip rectangle before flushBuffer is called.
+ */
G_STATIC_ASSERT (sizeof (GLint) == sizeof (int));
-
- cairo_region_get_extents (painted, &extents);
-
[self->gl_context
- setValues:(GLint *)&extents
+ setValues:(GLint *)&self->flush_rect
forParameter:NSOpenGLCPSwapRectangle];
+
[self->gl_context flushBuffer];
}
@@ -329,6 +360,21 @@ gdk_macos_gl_context_surface_resized (GdkDrawContext *draw_context)
g_assert (GDK_IS_MACOS_GL_CONTEXT (self));
self->needs_resize = TRUE;
+
+ g_clear_pointer (&self->damage, cairo_region_destroy);
+}
+
+static cairo_region_t *
+gdk_macos_gl_context_get_damage (GdkGLContext *context)
+{
+ GdkMacosGLContext *self = (GdkMacosGLContext *)context;
+
+ g_assert (GDK_IS_MACOS_GL_CONTEXT (self));
+
+ if (self->damage != NULL)
+ return cairo_region_copy (self->damage);
+
+ return GDK_GL_CONTEXT_CLASS (gdk_macos_gl_context_parent_class)->get_damage (context);
}
static void
@@ -339,17 +385,12 @@ gdk_macos_gl_context_dispose (GObject *gobject)
if (self->dummy_view != nil)
{
NSView *nsview = g_steal_pointer (&self->dummy_view);
-
- if (GDK_IS_MACOS_GL_VIEW (nsview))
- [(GdkMacosGLView *)nsview setOpenGLContext:nil];
-
[nsview release];
}
if (self->dummy_window != nil)
{
NSWindow *nswindow = g_steal_pointer (&self->dummy_window);
-
[nswindow release];
}
@@ -364,6 +405,8 @@ gdk_macos_gl_context_dispose (GObject *gobject)
[gl_context release];
}
+ g_clear_pointer (&self->damage, cairo_region_destroy);
+
G_OBJECT_CLASS (gdk_macos_gl_context_parent_class)->dispose (gobject);
}
@@ -380,6 +423,7 @@ gdk_macos_gl_context_class_init (GdkMacosGLContextClass *klass)
draw_context_class->end_frame = gdk_macos_gl_context_end_frame;
draw_context_class->surface_resized = gdk_macos_gl_context_surface_resized;
+ gl_class->get_damage = gdk_macos_gl_context_get_damage;
gl_class->realize = gdk_macos_gl_context_real_realize;
}
diff --git a/gdk/macos/gdkmacossurface.c b/gdk/macos/gdkmacossurface.c
index 9925407d46..2360e1c476 100644
--- a/gdk/macos/gdkmacossurface.c
+++ b/gdk/macos/gdkmacossurface.c
@@ -256,7 +256,7 @@ gdk_macos_surface_get_device_state (GdkSurface *surface,
| _gdk_macos_display_get_current_mouse_modifiers (GDK_MACOS_DISPLAY (display));
*x = point.x;
- *y = point.y - surface->height;
+ *y = surface->height - point.y;
return *x >= 0 && *y >= 0 && *x < surface->width && *y < surface->height;
}
diff --git a/gdk/macos/gdkmacostoplevelsurface-private.h b/gdk/macos/gdkmacostoplevelsurface-private.h
index d7866601e5..8d3ec15b02 100644
--- a/gdk/macos/gdkmacostoplevelsurface-private.h
+++ b/gdk/macos/gdkmacostoplevelsurface-private.h
@@ -24,13 +24,24 @@
G_BEGIN_DECLS
-typedef struct _GdkMacosToplevelSurface GdkMacosToplevelSurface;
-typedef struct _GdkMacosToplevelSurfaceClass GdkMacosToplevelSurfaceClass;
-
#define GDK_TYPE_MACOS_TOPLEVEL_SURFACE (_gdk_macos_toplevel_surface_get_type())
#define GDK_MACOS_TOPLEVEL_SURFACE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_MACOS_TOPLEVEL_SURFACE, GdkMacosToplevelSurface))
#define GDK_IS_MACOS_TOPLEVEL_SURFACE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_MACOS_TOPLEVEL_SURFACE))
+typedef struct _GdkMacosToplevelSurface GdkMacosToplevelSurface;
+typedef struct _GdkMacosToplevelSurfaceClass GdkMacosToplevelSurfaceClass;
+
+struct _GdkMacosToplevelSurface
+{
+ GdkMacosSurface parent_instance;
+ guint decorated : 1;
+};
+
+struct _GdkMacosToplevelSurfaceClass
+{
+ GdkMacosSurfaceClass parent_instance;
+};
+
GType _gdk_macos_toplevel_surface_get_type (void);
GdkMacosSurface *_gdk_macos_toplevel_surface_new (GdkMacosDisplay *display,
GdkSurface *parent,
diff --git a/gdk/macos/gdkmacostoplevelsurface.c b/gdk/macos/gdkmacostoplevelsurface.c
index 2615957b2c..a9a6488419 100644
--- a/gdk/macos/gdkmacostoplevelsurface.c
+++ b/gdk/macos/gdkmacostoplevelsurface.c
@@ -29,17 +29,6 @@
#include "gdkmacostoplevelsurface-private.h"
#include "gdkmacosutils-private.h"
-struct _GdkMacosToplevelSurface
-{
- GdkMacosSurface parent_instance;
- guint decorated : 1;
-};
-
-struct _GdkMacosToplevelSurfaceClass
-{
- GdkMacosSurfaceClass parent_instance;
-};
-
static void
_gdk_macos_toplevel_surface_fullscreen (GdkMacosToplevelSurface *self)
{
diff --git a/gdk/wayland/gdksurface-wayland.c b/gdk/wayland/gdksurface-wayland.c
index 0706db865d..df106ee6e3 100644
--- a/gdk/wayland/gdksurface-wayland.c
+++ b/gdk/wayland/gdksurface-wayland.c
@@ -2798,6 +2798,7 @@ gdk_wayland_surface_hide_surface (GdkSurface *surface)
}
impl->has_uncommitted_ack_configure = FALSE;
+ impl->input_region_dirty = TRUE;
unset_transient_for_exported (surface);
diff --git a/gdk/win32/gdksurface-win32.c b/gdk/win32/gdksurface-win32.c
index 076e18aac1..2ca4a670af 100644
--- a/gdk/win32/gdksurface-win32.c
+++ b/gdk/win32/gdksurface-win32.c
@@ -332,9 +332,8 @@ get_default_title (void)
static ATOM
RegisterGdkClass (GdkSurfaceType wtype)
{
- static ATOM klassTOPLEVEL = 0;
- static ATOM klassTEMP = 0;
- static ATOM klassTEMPSHADOW = 0;
+ static ATOM klassTOPLEVEL = 0;
+ static ATOM klassTEMP = 0;
static HICON hAppIcon = NULL;
static HICON hAppIconSm = NULL;
static WNDCLASSEXW wcl;
@@ -416,32 +415,16 @@ RegisterGdkClass (GdkSurfaceType wtype)
break;
case GDK_SURFACE_TEMP:
- if (TRUE)
+ if (klassTEMP == 0)
{
- if (klassTEMPSHADOW == 0)
- {
- wcl.lpszClassName = L"gdkSurfaceTempShadow";
- wcl.style |= CS_SAVEBITS;
- wcl.style |= 0x00020000; /* CS_DROPSHADOW */
-
- ONCE_PER_CLASS ();
- klassTEMPSHADOW = RegisterClassExW (&wcl);
- }
-
- klass = klassTEMPSHADOW;
+ wcl.lpszClassName = L"gdkSurfaceTemp";
+ wcl.style |= CS_SAVEBITS;
+ ONCE_PER_CLASS ();
+ klassTEMP = RegisterClassExW (&wcl);
}
- else
- {
- if (klassTEMP == 0)
- {
- wcl.lpszClassName = L"gdkSurfaceTemp";
- wcl.style |= CS_SAVEBITS;
- ONCE_PER_CLASS ();
- klassTEMP = RegisterClassExW (&wcl);
- }
- klass = klassTEMP;
- }
+ klass = klassTEMP;
+
break;
default:
diff --git a/gsk/gl/gskglprofiler.c b/gsk/gl/gskglprofiler.c
index 0262bd20f8..9b834e5fc8 100644
--- a/gsk/gl/gskglprofiler.c
+++ b/gsk/gl/gskglprofiler.c
@@ -18,6 +18,7 @@ struct _GskGLProfiler
GLuint gl_queries[N_QUERIES];
GLuint active_query;
+ gboolean has_queries : 1;
gboolean has_timer : 1;
gboolean first_frame : 1;
};
@@ -37,7 +38,8 @@ gsk_gl_profiler_finalize (GObject *gobject)
{
GskGLProfiler *self = GSK_GL_PROFILER (gobject);
- glDeleteQueries (N_QUERIES, self->gl_queries);
+ if (self->has_queries)
+ glDeleteQueries (N_QUERIES, self->gl_queries);
g_clear_object (&self->gl_context);
@@ -106,10 +108,14 @@ gsk_gl_profiler_class_init (GskGLProfilerClass *klass)
static void
gsk_gl_profiler_init (GskGLProfiler *self)
{
- glGenQueries (N_QUERIES, self->gl_queries);
+ self->has_queries = epoxy_is_desktop_gl();
+ self->has_timer = epoxy_is_desktop_gl() && (epoxy_gl_version () >= 33 || epoxy_has_gl_extension ("GL_ARB_timer_query"));
+
+ if (!self->has_queries)
+ return;
+ glGenQueries (N_QUERIES, self->gl_queries);
self->first_frame = TRUE;
- self->has_timer = epoxy_gl_version () >= 33 || epoxy_has_gl_extension ("GL_ARB_timer_query");
}
GskGLProfiler *
@@ -127,7 +133,7 @@ gsk_gl_profiler_begin_gpu_region (GskGLProfiler *profiler)
g_return_if_fail (GSK_IS_GL_PROFILER (profiler));
- if (!profiler->has_timer)
+ if (!profiler->has_timer || !profiler->has_queries)
return;
query_id = profiler->gl_queries[profiler->active_query];
@@ -143,7 +149,7 @@ gsk_gl_profiler_end_gpu_region (GskGLProfiler *profiler)
g_return_val_if_fail (GSK_IS_GL_PROFILER (profiler), 0);
- if (!profiler->has_timer)
+ if (!profiler->has_timer || !profiler->has_queries)
return 0;
glEndQuery (GL_TIME_ELAPSED);
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index 0678e81f1e..a40df3c94e 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -344,16 +344,16 @@ node_supports_transform (GskRenderNode *node)
}
static inline void
-load_vertex_data_with_region (GskQuadVertex vertex_data[GL_N_VERTICES],
- GskRenderNode *node,
- RenderOpBuilder *builder,
- const TextureRegion *r,
- gboolean flip_y)
+load_vertex_data_with_region (GskQuadVertex vertex_data[GL_N_VERTICES],
+ const graphene_rect_t *bounds,
+ RenderOpBuilder *builder,
+ const TextureRegion *r,
+ gboolean flip_y)
{
- const float min_x = builder->dx + node->bounds.origin.x;
- const float min_y = builder->dy + node->bounds.origin.y;
- const float max_x = min_x + node->bounds.size.width;
- const float max_y = min_y + node->bounds.size.height;
+ const float min_x = builder->dx + bounds->origin.x;
+ const float min_y = builder->dy + bounds->origin.y;
+ const float max_x = min_x + bounds->size.width;
+ const float max_y = min_y + bounds->size.height;
const float y1 = flip_y ? r->y2 : r->y;
const float y2 = flip_y ? r->y : r->y2;
@@ -388,15 +388,18 @@ load_vertex_data_with_region (GskQuadVertex vertex_data[GL_N_VERTICES],
vertex_data[5].uv[1] = y1;
}
-static void
-load_vertex_data (GskQuadVertex vertex_data[GL_N_VERTICES],
- GskRenderNode *node,
- RenderOpBuilder *builder)
+static inline void
+load_float_vertex_data (GskQuadVertex vertex_data[GL_N_VERTICES],
+ RenderOpBuilder *builder,
+ float x,
+ float y,
+ float width,
+ float height)
{
- const float min_x = builder->dx + node->bounds.origin.x;
- const float min_y = builder->dy + node->bounds.origin.y;
- const float max_x = min_x + node->bounds.size.width;
- const float max_y = min_y + node->bounds.size.height;
+ const float min_x = builder->dx + x;
+ const float min_y = builder->dy + y;
+ const float max_x = min_x + width;
+ const float max_y = min_y + height;
vertex_data[0].position[0] = min_x;
vertex_data[0].position[1] = min_y;
@@ -430,6 +433,16 @@ load_vertex_data (GskQuadVertex vertex_data[GL_N_VERTICES],
}
static void
+load_vertex_data (GskQuadVertex vertex_data[GL_N_VERTICES],
+ const graphene_rect_t *bounds,
+ RenderOpBuilder *builder)
+{
+ load_float_vertex_data (vertex_data, builder,
+ bounds->origin.x, bounds->origin.y,
+ bounds->size.width, bounds->size.height);
+}
+
+static void
fill_vertex_data (GskQuadVertex vertex_data[GL_N_VERTICES],
const float min_x,
const float min_y,
@@ -482,6 +495,7 @@ load_offscreen_vertex_data (GskQuadVertex vertex_data[GL_N_VERTICES],
max_x, max_y);
}
+
static void gsk_gl_renderer_setup_render_mode (GskGLRenderer *self);
static gboolean add_offscreen_ops (GskGLRenderer *self,
RenderOpBuilder *builder,
@@ -567,28 +581,7 @@ init_shader_builder (GskGLRenderer *self,
}
}
-static void G_GNUC_UNUSED
-add_rect_ops (RenderOpBuilder *builder,
- const graphene_rect_t *r)
-{
- const float min_x = r->origin.x;
- const float min_y = r->origin.y;
- const float max_x = min_x + r->size.width;
- const float max_y = min_y + r->size.height;
-
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { min_x, min_y }, { 0, 1 }, },
- { { min_x, max_y }, { 0, 0 }, },
- { { max_x, min_y }, { 1, 1 }, },
-
- { { max_x, max_y }, { 1, 0 }, },
- { { min_x, max_y }, { 0, 0 }, },
- { { max_x, min_y }, { 1, 1 }, },
- });
-}
-
static GdkRGBA BLACK = {0, 0, 0, 1};
-
static void G_GNUC_UNUSED
add_rect_outline_ops (GskGLRenderer *self,
RenderOpBuilder *builder,
@@ -597,19 +590,20 @@ add_rect_outline_ops (GskGLRenderer *self,
ops_set_program (builder, &self->programs->color_program);
ops_set_color (builder, &BLACK);
- add_rect_ops (builder,
- &GRAPHENE_RECT_INIT (rect->origin.x, rect->origin.y,
- 1, rect->size.height));
- add_rect_ops (builder,
- &GRAPHENE_RECT_INIT (rect->origin.x, rect->origin.y,
- rect->size.width, 1));
- add_rect_ops (builder,
- &GRAPHENE_RECT_INIT (rect->origin.x + rect->size.width - 1, rect->origin.y,
- 1, rect->size.height));
-
- add_rect_ops (builder,
- &GRAPHENE_RECT_INIT (rect->origin.x, rect->origin.y + rect->size.height - 1,
- rect->size.width, 1));
+ load_vertex_data (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (rect->origin.x, rect->origin.y, 1, rect->size.height),
+ builder);
+ load_vertex_data (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (rect->origin.x, rect->origin.y, rect->size.width, 1),
+ builder);
+ load_vertex_data (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (rect->origin.x + rect->size.width - 1,rect->origin.y,
+ 1, rect->size.height),
+ builder);
+ load_vertex_data (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (rect->origin.x, rect->origin.y + rect->size.height - 1,
+ rect->size.width, 1),
+ builder);
}
static inline GskRoundedRect
@@ -782,8 +776,7 @@ render_text_node (GskGLRenderer *self,
lookup.data.font = (PangoFont *)font;
lookup.data.scale = (guint) (text_scale * 1024);
- /* We use one quad per character, unlike the other nodes which
- * use at most one quad altogether */
+ /* We use one quad per character */
for (i = 0; i < num_glyphs; i++)
{
const PangoGlyphInfo *gi = &glyphs[i];
@@ -856,7 +849,7 @@ render_border_node (GskGLRenderer *self,
ops_set_inset_shadow (builder, transform_rect (self, builder, rounded_outline),
widths[0], &colors[0], 0, 0);
- load_vertex_data (ops_draw (builder, NULL), node, builder);
+ load_vertex_data (ops_draw (builder, NULL), &node->bounds, builder);
return;
}
@@ -983,7 +976,7 @@ render_color_node (GskGLRenderer *self,
{
ops_set_program (builder, &self->programs->color_program);
ops_set_color (builder, gsk_color_node_peek_color (node));
- load_vertex_data (ops_draw (builder, NULL), node, builder);
+ load_vertex_data (ops_draw (builder, NULL), &node->bounds, builder);
}
static inline void
@@ -1078,7 +1071,7 @@ render_texture_node (GskGLRenderer *self,
ops_set_texture (builder, r.texture_id);
load_vertex_data_with_region (ops_draw (builder, NULL),
- node, builder,
+ &node->bounds, builder,
&r,
FALSE);
}
@@ -1252,11 +1245,11 @@ render_gl_shader_node (GskGLRenderer *self,
static GdkRGBA pink = { 255 / 255., 105 / 255., 180 / 255., 1.0 };
ops_set_program (builder, &self->programs->color_program);
ops_set_color (builder, &pink);
- load_vertex_data (ops_draw (builder, NULL), node, builder);
+ load_vertex_data (ops_draw (builder, NULL), &node->bounds, builder);
}
}
-/* Returns TRUE is applying transform to bounds
+/* Returns TRUE if applying @transform to @bounds
* yields an axis-aligned rectangle
*/
static gboolean
@@ -1361,7 +1354,7 @@ render_transform_node (GskGLRenderer *self,
ops_set_program (builder, &self->programs->blit_program);
load_vertex_data_with_region (ops_draw (builder, NULL),
- child, builder,
+ &child->bounds, builder,
&region,
is_offscreen);
ops_pop_modelview (builder);
@@ -1407,7 +1400,7 @@ render_opacity_node (GskGLRenderer *self,
ops_set_texture (builder, region.texture_id);
load_vertex_data_with_region (ops_draw (builder, NULL),
- node, builder,
+ &node->bounds, builder,
&region,
is_offscreen);
}
@@ -1446,7 +1439,7 @@ render_linear_gradient_node (GskGLRenderer *self,
builder->dx + end->x,
builder->dy + end->y);
- load_vertex_data (ops_draw (builder, NULL), node, builder);
+ load_vertex_data (ops_draw (builder, NULL), &node->bounds, builder);
}
else
{
@@ -1480,7 +1473,7 @@ render_radial_gradient_node (GskGLRenderer *self,
hradius * builder->scale_x,
vradius * builder->scale_y);
- load_vertex_data (ops_draw (builder, NULL), node, builder);
+ load_vertex_data (ops_draw (builder, NULL), &node->bounds, builder);
}
else
{
@@ -1774,7 +1767,7 @@ render_color_matrix_node (GskGLRenderer *self,
ops_set_texture (builder, region.texture_id);
load_vertex_data_with_region (ops_draw (builder, NULL),
- node, builder,
+ &node->bounds, builder,
&region,
is_offscreen);
}
@@ -1834,16 +1827,10 @@ blur_texture (GskGLRenderer *self,
op->dir[1] = 0;
ops_set_texture (builder, region->texture_id);
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { 0, }, { region->x, region->y2 }, },
- { { 0, texture_to_blur_height }, { region->x, region->y }, },
- { { texture_to_blur_width, }, { region->x2, region->y2 }, },
-
- { { texture_to_blur_width, texture_to_blur_height }, { region->x2, region->y }, },
- { { 0, texture_to_blur_height }, { region->x, region->y }, },
- { { texture_to_blur_width, }, { region->x2, region->y2 }, },
- });
-
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (0, 0, texture_to_blur_width, texture_to_blur_height),
+ builder, region,
+ FALSE);
#if 0
{
static int k;
@@ -1862,15 +1849,10 @@ blur_texture (GskGLRenderer *self,
ops_set_texture (builder, pass1_texture_id);
ops_set_render_target (builder, pass2_render_target);
ops_begin (builder, OP_CLEAR);
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) { /* render pass 2 */
- { { 0, }, { 0, 1 }, },
- { { 0, texture_to_blur_height }, { 0, 0 }, },
- { { texture_to_blur_width, }, { 1, 1 }, },
-
- { { texture_to_blur_width, texture_to_blur_height }, { 1, 0 }, },
- { { 0, texture_to_blur_height }, { 0, 0 }, },
- { { texture_to_blur_width, }, { 1, 1 }, },
- });
+ load_vertex_data_with_region (ops_draw (builder, NULL), /* render pass 2 */
+ &GRAPHENE_RECT_INIT (0, 0, texture_to_blur_width, texture_to_blur_height),
+ builder, region,
+ FALSE);
#if 0
{
@@ -2001,7 +1983,7 @@ render_unblurred_inset_shadow_node (GskGLRenderer *self,
gsk_inset_shadow_node_peek_color (node),
dx, dy);
- load_vertex_data (ops_draw (builder, NULL), node, builder);
+ load_vertex_data (ops_draw (builder, NULL), &node->bounds, builder);
}
static inline void
@@ -2090,15 +2072,8 @@ render_inset_shadow_node (GskGLRenderer *self,
gsk_inset_shadow_node_peek_color (node),
dx * scale_x, dy * scale_y);
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { 0, 0 }, { 0, 1 }, },
- { { 0, texture_height }, { 0, 0 }, },
- { { texture_width, 0 }, { 1, 1 }, },
-
- { { texture_width, texture_height }, { 1, 0 }, },
- { { 0, texture_height }, { 0, 0 }, },
- { { texture_width, 0 }, { 1, 1 }, },
- });
+ load_float_vertex_data (ops_draw (builder, NULL), builder,
+ 0, 0, texture_width, texture_height);
ops_set_render_target (builder, prev_render_target);
ops_set_viewport (builder, &prev_viewport);
@@ -2138,7 +2113,7 @@ render_inset_shadow_node (GskGLRenderer *self,
ops_set_texture (builder, blurred_texture_id);
load_vertex_data_with_region (ops_draw (builder, NULL),
- node, builder,
+ &node->bounds, builder,
&(TextureRegion) { 0, tx1, ty1, tx2, ty2 },
TRUE);
@@ -2148,15 +2123,30 @@ render_inset_shadow_node (GskGLRenderer *self,
}
+/* Spread *grows* the outline. The offset moves the shadow and leaves the
+ * inner rect where it was */
static inline void
render_unblurred_outset_shadow_node (GskGLRenderer *self,
GskRenderNode *node,
RenderOpBuilder *builder)
{
const GskRoundedRect *outline = gsk_outset_shadow_node_peek_outline (node);
+ const float x = node->bounds.origin.x;
+ const float y = node->bounds.origin.y;
+ const float w = node->bounds.size.width;
+ const float h = node->bounds.size.height;
const float spread = gsk_outset_shadow_node_get_spread (node);
const float dx = gsk_outset_shadow_node_get_dx (node);
const float dy = gsk_outset_shadow_node_get_dy (node);
+ const float edge_sizes[] = { // Top, right, bottom, left
+ spread - dy, spread + dx, spread + dy, spread - dx
+ };
+ const float corner_sizes[][2] = { // top left, top right, bottom right, bottom left
+ { outline->corner[0].width + spread - dx, outline->corner[0].height + spread - dy },
+ { outline->corner[1].width + spread + dx, outline->corner[1].height + spread - dy },
+ { outline->corner[2].width + spread + dx, outline->corner[2].height + spread + dy },
+ { outline->corner[3].width + spread - dx, outline->corner[3].height + spread + dy },
+ };
ops_set_program (builder, &self->programs->unblurred_outset_shadow_program);
ops_set_unblurred_outset_shadow (builder, transform_rect (self, builder, outline),
@@ -2164,7 +2154,40 @@ render_unblurred_outset_shadow_node (GskGLRenderer *self,
gsk_outset_shadow_node_peek_color (node),
dx, dy);
- load_vertex_data (ops_draw (builder, NULL), node, builder);
+ /* Corners... */
+ if (corner_sizes[0][0] > 0 && corner_sizes[0][1] > 0) /* Top left */
+ load_float_vertex_data (ops_draw (builder, NULL), builder,
+ x, y,
+ corner_sizes[0][0], corner_sizes[0][1]);
+ if (corner_sizes[1][0] > 0 && corner_sizes[1][1] > 0) /* Top right */
+ load_float_vertex_data (ops_draw (builder, NULL), builder,
+ x + w - corner_sizes[1][0], y,
+ corner_sizes[1][0], corner_sizes[1][1]);
+ if (corner_sizes[2][0] > 0 && corner_sizes[2][1] > 0) /* Bottom right */
+ load_float_vertex_data (ops_draw (builder, NULL), builder,
+ x + w - corner_sizes[2][0], y + h - corner_sizes[2][1],
+ corner_sizes[2][0], corner_sizes[2][1]);
+ if (corner_sizes[3][0] > 0 && corner_sizes[3][1] > 0) /* Bottom left */
+ load_float_vertex_data (ops_draw (builder, NULL), builder,
+ x, y + h - corner_sizes[3][1],
+ corner_sizes[3][0], corner_sizes[3][1]);
+ /* Edges... */;
+ if (edge_sizes[0] > 0) /* Top */
+ load_float_vertex_data (ops_draw (builder, NULL), builder,
+ x + corner_sizes[0][0], y,
+ w - corner_sizes[0][0] - corner_sizes[1][0], edge_sizes[0]);
+ if (edge_sizes[1] > 0) /* Right */
+ load_float_vertex_data (ops_draw (builder, NULL), builder,
+ x + w - edge_sizes[1], y + corner_sizes[1][1],
+ edge_sizes[1], h - corner_sizes[1][1] - corner_sizes[2][1]);
+ if (edge_sizes[2] > 0) /* Bottom */
+ load_float_vertex_data (ops_draw (builder, NULL), builder,
+ x + corner_sizes[3][0], y + h - edge_sizes[2],
+ w - corner_sizes[3][0] - corner_sizes[2][0], edge_sizes[2]);
+ if (edge_sizes[3] > 0) /* Left */
+ load_float_vertex_data (ops_draw (builder, NULL), builder,
+ x, y + corner_sizes[0][1],
+ edge_sizes[3], h - corner_sizes[0][1] - corner_sizes[3][1]);
}
@@ -2269,15 +2292,8 @@ render_outset_shadow_node (GskGLRenderer *self,
/* Draw outline */
ops_push_clip (builder, &scaled_outline);
ops_set_color (builder, &COLOR_WHITE);
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { 0, }, { 0, 1 }, },
- { { 0, texture_height }, { 0, 0 }, },
- { { texture_width, }, { 1, 1 }, },
-
- { { texture_width, texture_height }, { 1, 0 }, },
- { { 0, texture_height }, { 0, 0 }, },
- { { texture_width, }, { 1, 1 }, },
- });
+ load_float_vertex_data (ops_draw (builder, NULL), builder,
+ 0, 0, texture_width, texture_height);
ops_pop_clip (builder);
ops_set_viewport (builder, &prev_viewport);
@@ -2307,9 +2323,8 @@ render_outset_shadow_node (GskGLRenderer *self,
if (!do_slicing)
{
- const float min_x = floorf (builder->dx + outline->bounds.origin.x - spread - (blur_extra / 2.0) + dx);
- const float min_y = floorf (builder->dy + outline->bounds.origin.y - spread - (blur_extra / 2.0) + dy);
- float x1, x2, y1, y2, tx1, tx2, ty1, ty2;
+ const float min_x = floorf (outline->bounds.origin.x - spread - (blur_extra / 2.0) + dx);
+ const float min_y = floorf (outline->bounds.origin.y - spread - (blur_extra / 2.0) + dy);
ops_set_program (builder, &self->programs->outset_shadow_program);
ops_set_color (builder, color);
@@ -2319,23 +2334,13 @@ render_outset_shadow_node (GskGLRenderer *self,
shadow->outline.value = transform_rect (self, builder, outline);
shadow->outline.send = TRUE;
- tx1 = 0; tx2 = 1;
- ty1 = 0; ty2 = 1;
-
- x1 = min_x;
- x2 = min_x + texture_width / scale_x;
- y1 = min_y;
- y2 = min_y + texture_height / scale_y;
-
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { x1, y1 }, { tx1, ty2 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
-
- { { x2, y2 }, { tx2, ty1 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
- });
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (
+ min_x, min_y,
+ texture_width / scale_x, texture_height / scale_y
+ ), builder,
+ &(TextureRegion) { 0, 0, 0, 1, 1 },
+ FALSE);
return;
}
@@ -2349,13 +2354,12 @@ render_outset_shadow_node (GskGLRenderer *self,
shadow->outline.send = TRUE;
{
- const float min_x = floorf (builder->dx + outline->bounds.origin.x - spread - (blur_extra / 2.0) + dx);
- const float min_y = floorf (builder->dy + outline->bounds.origin.y - spread - (blur_extra / 2.0) + dy);
- const float max_x = ceilf (builder->dx + outline->bounds.origin.x + outline->bounds.size.width +
+ const float min_x = floorf (outline->bounds.origin.x - spread - (blur_extra / 2.0) + dx);
+ const float min_y = floorf (outline->bounds.origin.y - spread - (blur_extra / 2.0) + dy);
+ const float max_x = ceilf (outline->bounds.origin.x + outline->bounds.size.width +
(blur_extra / 2.0) + dx + spread);
- const float max_y = ceilf (builder->dy + outline->bounds.origin.y + outline->bounds.size.height +
+ const float max_y = ceilf (outline->bounds.origin.y + outline->bounds.size.height +
(blur_extra / 2.0) + dy + spread);
- float x1, x2, y1, y2, tx1, tx2, ty1, ty2;
cairo_rectangle_int_t slices[9];
TextureRegion tregs[9];
@@ -2370,222 +2374,138 @@ render_outset_shadow_node (GskGLRenderer *self,
/* Top left */
if (slice_is_visible (&slices[NINE_SLICE_TOP_LEFT]))
{
- x1 = min_x;
- x2 = min_x + (slices[NINE_SLICE_TOP_LEFT].width / scale_x);
- y1 = min_y;
- y2 = min_y + (slices[NINE_SLICE_TOP_LEFT].height / scale_y);
-
- tx1 = tregs[NINE_SLICE_TOP_LEFT].x;
- tx2 = tregs[NINE_SLICE_TOP_LEFT].x2;
- ty1 = tregs[NINE_SLICE_TOP_LEFT].y;
- ty2 = tregs[NINE_SLICE_TOP_LEFT].y2;
-
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { x1, y1 }, { tx1, ty2 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
-
- { { x2, y2 }, { tx2, ty1 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
- });
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (
+ min_x, min_y,
+ slices[NINE_SLICE_TOP_LEFT].width / scale_x,
+ slices[NINE_SLICE_TOP_LEFT].height / scale_y
+ ),
+ builder,
+ &tregs[NINE_SLICE_TOP_LEFT], TRUE);
}
/* Top center */
if (slice_is_visible (&slices[NINE_SLICE_TOP_CENTER]))
{
- x1 = min_x + (slices[NINE_SLICE_TOP_LEFT].width / scale_x);
- x2 = max_x - (slices[NINE_SLICE_TOP_RIGHT].width / scale_x);
- y1 = min_y;
- y2 = min_y + (slices[NINE_SLICE_TOP_CENTER].height / scale_y);
-
- tx1 = tregs[NINE_SLICE_TOP_CENTER].x;
- tx2 = tregs[NINE_SLICE_TOP_CENTER].x2;
- ty1 = tregs[NINE_SLICE_TOP_CENTER].y;
- ty2 = tregs[NINE_SLICE_TOP_CENTER].y2;
-
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { x1, y1 }, { tx1, ty2 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
-
- { { x2, y2 }, { tx2, ty1 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
- });
+ const float width = (max_x - min_x) - (slices[NINE_SLICE_TOP_LEFT].width / scale_x +
+ slices[NINE_SLICE_TOP_RIGHT].width / scale_x);
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (
+ min_x + (slices[NINE_SLICE_TOP_LEFT].width / scale_x),
+ min_y,
+ width,
+ slices[NINE_SLICE_TOP_CENTER].height / scale_y
+ ),
+ builder,
+ &tregs[NINE_SLICE_TOP_CENTER], TRUE);
}
-
/* Top right */
if (slice_is_visible (&slices[NINE_SLICE_TOP_RIGHT]))
{
- x1 = max_x - (slices[NINE_SLICE_TOP_RIGHT].width / scale_x);
- x2 = max_x;
- y1 = min_y;
- y2 = min_y + (slices[NINE_SLICE_TOP_RIGHT].height / scale_y);
-
- tx1 = tregs[NINE_SLICE_TOP_RIGHT].x;
- tx2 = tregs[NINE_SLICE_TOP_RIGHT].x2;
-
- ty1 = tregs[NINE_SLICE_TOP_RIGHT].y;
- ty2 = tregs[NINE_SLICE_TOP_RIGHT].y2;
-
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { x1, y1 }, { tx1, ty2 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
-
- { { x2, y2 }, { tx2, ty1 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
- });
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (
+ max_x - (slices[NINE_SLICE_TOP_RIGHT].width / scale_x),
+ min_y,
+ slices[NINE_SLICE_TOP_RIGHT].width / scale_x,
+ slices[NINE_SLICE_TOP_RIGHT].height / scale_y
+ ),
+ builder,
+ &tregs[NINE_SLICE_TOP_RIGHT], TRUE);
}
/* Bottom right */
if (slice_is_visible (&slices[NINE_SLICE_BOTTOM_RIGHT]))
{
- x1 = max_x - (slices[NINE_SLICE_BOTTOM_RIGHT].width / scale_x);
- x2 = max_x;
- y1 = max_y - (slices[NINE_SLICE_BOTTOM_RIGHT].height / scale_y);
- y2 = max_y;
- tx1 = tregs[NINE_SLICE_BOTTOM_RIGHT].x;
- tx2 = tregs[NINE_SLICE_BOTTOM_RIGHT].x2;
- ty1 = tregs[NINE_SLICE_BOTTOM_RIGHT].y;
- ty2 = tregs[NINE_SLICE_BOTTOM_RIGHT].y2;
-
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { x1, y1 }, { tx1, ty2 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
-
- { { x2, y2 }, { tx2, ty1 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
- });
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (
+ max_x - (slices[NINE_SLICE_BOTTOM_RIGHT].width / scale_x),
+ max_y - (slices[NINE_SLICE_BOTTOM_RIGHT].height / scale_y),
+ slices[NINE_SLICE_BOTTOM_RIGHT].width / scale_x,
+ slices[NINE_SLICE_BOTTOM_RIGHT].height / scale_y
+ ),
+ builder,
+ &tregs[NINE_SLICE_BOTTOM_RIGHT], TRUE);
}
/* Bottom left */
if (slice_is_visible (&slices[NINE_SLICE_BOTTOM_LEFT]))
{
- x1 = min_x;
- x2 = min_x + (slices[NINE_SLICE_BOTTOM_LEFT].width / scale_x);
- y1 = max_y - (slices[NINE_SLICE_BOTTOM_LEFT].height / scale_y);
- y2 = max_y;
-
- tx1 = tregs[NINE_SLICE_BOTTOM_LEFT].x;
- tx2 = tregs[NINE_SLICE_BOTTOM_LEFT].x2;
- ty1 = tregs[NINE_SLICE_BOTTOM_LEFT].y;
- ty2 = tregs[NINE_SLICE_BOTTOM_LEFT].y2;
-
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { x1, y1 }, { tx1, ty2 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
-
- { { x2, y2 }, { tx2, ty1 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
- });
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (
+ min_x,
+ max_y - (slices[NINE_SLICE_BOTTOM_LEFT].height / scale_y),
+ slices[NINE_SLICE_BOTTOM_LEFT].width / scale_x,
+ slices[NINE_SLICE_BOTTOM_LEFT].height / scale_y
+ ),
+ builder,
+ &tregs[NINE_SLICE_BOTTOM_LEFT], TRUE);
}
/* Left side */
if (slice_is_visible (&slices[NINE_SLICE_LEFT_CENTER]))
{
- x1 = min_x;
- x2 = min_x + (slices[NINE_SLICE_LEFT_CENTER].width / scale_x);
- y1 = min_y + (slices[NINE_SLICE_TOP_LEFT].height / scale_y);
- y2 = max_y - (slices[NINE_SLICE_BOTTOM_LEFT].height / scale_y);
- tx1 = tregs[NINE_SLICE_LEFT_CENTER].x;
- tx2 = tregs[NINE_SLICE_LEFT_CENTER].x2;
- ty1 = tregs[NINE_SLICE_LEFT_CENTER].y;
- ty2 = tregs[NINE_SLICE_LEFT_CENTER].y2;
-
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { x1, y1 }, { tx1, ty2 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
-
- { { x2, y2 }, { tx2, ty1 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
- });
+ const float height = (max_y - min_y) - (slices[NINE_SLICE_TOP_LEFT].height / scale_y +
+ slices[NINE_SLICE_BOTTOM_LEFT].height / scale_y);
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (
+ min_x,
+ min_y + (slices[NINE_SLICE_TOP_LEFT].height / scale_y),
+ slices[NINE_SLICE_LEFT_CENTER].width / scale_x,
+ height
+ ),
+ builder,
+ &tregs[NINE_SLICE_LEFT_CENTER], TRUE);
}
/* Right side */
if (slice_is_visible (&slices[NINE_SLICE_RIGHT_CENTER]))
{
- x1 = max_x - (slices[NINE_SLICE_RIGHT_CENTER].width / scale_x);
- x2 = max_x;
- y1 = min_y + (slices[NINE_SLICE_TOP_RIGHT].height / scale_y);
- y2 = max_y - (slices[NINE_SLICE_BOTTOM_RIGHT].height / scale_y);
-
- tx1 = tregs[NINE_SLICE_RIGHT_CENTER].x;
- tx2 = tregs[NINE_SLICE_RIGHT_CENTER].x2;
-
- ty1 = tregs[NINE_SLICE_RIGHT_CENTER].y;
- ty2 = tregs[NINE_SLICE_RIGHT_CENTER].y2;
-
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { x1, y1 }, { tx1, ty2 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
-
- { { x2, y2 }, { tx2, ty1 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
- });
+ const float height = (max_y - min_y) - (slices[NINE_SLICE_TOP_RIGHT].height / scale_y +
+ slices[NINE_SLICE_BOTTOM_RIGHT].height / scale_y);
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (
+ max_x - (slices[NINE_SLICE_RIGHT_CENTER].width / scale_x),
+ min_y + (slices[NINE_SLICE_TOP_LEFT].height / scale_y),
+ slices[NINE_SLICE_RIGHT_CENTER].width / scale_x,
+ height
+ ),
+ builder,
+ &tregs[NINE_SLICE_RIGHT_CENTER], TRUE);
}
/* Bottom side */
if (slice_is_visible (&slices[NINE_SLICE_BOTTOM_CENTER]))
{
- x1 = min_x + (slices[NINE_SLICE_BOTTOM_LEFT].width / scale_x);
- x2 = max_x - (slices[NINE_SLICE_BOTTOM_RIGHT].width / scale_x);
- y1 = max_y - (slices[NINE_SLICE_BOTTOM_CENTER].height / scale_y);
- y2 = max_y;
-
- tx1 = tregs[NINE_SLICE_BOTTOM_CENTER].x;
- tx2 = tregs[NINE_SLICE_BOTTOM_CENTER].x2;
-
- ty1 = tregs[NINE_SLICE_BOTTOM_CENTER].y;
- ty2 = tregs[NINE_SLICE_BOTTOM_CENTER].y2;
-
-
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { x1, y1 }, { tx1, ty2 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
-
- { { x2, y2 }, { tx2, ty1 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
- });
+ const float width = (max_x - min_x) - (slices[NINE_SLICE_BOTTOM_LEFT].width / scale_x +
+ slices[NINE_SLICE_BOTTOM_RIGHT].width / scale_x);
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (
+ min_x + (slices[NINE_SLICE_BOTTOM_LEFT].width / scale_x),
+ max_y - (slices[NINE_SLICE_BOTTOM_CENTER].height / scale_y),
+ width,
+ slices[NINE_SLICE_BOTTOM_CENTER].height / scale_y
+ ),
+ builder,
+ &tregs[NINE_SLICE_BOTTOM_CENTER], TRUE);
}
/* Middle */
if (slice_is_visible (&slices[NINE_SLICE_CENTER]))
{
- x1 = min_x + (slices[NINE_SLICE_LEFT_CENTER].width / scale_x);
- x2 = max_x - (slices[NINE_SLICE_RIGHT_CENTER].width / scale_x);
- y1 = min_y + (slices[NINE_SLICE_TOP_CENTER].height / scale_y);
- y2 = max_y - (slices[NINE_SLICE_BOTTOM_CENTER].height / scale_y);
-
- tx1 = tregs[NINE_SLICE_CENTER].x;
- tx2 = tregs[NINE_SLICE_CENTER].x2;
-
- ty1 = tregs[NINE_SLICE_CENTER].y;
- ty2 = tregs[NINE_SLICE_CENTER].y2;
-
- ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { x1, y1 }, { tx1, ty2 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
-
- { { x2, y2 }, { tx2, ty1 }, },
- { { x1, y2 }, { tx1, ty1 }, },
- { { x2, y1 }, { tx2, ty2 }, },
- });
+ const float width = (max_x - min_x) - (slices[NINE_SLICE_LEFT_CENTER].width / scale_x +
+ slices[NINE_SLICE_RIGHT_CENTER].width / scale_x);
+ const float height = (max_y - min_y) - (slices[NINE_SLICE_TOP_CENTER].height / scale_y +
+ slices[NINE_SLICE_BOTTOM_CENTER].height / scale_y);
+
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &GRAPHENE_RECT_INIT (
+ min_x + (slices[NINE_SLICE_LEFT_CENTER].width / scale_x),
+ min_y + (slices[NINE_SLICE_TOP_CENTER].height / scale_y),
+ width, height
+ ),
+ builder,
+ &tregs[NINE_SLICE_CENTER], TRUE);
}
-
}
}
@@ -2614,10 +2534,7 @@ render_shadow_node (GskGLRenderer *self,
const float dy = shadow->dy;
TextureRegion region;
gboolean is_offscreen;
- float min_x;
- float min_y;
- float max_x;
- float max_y;
+ graphene_rect_t bounds;
if (shadow->radius == 0 &&
gsk_render_node_get_node_type (shadow_child) == GSK_TEXT_NODE)
@@ -2636,9 +2553,18 @@ render_shadow_node (GskGLRenderer *self,
if (shadow->radius > 0)
{
+ float min_x;
+ float min_y;
+ float max_x;
+ float max_y;
+
region.texture_id = 0;
blur_node (self, shadow_child, builder, shadow->radius, NO_CACHE_PLZ, &region,
(float*[4]){&min_x, &max_x, &min_y, &max_y});
+ bounds.origin.x = min_x - builder->dx;
+ bounds.origin.y = min_y - builder->dy;
+ bounds.size.width = max_x - min_x;
+ bounds.size.height = max_y - min_y;
is_offscreen = TRUE;
}
else if (dx == 0 && dy == 0)
@@ -2653,43 +2579,19 @@ render_shadow_node (GskGLRenderer *self,
RESET_CLIP | RESET_OPACITY | NO_CACHE_PLZ))
g_assert_not_reached ();
- min_x = builder->dx + shadow_child->bounds.origin.x;
- min_y = builder->dy + shadow_child->bounds.origin.y;
- max_x = min_x + shadow_child->bounds.size.width;
- max_y = min_y + shadow_child->bounds.size.height;
+ bounds = shadow_child->bounds;
}
ops_set_program (builder, &self->programs->coloring_program);
ops_set_color (builder, &shadow->color);
ops_set_texture (builder, region.texture_id);
- if (is_offscreen)
- {
- const GskQuadVertex offscreen_vertex_data[GL_N_VERTICES] = {
- { { dx + min_x, dy + min_y }, { region.x, region.y2 }, },
- { { dx + min_x, dy + max_y }, { region.x, region.y }, },
- { { dx + max_x, dy + min_y }, { region.x2, region.y2 }, },
- { { dx + max_x, dy + max_y }, { region.x2, region.y }, },
- { { dx + min_x, dy + max_y }, { region.x, region.y }, },
- { { dx + max_x, dy + min_y }, { region.x2, region.y2 }, },
- };
-
- ops_draw (builder, offscreen_vertex_data);
- }
- else
- {
- const GskQuadVertex onscreen_vertex_data[GL_N_VERTICES] = {
- { { dx + min_x, dy + min_y }, { region.x, region.y }, },
- { { dx + min_x, dy + max_y }, { region.x, region.y2 }, },
- { { dx + max_x, dy + min_y }, { region.x2, region.y }, },
-
- { { dx + max_x, dy + max_y }, { region.x2, region.y2 }, },
- { { dx + min_x, dy + max_y }, { region.x, region.y2 }, },
- { { dx + max_x, dy + min_y }, { region.x2, region.y }, },
- };
-
- ops_draw (builder, onscreen_vertex_data);
- }
+ ops_offset (builder, dx, dy);
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ &bounds, builder,
+ &region,
+ is_offscreen);
+ ops_offset (builder, -dx, -dy);
}
/* Now draw the child normally */
@@ -2788,7 +2690,7 @@ render_blend_node (GskGLRenderer *self,
FORCE_OFFSCREEN | RESET_CLIP))
{
load_vertex_data_with_region (ops_draw (builder, NULL),
- node,
+ &node->bounds,
builder,
&bottom_region,
TRUE);
@@ -2867,7 +2769,7 @@ render_repeat_node (GskGLRenderer *self,
}
load_vertex_data_with_region (ops_draw (builder, NULL),
- node, builder,
+ &node->bounds, builder,
&region,
is_offscreen);
}
@@ -4416,16 +4318,8 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer,
graphene_matrix_scale (&m, 1, -1, 1); /* Undo the scale init_projection_matrix() does again */
ops_set_projection (&self->op_builder, &m);
- ops_draw (&self->op_builder, (GskQuadVertex[GL_N_VERTICES]) {
- { { 0, 0 }, { 0, 1 }, },
- { { 0, height }, { 0, 0 }, },
- { { width, 0 }, { 1, 1 }, },
-
- { { width, height }, { 1, 0 }, },
- { { 0, height }, { 0, 0 }, },
- { { width, 0 }, { 1, 1 }, },
- });
-
+ fill_vertex_data (ops_draw (&self->op_builder, NULL),
+ 0, 0, width, height);
ops_pop_clip (&self->op_builder);
gsk_gl_renderer_render_ops (self);
diff --git a/gsk/gskrenderer.c b/gsk/gskrenderer.c
index 8ec0e0d36a..dbbfd28f35 100644
--- a/gsk/gskrenderer.c
+++ b/gsk/gskrenderer.c
@@ -606,7 +606,11 @@ static struct {
*
* Creates an appropriate #GskRenderer instance for the given @surface.
*
- * The renderer will be realized when it is returned.
+ * If the `GSK_RENDERER` environment variable is set, GSK will
+ * try that renderer first, before trying the backend-specific
+ * default. The ultimate fallback is the cairo renderer.
+ *
+ * The renderer will be realized before it is returned.
*
* Returns: (transfer full) (nullable): a #GskRenderer
*/
diff --git a/gsk/meson.build b/gsk/meson.build
index e71ac50c78..4ea6091a94 100644
--- a/gsk/meson.build
+++ b/gsk/meson.build
@@ -40,11 +40,9 @@ gsk_private_sources = files([
'gl/gskglshaderbuilder.c',
'gl/gskglprofiler.c',
'gl/gskglglyphcache.c',
- 'gl/gskglimage.c',
'gl/gskgldriver.c',
'gl/gskglrenderops.c',
'gl/gskglshadowcache.c',
- 'gl/gskglnodesample.c',
'gl/gskgltextureatlas.c',
'gl/gskgliconcache.c',
'gl/opbuffer.c',
diff --git a/gtk/a11y/gtkatspicache.c b/gtk/a11y/gtkatspicache.c
index 9681fd613e..935af5acd1 100644
--- a/gtk/a11y/gtkatspicache.c
+++ b/gtk/a11y/gtkatspicache.c
@@ -95,8 +95,9 @@ handle_cache_method (GDBusConnection *connection,
GDBusMethodInvocation *invocation,
gpointer user_data)
{
- g_printerr ("[Cache] Method '%s' on interface '%s' for object '%s' from '%s'\n",
- method_name, interface_name, object_path, sender);
+ GTK_NOTE (A11Y,
+ g_message ("[Cache] Method '%s' on interface '%s' for object '%s' from '%s'\n",
+ method_name, interface_name, object_path, sender));
}
diff --git a/gtk/a11y/gtkatspicontext.c b/gtk/a11y/gtkatspicontext.c
index 7bcdc57862..7b3db2cf6b 100644
--- a/gtk/a11y/gtkatspicontext.c
+++ b/gtk/a11y/gtkatspicontext.c
@@ -307,11 +307,8 @@ collect_relations (GtkAtSpiContext *self,
GtkAccessibleValue *value;
GList *list, *l;
GtkATContext *target_ctx;
- const char *unique_name;
int i;
- unique_name = g_dbus_connection_get_unique_name (self->connection);
-
for (i = 0; i < G_N_ELEMENTS (map); i++)
{
if (!gtk_at_context_has_accessible_relation (ctx, map[i].r))
@@ -325,9 +322,12 @@ collect_relations (GtkAtSpiContext *self,
for (l = list; l; l = l->next)
{
target_ctx = gtk_accessible_get_at_context (GTK_ACCESSIBLE (l->data));
- g_variant_builder_add (&b, "(so)",
- unique_name,
- GTK_AT_SPI_CONTEXT (target_ctx)->context_path);
+
+ /* Realize the ATContext of the target, so we can ask for its ref */
+ gtk_at_context_realize (target_ctx);
+
+ g_variant_builder_add (&b, "@(so)",
+ gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (target_ctx)));
}
g_variant_builder_add (builder, "(ua(so))", map[i].s, &b);
@@ -386,6 +386,66 @@ get_index_in_toplevels (GtkWidget *widget)
return -1;
}
+static GVariant *
+get_parent_context_ref (GtkAccessible *accessible)
+{
+ GVariant *res = NULL;
+
+ if (GTK_IS_WIDGET (accessible))
+ {
+ GtkWidget *widget = GTK_WIDGET (accessible);
+ GtkWidget *parent = gtk_widget_get_parent (widget);
+
+ if (parent == NULL)
+ {
+ GtkATContext *context = gtk_accessible_get_at_context (accessible);
+ GtkAtSpiContext *self = GTK_AT_SPI_CONTEXT (context);
+
+ res = gtk_at_spi_root_to_ref (self->root);
+ }
+ else if (GTK_IS_STACK (parent))
+ {
+ GtkStackPage *page =
+ gtk_stack_get_page (GTK_STACK (parent), widget);
+ GtkATContext *parent_context =
+ gtk_accessible_get_at_context (GTK_ACCESSIBLE (page));
+
+ if (parent_context != NULL)
+ res = gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (parent_context));
+ }
+ else
+ {
+ GtkATContext *parent_context =
+ gtk_accessible_get_at_context (GTK_ACCESSIBLE (parent));
+
+ if (parent_context != NULL)
+ {
+ /* XXX: This realize() is needed otherwise opening a GtkPopover will
+ * emit a warning when getting the context's reference
+ */
+ gtk_at_context_realize (parent_context);
+
+ res = gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (parent_context));
+ }
+ }
+ }
+ else if (GTK_IS_STACK_PAGE (accessible))
+ {
+ GtkWidget *parent =
+ gtk_widget_get_parent (gtk_stack_page_get_child (GTK_STACK_PAGE (accessible)));
+ GtkATContext *parent_context =
+ gtk_accessible_get_at_context (GTK_ACCESSIBLE (parent));
+
+ if (parent_context != NULL)
+ res = gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (parent_context));
+ }
+
+ if (res == NULL)
+ res = gtk_at_spi_null_ref ();
+
+ return res;
+}
+
static void
handle_accessible_method (GDBusConnection *connection,
const gchar *sender,
@@ -457,8 +517,6 @@ handle_accessible_method (GDBusConnection *connection,
GtkATContext *context = NULL;
GtkAccessible *accessible;
int idx, real_idx = 0;
- const char *name;
- const char *path;
g_variant_get (parameters, "(i)", &idx);
@@ -512,10 +570,12 @@ handle_accessible_method (GDBusConnection *connection,
return;
}
- name = g_dbus_connection_get_unique_name (self->connection);
- path = gtk_at_spi_context_get_context_path (GTK_AT_SPI_CONTEXT (context));
+ /* Realize the child ATContext in order to get its ref */
+ gtk_at_context_realize (context);
+
+ GVariant *ref = gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (context));
- g_dbus_method_invocation_return_value (invocation, g_variant_new ("((so))", name, path));
+ g_dbus_method_invocation_return_value (invocation, g_variant_new ("(@(so))", ref));
}
else if (g_strcmp0 (method_name, "GetChildren") == 0)
{
@@ -536,10 +596,13 @@ handle_accessible_method (GDBusConnection *connection,
GtkATContext *context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (child));
- const char *name = g_dbus_connection_get_unique_name (self->connection);
- const char *path = gtk_at_spi_context_get_context_path (GTK_AT_SPI_CONTEXT (context));
+ /* Realize the child ATContext in order to get its ref */
+ gtk_at_context_realize (context);
+
+ GVariant *ref = gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (context));
- g_variant_builder_add (&builder, "(so)", name, path);
+ if (ref != NULL)
+ g_variant_builder_add (&builder, "@(so)", ref);
}
}
else if (GTK_IS_STACK_PAGE (accessible))
@@ -549,9 +612,14 @@ handle_accessible_method (GDBusConnection *connection,
if (gtk_accessible_should_present (GTK_ACCESSIBLE (child)))
{
GtkATContext *context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (child));
- const char *name = g_dbus_connection_get_unique_name (self->connection);
- const char *path = gtk_at_spi_context_get_context_path (GTK_AT_SPI_CONTEXT (context));
- g_variant_builder_add (&builder, "(so)", name, path);
+
+ /* Realize the child ATContext in order to get its ref */
+ gtk_at_context_realize (context);
+
+ GVariant *ref = gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (context));
+
+ if (ref != NULL)
+ g_variant_builder_add (&builder, "@(so)", ref);
}
}
@@ -579,7 +647,7 @@ handle_accessible_method (GDBusConnection *connection,
else if (g_strcmp0 (method_name, "GetRelationSet") == 0)
{
GVariantBuilder builder = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE ("a(ua(so))"));
- collect_relations (self, &builder);
+ collect_relations (self, &builder);
g_dbus_method_invocation_return_value (invocation, g_variant_new ("(a(ua(so)))", &builder));
}
else if (g_strcmp0 (method_name, "GetInterfaces") == 0)
@@ -620,53 +688,7 @@ handle_accessible_get_property (GDBusConnection *connection,
else if (g_strcmp0 (property_name, "AccessibleId") == 0)
res = g_variant_new_string ("");
else if (g_strcmp0 (property_name, "Parent") == 0)
- {
- if (GTK_IS_WIDGET (accessible))
- {
- GtkWidget *parent = gtk_widget_get_parent (GTK_WIDGET (accessible));
-
- if (parent == NULL)
- {
- res = gtk_at_spi_root_to_ref (self->root);
- }
- else if (GTK_IS_STACK (parent))
- {
- GtkStackPage *page =
- gtk_stack_get_page (GTK_STACK (parent), GTK_WIDGET (accessible));
- GtkATContext *parent_context =
- gtk_accessible_get_at_context (GTK_ACCESSIBLE (page));
-
- if (parent_context != NULL)
- res = g_variant_new ("(so)",
- g_dbus_connection_get_unique_name (self->connection),
- GTK_AT_SPI_CONTEXT (parent_context)->context_path);
- }
- else
- {
- GtkATContext *parent_context =
- gtk_accessible_get_at_context (GTK_ACCESSIBLE (parent));
-
- if (parent_context != NULL)
- res = g_variant_new ("(so)",
- g_dbus_connection_get_unique_name (self->connection),
- GTK_AT_SPI_CONTEXT (parent_context)->context_path);
- }
- }
- else if (GTK_IS_STACK_PAGE (accessible))
- {
- GtkWidget *parent = gtk_widget_get_parent (gtk_stack_page_get_child (GTK_STACK_PAGE (accessible)));
- GtkATContext *parent_context =
- gtk_accessible_get_at_context (GTK_ACCESSIBLE (parent));
-
- if (parent_context != NULL)
- res = g_variant_new ("(so)",
- g_dbus_connection_get_unique_name (self->connection),
- GTK_AT_SPI_CONTEXT (parent_context)->context_path);
- }
-
- if (res == NULL)
- res = gtk_at_spi_null_ref ();
- }
+ res = get_parent_context_ref (accessible);
else if (g_strcmp0 (property_name, "ChildCount") == 0)
{
int n_children = 0;
@@ -713,6 +735,9 @@ emit_text_changed (GtkAtSpiContext *self,
int end,
const char *text)
{
+ if (self->connection == NULL)
+ return;
+
g_dbus_connection_emit_signal (self->connection,
NULL,
self->context_path,
@@ -728,6 +753,9 @@ emit_text_selection_changed (GtkAtSpiContext *self,
const char *kind,
int cursor_position)
{
+ if (self->connection == NULL)
+ return;
+
if (strcmp (kind, "text-caret-moved") == 0)
g_dbus_connection_emit_signal (self->connection,
NULL,
@@ -752,6 +780,9 @@ static void
emit_selection_changed (GtkAtSpiContext *self,
const char *kind)
{
+ if (self->connection == NULL)
+ return;
+
g_dbus_connection_emit_signal (self->connection,
NULL,
self->context_path,
@@ -767,6 +798,9 @@ emit_state_changed (GtkAtSpiContext *self,
const char *name,
gboolean enabled)
{
+ if (self->connection == NULL)
+ return;
+
g_dbus_connection_emit_signal (self->connection,
NULL,
self->context_path,
@@ -778,10 +812,28 @@ emit_state_changed (GtkAtSpiContext *self,
}
static void
+emit_defunct (GtkAtSpiContext *self)
+{
+ if (self->connection == NULL)
+ return;
+
+ g_dbus_connection_emit_signal (self->connection,
+ NULL,
+ self->context_path,
+ "org.a11y.atspi.Event.Object",
+ "StateChanged",
+ g_variant_new ("(siiva{sv})", "defunct", TRUE, 0, g_variant_new_string ("0"), NULL),
+ NULL);
+}
+
+static void
emit_property_changed (GtkAtSpiContext *self,
const char *name,
GVariant *value)
{
+ if (self->connection == NULL)
+ return;
+
g_dbus_connection_emit_signal (self->connection,
NULL,
self->context_path,
@@ -799,6 +851,9 @@ emit_bounds_changed (GtkAtSpiContext *self,
int width,
int height)
{
+ if (self->connection == NULL)
+ return;
+
g_dbus_connection_emit_signal (self->connection,
NULL,
self->context_path,
@@ -815,8 +870,12 @@ emit_children_changed (GtkAtSpiContext *self,
int idx,
GtkAccessibleChildState state)
{
- GVariant *child_ref = gtk_at_spi_context_to_ref (child_context);
+ /* If we don't have a connection on either contexts, we cannot emit a signal */
+ if (self->connection == NULL || child_context->connection == NULL)
+ return;
+
GVariant *context_ref = gtk_at_spi_context_to_ref (self);
+ GVariant *child_ref = gtk_at_spi_context_to_ref (child_context);
gtk_at_spi_emit_children_changed (self->connection,
self->context_path,
@@ -1312,6 +1371,10 @@ gtk_at_spi_context_register_object (GtkAtSpiContext *self)
}
self->interfaces = g_variant_ref_sink (g_variant_builder_end (&interfaces));
+
+ GTK_NOTE (A11Y, g_message ("Registered %d interfaces on object path '%s'",
+ self->n_registered_objects,
+ self->context_path));
}
static void
@@ -1328,22 +1391,11 @@ gtk_at_spi_context_unregister_object (GtkAtSpiContext *self)
/* }}} */
/* {{{ GObject boilerplate */
static void
-gtk_at_spi_context_dispose (GObject *gobject)
+gtk_at_spi_context_finalize (GObject *gobject)
{
GtkAtSpiContext *self = GTK_AT_SPI_CONTEXT (gobject);
- GtkAccessible *accessible = gtk_at_context_get_accessible (GTK_AT_CONTEXT (self));
gtk_at_spi_context_unregister_object (self);
- gtk_atspi_disconnect_text_signals (accessible);
- gtk_atspi_disconnect_selection_signals (accessible);
-
- G_OBJECT_CLASS (gtk_at_spi_context_parent_class)->dispose (gobject);
-}
-
-static void
-gtk_at_spi_context_finalize (GObject *gobject)
-{
- GtkAtSpiContext *self = GTK_AT_SPI_CONTEXT (gobject);
g_free (self->bus_address);
g_free (self->context_path);
@@ -1394,29 +1446,10 @@ static void
gtk_at_spi_context_constructed (GObject *gobject)
{
GtkAtSpiContext *self = GTK_AT_SPI_CONTEXT (gobject);
- GdkDisplay *display;
+ GdkDisplay *display = gtk_at_context_get_display (GTK_AT_CONTEXT (self));
g_assert (self->bus_address);
- /* Every GTK application has a single root AT-SPI object, which
- * handles all the global state, including the cache of accessible
- * objects. We use the GdkDisplay to store it, so it's guaranteed
- * to be unique per-display connection
- */
- display = gtk_at_context_get_display (GTK_AT_CONTEXT (self));
- self->root =
- g_object_get_data (G_OBJECT (display), "-gtk-atspi-root");
-
- if (self->root == NULL)
- {
- self->root = gtk_at_spi_root_new (self->bus_address);
- g_object_set_data_full (G_OBJECT (display), "-gtk-atspi-root",
- self->root,
- g_object_unref);
- }
-
- self->connection = gtk_at_spi_root_get_connection (self->root);
-
/* We use the application's object path to build the path of each
* accessible object exposed on the accessibility bus; the path is
* also used to access the object cache
@@ -1456,7 +1489,39 @@ gtk_at_spi_context_constructed (GObject *gobject)
g_free (base_path);
g_free (uuid);
- GtkAccessible *accessible = gtk_at_context_get_accessible (GTK_AT_CONTEXT (self));
+ /* Every GTK application has a single root AT-SPI object, which
+ * handles all the global state, including the cache of accessible
+ * objects. We use the GdkDisplay to store it, so it's guaranteed
+ * to be unique per-display connection
+ */
+ self->root =
+ g_object_get_data (G_OBJECT (display), "-gtk-atspi-root");
+
+ if (self->root == NULL)
+ {
+ self->root = gtk_at_spi_root_new (self->bus_address);
+ g_object_set_data_full (G_OBJECT (display), "-gtk-atspi-root",
+ self->root,
+ g_object_unref);
+ }
+
+ G_OBJECT_CLASS (gtk_at_spi_context_parent_class)->constructed (gobject);
+}
+
+static void
+gtk_at_spi_context_realize (GtkATContext *context)
+{
+ GtkAtSpiContext *self = GTK_AT_SPI_CONTEXT (context);
+
+ self->connection = gtk_at_spi_root_get_connection (self->root);
+ if (self->connection == NULL)
+ return;
+
+ GtkAccessible *accessible = gtk_at_context_get_accessible (context);
+ GTK_NOTE (A11Y, g_message ("Realizing ATSPI context at '%s' for accessible '%s'",
+ self->context_path,
+ G_OBJECT_TYPE_NAME (accessible)));
+
gtk_atspi_connect_text_signals (accessible,
(GtkAtspiTextChangedCallback *)emit_text_changed,
(GtkAtspiTextSelectionCallback *)emit_text_selection_changed,
@@ -1466,7 +1531,25 @@ gtk_at_spi_context_constructed (GObject *gobject)
self);
gtk_at_spi_context_register_object (self);
- G_OBJECT_CLASS (gtk_at_spi_context_parent_class)->constructed (gobject);
+ gtk_at_spi_root_queue_register (self->root);
+}
+
+static void
+gtk_at_spi_context_unrealize (GtkATContext *context)
+{
+ GtkAtSpiContext *self = GTK_AT_SPI_CONTEXT (context);
+ GtkAccessible *accessible = gtk_at_context_get_accessible (context);
+
+ GTK_NOTE (A11Y, g_message ("Unrealizing ATSPI context at '%s' for accessible '%s'",
+ self->context_path,
+ G_OBJECT_TYPE_NAME (accessible)));
+
+ /* Notify ATs that the accessible object is going away */
+ emit_defunct (self);
+
+ gtk_atspi_disconnect_text_signals (accessible);
+ gtk_atspi_disconnect_selection_signals (accessible);
+ gtk_at_spi_context_unregister_object (self);
}
static void
@@ -1479,8 +1562,9 @@ gtk_at_spi_context_class_init (GtkAtSpiContextClass *klass)
gobject_class->set_property = gtk_at_spi_context_set_property;
gobject_class->get_property = gtk_at_spi_context_get_property;
gobject_class->finalize = gtk_at_spi_context_finalize;
- gobject_class->dispose = gtk_at_spi_context_dispose;
+ context_class->realize = gtk_at_spi_context_realize;
+ context_class->unrealize = gtk_at_spi_context_unrealize;
context_class->state_change = gtk_at_spi_context_state_change;
context_class->platform_change = gtk_at_spi_context_platform_change;
context_class->bounds_change = gtk_at_spi_context_bounds_change;
diff --git a/gtk/a11y/gtkatspiroot.c b/gtk/a11y/gtkatspiroot.c
index c4c09bdae1..e9a174990e 100644
--- a/gtk/a11y/gtkatspiroot.c
+++ b/gtk/a11y/gtkatspiroot.c
@@ -61,6 +61,7 @@ struct _GtkAtSpiRoot
char *desktop_path;
gint32 application_id;
+ guint register_id;
GtkAtSpiCache *cache;
@@ -83,6 +84,8 @@ gtk_at_spi_root_finalize (GObject *gobject)
{
GtkAtSpiRoot *self = GTK_AT_SPI_ROOT (gobject);
+ g_clear_handle_id (&self->register_id, g_source_remove);
+
g_free (self->bus_address);
g_free (self->desktop_name);
g_free (self->desktop_path);
@@ -499,9 +502,12 @@ on_registration_reply (GObject *gobject,
self->toplevels = gtk_window_get_toplevels ();
}
-static void
-gtk_at_spi_root_register (GtkAtSpiRoot *self)
+static gboolean
+root_register (gpointer data)
{
+ GtkAtSpiRoot *self = data;
+ const char *unique_name;
+
/* Register the root element; every application has a single root, so we only
* need to do this once.
*
@@ -524,6 +530,8 @@ gtk_at_spi_root_register (GtkAtSpiRoot *self)
self->atspi_version = ATSPI_VERSION;
self->root_path = ATSPI_ROOT_PATH;
+ unique_name = g_dbus_connection_get_unique_name (self->connection);
+
g_dbus_connection_register_object (self->connection,
self->root_path,
(GDBusInterfaceInfo *) &atspi_application_interface,
@@ -540,7 +548,7 @@ gtk_at_spi_root_register (GtkAtSpiRoot *self)
NULL);
GTK_NOTE (A11Y, g_message ("Registering (%s, %s) on the a11y bus",
- g_dbus_connection_get_unique_name (self->connection),
+ unique_name,
self->root_path));
g_dbus_connection_call (self->connection,
@@ -548,15 +556,37 @@ gtk_at_spi_root_register (GtkAtSpiRoot *self)
ATSPI_ROOT_PATH,
"org.a11y.atspi.Socket",
"Embed",
- g_variant_new ("((so))",
- g_dbus_connection_get_unique_name (self->connection),
- self->root_path
- ),
+ g_variant_new ("((so))", unique_name, self->root_path),
G_VARIANT_TYPE ("((so))"),
G_DBUS_CALL_FLAGS_NONE, -1,
NULL,
on_registration_reply,
self);
+
+ self->register_id = 0;
+
+ return G_SOURCE_REMOVE;
+}
+
+/*< private >
+ * gtk_at_spi_root_queue_register:
+ * @self: a #GtkAtSpiRoot
+ *
+ * Queues the registration of the root object on the AT-SPI bus.
+ */
+void
+gtk_at_spi_root_queue_register (GtkAtSpiRoot *self)
+{
+ /* Ignore multiple registration requests while one is already in flight */
+ if (self->register_id != 0)
+ return;
+
+ /* The cache is only available once the registration succeeds */
+ if (self->cache != NULL)
+ return;
+
+ self->register_id = g_idle_add (root_register, self);
+ g_source_set_name_by_id (self->register_id, "[gtk] ATSPI root registration");
}
static void
@@ -583,8 +613,6 @@ gtk_at_spi_root_constructed (GObject *gobject)
goto out;
}
- gtk_at_spi_root_register (self);
-
out:
G_OBJECT_CLASS (gtk_at_spi_root_parent_class)->constructed (gobject);
}
diff --git a/gtk/a11y/gtkatspirootprivate.h b/gtk/a11y/gtkatspirootprivate.h
index f5ae272999..7a99e7c254 100644
--- a/gtk/a11y/gtkatspirootprivate.h
+++ b/gtk/a11y/gtkatspirootprivate.h
@@ -33,6 +33,9 @@ G_DECLARE_FINAL_TYPE (GtkAtSpiRoot, gtk_at_spi_root, GTK, AT_SPI_ROOT, GObject)
GtkAtSpiRoot *
gtk_at_spi_root_new (const char *bus_address);
+void
+gtk_at_spi_root_queue_register (GtkAtSpiRoot *self);
+
GDBusConnection *
gtk_at_spi_root_get_connection (GtkAtSpiRoot *self);
diff --git a/gtk/a11y/gtkatspiutils.c b/gtk/a11y/gtkatspiutils.c
index fad5ee10fd..7ec3193b9b 100644
--- a/gtk/a11y/gtkatspiutils.c
+++ b/gtk/a11y/gtkatspiutils.c
@@ -167,7 +167,7 @@ gtk_accessible_role_to_atspi_role (GtkAccessibleRole role)
return ATSPI_ROLE_OPTION_PANE;
case GTK_ACCESSIBLE_ROLE_PRESENTATION:
- return ATSPI_ROLE_DOCUMENT_PRESENTATION;
+ return ATSPI_ROLE_SECTION;
case GTK_ACCESSIBLE_ROLE_PROGRESS_BAR:
return ATSPI_ROLE_PROGRESS_BAR;
diff --git a/gtk/css/gtkcsstokenizer.c b/gtk/css/gtkcsstokenizer.c
index 607c4d6992..203d7f3a45 100644
--- a/gtk/css/gtkcsstokenizer.c
+++ b/gtk/css/gtkcsstokenizer.c
@@ -1349,7 +1349,7 @@ gtk_css_tokenizer_read_token (GtkCssTokenizer *tokenizer,
tokenizer->data[3] == '-')
{
gtk_css_token_init (token, GTK_CSS_TOKEN_CDO);
- gtk_css_tokenizer_consume (tokenizer, 3, 3);
+ gtk_css_tokenizer_consume (tokenizer, 4, 4);
}
else
{
diff --git a/gtk/css/meson.build b/gtk/css/meson.build
index 6b24561928..501411f917 100644
--- a/gtk/css/meson.build
+++ b/gtk/css/meson.build
@@ -47,7 +47,6 @@ libgtk_css = static_library('gtk_css',
c_args: [
'-DGTK_COMPILATION',
'-DG_LOG_DOMAIN="Gtk"',
- '-DG_LOG_STRUCTURED=1',
] + common_cflags,
link_args: common_ldflags)
diff --git a/gtk/gtkatcontext.c b/gtk/gtkatcontext.c
index 6e0c54693f..96b466a87e 100644
--- a/gtk/gtkatcontext.c
+++ b/gtk/gtkatcontext.c
@@ -80,6 +80,16 @@ gtk_at_context_finalize (GObject *gobject)
}
static void
+gtk_at_context_dispose (GObject *gobject)
+{
+ GtkATContext *self = GTK_AT_CONTEXT (gobject);
+
+ gtk_at_context_unrealize (self);
+
+ G_OBJECT_CLASS (gtk_at_context_parent_class)->dispose (gobject);
+}
+
+static void
gtk_at_context_set_property (GObject *gobject,
guint prop_id,
const GValue *value,
@@ -90,7 +100,10 @@ gtk_at_context_set_property (GObject *gobject,
switch (prop_id)
{
case PROP_ACCESSIBLE_ROLE:
- self->accessible_role = g_value_get_enum (value);
+ if (!self->realized)
+ self->accessible_role = g_value_get_enum (value);
+ else
+ g_critical ("The accessible role cannot be set on a realized AT context");
break;
case PROP_ACCESSIBLE:
@@ -163,14 +176,27 @@ gtk_at_context_real_child_change (GtkATContext *self,
}
static void
+gtk_at_context_real_realize (GtkATContext *self)
+{
+}
+
+static void
+gtk_at_context_real_unrealize (GtkATContext *self)
+{
+}
+
+static void
gtk_at_context_class_init (GtkATContextClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->set_property = gtk_at_context_set_property;
gobject_class->get_property = gtk_at_context_get_property;
+ gobject_class->dispose = gtk_at_context_dispose;
gobject_class->finalize = gtk_at_context_finalize;
+ klass->realize = gtk_at_context_real_realize;
+ klass->unrealize = gtk_at_context_real_unrealize;
klass->state_change = gtk_at_context_real_state_change;
klass->platform_change = gtk_at_context_real_platform_change;
klass->bounds_change = gtk_at_context_real_bounds_change;
@@ -191,7 +217,7 @@ gtk_at_context_class_init (GtkATContextClass *klass)
GTK_TYPE_ACCESSIBLE_ROLE,
GTK_ACCESSIBLE_ROLE_NONE,
G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS);
/**
@@ -511,6 +537,36 @@ gtk_at_context_create (GtkAccessibleRole accessible_role,
return res;
}
+gboolean
+gtk_at_context_is_realized (GtkATContext *self)
+{
+ return self->realized;
+}
+
+void
+gtk_at_context_realize (GtkATContext *self)
+{
+ if (self->realized)
+ return;
+
+ GTK_NOTE (A11Y, g_message ("Realizing AT context '%s'", G_OBJECT_TYPE_NAME (self)));
+ GTK_AT_CONTEXT_GET_CLASS (self)->realize (self);
+
+ self->realized = TRUE;
+}
+
+void
+gtk_at_context_unrealize (GtkATContext *self)
+{
+ if (!self->realized)
+ return;
+
+ GTK_NOTE (A11Y, g_message ("Unrealizing AT context '%s'", G_OBJECT_TYPE_NAME (self)));
+ GTK_AT_CONTEXT_GET_CLASS (self)->unrealize (self);
+
+ self->realized = FALSE;
+}
+
/*< private >
* gtk_at_context_update:
* @self: a #GtkATContext
@@ -523,6 +579,9 @@ gtk_at_context_update (GtkATContext *self)
{
g_return_if_fail (GTK_IS_AT_CONTEXT (self));
+ if (!self->realized)
+ return;
+
/* There's no point in notifying of state changes if there weren't any */
if (self->updated_properties == 0 &&
self->updated_relations == 0 &&
@@ -979,12 +1038,18 @@ void
gtk_at_context_platform_changed (GtkATContext *self,
GtkAccessiblePlatformChange change)
{
+ if (!self->realized)
+ return;
+
GTK_AT_CONTEXT_GET_CLASS (self)->platform_change (self, change);
}
void
gtk_at_context_bounds_changed (GtkATContext *self)
{
+ if (!self->realized)
+ return;
+
GTK_AT_CONTEXT_GET_CLASS (self)->bounds_change (self);
}
@@ -993,5 +1058,8 @@ gtk_at_context_child_changed (GtkATContext *self,
GtkAccessibleChildChange change,
GtkAccessible *child)
{
+ if (!self->realized)
+ return;
+
GTK_AT_CONTEXT_GET_CLASS (self)->child_change (self, change, child);
}
diff --git a/gtk/gtkatcontextprivate.h b/gtk/gtkatcontextprivate.h
index 85d897be90..9f161e9f20 100644
--- a/gtk/gtkatcontextprivate.h
+++ b/gtk/gtkatcontextprivate.h
@@ -116,6 +116,8 @@ struct _GtkATContext
GtkAccessiblePropertyChange updated_properties;
GtkAccessibleRelationChange updated_relations;
GtkAccessiblePlatformChange updated_platform;
+
+ guint realized : 1;
};
struct _GtkATContextClass
@@ -138,10 +140,17 @@ struct _GtkATContextClass
void (* child_change) (GtkATContext *self,
GtkAccessibleChildChange changed_child,
GtkAccessible *child);
+
+ void (* realize) (GtkATContext *self);
+ void (* unrealize) (GtkATContext *self);
};
GdkDisplay * gtk_at_context_get_display (GtkATContext *self);
+void gtk_at_context_realize (GtkATContext *self);
+void gtk_at_context_unrealize (GtkATContext *self);
+gboolean gtk_at_context_is_realized (GtkATContext *self);
+
void gtk_at_context_update (GtkATContext *self);
void gtk_at_context_set_accessible_state (GtkATContext *self,
diff --git a/gtk/gtkbuildable.c b/gtk/gtkbuildable.c
index 659a0ff3bd..2adc747d44 100644
--- a/gtk/gtkbuildable.c
+++ b/gtk/gtkbuildable.c
@@ -131,35 +131,6 @@ gtk_buildable_add_child (GtkBuildable *buildable,
}
/*< private >
- * gtk_buildable_set_buildable_property:
- * @buildable: a #GtkBuildable
- * @builder: a #GtkBuilder
- * @name: name of property
- * @value: value of property
- *
- * Sets the property name @name to @value on the @buildable object.
- */
-void
-gtk_buildable_set_buildable_property (GtkBuildable *buildable,
- GtkBuilder *builder,
- const char *name,
- const GValue *value)
-{
- GtkBuildableIface *iface;
-
- g_return_if_fail (GTK_IS_BUILDABLE (buildable));
- g_return_if_fail (GTK_IS_BUILDER (builder));
- g_return_if_fail (name != NULL);
- g_return_if_fail (value != NULL);
-
- iface = GTK_BUILDABLE_GET_IFACE (buildable);
- if (iface->set_buildable_property)
- (* iface->set_buildable_property) (buildable, builder, name, value);
- else
- g_object_set_property (G_OBJECT (buildable), name, value);
-}
-
-/*< private >
* gtk_buildable_parser_finished:
* @buildable: a #GtkBuildable
* @builder: a #GtkBuilder
diff --git a/gtk/gtkbuildableprivate.h b/gtk/gtkbuildableprivate.h
index 305be21898..90d447a995 100644
--- a/gtk/gtkbuildableprivate.h
+++ b/gtk/gtkbuildableprivate.h
@@ -11,10 +11,6 @@ void gtk_buildable_add_child (GtkBuildable *buildable,
GtkBuilder *builder,
GObject *child,
const char *type);
-void gtk_buildable_set_buildable_property (GtkBuildable *buildable,
- GtkBuilder *builder,
- const char *name,
- const GValue *value);
GObject * gtk_buildable_construct_child (GtkBuildable *buildable,
GtkBuilder *builder,
const char *name);
diff --git a/gtk/gtkbuilderscope.h b/gtk/gtkbuilderscope.h
index e08adaf6fc..2b987f3822 100644
--- a/gtk/gtkbuilderscope.h
+++ b/gtk/gtkbuilderscope.h
@@ -41,7 +41,7 @@ G_DECLARE_INTERFACE (GtkBuilderScope, gtk_builder_scope, GTK, BUILDER_SCOPE, GOb
* The list of flags that can be passed to gtk_builder_create_closure().
* New values may be added in the future for new features, so external
* implementations of GtkBuilderScopeInterface should test the flags for unknown
- * values and raise a %@GTK_BUILDER_ERROR_INVALID_ATTRIBUTE error when they
+ * values and raise a %GTK_BUILDER_ERROR_INVALID_ATTRIBUTE error when they
* encounter one.
*/
typedef enum {
diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c
index 91023ce39e..f964eb7495 100644
--- a/gtk/gtkbutton.c
+++ b/gtk/gtkbutton.c
@@ -938,6 +938,11 @@ gtk_button_set_icon_name (GtkButton *button,
gtk_image_set_from_icon_name (GTK_IMAGE (priv->child), icon_name);
}
+ gtk_accessible_update_relation (GTK_ACCESSIBLE (button),
+ GTK_ACCESSIBLE_RELATION_LABELLED_BY,
+ g_list_append (NULL, priv->child),
+ -1);
+
gtk_button_set_child_type (button, ICON_CHILD);
g_object_notify_by_pspec (G_OBJECT (button), props[PROP_ICON_NAME]);
}
diff --git a/gtk/gtkconstraintlayout.c b/gtk/gtkconstraintlayout.c
index 6b88ecf57a..e5d6037962 100644
--- a/gtk/gtkconstraintlayout.c
+++ b/gtk/gtkconstraintlayout.c
@@ -103,6 +103,8 @@
* The "source" and "target" attributes can be set to "super" to indicate
* that the constraint target is the widget using the GtkConstraintLayout.
*
+ * There can be "constant" and "multiplier" attributes.
+ *
* Additionally, the "constraints" element can also contain a description
* of the #GtkConstraintGuides used by the layout:
*
@@ -1327,6 +1329,7 @@ parse_int (const char *string,
static GtkConstraint *
constraint_data_to_constraint (const ConstraintData *data,
GtkBuilder *builder,
+ GHashTable *guides,
GError **error)
{
gpointer source, target;
@@ -1350,13 +1353,30 @@ constraint_data_to_constraint (const ConstraintData *data,
source = NULL;
}
else
- source = gtk_builder_get_object (builder, data->source_name);
+ {
+ if (g_hash_table_contains (guides, data->source_name))
+ source = g_hash_table_lookup (guides, data->source_name);
+ else
+ source = gtk_builder_get_object (builder, data->source_name);
+
+ if (source == NULL)
+ {
+ g_set_error (error, GTK_BUILDER_ERROR,
+ GTK_BUILDER_ERROR_INVALID_VALUE,
+ "Unable to find source '%s' for constraint",
+ data->source_name);
+ return NULL;
+ }
+ }
if (g_strcmp0 (data->target_name, "super") == 0)
target = NULL;
else
{
- target = gtk_builder_get_object (builder, data->target_name);
+ if (g_hash_table_contains (guides, data->target_name))
+ target = g_hash_table_lookup (guides, data->target_name);
+ else
+ target = gtk_builder_get_object (builder, data->target_name);
if (target == NULL)
{
@@ -1623,6 +1643,9 @@ gtk_constraint_layout_custom_finished (GtkBuildable *buildable,
if (strcmp (element_name, "constraints") == 0)
{
GList *l;
+ GHashTable *guides;
+
+ guides = g_hash_table_new (g_str_hash, g_str_equal);
data->guides = g_list_reverse (data->guides);
for (l = data->guides; l != NULL; l = l->next)
@@ -1630,16 +1653,25 @@ gtk_constraint_layout_custom_finished (GtkBuildable *buildable,
const GuideData *gdata = l->data;
GtkConstraintGuide *g;
GError *error = NULL;
+ const char *name;
g = guide_data_to_guide (gdata, builder, &error);
if (error != NULL)
{
- g_critical ("Unable to parse guide definition: %s",
- error->message);
+ g_critical ("Unable to parse guide definition: %s", error->message);
g_error_free (error);
continue;
}
+ name = gtk_constraint_guide_get_name (g);
+ if (g_hash_table_lookup (guides, name))
+ {
+ g_critical ("Duplicate guide: %s", name);
+ g_object_unref (g);
+ continue;
+ }
+
+ g_hash_table_insert (guides, (gpointer)name, g);
gtk_constraint_layout_add_guide (data->layout, g);
}
@@ -1650,7 +1682,7 @@ gtk_constraint_layout_custom_finished (GtkBuildable *buildable,
GtkConstraint *c;
GError *error = NULL;
- c = constraint_data_to_constraint (cdata, builder, &error);
+ c = constraint_data_to_constraint (cdata, builder, guides, &error);
if (error != NULL)
{
g_critical ("Unable to parse constraint definition '%s.%s [%s] %s.%s * %g + %g': %s",
@@ -1664,13 +1696,20 @@ gtk_constraint_layout_custom_finished (GtkBuildable *buildable,
continue;
}
- gtk_constraint_layout_add_constraint (data->layout, c);
+ layout_add_constraint (data->layout, c);
+ g_hash_table_add (data->layout->constraints, c);
+ if (data->layout->constraints_observer)
+ g_list_store_append (data->layout->constraints_observer, c);
}
+ gtk_layout_manager_layout_changed (GTK_LAYOUT_MANAGER (data->layout));
+
g_list_free_full (data->constraints, constraint_data_free);
g_list_free_full (data->guides, guide_data_free);
g_object_unref (data->layout);
g_free (data);
+
+ g_hash_table_unref (guides);
}
}
@@ -1828,7 +1867,10 @@ gtk_constraint_layout_add_guide (GtkConstraintLayout *layout,
if (layout->guides_observer)
g_list_store_append (layout->guides_observer, guide);
+ gtk_constraint_guide_update (guide);
+
gtk_layout_manager_layout_changed (GTK_LAYOUT_MANAGER (layout));
+
}
/**
diff --git a/gtk/gtkdragicon.c b/gtk/gtkdragicon.c
index e16d0d8b8c..2348674951 100644
--- a/gtk/gtkdragicon.c
+++ b/gtk/gtkdragicon.c
@@ -500,6 +500,7 @@ gtk_drag_icon_get_child (GtkDragIcon *self)
* Creates a widget that can be used as a drag icon for the given
* @value.
*
+ * Supported types include strings, #GdkRGBA and #GtkTextBuffer.
* If GTK does not know how to create a widget for a given value,
* it will return %NULL.
*
diff --git a/gtk/gtkdragicon.h b/gtk/gtkdragicon.h
index 018b9d4f6a..ea5907f38c 100644
--- a/gtk/gtkdragicon.h
+++ b/gtk/gtkdragicon.h
@@ -51,6 +51,7 @@ void gtk_drag_icon_set_from_paintable (GdkDrag *drag,
int hot_x,
int hot_y);
+GDK_AVAILABLE_IN_ALL
GtkWidget * gtk_drag_icon_create_widget_for_value (const GValue *value);
G_END_DECLS
diff --git a/gtk/gtkenums.h b/gtk/gtkenums.h
index 9a64124c49..8f0f7edc98 100644
--- a/gtk/gtkenums.h
+++ b/gtk/gtkenums.h
@@ -64,12 +64,12 @@ G_BEGIN_DECLS
* could be scaled and stretched, it could be centered, or it could be
* positioned to one side of the space.
*
- * Note that in horizontal context @GTK_ALIGN_START and @GTK_ALIGN_END
+ * Note that in horizontal context %GTK_ALIGN_START and %GTK_ALIGN_END
* are interpreted relative to text direction.
*
- * @GTK_ALIGN_BASELINE support is optional for containers and widgets, and
+ * %GTK_ALIGN_BASELINE support is optional for containers and widgets, and
* it is only supported for vertical alignment. When it's not supported by
- * a child or a container it is treated as @GTK_ALIGN_FILL.
+ * a child or a container it is treated as %GTK_ALIGN_FILL.
*/
typedef enum
{
@@ -245,23 +245,6 @@ typedef enum
} GtkJustification;
/**
- * GtkMenuDirectionType:
- * @GTK_MENU_DIR_PARENT: To the parent menu shell
- * @GTK_MENU_DIR_CHILD: To the submenu, if any, associated with the item
- * @GTK_MENU_DIR_NEXT: To the next menu item
- * @GTK_MENU_DIR_PREV: To the previous menu item
- *
- * An enumeration representing directional movements within a menu.
- */
-typedef enum
-{
- GTK_MENU_DIR_PARENT,
- GTK_MENU_DIR_CHILD,
- GTK_MENU_DIR_NEXT,
- GTK_MENU_DIR_PREV
-} GtkMenuDirectionType;
-
-/**
* GtkMessageType:
* @GTK_MESSAGE_INFO: Informational message
* @GTK_MESSAGE_WARNING: Non-fatal warning message
@@ -760,7 +743,7 @@ typedef enum
/**
* GtkBorderStyle:
* @GTK_BORDER_STYLE_NONE: No visible border
- * @GTK_BORDER_STYLE_HIDDEN: Same as @GTK_BORDER_STYLE_NONE
+ * @GTK_BORDER_STYLE_HIDDEN: Same as %GTK_BORDER_STYLE_NONE
* @GTK_BORDER_STYLE_SOLID: A single line segment
* @GTK_BORDER_STYLE_INSET: Looks as if the content is sunken into the canvas
* @GTK_BORDER_STYLE_OUTSET: Looks as if the content is coming out of the canvas
@@ -811,8 +794,8 @@ G_END_DECLS
* @GTK_INPUT_PURPOSE_URL: Edited field expects URL
* @GTK_INPUT_PURPOSE_EMAIL: Edited field expects email address
* @GTK_INPUT_PURPOSE_NAME: Edited field expects the name of a person
- * @GTK_INPUT_PURPOSE_PASSWORD: Like @GTK_INPUT_PURPOSE_FREE_FORM, but characters are hidden
- * @GTK_INPUT_PURPOSE_PIN: Like @GTK_INPUT_PURPOSE_DIGITS, but characters are hidden
+ * @GTK_INPUT_PURPOSE_PASSWORD: Like %GTK_INPUT_PURPOSE_FREE_FORM, but characters are hidden
+ * @GTK_INPUT_PURPOSE_PIN: Like %GTK_INPUT_PURPOSE_DIGITS, but characters are hidden
* @GTK_INPUT_PURPOSE_TERMINAL: Allow any character, in addition to control codes
*
* Describes primary purpose of the input widget. This information is
@@ -826,8 +809,8 @@ G_END_DECLS
* application is expected to validate the entry contents, even if
* it specified a purpose.
*
- * The difference between @GTK_INPUT_PURPOSE_DIGITS and
- * @GTK_INPUT_PURPOSE_NUMBER is that the former accepts only digits
+ * The difference between %GTK_INPUT_PURPOSE_DIGITS and
+ * %GTK_INPUT_PURPOSE_NUMBER is that the former accepts only digits
* while the latter also some punctuation (like commas or points, plus,
* minus) and “e” or “E” as in 3.14E+000.
*
@@ -874,7 +857,7 @@ typedef enum
* behaviour according to the #GtkInputPurpose of the entry.
*
* Some common sense is expected when using these flags - mixing
- * @GTK_INPUT_HINT_LOWERCASE with any of the uppercase hints makes no sense.
+ * %GTK_INPUT_HINT_LOWERCASE with any of the uppercase hints makes no sense.
*
* This enumeration may be extended in the future; input methods should
* ignore unknown values.
@@ -989,29 +972,6 @@ typedef enum
} GtkShortcutScope;
/**
- * GtkPopoverConstraint:
- * @GTK_POPOVER_CONSTRAINT_NONE: Don't constrain the popover position
- * beyond what is imposed by the implementation
- * @GTK_POPOVER_CONSTRAINT_WINDOW: Constrain the popover to the boundaries
- * of the window that it is attached to
- *
- * Describes constraints to positioning of popovers. More values
- * may be added to this enumeration in the future.
- */
-typedef enum
-{
- GTK_POPOVER_CONSTRAINT_NONE,
- GTK_POPOVER_CONSTRAINT_WINDOW
-} GtkPopoverConstraint;
-
-
-typedef enum {
- GTK_PLACES_OPEN_NORMAL = 1 << 0,
- GTK_PLACES_OPEN_NEW_TAB = 1 << 1,
- GTK_PLACES_OPEN_NEW_WINDOW = 1 << 2
-} GtkPlacesOpenFlags;
-
-/**
* GtkPickFlags:
* @GTK_PICK_DEFAULT: The default behavior, include widgets that are receiving events
* @GTK_PICK_INSENSITIVE: Include widgets that are insensitive
@@ -1464,7 +1424,7 @@ typedef enum {
* position with respect to the total number of columns within a table,
* grid, or treegrid. Value type: integer
* @GTK_ACCESSIBLE_RELATION_COL_INDEX_TEXT: Defines a human readable text
- * alternative of @GTK_ACCESSIBLE_RELATION_COL_INDEX. Value type: string
+ * alternative of %GTK_ACCESSIBLE_RELATION_COL_INDEX. Value type: string
* @GTK_ACCESSIBLE_RELATION_COL_SPAN: Defines the number of columns spanned
* by a cell or gridcell within a table, grid, or treegrid. Value type: integer
* @GTK_ACCESSIBLE_RELATION_CONTROLS: Identifies the element (or elements) whose
diff --git a/gtk/gtkeventcontroller.c b/gtk/gtkeventcontroller.c
index 68670a8e14..d41f24ebe1 100644
--- a/gtk/gtkeventcontroller.c
+++ b/gtk/gtkeventcontroller.c
@@ -516,7 +516,7 @@ gtk_event_controller_get_propagation_limit (GtkEventController *controller)
*
* Sets the event propagation limit on the event controller.
*
- * If the limit is set to %@GTK_LIMIT_SAME_NATIVE, the controller
+ * If the limit is set to %GTK_LIMIT_SAME_NATIVE, the controller
* won't handle events that are targeted at widgets on a different
* surface, such as popovers.
*/
diff --git a/gtk/gtkexpression.c b/gtk/gtkexpression.c
index f7c25f9c73..0974face66 100644
--- a/gtk/gtkexpression.c
+++ b/gtk/gtkexpression.c
@@ -1283,13 +1283,13 @@ gtk_property_expression_new (GType this_type,
{
GParamSpec *pspec;
- if (g_type_is_a (this_type, G_TYPE_OBJECT))
+ if (g_type_fundamental (this_type) == G_TYPE_OBJECT)
{
GObjectClass *class = g_type_class_ref (this_type);
pspec = g_object_class_find_property (class, property_name);
g_type_class_unref (class);
}
- else if (g_type_is_a (this_type, G_TYPE_INTERFACE))
+ else if (g_type_fundamental (this_type) == G_TYPE_INTERFACE)
{
GTypeInterface *iface = g_type_default_interface_ref (this_type);
pspec = g_object_interface_find_property (iface, property_name);
diff --git a/gtk/gtkfilter.h b/gtk/gtkfilter.h
index fcd1c7b02c..8fe080634f 100644
--- a/gtk/gtkfilter.h
+++ b/gtk/gtkfilter.h
@@ -40,7 +40,7 @@ G_BEGIN_DECLS
* Describes the known strictness of a filter.
*
* Note that for filters where the strictness is not known,
- * %@GTK_FILTER_MATCH_SOME is always an acceptable value,
+ * %GTK_FILTER_MATCH_SOME is always an acceptable value,
* even if a filter does match all or no items.
*/
typedef enum {
@@ -64,7 +64,7 @@ typedef enum {
* using the filter to optimize refiltering items.
*
* If you are writing an implementation and are not sure which
- * value to pass, @GTK_FILTER_CHANGE_DIFFERENT is always a correct
+ * value to pass, %GTK_FILTER_CHANGE_DIFFERENT is always a correct
* choice.
*/
typedef enum {
diff --git a/gtk/gtkhsla.c b/gtk/gtkhsla.c
index 9692e3e59f..ad1298df70 100644
--- a/gtk/gtkhsla.c
+++ b/gtk/gtkhsla.c
@@ -22,24 +22,6 @@
#include <math.h>
void
-_gtk_hsla_init (GtkHSLA *hsla,
- float hue,
- float saturation,
- float lightness,
- float alpha)
-{
- g_return_if_fail (hsla != NULL);
-
- if (hue >= 0)
- hsla->hue = fmod (hue, 360);
- else
- hsla->hue = fmod (hue, 360) + 360;
- hsla->saturation = CLAMP (saturation, 0, 1);
- hsla->lightness = CLAMP (lightness, 0, 1);
- hsla->alpha = CLAMP (alpha, 0, 1);
-}
-
-void
_gtk_hsla_init_from_rgba (GtkHSLA *hsla,
const GdkRGBA *rgba)
{
diff --git a/gtk/gtkhslaprivate.h b/gtk/gtkhslaprivate.h
index 145daf7461..304dcfb899 100644
--- a/gtk/gtkhslaprivate.h
+++ b/gtk/gtkhslaprivate.h
@@ -31,11 +31,6 @@ struct _GtkHSLA {
float alpha;
};
-void _gtk_hsla_init (GtkHSLA *hsla,
- float hue,
- float saturation,
- float lightness,
- float alpha);
void _gtk_hsla_init_from_rgba (GtkHSLA *hsla,
const GdkRGBA *rgba);
/* Yes, I can name that function like this! */
diff --git a/gtk/gtkimcontextime.c b/gtk/gtkimcontextime.c
index 1880332978..c8378c836e 100644
--- a/gtk/gtkimcontextime.c
+++ b/gtk/gtkimcontextime.c
@@ -50,34 +50,39 @@
# include <pango/pangowin32.h>
#endif /* STRICT */
-/* #define BUFSIZE 4096 */
+/* Determines what happens when focus is lost while preedit is in process. */
+typedef enum {
+ /* Preedit is committed. */
+ GTK_WIN32_IME_FOCUS_BEHAVIOR_COMMIT,
+ /* Preedit is discarded. */
+ GTK_WIN32_IME_FOCUS_BEHAVIOR_DISCARD,
+ /* Preedit follows the cursor (that means it will appear in the widget
+ * that receives the focus) */
+ GTK_WIN32_IME_FOCUS_BEHAVIOR_FOLLOW,
+} GtkWin32IMEFocusBehavior;
#define IS_DEAD_KEY(k) \
((k) >= GDK_KEY_dead_grave && (k) <= (GDK_KEY_dead_dasia+1))
-#define FREE_PREEDIT_BUFFER(ctx) \
-{ \
- g_free((ctx)->priv->comp_str); \
- g_free((ctx)->priv->read_str); \
- (ctx)->priv->comp_str = NULL; \
- (ctx)->priv->read_str = NULL; \
- (ctx)->priv->comp_str_len = 0; \
- (ctx)->priv->read_str_len = 0; \
-}
-
-
struct _GtkIMContextIMEPrivate
{
- /* save IME context when the client window is focused out */
- DWORD conversion_mode;
- DWORD sentence_mode;
-
- LPVOID comp_str;
- DWORD comp_str_len;
- LPVOID read_str;
- DWORD read_str_len;
-
+ /* When pretend_empty_preedit is set to TRUE,
+ * gtk_im_context_ime_get_preedit_string() will return an empty string
+ * instead of the actual content of ImmGetCompositionStringW().
+ *
+ * This is necessary because GtkEntry expects the preedit buffer to be
+ * cleared before commit() is called, otherwise it leads to an assertion
+ * failure in Pango. However, since we emit the commit() signal while
+ * handling the WM_IME_COMPOSITION message, the IME buffer will be non-empty,
+ * so we temporarily set this flag while emmiting the appropriate signals.
+ *
+ * See also:
+ * https://bugzilla.gnome.org/show_bug.cgi?id=787142
+ * https://gitlab.gnome.org/GNOME/gtk/commit/c255ba68fc2c918dd84da48a472e7973d3c00b03
+ */
+ gboolean pretend_empty_preedit;
guint32 dead_key_keyval;
+ GtkWin32IMEFocusBehavior focus_behavior;
};
@@ -166,12 +171,7 @@ gtk_im_context_ime_init (GtkIMContextIME *context_ime)
context_ime->commit_string = NULL;
context_ime->priv = g_malloc0 (sizeof (GtkIMContextIMEPrivate));
- context_ime->priv->conversion_mode = 0;
- context_ime->priv->sentence_mode = 0;
- context_ime->priv->comp_str = NULL;
- context_ime->priv->comp_str_len = 0;
- context_ime->priv->read_str = NULL;
- context_ime->priv->read_str_len = 0;
+ context_ime->priv->focus_behavior = GTK_WIN32_IME_FOCUS_BEHAVIOR_COMMIT;
}
@@ -184,8 +184,6 @@ gtk_im_context_ime_dispose (GObject *obj)
if (context_ime->client_surface)
gtk_im_context_ime_set_client_widget (context, NULL);
- FREE_PREEDIT_BUFFER (context_ime);
-
G_OBJECT_CLASS (gtk_im_context_ime_parent_class)->dispose (obj);
}
@@ -193,7 +191,6 @@ gtk_im_context_ime_dispose (GObject *obj)
static void
gtk_im_context_ime_finalize (GObject *obj)
{
- /* GtkIMContext *context = GTK_IM_CONTEXT (obj); */
GtkIMContextIME *context_ime = GTK_IM_CONTEXT_IME (obj);
g_free (context_ime->priv);
@@ -251,30 +248,27 @@ gtk_im_context_ime_set_client_widget (GtkIMContext *context,
GtkWidget *widget)
{
GtkIMContextIME *context_ime;
- GdkSurface *client_surface;
+ GdkSurface *client_surface = NULL;
g_return_if_fail (GTK_IS_IM_CONTEXT_IME (context));
context_ime = GTK_IM_CONTEXT_IME (context);
- client_surface = NULL;
if (widget)
client_surface = gtk_native_get_surface (gtk_widget_get_native (widget));
- if (client_surface)
+ if (client_surface != NULL)
{
- HIMC himc;
- HWND hwnd;
-
- hwnd = gdk_win32_surface_get_impl_hwnd (client_surface);
- himc = ImmGetContext (hwnd);
+ HWND hwnd = gdk_win32_surface_get_impl_hwnd (client_surface);
+ HIMC himc = ImmGetContext (hwnd);
if (himc)
- {
- context_ime->opened = ImmGetOpenStatus (himc);
- ImmGetConversionStatus (himc,
- &context_ime->priv->conversion_mode,
- &context_ime->priv->sentence_mode);
- ImmReleaseContext (hwnd, himc);
- }
+ {
+ context_ime->opened = ImmGetOpenStatus (himc);
+ ImmReleaseContext (hwnd, himc);
+ }
+ else
+ {
+ context_ime->opened = FALSE;
+ }
}
else if (context_ime->focus)
{
@@ -427,11 +421,10 @@ gtk_im_context_ime_reset (GtkIMContext *context)
if (!himc)
return;
+ ImmNotifyIME (himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
+
if (context_ime->preediting)
{
- if (ImmGetOpenStatus (himc))
- ImmNotifyIME (himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
-
context_ime->preediting = FALSE;
g_signal_emit_by_name (context, "preedit-changed");
}
@@ -441,12 +434,17 @@ gtk_im_context_ime_reset (GtkIMContext *context)
static char *
-get_utf8_preedit_string (GtkIMContextIME *context_ime, int *pos_ret)
+get_utf8_preedit_string (GtkIMContextIME *context_ime,
+ int kind,
+ int *pos_ret)
{
+ gunichar2 *utf16str = NULL;
+ glong size;
char *utf8str = NULL;
HWND hwnd;
HIMC himc;
int pos = 0;
+ GError *error = NULL;
if (pos_ret)
*pos_ret = 0;
@@ -458,58 +456,31 @@ get_utf8_preedit_string (GtkIMContextIME *context_ime, int *pos_ret)
if (!himc)
return g_strdup ("");
- if (context_ime->preediting)
+ size = ImmGetCompositionStringW (himc, kind, NULL, 0);
+
+ if (size > 0)
{
- glong len;
+ utf16str = g_malloc (size);
- len = ImmGetCompositionStringW (himc, GCS_COMPSTR, NULL, 0);
- if (len > 0)
+ ImmGetCompositionStringW (himc, kind, utf16str, size);
+ utf8str = g_utf16_to_utf8 (utf16str, size / sizeof (gunichar2),
+ NULL, NULL, &error);
+ if (error)
{
- GError *error = NULL;
- gpointer buf = g_alloca (len);
-
- ImmGetCompositionStringW (himc, GCS_COMPSTR, buf, len);
- len /= 2;
- utf8str = g_utf16_to_utf8 (buf, len, NULL, NULL, &error);
- if (error)
- {
- g_warning ("%s", error->message);
- g_error_free (error);
- }
+ g_warning ("%s", error->message);
+ g_error_free (error);
- if (pos_ret)
- {
- pos = ImmGetCompositionStringW (himc, GCS_CURSORPOS, NULL, 0);
- if (pos < 0 || len < pos)
- {
- g_warning ("ImmGetCompositionString: "
- "Invalid cursor position!");
- pos = 0;
- }
- }
}
}
- if (context_ime->commit_string)
+ if (pos_ret)
{
- if (utf8str)
- {
- char *utf8str_new = g_strdup (utf8str);
-
- /* Note: We *don't* want to update context_ime->commit_string here!
- * Otherwise it will be updated repeatedly, not what we want!
- */
- g_free (utf8str);
- utf8str = g_strconcat (context_ime->commit_string,
- utf8str_new,
- NULL);
- g_free (utf8str_new);
- pos += g_utf8_strlen (context_ime->commit_string, -1);
- }
- else
+ pos = ImmGetCompositionStringW (himc, GCS_CURSORPOS, NULL, 0);
+ if (pos < 0 || size < pos)
{
- utf8str = g_strdup (context_ime->commit_string);
- pos = g_utf8_strlen (context_ime->commit_string, -1);
+ g_warning ("ImmGetCompositionString: "
+ "Invalid cursor position!");
+ pos = 0;
}
}
@@ -523,6 +494,7 @@ get_utf8_preedit_string (GtkIMContextIME *context_ime, int *pos_ret)
*pos_ret = pos;
ImmReleaseContext (hwnd, himc);
+ g_free (utf16str);
return utf8str;
}
@@ -534,6 +506,7 @@ get_pango_attr_list (GtkIMContextIME *context_ime, const char *utf8str)
PangoAttrList *attrs = pango_attr_list_new ();
HWND hwnd;
HIMC himc;
+ guint8 *buf = NULL;
if (!context_ime->client_surface)
return attrs;
@@ -545,7 +518,6 @@ get_pango_attr_list (GtkIMContextIME *context_ime, const char *utf8str)
if (context_ime->preediting)
{
const char *schr = utf8str, *echr;
- guint8 *buf;
guint16 f_red, f_green, f_blue, b_red, b_green, b_blue;
glong len, spos = 0, epos, sidx = 0, eidx;
PangoAttribute *attr;
@@ -554,7 +526,7 @@ get_pango_attr_list (GtkIMContextIME *context_ime, const char *utf8str)
* get attributes list of IME.
*/
len = ImmGetCompositionStringW (himc, GCS_COMPATTR, NULL, 0);
- buf = g_alloca (len);
+ buf = g_malloc (len);
ImmGetCompositionStringW (himc, GCS_COMPATTR, buf, len);
/*
@@ -623,6 +595,7 @@ get_pango_attr_list (GtkIMContextIME *context_ime, const char *utf8str)
}
ImmReleaseContext (hwnd, himc);
+ g_free (buf);
return attrs;
}
@@ -640,20 +613,18 @@ gtk_im_context_ime_get_preedit_string (GtkIMContext *context,
context_ime = GTK_IM_CONTEXT_IME (context);
- utf8str = get_utf8_preedit_string (context_ime, &pos);
+ if (!context_ime->focus || context_ime->priv->pretend_empty_preedit)
+ utf8str = g_strdup ("");
+ else
+ utf8str = get_utf8_preedit_string (context_ime, GCS_COMPSTR, &pos);
if (attrs)
*attrs = get_pango_attr_list (context_ime, utf8str);
if (str)
- {
- *str = utf8str;
- }
+ *str = utf8str;
else
- {
- g_free (utf8str);
- utf8str = NULL;
- }
+ utf8str = NULL;
if (cursor_pos)
*cursor_pos = pos;
@@ -674,41 +645,45 @@ gtk_im_context_ime_focus_in (GtkIMContext *context)
/* switch current context */
context_ime->focus = TRUE;
- hwnd = gdk_win32_surface_get_impl_hwnd (context_ime->client_surface);
- himc = ImmGetContext (hwnd);
- if (!himc)
- return;
-
toplevel = context_ime->client_surface;
- if (GDK_IS_SURFACE (toplevel))
- {
- gdk_win32_display_add_filter (GDK_WIN32_DISPLAY (gdk_surface_get_display (toplevel)),
- gtk_im_context_ime_message_filter, context_ime);
- }
- else
+ if (!GDK_IS_SURFACE (toplevel))
{
g_warning ("gtk_im_context_ime_focus_in(): "
"cannot find toplevel window.");
return;
}
+ hwnd = gdk_win32_surface_get_impl_hwnd (toplevel);
+ himc = ImmGetContext (hwnd);
+ if (!himc)
+ return;
+
+ gdk_win32_display_add_filter (GDK_WIN32_DISPLAY (gdk_surface_get_display (toplevel)),
+ gtk_im_context_ime_message_filter, context_ime);
+
/* restore preedit context */
- ImmSetConversionStatus (himc,
- context_ime->priv->conversion_mode,
- context_ime->priv->sentence_mode);
+ context_ime->opened = ImmGetOpenStatus (himc);
- if (context_ime->opened)
+ switch (context_ime->priv->focus_behavior)
{
- if (!ImmGetOpenStatus (himc))
- ImmSetOpenStatus (himc, TRUE);
- if (context_ime->preediting)
+ case GTK_WIN32_IME_FOCUS_BEHAVIOR_COMMIT:
+ case GTK_WIN32_IME_FOCUS_BEHAVIOR_DISCARD:
+ gtk_im_context_ime_reset (context);
+ break;
+
+ case GTK_WIN32_IME_FOCUS_BEHAVIOR_FOLLOW:
{
- ImmSetCompositionStringW (himc,
- SCS_SETSTR,
- context_ime->priv->comp_str,
- context_ime->priv->comp_str_len, NULL, 0);
- FREE_PREEDIT_BUFFER (context_ime);
+ gchar *utf8str = get_utf8_preedit_string (context_ime, GCS_COMPSTR, NULL);
+ if (utf8str != NULL && strlen(utf8str) > 0)
+ {
+ context_ime->preediting = TRUE;
+ gtk_im_context_ime_set_cursor_location (context, NULL);
+ g_signal_emit_by_name (context, "preedit-start");
+ g_signal_emit_by_name (context, "preedit-changed");
+ }
+ g_free (utf8str);
}
+ break;
}
/* clean */
@@ -720,78 +695,66 @@ static void
gtk_im_context_ime_focus_out (GtkIMContext *context)
{
GtkIMContextIME *context_ime = GTK_IM_CONTEXT_IME (context);
- GdkSurface *toplevel;
HWND hwnd;
HIMC himc;
+ gboolean was_preediting;
if (!GDK_IS_SURFACE (context_ime->client_surface))
return;
/* switch current context */
+ was_preediting = context_ime->preediting;
+ context_ime->opened = FALSE;
+ context_ime->preediting = FALSE;
context_ime->focus = FALSE;
- hwnd = gdk_win32_surface_get_impl_hwnd (context_ime->client_surface);
- himc = ImmGetContext (hwnd);
- if (!himc)
- return;
-
- /* save preedit context */
- ImmGetConversionStatus (himc,
- &context_ime->priv->conversion_mode,
- &context_ime->priv->sentence_mode);
-
- if (ImmGetOpenStatus (himc))
+ switch (context_ime->priv->focus_behavior)
{
- gboolean preediting = context_ime->preediting;
+ case GTK_WIN32_IME_FOCUS_BEHAVIOR_COMMIT:
+ if (was_preediting)
+ {
+ gchar *utf8str = get_utf8_preedit_string (context_ime, GCS_COMPSTR, NULL);
+
+ context_ime->priv->pretend_empty_preedit = TRUE;
+ g_signal_emit_by_name (context, "preedit-changed");
+ g_signal_emit_by_name (context, "preedit-end");
+ g_signal_emit_by_name (context, "commit", utf8str);
+ g_signal_emit_by_name (context, "preedit-start");
+ g_signal_emit_by_name (context, "preedit-changed");
+ context_ime->priv->pretend_empty_preedit = FALSE;
+ g_free (utf8str);
+ }
+ /* fallthrough */
+ case GTK_WIN32_IME_FOCUS_BEHAVIOR_DISCARD:
+ gtk_im_context_ime_reset (context);
- if (preediting)
- {
- FREE_PREEDIT_BUFFER (context_ime);
-
- context_ime->priv->comp_str_len
- = ImmGetCompositionStringW (himc, GCS_COMPSTR, NULL, 0);
- context_ime->priv->comp_str
- = g_malloc (context_ime->priv->comp_str_len);
- ImmGetCompositionStringW (himc, GCS_COMPSTR,
- context_ime->priv->comp_str,
- context_ime->priv->comp_str_len);
-
- context_ime->priv->read_str_len
- = ImmGetCompositionStringW (himc, GCS_COMPREADSTR, NULL, 0);
- context_ime->priv->read_str
- = g_malloc (context_ime->priv->read_str_len);
- ImmGetCompositionStringW (himc, GCS_COMPREADSTR,
- context_ime->priv->read_str,
- context_ime->priv->read_str_len);
- }
+ /* Callbacks triggered by im_context_ime_reset() could set the focus back to our
+ context. In that case, we want to exit here. */
- ImmSetOpenStatus (himc, FALSE);
+ if (context_ime->focus)
+ return;
- context_ime->opened = TRUE;
- context_ime->preediting = preediting;
- }
- else
- {
- context_ime->opened = FALSE;
- context_ime->preediting = FALSE;
+ break;
+
+ case GTK_WIN32_IME_FOCUS_BEHAVIOR_FOLLOW:
+ break;
}
/* remove event filter */
- toplevel = context_ime->client_surface;
- if (GDK_IS_SURFACE (toplevel))
+ if (GDK_IS_SURFACE (context_ime->client_surface))
{
- gdk_win32_display_remove_filter (GDK_WIN32_DISPLAY (gdk_surface_get_display (toplevel)),
+ gdk_win32_display_remove_filter (GDK_WIN32_DISPLAY (gdk_surface_get_display (context_ime->client_surface)),
gtk_im_context_ime_message_filter,
context_ime);
}
- else
+
+ if (was_preediting)
{
g_warning ("gtk_im_context_ime_focus_out(): "
"cannot find toplevel window.");
+ g_signal_emit_by_name (context, "preedit-changed");
+ g_signal_emit_by_name (context, "preedit-end");
}
-
- /* clean */
- ImmReleaseContext (hwnd, himc);
}
@@ -1012,16 +975,16 @@ gtk_im_context_ime_message_filter (GdkWin32Display *display,
get_window_position (context_ime->client_surface, &wx, &wy);
/* FIXME! */
{
- HWND hwnd_top;
+ HWND hwnd;
POINT pt;
RECT rc;
- hwnd_top =
+ hwnd =
gdk_win32_surface_get_impl_hwnd (context_ime->client_surface);
- GetWindowRect (hwnd_top, &rc);
+ GetWindowRect (hwnd, &rc);
pt.x = wx;
pt.y = wy;
- ClientToScreen (hwnd_top, &pt);
+ ClientToScreen (hwnd, &pt);
wx = pt.x - rc.left;
wy = pt.y - rc.top;
}
@@ -1037,38 +1000,32 @@ gtk_im_context_ime_message_filter (GdkWin32Display *display,
if (msg->lParam & GCS_RESULTSTR)
{
- gsize len;
- GError *error = NULL;
+ gchar *utf8str = get_utf8_preedit_string (context_ime, GCS_RESULTSTR, NULL);
- len = ImmGetCompositionStringW (himc, GCS_RESULTSTR, NULL, 0);
-
- if (len > 0)
+ if (utf8str)
{
- gpointer buf = g_alloca (len);
- ImmGetCompositionStringW (himc, GCS_RESULTSTR, buf, len);
- len /= 2;
- context_ime->commit_string = g_utf16_to_utf8 (buf, len, NULL, NULL, &error);
- if (error)
- {
- g_warning ("%s", error->message);
- g_error_free (error);
- }
-
- if (context_ime->commit_string)
- {
- g_signal_emit_by_name (context, "commit", context_ime->commit_string);
- g_free (context_ime->commit_string);
- context_ime->commit_string = NULL;
- retval = GDK_WIN32_MESSAGE_FILTER_REMOVE;
- }
+ context_ime->priv->pretend_empty_preedit = TRUE;
+ g_signal_emit_by_name (context, "preedit-changed");
+ g_signal_emit_by_name (context, "preedit-end");
+
+ g_signal_emit_by_name (context, "commit", utf8str);
+
+ g_signal_emit_by_name (context, "preedit-start");
+ g_signal_emit_by_name (context, "preedit-changed");
+ context_ime->priv->pretend_empty_preedit = FALSE;
+
+ retval = TRUE;
}
+
+ g_free (utf8str);
}
if (context_ime->use_preedit)
retval = GDK_WIN32_MESSAGE_FILTER_REMOVE;
- break;
}
+ break;
+
case WM_IME_STARTCOMPOSITION:
context_ime->preediting = TRUE;
gtk_im_context_ime_set_cursor_location (context, NULL);
diff --git a/gtk/gtkimcontextwayland.c b/gtk/gtkimcontextwayland.c
index 70b46e317f..ad89d83a07 100644
--- a/gtk/gtkimcontextwayland.c
+++ b/gtk/gtkimcontextwayland.c
@@ -546,6 +546,7 @@ gtk_im_context_wayland_set_client_widget (GtkIMContext *context,
if (context_wayland->widget)
{
+ gtk_im_context_wayland_focus_out (context);
gtk_widget_remove_controller (context_wayland->widget, GTK_EVENT_CONTROLLER (context_wayland->gesture));
context_wayland->gesture = NULL;
}
diff --git a/gtk/gtkmagnifier.c b/gtk/gtkmagnifier.c
index af06d213d3..5b5b6ab7ac 100644
--- a/gtk/gtkmagnifier.c
+++ b/gtk/gtkmagnifier.c
@@ -202,6 +202,8 @@ gtk_magnifier_class_init (GtkMagnifierClass *klass)
P_("resize"),
FALSE,
G_PARAM_READWRITE));
+
+ gtk_widget_class_set_css_name (widget_class, "magnifier");
}
static void
diff --git a/gtk/gtkmenusectionbox.c b/gtk/gtkmenusectionbox.c
index 9f988d98f5..332252bb51 100644
--- a/gtk/gtkmenusectionbox.c
+++ b/gtk/gtkmenusectionbox.c
@@ -696,6 +696,8 @@ gtk_menu_section_box_add_custom (GtkPopoverMenu *popover,
stack = gtk_popover_get_child (GTK_POPOVER (popover));
box = GTK_MENU_SECTION_BOX (gtk_stack_get_child_by_name (GTK_STACK (stack), "main"));
+ if (box == NULL)
+ return FALSE;
slot = (GtkWidget *)g_hash_table_lookup (box->custom_slots, id);
diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c
index d503bf1e46..b90b748b85 100644
--- a/gtk/gtkplacessidebar.c
+++ b/gtk/gtkplacessidebar.c
@@ -43,6 +43,7 @@
#include "gtksettings.h"
#include "gtktrashmonitor.h"
#include "gtktypebuiltins.h"
+#include "gtkprivatetypebuiltins.h"
#include "gtkpopovermenu.h"
#include "gtkgrid.h"
#include "gtklabel.h"
@@ -379,8 +380,8 @@ list_box_header_func (GtkListBoxRow *row,
GtkListBoxRow *before,
gpointer user_data)
{
- GtkPlacesSidebarSectionType row_section_type;
- GtkPlacesSidebarSectionType before_section_type;
+ GtkPlacesSectionType row_section_type;
+ GtkPlacesSectionType before_section_type;
GtkWidget *separator;
gtk_list_box_row_set_header (row, NULL);
@@ -392,7 +393,7 @@ list_box_header_func (GtkListBoxRow *row,
}
else
{
- before_section_type = SECTION_INVALID;
+ before_section_type = GTK_PLACES_SECTION_INVALID;
}
if (before && before_section_type != row_section_type)
@@ -404,8 +405,8 @@ list_box_header_func (GtkListBoxRow *row,
static GtkWidget*
add_place (GtkPlacesSidebar *sidebar,
- GtkPlacesSidebarPlaceType place_type,
- GtkPlacesSidebarSectionType section_type,
+ GtkPlacesPlaceType place_type,
+ GtkPlacesSectionType section_type,
const char *name,
GIcon *start_icon,
GIcon *end_icon,
@@ -431,7 +432,7 @@ add_place (GtkPlacesSidebar *sidebar,
&show_unmount, &show_eject);
if (show_unmount || show_eject)
- g_assert (place_type != PLACES_BOOKMARK);
+ g_assert (place_type != GTK_PLACES_BOOKMARK);
show_eject_button = (show_unmount || show_eject);
@@ -614,8 +615,8 @@ add_special_dirs (GtkPlacesSidebar *sidebar)
mount_uri = g_file_get_uri (root);
tooltip = g_file_get_parse_name (root);
- add_place (sidebar, PLACES_XDG_DIR,
- SECTION_COMPUTER,
+ add_place (sidebar, GTK_PLACES_XDG_DIR,
+ GTK_PLACES_SECTION_COMPUTER,
name, start_icon, NULL, mount_uri,
NULL, NULL, NULL, NULL, 0,
tooltip);
@@ -721,8 +722,8 @@ on_app_shortcuts_query_complete (GObject *source,
uri = g_file_get_uri (file);
tooltip = g_file_get_parse_name (file);
- add_place (sidebar, PLACES_BUILT_IN,
- SECTION_COMPUTER,
+ add_place (sidebar, GTK_PLACES_BUILT_IN,
+ GTK_PLACES_SECTION_COMPUTER,
name, start_icon, NULL, uri,
NULL, NULL, NULL, NULL,
pos,
@@ -811,8 +812,8 @@ on_bookmark_query_info_complete (GObject *source,
mount_uri = g_file_get_uri (root);
tooltip = g_file_get_parse_name (root);
- add_place (sidebar, PLACES_BOOKMARK,
- SECTION_BOOKMARKS,
+ add_place (sidebar, GTK_PLACES_BOOKMARK,
+ GTK_PLACES_SECTION_BOOKMARKS,
bookmark_name, start_icon, NULL, mount_uri,
NULL, NULL, NULL, NULL, clos->index,
tooltip);
@@ -911,8 +912,8 @@ create_cloud_provider_account_row (GtkPlacesSidebar *sidebar,
/* translators: %s is the name of a cloud provider for files */
tooltip = g_strdup_printf (_("Open %s"), name);
- add_place (sidebar, PLACES_BUILT_IN,
- SECTION_CLOUD,
+ add_place (sidebar, GTK_PLACES_BUILT_IN,
+ GTK_PLACES_SECTION_CLOUD,
name, start_icon, end_icon, mount_uri,
NULL, NULL, NULL, account, 0,
tooltip);
@@ -997,8 +998,8 @@ update_places (GtkPlacesSidebar *sidebar)
if (should_show_recent (sidebar))
{
start_icon = g_themed_icon_new_with_default_fallbacks ("document-open-recent-symbolic");
- add_place (sidebar, PLACES_BUILT_IN,
- SECTION_COMPUTER,
+ add_place (sidebar, GTK_PLACES_BUILT_IN,
+ GTK_PLACES_SECTION_COMPUTER,
_("Recent"), start_icon, NULL, "recent:///",
NULL, NULL, NULL, NULL, 0,
_("Recent files"));
@@ -1008,8 +1009,8 @@ update_places (GtkPlacesSidebar *sidebar)
if (sidebar->show_starred_location)
{
start_icon = g_themed_icon_new_with_default_fallbacks ("starred-symbolic");
- add_place (sidebar, PLACES_STARRED_LOCATION,
- SECTION_COMPUTER,
+ add_place (sidebar, GTK_PLACES_STARRED_LOCATION,
+ GTK_PLACES_SECTION_COMPUTER,
_("Starred"), start_icon, NULL, "starred:///",
NULL, NULL, NULL, NULL, 0,
_("Starred files"));
@@ -1019,8 +1020,8 @@ update_places (GtkPlacesSidebar *sidebar)
/* home folder */
home_uri = get_home_directory_uri ();
start_icon = g_themed_icon_new_with_default_fallbacks (ICON_NAME_HOME);
- add_place (sidebar, PLACES_BUILT_IN,
- SECTION_COMPUTER,
+ add_place (sidebar, GTK_PLACES_BUILT_IN,
+ GTK_PLACES_SECTION_COMPUTER,
_("Home"), start_icon, NULL, home_uri,
NULL, NULL, NULL, NULL, 0,
_("Open your personal folder"));
@@ -1034,8 +1035,8 @@ update_places (GtkPlacesSidebar *sidebar)
if (mount_uri)
{
start_icon = g_themed_icon_new_with_default_fallbacks (ICON_NAME_DESKTOP);
- add_place (sidebar, PLACES_BUILT_IN,
- SECTION_COMPUTER,
+ add_place (sidebar, GTK_PLACES_BUILT_IN,
+ GTK_PLACES_SECTION_COMPUTER,
_("Desktop"), start_icon, NULL, mount_uri,
NULL, NULL, NULL, NULL, 0,
_("Open the contents of your desktop in a folder"));
@@ -1050,8 +1051,8 @@ update_places (GtkPlacesSidebar *sidebar)
if (sidebar->show_enter_location)
{
start_icon = g_themed_icon_new_with_default_fallbacks (ICON_NAME_NETWORK_SERVER);
- add_place (sidebar, PLACES_ENTER_LOCATION,
- SECTION_COMPUTER,
+ add_place (sidebar, GTK_PLACES_ENTER_LOCATION,
+ GTK_PLACES_SECTION_COMPUTER,
_("Enter Location"), start_icon, NULL, NULL,
NULL, NULL, NULL, NULL, 0,
_("Manually enter a location"));
@@ -1062,8 +1063,8 @@ update_places (GtkPlacesSidebar *sidebar)
if (sidebar->show_trash)
{
start_icon = _gtk_trash_monitor_get_icon (sidebar->trash_monitor);
- sidebar->trash_row = add_place (sidebar, PLACES_BUILT_IN,
- SECTION_COMPUTER,
+ sidebar->trash_row = add_place (sidebar, GTK_PLACES_BUILT_IN,
+ GTK_PLACES_SECTION_COMPUTER,
_("Trash"), start_icon, NULL, "trash:///",
NULL, NULL, NULL, NULL, 0,
_("Open the trash"));
@@ -1154,8 +1155,8 @@ update_places (GtkPlacesSidebar *sidebar)
name = g_mount_get_name (mount);
tooltip = g_file_get_parse_name (root);
- add_place (sidebar, PLACES_MOUNTED_VOLUME,
- SECTION_MOUNTS,
+ add_place (sidebar, GTK_PLACES_MOUNTED_VOLUME,
+ GTK_PLACES_SECTION_MOUNTS,
name, start_icon, NULL, mount_uri,
drive, volume, mount, NULL, 0, tooltip);
g_object_unref (root);
@@ -1179,8 +1180,8 @@ update_places (GtkPlacesSidebar *sidebar)
name = g_volume_get_name (volume);
tooltip = g_strdup_printf (_("Mount and open “%s”"), name);
- add_place (sidebar, PLACES_MOUNTED_VOLUME,
- SECTION_MOUNTS,
+ add_place (sidebar, GTK_PLACES_MOUNTED_VOLUME,
+ GTK_PLACES_SECTION_MOUNTS,
name, start_icon, NULL, NULL,
drive, volume, NULL, NULL, 0, tooltip);
g_object_unref (start_icon);
@@ -1207,8 +1208,8 @@ update_places (GtkPlacesSidebar *sidebar)
name = g_drive_get_name (drive);
tooltip = g_strdup_printf (_("Mount and open “%s”"), name);
- add_place (sidebar, PLACES_BUILT_IN,
- SECTION_MOUNTS,
+ add_place (sidebar, GTK_PLACES_BUILT_IN,
+ GTK_PLACES_SECTION_MOUNTS,
name, start_icon, NULL, NULL,
drive, NULL, NULL, NULL, 0, tooltip);
g_object_unref (start_icon);
@@ -1265,8 +1266,8 @@ update_places (GtkPlacesSidebar *sidebar)
mount_uri = g_file_get_uri (root);
tooltip = g_file_get_parse_name (root);
name = g_mount_get_name (mount);
- add_place (sidebar, PLACES_MOUNTED_VOLUME,
- SECTION_MOUNTS,
+ add_place (sidebar, GTK_PLACES_MOUNTED_VOLUME,
+ GTK_PLACES_SECTION_MOUNTS,
name, start_icon, NULL, mount_uri,
NULL, volume, mount, NULL, 0, tooltip);
g_object_unref (mount);
@@ -1281,8 +1282,8 @@ update_places (GtkPlacesSidebar *sidebar)
/* see comment above in why we add an icon for an unmounted mountable volume */
start_icon = g_volume_get_symbolic_icon (volume);
name = g_volume_get_name (volume);
- add_place (sidebar, PLACES_MOUNTED_VOLUME,
- SECTION_MOUNTS,
+ add_place (sidebar, GTK_PLACES_MOUNTED_VOLUME,
+ GTK_PLACES_SECTION_MOUNTS,
name, start_icon, NULL, NULL,
NULL, volume, NULL, NULL, 0, name);
g_object_unref (start_icon);
@@ -1296,8 +1297,8 @@ update_places (GtkPlacesSidebar *sidebar)
if (!sidebar->show_other_locations)
{
start_icon = g_themed_icon_new_with_default_fallbacks (ICON_NAME_FILESYSTEM);
- add_place (sidebar, PLACES_BUILT_IN,
- SECTION_MOUNTS,
+ add_place (sidebar, GTK_PLACES_BUILT_IN,
+ GTK_PLACES_SECTION_MOUNTS,
sidebar->hostname, start_icon, NULL, "file:///",
NULL, NULL, NULL, NULL, 0,
_("Open the contents of the file system"));
@@ -1337,8 +1338,8 @@ update_places (GtkPlacesSidebar *sidebar)
mount_uri = g_file_get_uri (root);
name = g_mount_get_name (mount);
tooltip = g_file_get_parse_name (root);
- add_place (sidebar, PLACES_MOUNTED_VOLUME,
- SECTION_COMPUTER,
+ add_place (sidebar, GTK_PLACES_MOUNTED_VOLUME,
+ GTK_PLACES_SECTION_COMPUTER,
name, start_icon, NULL, mount_uri,
NULL, NULL, mount, NULL, 0, tooltip);
g_object_unref (root);
@@ -1381,8 +1382,8 @@ update_places (GtkPlacesSidebar *sidebar)
/* Add new bookmark row */
new_bookmark_icon = g_themed_icon_new ("bookmark-new-symbolic");
- sidebar->new_bookmark_row = add_place (sidebar, PLACES_DROP_FEEDBACK,
- SECTION_BOOKMARKS,
+ sidebar->new_bookmark_row = add_place (sidebar, GTK_PLACES_DROP_FEEDBACK,
+ GTK_PLACES_SECTION_BOOKMARKS,
_("New bookmark"), new_bookmark_icon, NULL, NULL,
NULL, NULL, NULL, NULL, 0,
_("Add a new bookmark"));
@@ -1407,8 +1408,8 @@ update_places (GtkPlacesSidebar *sidebar)
name = g_volume_get_name (volume);
tooltip = g_strdup_printf (_("Mount and open “%s”"), name);
- add_place (sidebar, PLACES_MOUNTED_VOLUME,
- SECTION_MOUNTS,
+ add_place (sidebar, GTK_PLACES_MOUNTED_VOLUME,
+ GTK_PLACES_SECTION_MOUNTS,
name, start_icon, NULL, NULL,
NULL, volume, NULL, NULL, 0, tooltip);
g_object_unref (start_icon);
@@ -1428,8 +1429,8 @@ update_places (GtkPlacesSidebar *sidebar)
mount_uri = g_file_get_uri (root);
name = g_mount_get_name (mount);
tooltip = g_file_get_parse_name (root);
- add_place (sidebar, PLACES_MOUNTED_VOLUME,
- SECTION_MOUNTS,
+ add_place (sidebar, GTK_PLACES_MOUNTED_VOLUME,
+ GTK_PLACES_SECTION_MOUNTS,
name, start_icon, NULL, mount_uri,
NULL, NULL, mount, NULL, 0, tooltip);
g_object_unref (root);
@@ -1448,8 +1449,8 @@ update_places (GtkPlacesSidebar *sidebar)
{
start_icon = g_themed_icon_new_with_default_fallbacks (ICON_NAME_OTHER_LOCATIONS);
- add_place (sidebar, PLACES_OTHER_LOCATIONS,
- SECTION_OTHER_LOCATIONS,
+ add_place (sidebar, GTK_PLACES_OTHER_LOCATIONS,
+ GTK_PLACES_SECTION_OTHER_LOCATIONS,
_("Other Locations"), start_icon, NULL, "other-locations:///",
NULL, NULL, NULL, NULL, 0, _("Show other locations"));
@@ -1477,8 +1478,8 @@ check_valid_drop_target (GtkPlacesSidebar *sidebar,
GtkSidebarRow *row,
const GValue *value)
{
- GtkPlacesSidebarPlaceType place_type;
- GtkPlacesSidebarSectionType section_type;
+ GtkPlacesPlaceType place_type;
+ GtkPlacesSectionType section_type;
gboolean valid = FALSE;
char *uri;
GFile *dest_file;
@@ -1495,26 +1496,26 @@ check_valid_drop_target (GtkPlacesSidebar *sidebar,
"uri", &uri,
NULL);
- if (place_type == PLACES_STARRED_LOCATION)
+ if (place_type == GTK_PLACES_STARRED_LOCATION)
{
g_free (uri);
return FALSE;
}
- if (place_type == PLACES_CONNECT_TO_SERVER)
+ if (place_type == GTK_PLACES_CONNECT_TO_SERVER)
{
g_free (uri);
return FALSE;
}
- if (place_type == PLACES_DROP_FEEDBACK)
+ if (place_type == GTK_PLACES_DROP_FEEDBACK)
{
g_free (uri);
return TRUE;
}
/* Disallow drops on recent:/// */
- if (place_type == PLACES_BUILT_IN)
+ if (place_type == GTK_PLACES_BUILT_IN)
{
if (g_strcmp0 (uri, "recent:///") == 0)
{
@@ -1527,7 +1528,7 @@ check_valid_drop_target (GtkPlacesSidebar *sidebar,
if (G_VALUE_HOLDS (value, GTK_TYPE_SIDEBAR_ROW))
{
/* Don't allow reordering bookmarks into non-bookmark areas */
- valid = section_type == SECTION_BOOKMARKS;
+ valid = section_type == GTK_PLACES_SECTION_BOOKMARKS;
}
else if (G_VALUE_HOLDS (value, GDK_TYPE_FILE_LIST))
{
@@ -1633,7 +1634,7 @@ drag_motion_callback (GtkDropTarget *target,
{
GdkDragAction action;
GtkListBoxRow *row;
- GtkPlacesSidebarPlaceType place_type;
+ GtkPlacesPlaceType place_type;
char *drop_target_uri = NULL;
int row_index;
int row_placeholder_index;
@@ -1718,7 +1719,7 @@ drag_motion_callback (GtkDropTarget *target,
* file move/copy operation itself, or if we should only try to
* create bookmarks out of the dragged URIs.
*/
- if (place_type == PLACES_DROP_FEEDBACK)
+ if (place_type == GTK_PLACES_DROP_FEEDBACK)
{
action = GDK_ACTION_COPY;
}
@@ -1799,8 +1800,8 @@ drag_drop_callback (GtkDropTarget *target,
GtkPlacesSidebar *sidebar)
{
int target_order_index;
- GtkPlacesSidebarPlaceType target_place_type;
- GtkPlacesSidebarSectionType target_section_type;
+ GtkPlacesPlaceType target_place_type;
+ GtkPlacesSectionType target_section_type;
char *target_uri;
GtkListBoxRow *target_row;
gboolean result;
@@ -1824,7 +1825,7 @@ drag_drop_callback (GtkDropTarget *target,
{
GtkWidget *source_row;
/* A bookmark got reordered */
- if (target_section_type != SECTION_BOOKMARKS)
+ if (target_section_type != GTK_PLACES_SECTION_BOOKMARKS)
goto out;
source_row = g_value_get_object (value);
@@ -1838,7 +1839,7 @@ drag_drop_callback (GtkDropTarget *target,
else if (G_VALUE_HOLDS (value, GDK_TYPE_FILE_LIST))
{
/* Dropping URIs! */
- if (target_place_type == PLACES_DROP_FEEDBACK)
+ if (target_place_type == GTK_PLACES_DROP_FEEDBACK)
{
drop_files_as_bookmarks (sidebar, g_value_get_boxed (value), target_order_index);
}
@@ -2096,7 +2097,7 @@ open_row (GtkSidebarRow *row,
char *uri;
GDrive *drive;
GVolume *volume;
- GtkPlacesSidebarPlaceType place_type;
+ GtkPlacesPlaceType place_type;
GtkPlacesSidebar *sidebar;
g_object_get (row,
@@ -2107,11 +2108,11 @@ open_row (GtkSidebarRow *row,
"volume", &volume,
NULL);
- if (place_type == PLACES_OTHER_LOCATIONS)
+ if (place_type == GTK_PLACES_OTHER_LOCATIONS)
{
emit_show_other_locations_with_flags (sidebar, open_flags);
}
- else if (place_type == PLACES_STARRED_LOCATION)
+ else if (place_type == GTK_PLACES_STARRED_LOCATION)
{
emit_show_starred_location (sidebar, open_flags);
}
@@ -2119,7 +2120,7 @@ open_row (GtkSidebarRow *row,
{
open_uri (sidebar, uri, open_flags);
}
- else if (place_type == PLACES_ENTER_LOCATION)
+ else if (place_type == GTK_PLACES_ENTER_LOCATION)
{
emit_show_enter_location (sidebar);
}
@@ -2185,7 +2186,7 @@ static void
rename_entry_changed (GtkEntry *entry,
GtkPlacesSidebar *sidebar)
{
- GtkPlacesSidebarPlaceType type;
+ GtkPlacesPlaceType type;
char *name;
char *uri;
const char *new_name;
@@ -2214,7 +2215,7 @@ rename_entry_changed (GtkEntry *entry,
"label", &name,
NULL);
- if ((type == PLACES_XDG_DIR || type == PLACES_BOOKMARK) &&
+ if ((type == GTK_PLACES_XDG_DIR || type == GTK_PLACES_BOOKMARK) &&
strcmp (uri, sidebar->rename_uri) != 0 &&
strcmp (new_name, name) == 0)
found = TRUE;
@@ -2404,11 +2405,11 @@ show_rename_popover (GtkSidebarRow *row)
static void
rename_bookmark (GtkSidebarRow *row)
{
- GtkPlacesSidebarPlaceType type;
+ GtkPlacesPlaceType type;
g_object_get (row, "place-type", &type, NULL);
- if (type != PLACES_BOOKMARK && type != PLACES_XDG_DIR)
+ if (type != GTK_PLACES_BOOKMARK && type != GTK_PLACES_XDG_DIR)
return;
show_rename_popover (row);
@@ -2427,7 +2428,7 @@ rename_shortcut_cb (GSimpleAction *action,
static void
remove_bookmark (GtkSidebarRow *row)
{
- GtkPlacesSidebarPlaceType type;
+ GtkPlacesPlaceType type;
char *uri;
GFile *file;
GtkPlacesSidebar *sidebar;
@@ -2438,7 +2439,7 @@ remove_bookmark (GtkSidebarRow *row)
"uri", &uri,
NULL);
- if (type == PLACES_BOOKMARK)
+ if (type == GTK_PLACES_BOOKMARK)
{
file = g_file_new_for_uri (uri);
_gtk_bookmarks_manager_remove_bookmark (sidebar->bookmarks_manager, file, NULL);
@@ -3165,7 +3166,7 @@ static void
create_row_popover (GtkPlacesSidebar *sidebar,
GtkSidebarRow *row)
{
- GtkPlacesSidebarPlaceType type;
+ GtkPlacesPlaceType type;
GMenu *menu, *section;
GMenuItem *item;
GMount *mount;
@@ -3197,10 +3198,10 @@ create_row_popover (GtkPlacesSidebar *sidebar,
#endif
action = g_action_map_lookup_action (G_ACTION_MAP (sidebar->row_actions), "remove");
- g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (type == PLACES_BOOKMARK));
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (type == GTK_PLACES_BOOKMARK));
action = g_action_map_lookup_action (G_ACTION_MAP (sidebar->row_actions), "rename");
- g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (type == PLACES_BOOKMARK ||
- type == PLACES_XDG_DIR));
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (type == GTK_PLACES_BOOKMARK ||
+ type == GTK_PLACES_XDG_DIR));
action = g_action_map_lookup_action (G_ACTION_MAP (sidebar->row_actions), "open");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), !gtk_list_box_row_is_selected (GTK_LIST_BOX_ROW (row)));
@@ -3372,8 +3373,8 @@ on_row_pressed (GtkGestureClick *gesture,
GtkSidebarRow *row)
{
GtkPlacesSidebar *sidebar;
- GtkPlacesSidebarSectionType section_type;
- GtkPlacesSidebarPlaceType row_type;
+ GtkPlacesSectionType section_type;
+ GtkPlacesPlaceType row_type;
g_object_get (row,
"sidebar", &sidebar,
@@ -3381,7 +3382,7 @@ on_row_pressed (GtkGestureClick *gesture,
"place-type", &row_type,
NULL);
- if (section_type == SECTION_BOOKMARKS)
+ if (section_type == GTK_PLACES_SECTION_BOOKMARKS)
{
sidebar->drag_row = GTK_WIDGET (row);
sidebar->drag_row_x = (int)x;
@@ -3399,8 +3400,8 @@ on_row_released (GtkGestureClick *gesture,
GtkSidebarRow *row)
{
GtkPlacesSidebar *sidebar;
- GtkPlacesSidebarSectionType section_type;
- GtkPlacesSidebarPlaceType row_type;
+ GtkPlacesSectionType section_type;
+ GtkPlacesPlaceType row_type;
guint button, state;
g_object_get (row,
@@ -3428,7 +3429,7 @@ on_row_released (GtkGestureClick *gesture,
}
else if (button == 3)
{
- if (row_type != PLACES_CONNECT_TO_SERVER)
+ if (row_type != GTK_PLACES_CONNECT_TO_SERVER)
show_row_popover (GTK_SIDEBAR_ROW (row));
}
}
@@ -3500,11 +3501,11 @@ on_row_dragged (GtkGestureDrag *gesture,
static void
popup_menu_cb (GtkSidebarRow *row)
{
- GtkPlacesSidebarPlaceType row_type;
+ GtkPlacesPlaceType row_type;
g_object_get (row, "place-type", &row_type, NULL);
- if (row_type != PLACES_CONNECT_TO_SERVER)
+ if (row_type != GTK_PLACES_CONNECT_TO_SERVER)
show_row_popover (row);
}
@@ -3526,8 +3527,8 @@ list_box_sort_func (GtkListBoxRow *row1,
GtkListBoxRow *row2,
gpointer user_data)
{
- GtkPlacesSidebarSectionType section_type_1, section_type_2;
- GtkPlacesSidebarPlaceType place_type_1, place_type_2;
+ GtkPlacesSectionType section_type_1, section_type_2;
+ GtkPlacesPlaceType place_type_1, place_type_2;
char *label_1, *label_2;
int index_1, index_2;
int retval = 0;
@@ -3546,11 +3547,11 @@ list_box_sort_func (GtkListBoxRow *row1,
NULL);
/* Always last position for "connect to server" */
- if (place_type_1 == PLACES_CONNECT_TO_SERVER)
+ if (place_type_1 == GTK_PLACES_CONNECT_TO_SERVER)
{
retval = 1;
}
- else if (place_type_2 == PLACES_CONNECT_TO_SERVER)
+ else if (place_type_2 == GTK_PLACES_CONNECT_TO_SERVER)
{
retval = -1;
}
@@ -3558,15 +3559,15 @@ list_box_sort_func (GtkListBoxRow *row1,
{
if (section_type_1 == section_type_2)
{
- if ((section_type_1 == SECTION_COMPUTER &&
+ if ((section_type_1 == GTK_PLACES_SECTION_COMPUTER &&
place_type_1 == place_type_2 &&
- place_type_1 == PLACES_XDG_DIR) ||
- section_type_1 == SECTION_MOUNTS)
+ place_type_1 == GTK_PLACES_XDG_DIR) ||
+ section_type_1 == GTK_PLACES_SECTION_MOUNTS)
{
retval = g_utf8_collate (label_1, label_2);
}
- else if ((place_type_1 == PLACES_BOOKMARK || place_type_2 == PLACES_DROP_FEEDBACK) &&
- (place_type_1 == PLACES_DROP_FEEDBACK || place_type_2 == PLACES_BOOKMARK))
+ else if ((place_type_1 == GTK_PLACES_BOOKMARK || place_type_2 == GTK_PLACES_DROP_FEEDBACK) &&
+ (place_type_1 == GTK_PLACES_DROP_FEEDBACK || place_type_2 == GTK_PLACES_BOOKMARK))
{
retval = index_1 - index_2;
}
@@ -3580,14 +3581,14 @@ list_box_sort_func (GtkListBoxRow *row1,
* the current row, for instance when the cursor is in the lower half
* of the row, we need to increase the order-index.
*/
- else if (place_type_1 == PLACES_BOOKMARK_PLACEHOLDER && place_type_2 == PLACES_BOOKMARK)
+ else if (place_type_1 == GTK_PLACES_BOOKMARK_PLACEHOLDER && place_type_2 == GTK_PLACES_BOOKMARK)
{
if (index_1 == index_2)
retval = index_1 - index_2 - 1;
else
retval = index_1 - index_2;
}
- else if (place_type_1 == PLACES_BOOKMARK && place_type_2 == PLACES_BOOKMARK_PLACEHOLDER)
+ else if (place_type_1 == GTK_PLACES_BOOKMARK && place_type_2 == GTK_PLACES_BOOKMARK_PLACEHOLDER)
{
if (index_1 == index_2)
retval = index_1 - index_2 + 1;
@@ -4883,7 +4884,7 @@ gtk_places_sidebar_get_nth_bookmark (GtkPlacesSidebar *sidebar,
row != NULL;
row = gtk_widget_get_next_sibling (row))
{
- GtkPlacesSidebarPlaceType place_type;
+ GtkPlacesPlaceType place_type;
char *uri;
if (!GTK_IS_LIST_BOX_ROW (row))
@@ -4893,7 +4894,7 @@ gtk_places_sidebar_get_nth_bookmark (GtkPlacesSidebar *sidebar,
"place-type", &place_type,
"uri", &uri,
NULL);
- if (place_type == PLACES_BOOKMARK)
+ if (place_type == GTK_PLACES_BOOKMARK)
{
if (k == n)
{
diff --git a/gtk/gtkplacessidebarprivate.h b/gtk/gtkplacessidebarprivate.h
index 512ef23cf3..55003b499d 100644
--- a/gtk/gtkplacessidebarprivate.h
+++ b/gtk/gtkplacessidebarprivate.h
@@ -64,6 +64,11 @@ typedef struct _GtkPlacesSidebarClass GtkPlacesSidebarClass;
* use #GTK_PLACES_OPEN_NORMAL in the #GtkPlacesSidebar::open-location signal. This is the
* default mode of operation.
*/
+typedef enum {
+ GTK_PLACES_OPEN_NORMAL = 1 << 0,
+ GTK_PLACES_OPEN_NEW_TAB = 1 << 1,
+ GTK_PLACES_OPEN_NEW_WINDOW = 1 << 2
+} GtkPlacesOpenFlags;
GType gtk_places_sidebar_get_type (void) G_GNUC_CONST;
GtkWidget * gtk_places_sidebar_new (void);
@@ -112,30 +117,30 @@ gboolean gtk_places_sidebar_get_show_starred_location (GtkPlacesSide
/* Keep order, since it's used for the sort functions */
typedef enum {
- SECTION_INVALID,
- SECTION_COMPUTER,
- SECTION_MOUNTS,
- SECTION_CLOUD,
- SECTION_BOOKMARKS,
- SECTION_OTHER_LOCATIONS,
- N_SECTIONS
-} GtkPlacesSidebarSectionType;
+ GTK_PLACES_SECTION_INVALID,
+ GTK_PLACES_SECTION_COMPUTER,
+ GTK_PLACES_SECTION_MOUNTS,
+ GTK_PLACES_SECTION_CLOUD,
+ GTK_PLACES_SECTION_BOOKMARKS,
+ GTK_PLACES_SECTION_OTHER_LOCATIONS,
+ GTK_PLACES_N_SECTIONS
+} GtkPlacesSectionType;
typedef enum {
- PLACES_INVALID,
- PLACES_BUILT_IN,
- PLACES_XDG_DIR,
- PLACES_MOUNTED_VOLUME,
- PLACES_BOOKMARK,
- PLACES_HEADING,
- PLACES_CONNECT_TO_SERVER,
- PLACES_ENTER_LOCATION,
- PLACES_DROP_FEEDBACK,
- PLACES_BOOKMARK_PLACEHOLDER,
- PLACES_OTHER_LOCATIONS,
- PLACES_STARRED_LOCATION,
- N_PLACES
-} GtkPlacesSidebarPlaceType;
+ GTK_PLACES_INVALID,
+ GTK_PLACES_BUILT_IN,
+ GTK_PLACES_XDG_DIR,
+ GTK_PLACES_MOUNTED_VOLUME,
+ GTK_PLACES_BOOKMARK,
+ GTK_PLACES_HEADING,
+ GTK_PLACES_CONNECT_TO_SERVER,
+ GTK_PLACES_ENTER_LOCATION,
+ GTK_PLACES_DROP_FEEDBACK,
+ GTK_PLACES_BOOKMARK_PLACEHOLDER,
+ GTK_PLACES_OTHER_LOCATIONS,
+ GTK_PLACES_STARRED_LOCATION,
+ GTK_PLACES_N_PLACES
+} GtkPlacesPlaceType;
char *gtk_places_sidebar_get_location_title (GtkPlacesSidebar *sidebar);
diff --git a/gtk/gtkplacesview.c b/gtk/gtkplacesview.c
index 9bdd919547..aec0ddea60 100644
--- a/gtk/gtkplacesview.c
+++ b/gtk/gtkplacesview.c
@@ -28,6 +28,7 @@
#include "gtkplacesviewprivate.h"
#include "gtkplacesviewrowprivate.h"
#include "gtktypebuiltins.h"
+#include "gtkprivatetypebuiltins.h"
#include "gtkeventcontrollerkey.h"
#include "gtkpopovermenu.h"
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index 1cfe499f52..2a17b677da 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -839,7 +839,7 @@ gtk_popover_init (GtkPopover *popover)
priv->final_position = GTK_POS_BOTTOM;
priv->autohide = TRUE;
priv->has_arrow = TRUE;
- priv->cascade_popdown = TRUE;
+ priv->cascade_popdown = FALSE;
controller = gtk_event_controller_key_new ();
g_signal_connect_swapped (controller, "key-pressed", G_CALLBACK (gtk_popover_key_pressed), popover);
@@ -1674,7 +1674,7 @@ gtk_popover_class_init (GtkPopoverClass *klass)
g_param_spec_boolean ("cascade-popdown",
P_("Cascade popdown"),
P_("Wether the popover pops down after a child popover"),
- TRUE,
+ FALSE,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
diff --git a/gtk/gtkpopovermenu.c b/gtk/gtkpopovermenu.c
index 751d14c176..c3f39ed0ce 100644
--- a/gtk/gtkpopovermenu.c
+++ b/gtk/gtkpopovermenu.c
@@ -309,6 +309,7 @@ gtk_popover_menu_init (GtkPopoverMenu *popover)
g_free (controllers);
gtk_popover_disable_auto_mnemonics (GTK_POPOVER (popover));
+ gtk_popover_set_cascade_popdown (GTK_POPOVER (popover), TRUE);
}
static void
diff --git a/gtk/gtkprintoperation.c b/gtk/gtkprintoperation.c
index 1a205da55d..382d461fec 100644
--- a/gtk/gtkprintoperation.c
+++ b/gtk/gtkprintoperation.c
@@ -2192,8 +2192,6 @@ print_pages_idle_done (gpointer user_data)
PrintPagesData *data = (PrintPagesData*)user_data;
GtkPrintOperationPrivate *priv = gtk_print_operation_get_instance_private (data->op);
- priv = data->op->priv;
-
priv->print_pages_idle_id = 0;
if (priv->show_progress_timeout_id > 0)
diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h
index 91a485092b..cd41e85b2c 100644
--- a/gtk/gtkprivate.h
+++ b/gtk/gtkprivate.h
@@ -31,6 +31,7 @@
#include "gtkcsstypesprivate.h"
#include "gtktexthandleprivate.h"
+#include "gtkplacessidebarprivate.h"
#include "gtkeventcontrollerprivate.h"
#include "gtkwindowgroup.h"
diff --git a/gtk/gtkrender.c b/gtk/gtkrender.c
index 4abb9fbc0e..a094604d7a 100644
--- a/gtk/gtkrender.c
+++ b/gtk/gtkrender.c
@@ -27,7 +27,6 @@
#include "gtkcsscolorvalueprivate.h"
#include "gtkcssshadowvalueprivate.h"
#include "gtkcsstransformvalueprivate.h"
-#include "gtkhslaprivate.h"
#include "gtkrendericonprivate.h"
#include "gtkstylecontextprivate.h"
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index a428de2f95..6345550a73 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -21,7 +21,6 @@
#include "gtksettingsprivate.h"
#include "gtkcssproviderprivate.h"
-#include "gtkhslaprivate.h"
#include "gtkintl.h"
#include "gtkprivate.h"
#include "gtkscrolledwindow.h"
diff --git a/gtk/gtksidebarrow.c b/gtk/gtksidebarrow.c
index 350a6d629f..8dc2af293b 100644
--- a/gtk/gtksidebarrow.c
+++ b/gtk/gtksidebarrow.c
@@ -27,6 +27,7 @@
#include "gtkrevealer.h"
#include "gtkintl.h"
#include "gtkspinner.h"
+#include "gtkprivatetypebuiltins.h"
#ifdef HAVE_CLOUDPROVIDERS
#include <cloudproviders.h>
@@ -45,8 +46,8 @@ struct _GtkSidebarRow
gboolean ejectable;
GtkWidget *eject_button;
int order_index;
- GtkPlacesSidebarSectionType section_type;
- GtkPlacesSidebarPlaceType place_type;
+ GtkPlacesSectionType section_type;
+ GtkPlacesPlaceType place_type;
char *uri;
GDrive *drive;
GVolume *volume;
@@ -167,11 +168,11 @@ gtk_sidebar_row_get_property (GObject *object,
break;
case PROP_SECTION_TYPE:
- g_value_set_int (value, self->section_type);
+ g_value_set_enum (value, self->section_type);
break;
case PROP_PLACE_TYPE:
- g_value_set_int (value, self->place_type);
+ g_value_set_enum (value, self->place_type);
break;
case PROP_URI:
@@ -276,16 +277,16 @@ gtk_sidebar_row_set_property (GObject *object,
break;
case PROP_SECTION_TYPE:
- self->section_type = g_value_get_int (value);
- if (self->section_type == SECTION_COMPUTER ||
- self->section_type == SECTION_OTHER_LOCATIONS)
+ self->section_type = g_value_get_enum (value);
+ if (self->section_type == GTK_PLACES_SECTION_COMPUTER ||
+ self->section_type == GTK_PLACES_SECTION_OTHER_LOCATIONS)
gtk_label_set_ellipsize (GTK_LABEL (self->label_widget), PANGO_ELLIPSIZE_NONE);
else
gtk_label_set_ellipsize (GTK_LABEL (self->label_widget), PANGO_ELLIPSIZE_END);
break;
case PROP_PLACE_TYPE:
- self->place_type = g_value_get_int (value);
+ self->place_type = g_value_get_enum (value);
break;
case PROP_URI:
@@ -337,8 +338,8 @@ gtk_sidebar_row_set_property (GObject *object,
self->tooltip = NULL;
gtk_widget_set_tooltip_text (GTK_WIDGET (self), NULL);
self->ejectable = FALSE;
- self->section_type = SECTION_BOOKMARKS;
- self->place_type = PLACES_BOOKMARK_PLACEHOLDER;
+ self->section_type = GTK_PLACES_SECTION_BOOKMARKS;
+ self->place_type = GTK_PLACES_BOOKMARK_PLACEHOLDER;
g_free (self->uri);
self->uri = NULL;
g_clear_object (&self->drive);
@@ -531,22 +532,24 @@ gtk_sidebar_row_class_init (GtkSidebarRowClass *klass)
G_PARAM_STATIC_STRINGS));
properties [PROP_SECTION_TYPE] =
- g_param_spec_int ("section-type",
- "section type",
- "The section type.",
- SECTION_INVALID, N_SECTIONS, SECTION_INVALID,
- (G_PARAM_READWRITE |
- G_PARAM_STATIC_STRINGS |
- G_PARAM_CONSTRUCT_ONLY));
+ g_param_spec_enum ("section-type",
+ "section type",
+ "The section type.",
+ GTK_TYPE_PLACES_SECTION_TYPE,
+ GTK_PLACES_SECTION_INVALID,
+ (G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT_ONLY));
properties [PROP_PLACE_TYPE] =
- g_param_spec_int ("place-type",
- "place type",
- "The place type.",
- PLACES_INVALID, N_PLACES, PLACES_INVALID,
- (G_PARAM_READWRITE |
- G_PARAM_STATIC_STRINGS |
- G_PARAM_CONSTRUCT_ONLY));
+ g_param_spec_enum ("place-type",
+ "place type",
+ "The place type.",
+ GTK_TYPE_PLACES_PLACE_TYPE,
+ GTK_PLACES_INVALID,
+ (G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS |
+ G_PARAM_CONSTRUCT_ONLY));
properties [PROP_URI] =
g_param_spec_string ("uri",
diff --git a/gtk/gtkstringlist.c b/gtk/gtkstringlist.c
index 5c04301c70..18474b013e 100644
--- a/gtk/gtkstringlist.c
+++ b/gtk/gtkstringlist.c
@@ -95,27 +95,6 @@ gtk_string_object_finalize (GObject *object)
}
static void
-gtk_string_object_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GtkStringObject *self = GTK_STRING_OBJECT (object);
-
- switch (property_id)
- {
- case PROP_STRING:
- g_free (self->string);
- self->string = g_value_dup_string (value);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
gtk_string_object_get_property (GObject *object,
guint property_id,
GValue *value,
@@ -142,7 +121,6 @@ gtk_string_object_class_init (GtkStringObjectClass *class)
GParamSpec *pspec;
object_class->finalize = gtk_string_object_finalize;
- object_class->set_property = gtk_string_object_set_property;
object_class->get_property = gtk_string_object_get_property;
pspec = g_param_spec_string ("string", "String", "String",
diff --git a/gtk/gtktextbuffer.h b/gtk/gtktextbuffer.h
index c084ff838b..2223bb9516 100644
--- a/gtk/gtktextbuffer.h
+++ b/gtk/gtktextbuffer.h
@@ -42,26 +42,6 @@ G_BEGIN_DECLS
* GtkTextBTree is the PRIVATE internal representation of it.
*/
-/**
- * GtkTextBufferTargetInfo:
- * @GTK_TEXT_BUFFER_TARGET_INFO_BUFFER_CONTENTS: Buffer contents
- * @GTK_TEXT_BUFFER_TARGET_INFO_RICH_TEXT: Rich text
- * @GTK_TEXT_BUFFER_TARGET_INFO_TEXT: Text
- *
- * These values are used as “info” for the targets contained in the
- * lists returned by gtk_text_buffer_get_copy_target_list() and
- * gtk_text_buffer_get_paste_target_list().
- *
- * The values counts down from `-1` to avoid clashes
- * with application added drag destinations which usually start at 0.
- */
-typedef enum
-{
- GTK_TEXT_BUFFER_TARGET_INFO_BUFFER_CONTENTS = - 1,
- GTK_TEXT_BUFFER_TARGET_INFO_RICH_TEXT = - 2,
- GTK_TEXT_BUFFER_TARGET_INFO_TEXT = - 3
-} GtkTextBufferTargetInfo;
-
typedef struct _GtkTextBTree GtkTextBTree;
#define GTK_TYPE_TEXT_BUFFER (gtk_text_buffer_get_type ())
diff --git a/gtk/gtktexthandle.c b/gtk/gtktexthandle.c
index 4353a6226d..47cceafa0e 100644
--- a/gtk/gtktexthandle.c
+++ b/gtk/gtktexthandle.c
@@ -44,9 +44,10 @@ struct _GtkTextHandle
{
GtkWidget parent_instance;
- GtkWidget *parent;
GdkSurface *surface;
GskRenderer *renderer;
+ GtkEventController *controller;
+ GtkWidget *controller_widget;
GdkRectangle pointing_to;
GtkBorder border;
@@ -61,6 +62,19 @@ struct _GtkTextHandle
static void gtk_text_handle_native_interface_init (GtkNativeInterface *iface);
+static void handle_drag_begin (GtkGestureDrag *gesture,
+ double x,
+ double y,
+ GtkTextHandle *handle);
+static void handle_drag_update (GtkGestureDrag *gesture,
+ double offset_x,
+ double offset_y,
+ GtkWidget *widget);
+static void handle_drag_end (GtkGestureDrag *gesture,
+ double offset_x,
+ double offset_y,
+ GtkTextHandle *handle);
+
G_DEFINE_TYPE_WITH_CODE (GtkTextHandle, gtk_text_handle, GTK_TYPE_WIDGET,
G_IMPLEMENT_INTERFACE (GTK_TYPE_NATIVE,
gtk_text_handle_native_interface_init))
@@ -116,22 +130,19 @@ gtk_text_handle_present_surface (GtkTextHandle *handle)
GdkPopupLayout *layout;
GdkRectangle rect;
GtkRequisition req;
- double x, y;
+ GtkWidget *parent;
gtk_widget_get_preferred_size (widget, NULL, &req);
gtk_text_handle_get_padding (handle, &handle->border);
- rect.x = handle->pointing_to.x;
- rect.y = handle->pointing_to.y + handle->pointing_to.height - handle->border.top;
+ parent = gtk_widget_get_parent (widget);
+ gtk_widget_get_surface_allocation (parent, &rect);
+
+ rect.x += handle->pointing_to.x;
+ rect.y += handle->pointing_to.y + handle->pointing_to.height - handle->border.top;
rect.width = req.width - handle->border.left - handle->border.right;
rect.height = 1;
- gtk_widget_translate_coordinates (gtk_widget_get_parent (widget),
- gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW),
- rect.x, rect.y, &x, &y);
- rect.x = x;
- rect.y = y;
-
if (handle->role == GTK_TEXT_HANDLE_ROLE_CURSOR)
rect.x -= rect.width / 2;
else if ((handle->role == GTK_TEXT_HANDLE_ROLE_SELECTION_END &&
@@ -188,15 +199,6 @@ surface_render (GdkSurface *surface,
return TRUE;
}
-static gboolean
-surface_event (GdkSurface *surface,
- GdkEvent *event,
- GtkTextHandle *handle)
-{
- gtk_main_do_event (event);
- return TRUE;
-}
-
static void
surface_mapped_changed (GtkWidget *widget)
{
@@ -229,11 +231,11 @@ gtk_text_handle_realize (GtkWidget *widget)
handle->surface = gdk_surface_new_popup (parent_surface, FALSE);
gdk_surface_set_widget (handle->surface, widget);
+ gdk_surface_set_input_region (handle->surface, cairo_region_create ());
g_signal_connect_swapped (handle->surface, "notify::mapped",
G_CALLBACK (surface_mapped_changed), widget);
g_signal_connect (handle->surface, "render", G_CALLBACK (surface_render), widget);
- g_signal_connect (handle->surface, "event", G_CALLBACK (surface_event), widget);
GTK_WIDGET_CLASS (gtk_text_handle_parent_class)->realize (widget);
@@ -251,7 +253,6 @@ gtk_text_handle_unrealize (GtkWidget *widget)
g_clear_object (&handle->renderer);
g_signal_handlers_disconnect_by_func (handle->surface, surface_render, widget);
- g_signal_handlers_disconnect_by_func (handle->surface, surface_event, widget);
g_signal_handlers_disconnect_by_func (handle->surface, surface_mapped_changed, widget);
gdk_surface_set_widget (handle->surface, NULL);
@@ -260,6 +261,28 @@ gtk_text_handle_unrealize (GtkWidget *widget)
}
static void
+text_handle_set_up_gesture (GtkTextHandle *handle)
+{
+ GtkNative *native;
+
+ /* The drag gesture is hooked on the parent native */
+ native = gtk_widget_get_native (gtk_widget_get_parent (GTK_WIDGET (handle)));
+ handle->controller_widget = GTK_WIDGET (native);
+
+ handle->controller = GTK_EVENT_CONTROLLER (gtk_gesture_drag_new ());
+ gtk_event_controller_set_propagation_phase (handle->controller,
+ GTK_PHASE_CAPTURE);
+ g_signal_connect (handle->controller, "drag-begin",
+ G_CALLBACK (handle_drag_begin), handle);
+ g_signal_connect (handle->controller, "drag-update",
+ G_CALLBACK (handle_drag_update), handle);
+ g_signal_connect (handle->controller, "drag-end",
+ G_CALLBACK (handle_drag_end), handle);
+
+ gtk_widget_add_controller (handle->controller_widget, handle->controller);
+}
+
+static void
gtk_text_handle_map (GtkWidget *widget)
{
GtkTextHandle *handle = GTK_TEXT_HANDLE (widget);
@@ -267,7 +290,10 @@ gtk_text_handle_map (GtkWidget *widget)
GTK_WIDGET_CLASS (gtk_text_handle_parent_class)->map (widget);
if (handle->has_point)
- gtk_text_handle_present_surface (handle);
+ {
+ gtk_text_handle_present_surface (handle);
+ text_handle_set_up_gesture (handle);
+ }
}
static void
@@ -277,6 +303,14 @@ gtk_text_handle_unmap (GtkWidget *widget)
GTK_WIDGET_CLASS (gtk_text_handle_parent_class)->unmap (widget);
gdk_surface_hide (handle->surface);
+
+ if (handle->controller_widget)
+ {
+ gtk_widget_remove_controller (handle->controller_widget,
+ handle->controller);
+ handle->controller_widget = NULL;
+ handle->controller = NULL;
+ }
}
static void
@@ -333,26 +367,67 @@ gtk_text_handle_class_init (GtkTextHandleClass *klass)
gtk_widget_class_set_css_name (widget_class, I_("cursor-handle"));
}
+/* Relative to pointing_to x/y */
static void
-handle_drag_begin (GtkGestureDrag *gesture,
- double x,
- double y,
- GtkTextHandle *handle)
+handle_get_input_extents (GtkTextHandle *handle,
+ GtkBorder *border)
{
- GtkWidget *widget;
-
- widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
+ GtkWidget *widget = GTK_WIDGET (handle);
if (handle->role == GTK_TEXT_HANDLE_ROLE_CURSOR)
- x -= gtk_widget_get_width (widget) / 2;
+ {
+ border->left = (-gtk_widget_get_width (widget) / 2) - handle->border.left;
+ border->right = (gtk_widget_get_width (widget) / 2) + handle->border.right;
+ }
else if ((handle->role == GTK_TEXT_HANDLE_ROLE_SELECTION_END &&
gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) ||
(handle->role == GTK_TEXT_HANDLE_ROLE_SELECTION_START &&
gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL))
- x -= gtk_widget_get_width (widget);
+ {
+ border->left = -gtk_widget_get_width (widget) - handle->border.left;
+ border->right = handle->border.right;
+ }
+ else
+ {
+ border->left = -handle->border.left;
+ border->right = gtk_widget_get_width (widget) + handle->border.right;
+ }
- y += handle->border.top / 2;
+ border->top = - handle->border.top;
+ border->bottom = gtk_widget_get_height (widget) + handle->border.bottom;
+}
+static void
+handle_drag_begin (GtkGestureDrag *gesture,
+ double x,
+ double y,
+ GtkTextHandle *handle)
+{
+ GtkBorder input_extents;
+ double widget_x, widget_y;
+
+ x -= handle->pointing_to.x;
+ y -= handle->pointing_to.y;
+
+ /* Figure out if the coordinates fall into the handle input area, coordinates
+ * are relative to the parent widget.
+ */
+ handle_get_input_extents (handle, &input_extents);
+ gtk_widget_translate_coordinates (handle->controller_widget,
+ gtk_widget_get_parent (GTK_WIDGET (handle)),
+ x, y, &widget_x, &widget_y);
+
+ if (widget_x < input_extents.left || widget_x >= input_extents.right ||
+ widget_y < input_extents.top || widget_y >= input_extents.bottom)
+ {
+ gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_DENIED);
+ return;
+ }
+
+ gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
+ /* Store untranslated coordinates here, so ::update does not need
+ * an extra translation
+ */
handle->dx = x;
handle->dy = y;
handle->dragged = TRUE;
@@ -371,19 +446,8 @@ handle_drag_update (GtkGestureDrag *gesture,
gtk_gesture_drag_get_start_point (gesture, &start_x, &start_y);
- x = handle->pointing_to.x + handle->pointing_to.width / 2 +
- start_x + offset_x - handle->dx;
- y = handle->pointing_to.y + handle->pointing_to.height +
- start_y + offset_y - handle->dy;
-
- if (handle->role == GTK_TEXT_HANDLE_ROLE_CURSOR)
- x -= gtk_widget_get_width (widget) / 2;
- else if ((handle->role == GTK_TEXT_HANDLE_ROLE_SELECTION_END &&
- gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) ||
- (handle->role == GTK_TEXT_HANDLE_ROLE_SELECTION_START &&
- gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL))
- x -= gtk_widget_get_width (widget);
-
+ x = start_x + offset_x - handle->dx;
+ y = start_y + offset_y - handle->dy + (handle->pointing_to.height / 2);
g_signal_emit (widget, signals[HANDLE_DRAGGED], 0, x, y);
}
@@ -393,7 +457,15 @@ handle_drag_end (GtkGestureDrag *gesture,
double offset_y,
GtkTextHandle *handle)
{
- g_signal_emit (handle, signals[DRAG_FINISHED], 0);
+ GdkEventSequence *sequence;
+ GtkEventSequenceState state;
+
+ sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
+ state = gtk_gesture_get_sequence_state (GTK_GESTURE (gesture), sequence);
+
+ if (state == GTK_EVENT_SEQUENCE_CLAIMED)
+ g_signal_emit (handle, signals[DRAG_FINISHED], 0);
+
handle->dragged = FALSE;
}
@@ -420,23 +492,14 @@ gtk_text_handle_update_for_role (GtkTextHandle *handle)
gtk_widget_remove_css_class (widget, "bottom");
gtk_widget_remove_css_class (widget, "insertion-cursor");
}
+
+ gtk_widget_queue_draw (widget);
}
static void
-gtk_text_handle_init (GtkTextHandle *widget)
+gtk_text_handle_init (GtkTextHandle *handle)
{
- GtkEventController *controller;
-
- controller = GTK_EVENT_CONTROLLER (gtk_gesture_drag_new ());
- g_signal_connect (controller, "drag-begin",
- G_CALLBACK (handle_drag_begin), widget);
- g_signal_connect (controller, "drag-update",
- G_CALLBACK (handle_drag_update), widget);
- g_signal_connect (controller, "drag-end",
- G_CALLBACK (handle_drag_end), widget);
- gtk_widget_add_controller (GTK_WIDGET (widget), controller);
-
- gtk_text_handle_update_for_role (GTK_TEXT_HANDLE (widget));
+ gtk_text_handle_update_for_role (handle);
}
GtkTextHandle *
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index f94067eda1..22f6d84b71 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -5116,7 +5116,7 @@ gtk_text_view_handle_dragged (GtkTextHandle *handle,
*old_iter = iter;
if (handle == priv->text_handles[TEXT_HANDLE_CURSOR] &&
- !gtk_widget_is_visible (GTK_WIDGET (priv->text_handles[TEXT_HANDLE_SELECTION_BOUND])))
+ gtk_text_handle_get_role (priv->text_handles[TEXT_HANDLE_CURSOR]) == GTK_TEXT_HANDLE_ROLE_CURSOR)
gtk_text_buffer_place_cursor (buffer, &cursor);
else
gtk_text_buffer_select_range (buffer, &cursor, &bound);
@@ -5217,7 +5217,6 @@ gtk_text_view_update_handles (GtkTextView *text_view)
&cursor);
gtk_text_handle_set_role (priv->text_handles[TEXT_HANDLE_CURSOR],
GTK_TEXT_HANDLE_ROLE_CURSOR);
- gtk_widget_show (GTK_WIDGET (priv->text_handles[TEXT_HANDLE_CURSOR]));
}
else if (gtk_text_iter_compare (&cursor, &bound) != 0)
{
@@ -5227,14 +5226,12 @@ gtk_text_view_update_handles (GtkTextView *text_view)
&cursor);
gtk_text_handle_set_role (priv->text_handles[TEXT_HANDLE_CURSOR],
GTK_TEXT_HANDLE_ROLE_SELECTION_START);
- gtk_widget_show (GTK_WIDGET (priv->text_handles[TEXT_HANDLE_CURSOR]));
gtk_text_view_set_handle_position (text_view,
priv->text_handles[TEXT_HANDLE_SELECTION_BOUND],
&bound);
gtk_text_handle_set_role (priv->text_handles[TEXT_HANDLE_SELECTION_BOUND],
GTK_TEXT_HANDLE_ROLE_SELECTION_END);
- gtk_widget_show (GTK_WIDGET (priv->text_handles[TEXT_HANDLE_SELECTION_BOUND]));
}
else
{
@@ -5473,10 +5470,7 @@ gtk_text_view_click_gesture_pressed (GtkGestureClick *gesture,
gtk_text_view_selection_bubble_popup_unset (text_view);
if (is_touchscreen)
- {
- gtk_text_buffer_place_cursor (get_buffer (text_view), &iter);
- priv->handle_place_time = g_get_monotonic_time ();
- }
+ priv->handle_place_time = g_get_monotonic_time ();
else
gtk_text_view_start_selection_drag (text_view, &iter,
SELECT_CHARACTERS, extends);
@@ -7344,11 +7338,6 @@ gtk_text_view_drag_gesture_end (GtkGestureDrag *gesture,
priv = text_view->priv;
sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
- if (!drag_gesture_get_text_surface_coords (gesture, text_view,
- &start_x, &start_y, &x, &y))
- return;
-
-
clicked_in_selection =
g_object_get_qdata (G_OBJECT (gesture), quark_text_selection_data) == NULL;
g_object_set_qdata (G_OBJECT (gesture), quark_text_selection_data, NULL);
@@ -7363,6 +7352,10 @@ gtk_text_view_drag_gesture_end (GtkGestureDrag *gesture,
if (priv->magnifier_popover)
gtk_widget_hide (priv->magnifier_popover);
+ if (!drag_gesture_get_text_surface_coords (gesture, text_view,
+ &start_x, &start_y, &x, &y))
+ return;
+
/* Check whether the drag was cancelled rather than finished */
if (!gtk_gesture_handles_sequence (GTK_GESTURE (gesture), sequence))
return;
@@ -7372,7 +7365,7 @@ gtk_text_view_drag_gesture_end (GtkGestureDrag *gesture,
is_touchscreen = gtk_simulate_touchscreen () ||
gdk_device_get_source (device) == GDK_SOURCE_TOUCHSCREEN;
- if (!is_touchscreen && clicked_in_selection &&
+ if ((is_touchscreen || clicked_in_selection) &&
!gtk_drag_check_threshold (GTK_WIDGET (text_view), start_x, start_y, x, y))
{
GtkTextIter iter;
diff --git a/gtk/gtktreeexpander.c b/gtk/gtktreeexpander.c
index 14992685f7..2a68df898d 100644
--- a/gtk/gtktreeexpander.c
+++ b/gtk/gtktreeexpander.c
@@ -21,6 +21,7 @@
#include "gtktreeexpander.h"
+#include "gtkaccessible.h"
#include "gtkboxlayout.h"
#include "gtkbuiltiniconprivate.h"
#include "gtkdropcontrollermotion.h"
@@ -157,7 +158,11 @@ gtk_tree_expander_update_for_list_row (GtkTreeExpander *self)
{
GtkGesture *gesture;
- self->expander = gtk_builtin_icon_new ("expander");
+ self->expander =
+ g_object_new (GTK_TYPE_BUILTIN_ICON,
+ "css-name", "expander",
+ "accessible-role", GTK_ACCESSIBLE_ROLE_BUTTON,
+ NULL);
gesture = gtk_gesture_click_new ();
gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (gesture),
@@ -178,10 +183,22 @@ gtk_tree_expander_update_for_list_row (GtkTreeExpander *self)
GTK_WIDGET (self),
self->child);
}
+
if (gtk_tree_list_row_get_expanded (self->list_row))
- gtk_widget_set_state_flags (self->expander, GTK_STATE_FLAG_CHECKED, FALSE);
+ {
+ gtk_widget_set_state_flags (self->expander, GTK_STATE_FLAG_CHECKED, FALSE);
+ gtk_accessible_update_state (GTK_ACCESSIBLE (self->expander),
+ GTK_ACCESSIBLE_STATE_EXPANDED, TRUE,
+ -1);
+ }
else
- gtk_widget_unset_state_flags (self->expander, GTK_STATE_FLAG_CHECKED);
+ {
+ gtk_widget_unset_state_flags (self->expander, GTK_STATE_FLAG_CHECKED);
+ gtk_accessible_update_state (GTK_ACCESSIBLE (self->expander),
+ GTK_ACCESSIBLE_STATE_EXPANDED, FALSE,
+ -1);
+ }
+
child = gtk_widget_get_prev_sibling (self->expander);
}
else
@@ -199,7 +216,15 @@ gtk_tree_expander_update_for_list_row (GtkTreeExpander *self)
if (child)
child = gtk_widget_get_prev_sibling (child);
else
- gtk_widget_insert_after (gtk_builtin_icon_new ("indent"), GTK_WIDGET (self), NULL);
+ {
+ GtkWidget *indent =
+ g_object_new (GTK_TYPE_BUILTIN_ICON,
+ "css-name", "indent",
+ "accessible-role", GTK_ACCESSIBLE_ROLE_PRESENTATION,
+ NULL);
+
+ gtk_widget_insert_after (indent, GTK_WIDGET (self), NULL);
+ }
}
while (child)
@@ -221,9 +246,19 @@ gtk_tree_expander_list_row_notify_cb (GtkTreeListRow *list_row,
if (self->expander)
{
if (gtk_tree_list_row_get_expanded (list_row))
- gtk_widget_set_state_flags (self->expander, GTK_STATE_FLAG_CHECKED, FALSE);
+ {
+ gtk_widget_set_state_flags (self->expander, GTK_STATE_FLAG_CHECKED, FALSE);
+ gtk_accessible_update_state (GTK_ACCESSIBLE (self->expander),
+ GTK_ACCESSIBLE_STATE_EXPANDED, TRUE,
+ -1);
+ }
else
- gtk_widget_unset_state_flags (self->expander, GTK_STATE_FLAG_CHECKED);
+ {
+ gtk_widget_unset_state_flags (self->expander, GTK_STATE_FLAG_CHECKED);
+ gtk_accessible_update_state (GTK_ACCESSIBLE (self->expander),
+ GTK_ACCESSIBLE_STATE_EXPANDED, FALSE,
+ -1);
+ }
}
}
else if (pspec->name == g_intern_static_string ("item"))
diff --git a/gtk/gtktreemodel.c b/gtk/gtktreemodel.c
index 377a365d7b..b4ae17545e 100644
--- a/gtk/gtktreemodel.c
+++ b/gtk/gtktreemodel.c
@@ -1426,7 +1426,7 @@ gtk_tree_model_get_value (GtkTreeModel *tree_model,
/**
* gtk_tree_model_iter_next:
* @tree_model: a #GtkTreeModel
- * @iter: (in): the #GtkTreeIter-struct
+ * @iter: (inout): the #GtkTreeIter-struct
*
* Sets @iter to point to the node following it at the current level.
*
@@ -1474,7 +1474,7 @@ gtk_tree_model_iter_previous_default (GtkTreeModel *tree_model,
/**
* gtk_tree_model_iter_previous:
* @tree_model: a #GtkTreeModel
- * @iter: (in): the #GtkTreeIter-struct
+ * @iter: (inout): the #GtkTreeIter-struct
*
* Sets @iter to point to the previous node at the current level.
*
diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c
index abc7ca36d4..27cc237a49 100644
--- a/gtk/gtktreestore.c
+++ b/gtk/gtktreestore.c
@@ -1192,7 +1192,7 @@ gtk_tree_store_set (GtkTreeStore *tree_store,
/**
* gtk_tree_store_remove:
* @tree_store: A #GtkTreeStore
- * @iter: (inout): A valid #GtkTreeIter
+ * @iter: A valid #GtkTreeIter
*
* Removes @iter from @tree_store. After being removed, @iter is set to the
* next valid row at that level, or invalidated if it previously pointed to the
diff --git a/gtk/gtktreeviewcolumn.h b/gtk/gtktreeviewcolumn.h
index 6c83cdbc66..7199636f24 100644
--- a/gtk/gtktreeviewcolumn.h
+++ b/gtk/gtktreeviewcolumn.h
@@ -44,7 +44,7 @@ typedef struct _GtkTreeViewColumn GtkTreeViewColumn;
* @GTK_TREE_VIEW_COLUMN_FIXED: Columns are a fixed numbers of pixels wide.
*
* The sizing method the column uses to determine its width. Please note
- * that @GTK_TREE_VIEW_COLUMN_AUTOSIZE are inefficient for large views, and
+ * that %GTK_TREE_VIEW_COLUMN_AUTOSIZE are inefficient for large views, and
* can make columns appear choppy.
*/
typedef enum
diff --git a/gtk/gtkversion.c b/gtk/gtkversion.c
index eab7146140..ea5a5452d4 100644
--- a/gtk/gtkversion.c
+++ b/gtk/gtkversion.c
@@ -43,7 +43,7 @@
* (e.g. in GTK version 3.1.5 this is 3.)
*
* This function is in the library, so it represents the GTK library
- * your code is running against. Contrast with the #GTK_MAJOR_VERSION
+ * your code is running against. Contrast with the %GTK_MAJOR_VERSION
* macro, which represents the major version of the GTK headers you
* have included when compiling your code.
*
@@ -63,7 +63,7 @@ gtk_get_major_version (void)
*
* This function is in the library, so it represents the GTK library
* your code is are running against. Contrast with the
- * #GTK_MINOR_VERSION macro, which represents the minor version of the
+ * %GTK_MINOR_VERSION macro, which represents the minor version of the
* GTK headers you have included when compiling your code.
*
* Returns: the minor version number of the GTK library
@@ -82,7 +82,7 @@ gtk_get_minor_version (void)
*
* This function is in the library, so it represents the GTK library
* your code is are running against. Contrast with the
- * #GTK_MICRO_VERSION macro, which represents the micro version of the
+ * %GTK_MICRO_VERSION macro, which represents the micro version of the
* GTK headers you have included when compiling your code.
*
* Returns: the micro version number of the GTK library
@@ -133,7 +133,7 @@ gtk_get_interface_age (void)
*
* Checks that the GTK library in use is compatible with the
* given version. Generally you would pass in the constants
- * #GTK_MAJOR_VERSION, #GTK_MINOR_VERSION, #GTK_MICRO_VERSION
+ * %GTK_MAJOR_VERSION, %GTK_MINOR_VERSION, %GTK_MICRO_VERSION
* as the three arguments to this function; that produces
* a check that the library in use is compatible with
* the version of GTK the application or module was compiled
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index f9bc34a969..023f0ceb3a 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -1013,7 +1013,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
g_param_spec_boolean ("can-target",
P_("Can target"),
P_("Whether the widget can receive pointer events"),
- FALSE,
+ TRUE,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
@@ -1731,9 +1731,11 @@ gtk_widget_set_property (GObject *object,
gtk_widget_set_layout_manager (widget, g_value_dup_object (value));
break;
case PROP_ACCESSIBLE_ROLE:
- if (priv->at_context == NULL)
+ if (priv->at_context == NULL || !gtk_at_context_is_realized (priv->at_context))
{
priv->accessible_role = g_value_get_enum (value);
+ if (priv->at_context)
+ g_object_set (priv->at_context, "accessible-role", priv->accessible_role, NULL);
g_object_notify_by_pspec (object, pspec);
}
else
@@ -2346,6 +2348,16 @@ gtk_widget_root (GtkWidget *widget)
if (priv->layout_manager)
gtk_layout_manager_set_root (priv->layout_manager, priv->root);
+ if (priv->at_context != NULL)
+ {
+ GtkATContext *root_context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (priv->root));
+
+ if (root_context)
+ gtk_at_context_realize (root_context);
+
+ gtk_at_context_realize (priv->at_context);
+ }
+
GTK_WIDGET_GET_CLASS (widget)->root (widget);
if (!GTK_IS_ROOT (widget))
@@ -2370,6 +2382,9 @@ gtk_widget_unroot (GtkWidget *widget)
GTK_WIDGET_GET_CLASS (widget)->unroot (widget);
+ if (priv->at_context)
+ gtk_at_context_unrealize (priv->at_context);
+
if (priv->context)
gtk_style_context_set_display (priv->context, gdk_display_get_default ());
@@ -9453,6 +9468,10 @@ gtk_widget_set_tooltip_text (GtkWidget *widget,
priv->tooltip_text = tooltip_text;
priv->tooltip_markup = tooltip_markup;
+ gtk_accessible_update_property (GTK_ACCESSIBLE (widget),
+ GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, priv->tooltip_text,
+ -1);
+
gtk_widget_set_has_tooltip (widget, priv->tooltip_text != NULL);
if (_gtk_widget_get_visible (widget))
gtk_widget_trigger_tooltip_query (widget);
@@ -9535,6 +9554,10 @@ gtk_widget_set_tooltip_markup (GtkWidget *widget,
NULL);
}
+ gtk_accessible_update_property (GTK_ACCESSIBLE (widget),
+ GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, priv->tooltip_text,
+ -1);
+
gtk_widget_set_has_tooltip (widget, tooltip_markup != NULL);
if (_gtk_widget_get_visible (widget))
gtk_widget_trigger_tooltip_query (widget);
diff --git a/gtk/gtkwindowcontrols.c b/gtk/gtkwindowcontrols.c
index 3411a5d13f..d2b3667555 100644
--- a/gtk/gtkwindowcontrols.c
+++ b/gtk/gtkwindowcontrols.c
@@ -20,6 +20,7 @@
#include "gtkwindowcontrols.h"
+#include "gtkaccessible.h"
#include "gtkactionable.h"
#include "gtkboxlayout.h"
#include "gtkbutton.h"
@@ -272,6 +273,11 @@ update_window_buttons (GtkWindowControls *self)
gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
gtk_widget_add_css_class (button, "icon");
+ /* The icon is not relevant for accessibility purposes */
+ gtk_accessible_update_state (GTK_ACCESSIBLE (button),
+ GTK_ACCESSIBLE_STATE_HIDDEN, TRUE,
+ -1);
+
if (!update_window_icon (window, button))
{
g_object_ref_sink (button);
@@ -291,6 +297,11 @@ update_window_buttons (GtkWindowControls *self)
gtk_widget_set_can_focus (button, FALSE);
gtk_actionable_set_action_name (GTK_ACTIONABLE (button),
"window.minimize");
+ gtk_accessible_update_property (GTK_ACCESSIBLE (button),
+ GTK_ACCESSIBLE_PROPERTY_LABEL, _("Minimize"),
+ GTK_ACCESSIBLE_PROPERTY_DESCRIPTION,
+ _("Minimize the window"),
+ -1);
}
else if (strcmp (tokens[i], "maximize") == 0 &&
resizable &&
@@ -308,6 +319,11 @@ update_window_buttons (GtkWindowControls *self)
gtk_widget_set_can_focus (button, FALSE);
gtk_actionable_set_action_name (GTK_ACTIONABLE (button),
"window.toggle-maximized");
+ gtk_accessible_update_property (GTK_ACCESSIBLE (button),
+ GTK_ACCESSIBLE_PROPERTY_LABEL, _("Maximize"),
+ GTK_ACCESSIBLE_PROPERTY_DESCRIPTION,
+ _("Maximize the window"),
+ -1);
}
else if (strcmp (tokens[i], "close") == 0 &&
deletable)
@@ -321,6 +337,11 @@ update_window_buttons (GtkWindowControls *self)
gtk_widget_set_can_focus (button, FALSE);
gtk_actionable_set_action_name (GTK_ACTIONABLE (button),
"window.close");
+ gtk_accessible_update_property (GTK_ACCESSIBLE (button),
+ GTK_ACCESSIBLE_PROPERTY_LABEL, _("Close"),
+ GTK_ACCESSIBLE_PROPERTY_DESCRIPTION,
+ _("Close the window"),
+ -1);
}
if (button)
diff --git a/gtk/meson.build b/gtk/meson.build
index 614b4079f8..d7e042d857 100644
--- a/gtk/meson.build
+++ b/gtk/meson.build
@@ -437,6 +437,7 @@ gtk_public_sources = files([
gtk_private_type_headers = files([
'gtkcsstypesprivate.h',
'gtktexthandleprivate.h',
+ 'gtkplacessidebarprivate.h',
])
gtk_public_headers = files([
diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss
index 119694649d..a552965cdd 100644
--- a/gtk/theme/Adwaita/_common.scss
+++ b/gtk/theme/Adwaita/_common.scss
@@ -1845,6 +1845,9 @@ popover.background {
}
}
+magnifier {
+ background-color: $base_color;
+}
/*************
* Notebooks *
diff --git a/gtk/tools/gtk-builder-tool-simplify.c b/gtk/tools/gtk-builder-tool-simplify.c
index f2f57d8eab..d40556b0cb 100644
--- a/gtk/tools/gtk-builder-tool-simplify.c
+++ b/gtk/tools/gtk-builder-tool-simplify.c
@@ -212,59 +212,6 @@ needs_explicit_setting (GParamSpec *pspec,
}
static gboolean
-keep_for_rewrite (const char *class_name,
- const char *property_name,
- PropKind kind)
-{
- struct _Prop {
- const char *class;
- const char *property;
- PropKind kind;
- } props[] = {
- { "GtkPopover", "modal", PROP_KIND_OBJECT },
- { "GtkActionBar", "pack-type", PROP_KIND_PACKING },
- { "GtkHeaderBar", "pack-type", PROP_KIND_PACKING },
- { "GtkPopoverMenu", "submenu", PROP_KIND_PACKING },
- { "GtkToolbar", "expand", PROP_KIND_PACKING },
- { "GtkToolbar", "homogeneous", PROP_KIND_PACKING },
- { "GtkPaned", "resize", PROP_KIND_PACKING },
- { "GtkPaned", "shrink", PROP_KIND_PACKING },
- { "GtkOverlay", "measure", PROP_KIND_PACKING },
- { "GtkOverlay", "clip-overlay", PROP_KIND_PACKING },
- { "GtkGrid", "column", PROP_KIND_PACKING },
- { "GtkGrid", "row", PROP_KIND_PACKING },
- { "GtkGrid", "width", PROP_KIND_PACKING },
- { "GtkGrid", "height", PROP_KIND_PACKING },
- { "GtkStack", "name", PROP_KIND_PACKING },
- { "GtkStack", "title", PROP_KIND_PACKING },
- { "GtkStack", "icon-name", PROP_KIND_PACKING },
- { "GtkStack", "needs-attention", PROP_KIND_PACKING },
- };
- gboolean found;
- int k;
- char *canonical_name;
-
- canonical_name = g_strdup (property_name);
- g_strdelimit (canonical_name, "_", '-');
-
- found = FALSE;
- for (k = 0; k < G_N_ELEMENTS (props); k++)
- {
- if (strcmp (class_name, props[k].class) == 0 &&
- strcmp (canonical_name, props[k].property) == 0 &&
- kind == props[k].kind)
- {
- found = TRUE;
- break;
- }
- }
-
- g_free (canonical_name);
-
- return found;
-}
-
-static gboolean
has_attribute (Element *elt,
const char *name,
const char *value)
@@ -537,6 +484,7 @@ set_attribute_value (Element *element,
const char *value)
{
int i;
+ int len;
for (i = 0; element->attribute_names[i]; i++)
{
@@ -547,6 +495,14 @@ set_attribute_value (Element *element,
return;
}
}
+
+ len = g_strv_length (element->attribute_names);
+ element->attribute_names = g_realloc (element->attribute_names, len + 2);
+ element->attribute_values = g_realloc (element->attribute_values, len + 2);
+ element->attribute_names[len] = g_strdup (name);
+ element->attribute_values[len] = g_strdup (value);
+ element->attribute_names[len + 1] = NULL;
+ element->attribute_values[len + 1] = NULL;
}
static gboolean
@@ -589,7 +545,7 @@ static gboolean
property_is_boolean (Element *element,
MyParserData *data)
{
- GParamSpec *pspec;
+ GParamSpec *pspec = NULL;
const char *class_name;
const char *property_name;
int i;
@@ -605,7 +561,8 @@ property_is_boolean (Element *element,
property_name = (const char *)element->attribute_values[i];
}
- pspec = get_property_pspec (data, class_name, property_name, kind);
+ if (class_name && property_name)
+ pspec = get_property_pspec (data, class_name, property_name, kind);
if (pspec)
return G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_BOOLEAN;
@@ -624,7 +581,7 @@ warn_missing_property (Element *element,
g_printerr (_("%s:%d: %sproperty %s::%s not found\n"),
data->input_filename, element->line_number, kind_str[kind], class_name, property_name);
}
-
+
static gboolean
property_can_be_omitted (Element *element,
MyParserData *data)
@@ -656,10 +613,6 @@ property_can_be_omitted (Element *element,
property_name = (const char *)element->attribute_values[i];
}
- if (data->convert3to4 &&
- keep_for_rewrite (class_name, property_name, kind))
- return FALSE; /* keep, will be rewritten */
-
if (translatable)
return FALSE;
@@ -1140,86 +1093,6 @@ rewrite_pack_type (Element *element,
}
static void
-rewrite_child_prop_to_prop_child (Element *element,
- MyParserData *data,
- const char *child_prop,
- const char *prop)
-{
- Element *object = NULL;
- Element *replaced = NULL;
- GList *l, *ll;
-
- if (!g_str_equal (element->element_name, "child"))
- return;
-
- for (l = element->children; l; l = l->next)
- {
- Element *elt = l->data;
-
- if (g_str_equal (elt->element_name, "object"))
- object = elt;
-
- if (g_str_equal (elt->element_name, "packing"))
- {
- for (ll = elt->children; ll; ll = ll->next)
- {
- Element *elt2 = ll->data;
-
- if (g_str_equal (elt2->element_name, "property") &&
- has_attribute (elt2, "name", child_prop))
- {
- replaced = elt2;
- elt->children = g_list_remove (elt->children, replaced);
- if (elt->children == NULL)
- {
- element->children = g_list_remove (element->children, elt);
- free_element (elt);
- }
- break;
- }
- }
- }
-
- if (replaced)
- break;
- }
-
- if (replaced)
- {
- Element *elt;
-
- elt = g_new0 (Element, 1);
- elt->parent = element;
- elt->element_name = g_strdup ("property");
- elt->attribute_names = g_new0 (char *, 2);
- elt->attribute_names[0] = g_strdup ("name");
- elt->attribute_values = g_new0 (char *, 2);
- elt->attribute_values[0] = g_strdup (prop);
- elt->data = g_strdup (replaced->data);
-
- object->children = g_list_prepend (object->children, elt);
-
- free_element (replaced);
- }
-}
-
-static void
-rewrite_child_prop_to_prop (Element *element,
- MyParserData *data,
- const char *child_prop,
- const char *prop)
-{
- GList *l;
-
- for (l = element->children; l; l = l->next)
- {
- Element *elt = l->data;
- if (g_str_equal (elt->element_name, "child"))
- rewrite_child_prop_to_prop_child (elt, data, child_prop, prop);
- }
-}
-
-static void
rewrite_paned_child (Element *element,
MyParserData *data,
Element *child,
@@ -1322,10 +1195,10 @@ rewrite_paned (Element *element,
}
if (child1)
- rewrite_paned_child (element, data, child1, "child1");
+ rewrite_paned_child (element, data, child1, "start-child");
if (child2)
- rewrite_paned_child (element, data, child2, "child2");
+ rewrite_paned_child (element, data, child2, "end-child");
}
static void
@@ -1389,46 +1262,6 @@ rewrite_dialog (Element *element,
}
static void
-rewrite_layout_props (Element *element,
- MyParserData *data)
-{
- GList *l, *ll;
-
- for (l = element->children; l; l = l->next)
- {
- Element *child = l->data;
-
- if (g_str_equal (child->element_name, "child"))
- {
- Element *object = NULL;
- Element *packing = NULL;
-
- for (ll = child->children; ll; ll = ll->next)
- {
- Element *elt2 = ll->data;
-
- if (g_str_equal (elt2->element_name, "object"))
- object = elt2;
-
- if (g_str_equal (elt2->element_name, "packing"))
- packing = elt2;
- }
-
- if (object && packing)
- {
- child->children = g_list_remove (child->children, packing);
-
- g_free (packing->element_name);
- packing->element_name = g_strdup ("layout");
-
- packing->parent = object;
- object->children = g_list_append (object->children, packing);
- }
- }
- }
-}
-
-static void
rewrite_grid_layout_prop (Element *element,
const char *attr_name,
const char *old_value,
@@ -1514,6 +1347,21 @@ rewrite_grid_layout (Element *element,
}
}
+static Element *
+add_element (Element *parent,
+ const char *element_name)
+{
+ Element *child;
+
+ child = g_new0 (Element, 1);
+ child->parent = parent;
+ child->element_name = g_strdup (element_name);
+ child->attribute_names = g_new0 (char *, 1);
+ child->attribute_values = g_new0 (char *, 1);
+ parent->children = g_list_prepend (parent->children, child);
+
+ return child;
+}
static Element *
write_box_prop (Element *element,
@@ -1526,16 +1374,11 @@ write_box_prop (Element *element,
g_free (element->data);
else
{
- element = g_new0 (Element, 1);
- element->parent = parent;
- element->element_name = g_strdup ("property");
- element->attribute_names = g_new0 (char *, 2);
- element->attribute_names[0] = g_strdup ("name");
- element->attribute_values = g_new0 (char *, 2);
- element->attribute_values[0] = g_strdup (name);
- parent->children = g_list_prepend (parent->children, element);
+ element = add_element (parent, "property");
+ set_attribute_value (element, "name", name);
}
element->data = g_strdup (value);
+
return element;
}
@@ -1747,27 +1590,16 @@ static void
rewrite_radio_button (Element *element,
MyParserData *data)
{
- int i;
gboolean draw_indicator = TRUE;
- const char *new_class;
if (!remove_boolean_prop (element, data, "draw-indicator", &draw_indicator))
remove_boolean_prop (element, data, "draw_indicator", &draw_indicator);
if (draw_indicator)
- new_class = "GtkCheckButton";
+ set_attribute_value (element, "class", "GtkCheckButton");
else
- new_class = "GtkToggleButton";
+ set_attribute_value (element, "class", "GtkToggleButton");
- for (i = 0; element->attribute_names[i]; i++)
- {
- if (strcmp (element->attribute_names[i], "class") == 0)
- {
- g_free (element->attribute_values[i]);
- element->attribute_values[i] = g_strdup (new_class);
- break;
- }
- }
}
static gboolean
@@ -1797,15 +1629,200 @@ rewrite_scale (Element *element,
!has_prop (element, data, "draw_value"))
{
Element *child;
- child = g_new0 (Element, 1);
- child->parent = element;
- child->element_name = g_strdup ("property");
- child->attribute_names = g_new0 (char *, 2);
- child->attribute_names[0] = g_strdup ("name");
- child->attribute_values = g_new0 (char *, 2);
- child->attribute_values[0] = g_strdup ("draw-value");
+ child = add_element (element, "property");
+ set_attribute_value (child, "name", "draw-value");
child->data = g_strdup ("1");
- element->children = g_list_prepend (element->children, child);
+ }
+}
+
+static void
+rewrite_overlay (Element *element,
+ MyParserData *data)
+{
+ GList *l, *ll;
+
+ for (l = element->children; l; l = l->next)
+ {
+ Element *child = l->data;
+
+ if (g_str_equal (child->element_name, "child"))
+ {
+ Element *object = NULL;
+ Element *packing = NULL;
+
+ for (ll = child->children; ll; ll = ll->next)
+ {
+ Element *elt2 = ll->data;
+
+ if (g_str_equal (elt2->element_name, "object"))
+ object = elt2;
+
+ if (g_str_equal (elt2->element_name, "packing"))
+ packing = elt2;
+ }
+
+ if (object && packing)
+ {
+ child->children = g_list_remove (child->children, packing);
+
+ for (ll = packing->children; ll; ll = ll->next)
+ {
+ Element *elt2 = ll->data;
+
+ if (g_str_equal (elt2->element_name, "property") &&
+ (has_attribute (elt2, "name", "pass-through") ||
+ has_attribute (elt2, "name", "pass_through")))
+ {
+ const char *b = canonical_boolean_value (data, elt2->data);
+ if (g_str_equal (b, "1"))
+ {
+ Element *new_prop;
+
+ new_prop = add_element (object, "property");
+ set_attribute_value (new_prop, "name", "can-target");
+ new_prop->data = g_strdup ("0");
+ }
+ break;
+ }
+ }
+
+ free_element (packing);
+ }
+ }
+ }
+}
+
+static void
+rewrite_toolbar (Element *element,
+ MyParserData *data)
+{
+ GList *l, *ll;
+ Element *style = NULL;
+
+ set_attribute_value (element, "class", "GtkBox");
+
+ for (l = element->children; l; l = l->next)
+ {
+ Element *child = l->data;
+ Element *object = NULL;
+ Element *packing = NULL;
+
+ if (g_str_equal (child->element_name, "style"))
+ style = child;
+
+ if (!g_str_equal (child->element_name, "child"))
+ continue;
+
+ for (ll = child->children; ll; ll = ll->next)
+ {
+ Element *elt2 = ll->data;
+
+ if (g_str_equal (elt2->element_name, "object"))
+ object = elt2;
+
+ if (g_str_equal (elt2->element_name, "packing"))
+ packing = elt2;
+ }
+
+ if (object)
+ {
+ const char *class_name;
+
+ class_name = get_class_name (object);
+
+ if (g_str_equal (class_name, "GtkToolButton"))
+ {
+ set_attribute_value (object, "class", "GtkButton");
+ }
+ else if (g_str_equal (class_name, "GtkToggleToolButton") ||
+ g_str_equal (class_name, "GtkRadioToolButton"))
+ {
+ set_attribute_value (object, "class", "GtkToggleButton");
+ }
+ else if (g_str_equal (class_name, "GtkSeparatorToolItem"))
+ {
+ Element *prop;
+
+ set_attribute_value (object, "class", "GtkSeparator");
+ prop = add_element (object, "property");
+ set_attribute_value (prop, "name", "orientation");
+ prop->data = g_strdup ("vertical");
+ }
+ }
+
+ if (packing)
+ child->children = g_list_remove (child->children, packing);
+ }
+
+ if (!style)
+ style = add_element (element, "style");
+
+ set_attribute_value (add_element (style, "class"), "name", "toolbar");
+}
+
+static void
+rewrite_fixed (Element *element,
+ MyParserData *data)
+{
+ GList *l, *ll;
+
+ for (l = element->children; l; l = l->next)
+ {
+ Element *child = l->data;
+
+ if (g_str_equal (child->element_name, "child"))
+ {
+ Element *object = NULL;
+ Element *packing = NULL;
+
+ for (ll = child->children; ll; ll = ll->next)
+ {
+ Element *elt2 = ll->data;
+
+ if (g_str_equal (elt2->element_name, "object"))
+ object = elt2;
+
+ if (g_str_equal (elt2->element_name, "packing"))
+ packing = elt2;
+ }
+
+ if (object && packing)
+ {
+ int x = 0;
+ int y = 0;
+ Element *layout;
+ Element *new_prop;
+ GskTransform *transform;
+
+ for (ll = packing->children; ll; ll = ll->next)
+ {
+ Element *elt2 = ll->data;
+ GValue value = G_VALUE_INIT;
+
+ if (has_attribute (elt2, "name", "x"))
+ {
+ if (gtk_builder_value_from_string_type (data->builder, G_TYPE_INT, elt2->data, &value, NULL))
+ x = g_value_get_int (&value);
+ }
+ else if (has_attribute (elt2, "name", "y"))
+ {
+ if (gtk_builder_value_from_string_type (data->builder, G_TYPE_INT, elt2->data, &value, NULL))
+ y = g_value_get_int (&value);
+ }
+ }
+
+ child->children = g_list_remove (child->children, packing);
+ free_element (packing);
+
+ layout = add_element (object, "layout");
+ new_prop = add_element (layout, "property");
+ set_attribute_value (new_prop, "name", "transform");
+
+ transform = gsk_transform_translate (NULL, &GRAPHENE_POINT_INIT (x, y));
+ new_prop->data = gsk_transform_to_string (transform);
+ gsk_transform_unref (transform);
+ }
+ }
}
}
@@ -1900,16 +1917,8 @@ rewrite_element (Element *element,
rewrite_pack_type (element, data);
if (element_is_object_or_template (element) &&
- g_str_equal (get_class_name (element), "GtkPopoverMenu"))
- rewrite_child_prop_to_prop (element, data, "submenu", "name");
-
- if (element_is_object_or_template (element) &&
- g_str_equal (get_class_name (element), "GtkToolbar"))
- rewrite_child_prop_to_prop (element, data, "expand", "expand-item");
-
- if (element_is_object_or_template (element) &&
g_str_equal (get_class_name (element), "GtkToolbar"))
- rewrite_child_prop_to_prop (element, data, "homogeneous", "homogeneous");
+ rewrite_toolbar (element, data);
if (element_is_object_or_template (element) &&
g_str_equal (get_class_name (element), "GtkPaned"))
@@ -1921,7 +1930,7 @@ rewrite_element (Element *element,
if (element_is_object_or_template (element) &&
g_str_equal (get_class_name (element), "GtkOverlay"))
- rewrite_layout_props (element, data);
+ rewrite_overlay (element, data);
if (element_is_object_or_template (element) &&
g_str_equal (get_class_name (element), "GtkGrid"))
@@ -1935,7 +1944,7 @@ rewrite_element (Element *element,
if (element_is_object_or_template (element) &&
g_str_equal (get_class_name (element), "GtkFixed"))
- rewrite_layout_props (element, data);
+ rewrite_fixed (element, data);
if (element_is_object_or_template (element) &&
(g_str_equal (get_class_name (element), "GtkAspectFrame") ||
@@ -2015,15 +2024,11 @@ add_old_default_properties (Element *element,
if (!has_visible)
{
- Element *new_prop = g_new0 (Element, 1);
- new_prop->parent = element;
- new_prop->element_name = g_strdup ("property");
- new_prop->attribute_names = g_new0 (char *, 2);
- new_prop->attribute_names[0] = g_strdup ("name");
- new_prop->attribute_values = g_new0 (char *, 2);
- new_prop->attribute_values[0] = g_strdup ("visible");
+ Element *new_prop;
+
+ new_prop = add_element (element, "property");
+ set_attribute_value (new_prop, "name", "visible");
new_prop->data = g_strdup ("0");
- element->children = g_list_prepend (element->children, new_prop);
}
}
}
@@ -2090,7 +2095,7 @@ dump_element (Element *element,
g_fprintf (output, "]]>");
}
else
- {
+ {
char *escaped = g_markup_escape_text (element->data, -1);
g_fprintf (output, "%s", escaped);
g_free (escaped);
diff --git a/gtk/tools/gtk-builder-tool-validate.c b/gtk/tools/gtk-builder-tool-validate.c
index 63910f9fb6..8551231730 100644
--- a/gtk/tools/gtk-builder-tool-validate.c
+++ b/gtk/tools/gtk-builder-tool-validate.c
@@ -139,7 +139,7 @@ validate_file (const char *filename)
}
else
{
- g_printerr ("%s: %s\n", filename, error->message);
+ g_printerr ("%s\n", error->message);
return FALSE;
}
}
diff --git a/gtk/tools/gtk-builder-tool.c b/gtk/tools/gtk-builder-tool.c
index e07cfb6218..e45a52672d 100644
--- a/gtk/tools/gtk-builder-tool.c
+++ b/gtk/tools/gtk-builder-tool.c
@@ -52,11 +52,66 @@ usage (void)
exit (1);
}
+#if !GLIB_CHECK_VERSION(2,67,0)
+static gboolean
+g_log_writer_default_would_drop (GLogLevelFlags level,
+ const char *domain)
+{
+ return (level & (G_LOG_LEVEL_ERROR |
+ G_LOG_LEVEL_CRITICAL |
+ G_LOG_LEVEL_WARNING)) == 0;
+}
+#endif
+
+static GLogWriterOutput
+log_writer_func (GLogLevelFlags level,
+ const GLogField *fields,
+ gsize n_fields,
+ gpointer user_data)
+{
+ gsize i;
+ const char *domain = NULL;
+ const char *message = NULL;
+
+ for (i = 0; i < n_fields; i++)
+ {
+ if (g_strcmp0 (fields[i].key, "GLIB_DOMAIN") == 0)
+ domain = fields[i].value;
+ else if (g_strcmp0 (fields[i].key, "MESSAGE") == 0)
+ message = fields[i].value;
+ }
+
+ if (message != NULL && !g_log_writer_default_would_drop (level, domain))
+ {
+ const char *prefix;
+ switch (level & G_LOG_LEVEL_MASK)
+ {
+ case G_LOG_LEVEL_ERROR:
+ prefix = "ERROR";
+ break;
+ case G_LOG_LEVEL_CRITICAL:
+ prefix = "CRITICAL";
+ break;
+ case G_LOG_LEVEL_WARNING:
+ prefix = "WARNING";
+ break;
+ default:
+ prefix = "INFO";
+ break;
+ }
+ g_printerr ("%s-%s: %s\n", domain, prefix, message);
+ }
+
+ return G_LOG_WRITER_HANDLED;
+}
+
int
main (int argc, const char *argv[])
{
g_set_prgname ("gtk-builder-tool");
+ g_log_set_writer_func (log_writer_func, NULL, NULL);
+
gtk_init ();
gtk_test_register_all_types ();
diff --git a/meson.build b/meson.build
index f3ff23986b..306b55f686 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
project('gtk', 'c',
- version: '3.99.3',
+ version: '3.99.4',
default_options: [
'buildtype=debugoptimized',
'warning_level=1',
diff --git a/po-properties/POTFILES.skip b/po-properties/POTFILES.skip
index 07372ceead..b8847035a4 100644
--- a/po-properties/POTFILES.skip
+++ b/po-properties/POTFILES.skip
@@ -8,6 +8,7 @@ demos/gtk-demo/blendmodes.ui
demos/gtk-demo/changedisplay.c
demos/gtk-demo/clipboard.c
demos/gtk-demo/combobox.c
+demos/gtk-demo/constraints.ui
demos/gtk-demo/cursors.ui
demos/gtk-demo/demoimage.c
demos/gtk-demo/demo.ui
@@ -182,6 +183,7 @@ testsuite/gtk/focus-chain/widget-factory3.ui
testsuite/gtk/focus-chain/widget-factory.ui
testsuite/gtk/ui/a11y2.ui
testsuite/gtk/ui/celllayout1.ui
+testsuite/gtk/ui/constraints.ui
testsuite/gtk/ui/container1.ui
testsuite/gtk/ui/container8.ui
testsuite/gtk/ui/scale1.ui
@@ -360,6 +362,7 @@ testsuite/tools/simplify-data-3to4/grid.ui
testsuite/tools/simplify-data-3to4/notebook.ui
testsuite/tools/simplify-data-3to4/office-runner.ui
testsuite/tools/simplify-data-3to4/stack.ui
+testsuite/tools/simplify-data-3to4/toolbar.ui
testsuite/tools/simplify-data/test3.ui
tests/visuals/linked-buttons-horizontal.ui
tests/visuals/linked-buttons-vertical.ui
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
index 4a27b36b3e..5992de2117 100644
--- a/po/POTFILES.skip
+++ b/po/POTFILES.skip
@@ -8,6 +8,7 @@ demos/gtk-demo/blendmodes.ui
demos/gtk-demo/changedisplay.c
demos/gtk-demo/clipboard.c
demos/gtk-demo/combobox.c
+demos/gtk-demo/constraints.ui
demos/gtk-demo/cursors.ui
demos/gtk-demo/demoimage.c
demos/gtk-demo/demo.ui
@@ -140,6 +141,7 @@ testsuite/gtk/focus-chain/widget-factory3.ui
testsuite/gtk/focus-chain/widget-factory.ui
testsuite/gtk/ui/a11y2.ui
testsuite/gtk/ui/celllayout1.ui
+testsuite/gtk/ui/constraints.ui
testsuite/gtk/ui/container1.ui
testsuite/gtk/ui/container8.ui
testsuite/gtk/ui/scale1.ui
@@ -318,6 +320,7 @@ testsuite/tools/simplify-data-3to4/grid.ui
testsuite/tools/simplify-data-3to4/notebook.ui
testsuite/tools/simplify-data-3to4/office-runner.ui
testsuite/tools/simplify-data-3to4/stack.ui
+testsuite/tools/simplify-data-3to4/toolbar.ui
testsuite/tools/simplify-data/test3.ui
tests/visuals/linked-buttons-horizontal.ui
tests/visuals/linked-buttons-vertical.ui
diff --git a/po/de.po b/po/de.po
index d1c09d7448..a9f63bc68c 100644
--- a/po/de.po
+++ b/po/de.po
@@ -33,16 +33,16 @@ msgid ""
msgstr ""
"Project-Id-Version: GTK+ master\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-08-31 16:17+0000\n"
-"PO-Revision-Date: 2020-09-01 20:06+0200\n"
-"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
+"POT-Creation-Date: 2020-10-30 19:49+0000\n"
+"PO-Revision-Date: 2020-11-01 15:06+0100\n"
+"Last-Translator: Tim Sabsch <tim@sabsch.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 20.08.0\n"
+"X-Generator: Poedit 2.4.1\n"
#: gdk/broadway/gdkbroadway-server.c:133
#, c-format
@@ -81,15 +81,15 @@ msgstr "Ziehen-und-Ablegen aus anderen Anwendungen wird nicht unterstützt."
msgid "No compatible formats to transfer contents."
msgstr "Keine kompatiblen Formate zum Übertragen des Inhalts."
-#: gdk/gdksurface.c:1094
+#: gdk/gdksurface.c:1078
msgid "GL support disabled via GDK_DEBUG"
msgstr "Unterstützung für GL ist durch GDK_DEBUG deaktiviert"
-#: gdk/gdksurface.c:1105
+#: gdk/gdksurface.c:1089
msgid "The current backend does not support OpenGL"
msgstr "Aktuelles Backend unterstützt kein OpenGL"
-#: gdk/gdksurface.c:1213
+#: gdk/gdksurface.c:1197
msgid "Vulkan support disabled via GDK_DEBUG"
msgstr "Unterstützung für Vulkan ist durch GDK_DEBUG deaktiviert"
@@ -482,29 +482,25 @@ msgstr "Kein kompatibles Übertragungsformat gefunden"
msgid "Failed to decode contents with mime-type of '%s'"
msgstr "Inhalt mit dem MIME-Typ »%s« konnte nicht dekodiert werden"
-#: gdk/macos/gdkmacosglcontext.c:105
-msgid "Unable to create a GL pixel format"
-msgstr "GL-Pixelformat kann nicht angelegt werden"
-
-#: gdk/macos/gdkmacosglcontext.c:116 gdk/wayland/gdkglcontext-wayland.c:151
-#: gdk/win32/gdkglcontext-win32.c:947 gdk/win32/gdkglcontext-win32.c:988
-#: gdk/x11/gdkglcontext-x11.c:834 gdk/x11/gdkglcontext-x11.c:884
+#: gdk/wayland/gdkglcontext-wayland.c:151 gdk/win32/gdkglcontext-win32.c:947
+#: gdk/win32/gdkglcontext-win32.c:988 gdk/x11/gdkglcontext-x11.c:581
+#: gdk/x11/gdkglcontext-x11.c:631
msgid "Unable to create a GL context"
msgstr "GL-Kontext kann nicht erstellt werden"
-#: gdk/wayland/gdkglcontext-wayland.c:412
-#: gdk/wayland/gdkglcontext-wayland.c:422 gdk/win32/gdkglcontext-win32.c:788
+#: gdk/wayland/gdkglcontext-wayland.c:414
+#: gdk/wayland/gdkglcontext-wayland.c:424 gdk/win32/gdkglcontext-win32.c:788
#: gdk/win32/gdkglcontext-win32.c:798 gdk/win32/gdkglcontext-win32.c:913
-#: gdk/x11/gdkglcontext-x11.c:1129
+#: gdk/x11/gdkglcontext-x11.c:879
msgid "No available configurations for the given pixel format"
msgstr "Es sind keine Einstellungen für das angegebene Pixelformat vorhanden"
-#: gdk/wayland/gdkglcontext-wayland.c:451 gdk/win32/gdkglcontext-win32.c:1072
-#: gdk/x11/gdkglcontext-x11.c:1432
+#: gdk/wayland/gdkglcontext-wayland.c:453 gdk/win32/gdkglcontext-win32.c:1072
+#: gdk/x11/gdkglcontext-x11.c:1182
msgid "No GL implementation is available"
msgstr "Es ist keine GL-Implementierung verfügbar"
-#: gdk/wayland/gdkglcontext-wayland.c:459
+#: gdk/wayland/gdkglcontext-wayland.c:461
msgid "Core GL is not available on EGL implementation"
msgstr "Core GL ist nicht in der EGL-Implementierung verfügbar"
@@ -512,136 +508,136 @@ msgstr "Core GL ist nicht in der EGL-Implementierung verfügbar"
#, c-format
msgid "Cannot claim clipboard ownership. OpenClipboard() timed out."
msgstr ""
-"Die Zwischenablage kann nicht beansprucht werden. Zeitüberschreitung in"
-" OpenClipboard()."
+"Die Zwischenablage kann nicht beansprucht werden. Zeitüberschreitung in "
+"OpenClipboard()."
#: gdk/win32/gdkclipdrop-win32.c:727
#, c-format
msgid "Cannot claim clipboard ownership. Another process claimed it before us."
msgstr ""
-"Die Zwischenablage kann nicht beansprucht werden. Ein anderer "
-"Prozess beansprucht sie bereits."
+"Die Zwischenablage kann nicht beansprucht werden. Ein anderer Prozess "
+"beansprucht sie bereits."
#: gdk/win32/gdkclipdrop-win32.c:741
#, c-format
msgid "Cannot claim clipboard ownership. OpenClipboard() failed: 0x%lx."
msgstr ""
-"Die Zwischenablage kann nicht beansprucht werden. OpenClipboard() ist"
-" fehlgeschlagen: 0x%lx."
+"Die Zwischenablage kann nicht beansprucht werden. OpenClipboard() ist "
+"fehlgeschlagen: 0x%lx."
#: gdk/win32/gdkclipdrop-win32.c:753
#, c-format
msgid "Cannot claim clipboard ownership. EmptyClipboard() failed: 0x%lx."
msgstr ""
-"Die Zwischenablage kann nicht beansprucht werden. EmptyClipboard() ist"
-" fehlgeschlagen: 0x%lx."
+"Die Zwischenablage kann nicht beansprucht werden. EmptyClipboard() ist "
+"fehlgeschlagen: 0x%lx."
#: gdk/win32/gdkclipdrop-win32.c:796
#, c-format
msgid "Cannot set clipboard data. OpenClipboard() timed out."
msgstr ""
-"Daten der Zwischenablage können nicht gesetzt werden. Zeitüberschreitung in"
-" OpenClipboard()."
+"Daten der Zwischenablage können nicht gesetzt werden. Zeitüberschreitung in "
+"OpenClipboard()."
#: gdk/win32/gdkclipdrop-win32.c:806 gdk/win32/gdkclipdrop-win32.c:837
#, c-format
msgid "Cannot set clipboard data. Another process claimed clipboard ownership."
msgstr ""
-"Daten der Zwischenablage können nicht gesetzt werden. Ein anderer "
-"Prozess beansprucht die Zwischenablage bereits."
+"Daten der Zwischenablage können nicht gesetzt werden. Ein anderer Prozess "
+"beansprucht die Zwischenablage bereits."
#: gdk/win32/gdkclipdrop-win32.c:820
#, c-format
msgid "Cannot set clipboard data. OpenClipboard() failed: 0x%lx."
msgstr ""
-"Daten der Zwischenablage können nicht gesetzt werden. OpenClipboard() ist"
-" fehlgeschlagen: 0x%lx."
+"Daten der Zwischenablage können nicht gesetzt werden. OpenClipboard() ist "
+"fehlgeschlagen: 0x%lx."
#: gdk/win32/gdkclipdrop-win32.c:872
#, c-format
msgid "Cannot get clipboard data. GlobalLock(0x%p) failed: 0x%lx."
msgstr ""
-"Daten der Zwischenablage können nicht geholt werden. GlobalLock(0x%p) ist"
-" fehlgeschlagen: 0x%lx."
+"Daten der Zwischenablage können nicht geholt werden. GlobalLock(0x%p) ist "
+"fehlgeschlagen: 0x%lx."
#: gdk/win32/gdkclipdrop-win32.c:883
#, c-format
msgid "Cannot get clipboard data. GlobalSize(0x%p) failed: 0x%lx."
msgstr ""
-"Daten der Zwischenablage können nicht geholt werden. GlobalSize(0x%p) ist"
-" fehlgeschlagen: 0x%lx."
+"Daten der Zwischenablage können nicht geholt werden. GlobalSize(0x%p) ist "
+"fehlgeschlagen: 0x%lx."
#: gdk/win32/gdkclipdrop-win32.c:896
#, c-format
msgid ""
"Cannot get clipboard data. Failed to allocate %s bytes to store the data."
msgstr ""
-"Daten der Zwischenablage können nicht geholt werden. %s Byte zum Speichern"
-" der Daten konnten nicht zugewiesen werden."
+"Daten der Zwischenablage können nicht geholt werden. %s Byte zum Speichern "
+"der Daten konnten nicht zugewiesen werden."
#: gdk/win32/gdkclipdrop-win32.c:928
#, c-format
msgid "Cannot get clipboard data. OpenClipboard() timed out."
msgstr ""
-"Daten der Zwischenablage können nicht geholt werden. Zeitüberschreitung in"
-" OpenClipboard()."
+"Daten der Zwischenablage können nicht geholt werden. Zeitüberschreitung in "
+"OpenClipboard()."
#: gdk/win32/gdkclipdrop-win32.c:938
#, c-format
msgid "Cannot get clipboard data. Clipboard ownership changed."
msgstr ""
-"Daten der Zwischenablage können nicht geholt werden. Die Eigentümerschaft der"
-" Zwischenablage hat sich geändert."
+"Daten der Zwischenablage können nicht geholt werden. Die Eigentümerschaft "
+"der Zwischenablage hat sich geändert."
#: gdk/win32/gdkclipdrop-win32.c:948
#, c-format
msgid ""
"Cannot get clipboard data. Clipboard data changed before we could get it."
msgstr ""
-"Daten der Zwischenablage können nicht geholt werden. Die Daten der"
-" Zwischenablage wurden geändert, bevor sie geholt werden konnten."
+"Daten der Zwischenablage können nicht geholt werden. Die Daten der "
+"Zwischenablage wurden geändert, bevor sie geholt werden konnten."
#: gdk/win32/gdkclipdrop-win32.c:965
#, c-format
msgid "Cannot get clipboard data. OpenClipboard() failed: 0x%lx."
msgstr ""
-"Daten der Zwischenablage können nicht geholt werden. OpenClipboard() ist"
-" fehlgeschlagen: 0x%lx."
+"Daten der Zwischenablage können nicht geholt werden. OpenClipboard() ist "
+"fehlgeschlagen: 0x%lx."
#: gdk/win32/gdkclipdrop-win32.c:990
#, c-format
msgid "Cannot get clipboard data. No compatible transfer format found."
msgstr ""
-"Daten der Zwischenablage können nicht geholt werden. Es wurde kein"
-" kompatibles Übertragungsformat gefunden."
+"Daten der Zwischenablage können nicht geholt werden. Es wurde kein "
+"kompatibles Übertragungsformat gefunden."
#: gdk/win32/gdkclipdrop-win32.c:1000
#, c-format
msgid "Cannot get clipboard data. GetClipboardData() failed: 0x%lx."
msgstr ""
-"Daten der Zwischenablage können nicht geholt werden. GetClipboardData() ist"
-" fehlgeschlagen: 0x%lx."
+"Daten der Zwischenablage können nicht geholt werden. GetClipboardData() ist "
+"fehlgeschlagen: 0x%lx."
#: gdk/win32/gdkdrop-win32.c:1210
#, c-format
msgid "Cannot get DnD data. GlobalLock(0x%p) failed: 0x%lx."
msgstr ""
-"Daten zum Ziehen-und-Ablegen können nicht geholt werden. GlobalLock(0x%p) ist"
-" fehlgeschlagen: 0x%lx."
+"Daten zum Ziehen-und-Ablegen können nicht geholt werden. GlobalLock(0x%p) "
+"ist fehlgeschlagen: 0x%lx."
#: gdk/win32/gdkdrop-win32.c:1219
#, c-format
msgid "Cannot get DnD data. GlobalSize(0x%p) failed: 0x%lx."
msgstr ""
-"Daten zum Ziehen-und-Ablegen können nicht geholt werden. GlobalSize(0x%p) ist"
-" fehlgeschlagen: 0x%lx."
+"Daten zum Ziehen-und-Ablegen können nicht geholt werden. GlobalSize(0x%p) "
+"ist fehlgeschlagen: 0x%lx."
#: gdk/win32/gdkdrop-win32.c:1230
#, c-format
msgid "Cannot get DnD data. Failed to allocate %s bytes to store the data."
msgstr ""
-"Daten zum Ziehen-und-Ablegen können nicht geholt werden. %s Byte zum"
-" Speichern der Daten konnten nicht zugewiesen werden."
+"Daten zum Ziehen-und-Ablegen können nicht geholt werden. %s Byte zum "
+"Speichern der Daten konnten nicht zugewiesen werden."
#: gdk/win32/gdkdrop-win32.c:1298
#, c-format
@@ -663,8 +659,8 @@ msgstr ""
#, c-format
msgid "Failed to transmute DnD data W32 format 0x%x to %p (%s)"
msgstr ""
-"Umwandeln der Daten zum Ziehen-und-Ablegen aus dem W32-Format 0x%x nach %p ("
-"%s) ist fehlgeschlagen"
+"Umwandeln der Daten zum Ziehen-und-Ablegen aus dem W32-Format 0x%x nach %p "
+"(%s) ist fehlgeschlagen"
#: gdk/win32/gdkhdataoutputstream-win32.c:64
msgid "writing a closed stream"
@@ -724,10 +720,10 @@ msgstr "Die Zwischenablagenverwaltung konnte die Auswahl nicht speichern."
#: gdk/x11/gdkclipboard-x11.c:613
msgid "Cannot store clipboard. No clipboard manager is active."
msgstr ""
-"Die Zwischenablage konnte nicht gespeichert werden. Es ist keine"
-" Zwischenablagenverwaltung aktiv."
+"Die Zwischenablage konnte nicht gespeichert werden. Es ist keine "
+"Zwischenablagenverwaltung aktiv."
-#: gdk/x11/gdkglcontext-x11.c:1157
+#: gdk/x11/gdkglcontext-x11.c:907
#, c-format
msgid "No available configurations for the given RGBA pixel format"
msgstr "Keine verfügbaren Konfigurationen für das gegebene RGBA-Pixelformat"
@@ -759,6 +755,150 @@ msgstr "Unzulässige Formate in verbundener Textumwandlung."
msgid "Unsupported encoding “%s”"
msgstr "Nicht unterstützte Kodierung »%s«"
+#: gtk/a11y/gtkatspiaction.c:242
+#, fuzzy
+#| msgctxt "Action name"
+#| msgid "Click"
+msgctxt "accessibility"
+msgid "Click"
+msgstr "Klicken"
+
+#: gtk/a11y/gtkatspiaction.c:243
+#, fuzzy
+#| msgctxt "Action description"
+#| msgid "Clicks the button"
+msgctxt "accessibility"
+msgid "Clicks the button"
+msgstr "Klickt den Knopf an"
+
+#: gtk/a11y/gtkatspiaction.c:293
+#, fuzzy
+#| msgctxt "Action name"
+#| msgid "Toggle"
+msgctxt "accessibility"
+msgid "Toggle"
+msgstr "Umschalten"
+
+#: gtk/a11y/gtkatspiaction.c:294
+#, fuzzy
+#| msgctxt "Action description"
+#| msgid "Toggles the switch"
+msgctxt "accessibility"
+msgid "Toggles the switch"
+msgstr "Schaltet den Schalter um"
+
+#: gtk/a11y/gtkatspiaction.c:374
+#, fuzzy
+#| msgctxt "Action name"
+#| msgid "Select"
+msgctxt "accessibility"
+msgid "Select"
+msgstr "Auswählen"
+
+#: gtk/a11y/gtkatspiaction.c:375
+#, fuzzy
+#| msgctxt "Action description"
+#| msgid "Selects the color"
+msgctxt "accessibility"
+msgid "Selects the color"
+msgstr "Farbe auswählen"
+
+#: gtk/a11y/gtkatspiaction.c:382 gtk/a11y/gtkatspiaction.c:442
+#: gtk/a11y/gtkatspiaction.c:498 gtk/a11y/gtkatspiaction.c:606
+#, fuzzy
+#| msgid "Activate"
+msgctxt "accessibility"
+msgid "Activate"
+msgstr "Aktivieren"
+
+#: gtk/a11y/gtkatspiaction.c:383
+#, fuzzy
+#| msgctxt "Action description"
+#| msgid "Activates the color"
+msgctxt "accessibility"
+msgid "Activates the color"
+msgstr "Aktiviert die Farbe"
+
+#: gtk/a11y/gtkatspiaction.c:390
+#, fuzzy
+#| msgid "Customize"
+msgctxt "accessibility"
+msgid "Customize"
+msgstr "Anpassen"
+
+#: gtk/a11y/gtkatspiaction.c:391
+#, fuzzy
+#| msgctxt "Action description"
+#| msgid "Customizes the color"
+msgctxt "accessibility"
+msgid "Customizes the color"
+msgstr "Passt die Farbe an"
+
+# expander?
+#: gtk/a11y/gtkatspiaction.c:443
+#, fuzzy
+#| msgctxt "Action description"
+#| msgid "Activates the expander"
+msgctxt "accessibility"
+msgid "Activates the expander"
+msgstr "Aktiviert den Ausklapper"
+
+#: gtk/a11y/gtkatspiaction.c:499 gtk/a11y/gtkatspiaction.c:607
+#, fuzzy
+#| msgctxt "Action description"
+#| msgid "Activates the entry"
+msgctxt "accessibility"
+msgid "Activates the entry"
+msgstr "Eintrag aktivieren"
+
+#: gtk/a11y/gtkatspiaction.c:506
+msgctxt "accessibility"
+msgid "Activate primary icon"
+msgstr ""
+
+#: gtk/a11y/gtkatspiaction.c:507
+#, fuzzy
+#| msgctxt "Action description"
+#| msgid "Activates the entry"
+msgctxt "accessibility"
+msgid "Activates the primary icon of the entry"
+msgstr "Eintrag aktivieren"
+
+#: gtk/a11y/gtkatspiaction.c:514
+#, fuzzy
+#| msgctxt "Action description"
+#| msgid "Activates the color"
+msgctxt "accessibility"
+msgid "Activate secondary icon"
+msgstr "Aktiviert die Farbe"
+
+#: gtk/a11y/gtkatspiaction.c:515
+#, fuzzy
+#| msgctxt "Action description"
+#| msgid "Activates the entry"
+msgctxt "accessibility"
+msgid "Activates the secondary icon of the entry"
+msgstr "Eintrag aktivieren"
+
+#: gtk/a11y/gtkatspiaction.c:614
+msgctxt "accessibility"
+msgid "Peek"
+msgstr ""
+
+#: gtk/a11y/gtkatspiaction.c:615
+#, fuzzy
+#| msgid "Could not read the contents of the folder"
+msgctxt "accessibility"
+msgid "Shows the contents of the password entry"
+msgstr "Inhalt des Ordners konnte nicht gelesen werden"
+
+#: gtk/a11y/gtkatspiroot.c:246
+#, fuzzy
+#| msgid "Application"
+msgctxt "accessibility"
+msgid "application"
+msgstr "Anwendung"
+
#: gtk/css/gtkcssdataurl.c:70
#, c-format
msgid "Not a data: URL"
@@ -771,124 +911,110 @@ msgstr "Ungültige Daten: ADRESSE"
#: gtk/css/gtkcssdataurl.c:141
#, c-format
-#| msgid "Could not show link"
msgid "Could not unescape string"
msgstr "Zeichenkette konnte nicht demaskiert werden"
-#: gtk/gtkaboutdialog.c:123 gtk/ui/gtkaboutdialog.ui:159
+#: gtk/gtkaboutdialog.c:114 gtk/ui/gtkaboutdialog.ui:159
msgid "License"
msgstr "Lizenz"
-#: gtk/gtkaboutdialog.c:124
+#: gtk/gtkaboutdialog.c:115
msgid "Custom License"
msgstr "Eigene Lizenz"
-#: gtk/gtkaboutdialog.c:125
+#: gtk/gtkaboutdialog.c:116
msgid "GNU General Public License, version 2 or later"
msgstr "GNU General Public License, Version 2 oder neuer"
-#: gtk/gtkaboutdialog.c:126
+#: gtk/gtkaboutdialog.c:117
msgid "GNU General Public License, version 3 or later"
msgstr "GNU General Public License, Version 3 oder neuer"
-#: gtk/gtkaboutdialog.c:127
+#: gtk/gtkaboutdialog.c:118
msgid "GNU Lesser General Public License, version 2.1 or later"
msgstr "GNU Lesser General Public License, Version 2.1 oder neuer"
-#: gtk/gtkaboutdialog.c:128
+#: gtk/gtkaboutdialog.c:119
msgid "GNU Lesser General Public License, version 3 or later"
msgstr "GNU Lesser General Public License, Version 3 oder neuer"
-#: gtk/gtkaboutdialog.c:129
+#: gtk/gtkaboutdialog.c:120
msgid "BSD 2-Clause License"
msgstr "BSD 2-Clause Lizenz"
-#: gtk/gtkaboutdialog.c:130
+#: gtk/gtkaboutdialog.c:121
msgid "The MIT License (MIT)"
msgstr "Die MIT-Lizenz (MIT)"
-#: gtk/gtkaboutdialog.c:131
+#: gtk/gtkaboutdialog.c:122
msgid "Artistic License 2.0"
msgstr "Artistic License 2.0"
-#: gtk/gtkaboutdialog.c:132
+#: gtk/gtkaboutdialog.c:123
msgid "GNU General Public License, version 2 only"
msgstr "GNU General Public License, nur Version 2"
-#: gtk/gtkaboutdialog.c:133
+#: gtk/gtkaboutdialog.c:124
msgid "GNU General Public License, version 3 only"
msgstr "GNU General Public License, nur Version 3"
-#: gtk/gtkaboutdialog.c:134
+#: gtk/gtkaboutdialog.c:125
msgid "GNU Lesser General Public License, version 2.1 only"
msgstr "GNU Lesser General Public License, nur Version 2.1"
-#: gtk/gtkaboutdialog.c:135
+#: gtk/gtkaboutdialog.c:126
msgid "GNU Lesser General Public License, version 3 only"
msgstr "GNU Lesser General Public License, nur Version 3"
-#: gtk/gtkaboutdialog.c:136
+#: gtk/gtkaboutdialog.c:127
msgid "GNU Affero General Public License, version 3 or later"
msgstr "GNU Affero General Public License, Version 3 oder neuer"
-#: gtk/gtkaboutdialog.c:137
+#: gtk/gtkaboutdialog.c:128
msgid "GNU Affero General Public License, version 3 only"
msgstr "GNU Affero General Public License, nur Version 3"
-#: gtk/gtkaboutdialog.c:138
+#: gtk/gtkaboutdialog.c:129
msgid "BSD 3-Clause License"
msgstr "BSD 3-Klausel-Lizenz"
-#: gtk/gtkaboutdialog.c:139
+#: gtk/gtkaboutdialog.c:130
msgid "Apache License, Version 2.0"
msgstr "Apache Lizenz Version 2.0"
-#: gtk/gtkaboutdialog.c:140
+#: gtk/gtkaboutdialog.c:131
msgid "Mozilla Public License 2.0"
msgstr "Mozilla Public License 2.0"
-#: gtk/gtkaboutdialog.c:732
-msgid "C_redits"
-msgstr "_Mitwirkende"
-
-#: gtk/gtkaboutdialog.c:739
-msgid "_License"
-msgstr "_Lizenz"
-
-#: gtk/gtkaboutdialog.c:744 gtk/gtkcustompaperunixdialog.c:348
-#: gtk/gtkmessagedialog.c:738 gtk/ui/gtkassistant.ui:40
-msgid "_Close"
-msgstr "_Schließen"
-
-#: gtk/gtkaboutdialog.c:1011
+#: gtk/gtkaboutdialog.c:927
msgid "Website"
msgstr "Webseite"
-#: gtk/gtkaboutdialog.c:1048 gtk/ui/gtkapplication-quartz.ui:6
+#: gtk/gtkaboutdialog.c:964 gtk/ui/gtkapplication-quartz.ui:6
#, c-format
msgid "About %s"
msgstr "Info zu %s"
-#: gtk/gtkaboutdialog.c:2184
+#: gtk/gtkaboutdialog.c:2102
msgid "Created by"
msgstr "Erstellt von"
-#: gtk/gtkaboutdialog.c:2187
+#: gtk/gtkaboutdialog.c:2105
msgid "Documented by"
msgstr "Dokumentation von"
-#: gtk/gtkaboutdialog.c:2197
+#: gtk/gtkaboutdialog.c:2115
msgid "Translated by"
msgstr "Übersetzung von"
-#: gtk/gtkaboutdialog.c:2202
+#: gtk/gtkaboutdialog.c:2120
msgid "Design by"
msgstr "Design von"
#. Translators: this is the license preamble; the string at the end
#. * contains the name of the license as link text.
#.
-#: gtk/gtkaboutdialog.c:2367
+#: gtk/gtkaboutdialog.c:2283
#, c-format
msgid ""
"This program comes with absolutely no warranty.\n"
@@ -983,38 +1109,490 @@ msgctxt "keyboard label"
msgid "Backslash"
msgstr "Backslash"
+#: gtk/gtkaccessible.c:540
+msgctxt "accessibility"
+msgid "alert"
+msgstr ""
+
+#: gtk/gtkaccessible.c:541
+msgctxt "accessibility"
+msgid "alert dialog"
+msgstr ""
+
+#: gtk/gtkaccessible.c:542
+#, fuzzy
+#| msgctxt "throbbing progress animation widget"
+#| msgid "Spinner"
+msgctxt "accessibility"
+msgid "banner"
+msgstr "Spinner"
+
+#: gtk/gtkaccessible.c:543
+msgctxt "accessibility"
+msgid "button"
+msgstr ""
+
+#: gtk/gtkaccessible.c:544
+#, fuzzy
+#| msgid "Location"
+msgctxt "accessibility"
+msgid "caption"
+msgstr "Standort"
+
+#: gtk/gtkaccessible.c:545
+msgctxt "accessibility"
+msgid "cell"
+msgstr ""
+
+#: gtk/gtkaccessible.c:546
+msgctxt "accessibility"
+msgid "checkbox"
+msgstr ""
+
+#: gtk/gtkaccessible.c:547
+msgctxt "accessibility"
+msgid "column header"
+msgstr ""
+
+#: gtk/gtkaccessible.c:548
+msgctxt "accessibility"
+msgid "combo box"
+msgstr ""
+
+#: gtk/gtkaccessible.c:549
+#, fuzzy
+#| msgid "Top Command"
+msgctxt "accessibility"
+msgid "command"
+msgstr "Oberster Befehl"
+
+#: gtk/gtkaccessible.c:550
+#, fuzzy
+#| msgid "Composited"
+msgctxt "accessibility"
+msgid "composite"
+msgstr "Zusammengesetzt"
+
+#: gtk/gtkaccessible.c:551
+#, fuzzy
+#| msgctxt "Script"
+#| msgid "Tagalog"
+msgctxt "accessibility"
+msgid "dialog"
+msgstr "Tagalog"
+
+#: gtk/gtkaccessible.c:552
+#, fuzzy
+#| msgid "Document"
+msgctxt "accessibility"
+msgid "document"
+msgstr "Dokument"
+
+#: gtk/gtkaccessible.c:553
+msgctxt "accessibility"
+msgid "feed"
+msgstr ""
+
+#: gtk/gtkaccessible.c:554
+#, fuzzy
+#| msgctxt "Script"
+#| msgid "Cuneiform"
+msgctxt "accessibility"
+msgid "form"
+msgstr "Cuneiform"
+
+#: gtk/gtkaccessible.c:555
+msgctxt "accessibility"
+msgid "generic"
+msgstr ""
+
+#: gtk/gtkaccessible.c:556
+msgctxt "accessibility"
+msgid "grid"
+msgstr ""
+
+#: gtk/gtkaccessible.c:557
+msgctxt "accessibility"
+msgid "grid cell"
+msgstr ""
+
+#: gtk/gtkaccessible.c:558
+msgctxt "accessibility"
+msgid "group"
+msgstr ""
+
+#: gtk/gtkaccessible.c:559
+msgctxt "accessibility"
+msgid "heading"
+msgstr ""
+
+#: gtk/gtkaccessible.c:560
+#, fuzzy
+#| msgid "Image"
+msgctxt "accessibility"
+msgid "image"
+msgstr "Grafik"
+
+#: gtk/gtkaccessible.c:561
+msgctxt "accessibility"
+msgid "input"
+msgstr ""
+
+#: gtk/gtkaccessible.c:562
+#, fuzzy
+#| msgid "Label"
+msgctxt "accessibility"
+msgid "label"
+msgstr "Bezeichnung"
+
+#: gtk/gtkaccessible.c:563
+msgctxt "accessibility"
+msgid "landmark"
+msgstr ""
+
+#: gtk/gtkaccessible.c:564
+msgctxt "accessibility"
+msgid "legend"
+msgstr ""
+
+#: gtk/gtkaccessible.c:565
+msgctxt "accessibility"
+msgid "link"
+msgstr ""
+
+#: gtk/gtkaccessible.c:566
+msgctxt "accessibility"
+msgid "list"
+msgstr ""
+
+#: gtk/gtkaccessible.c:567
+msgctxt "accessibility"
+msgid "list box"
+msgstr ""
+
+#: gtk/gtkaccessible.c:568
+#, fuzzy
+#| msgctxt "Action description"
+#| msgid "Clicks the menuitem"
+msgctxt "accessibility"
+msgid "list item"
+msgstr "Klickt das Menüelement an"
+
+#: gtk/gtkaccessible.c:569
+msgctxt "accessibility"
+msgid "log"
+msgstr ""
+
+#: gtk/gtkaccessible.c:570
+#, fuzzy
+#| msgid "_Domain"
+msgctxt "accessibility"
+msgid "main"
+msgstr "_Domäne"
+
+#: gtk/gtkaccessible.c:571
+msgctxt "accessibility"
+msgid "marquee"
+msgstr ""
+
+#: gtk/gtkaccessible.c:572
+msgctxt "accessibility"
+msgid "math"
+msgstr ""
+
+#: gtk/gtkaccessible.c:573
+msgctxt "accessibility"
+msgid "meter"
+msgstr ""
+
+#: gtk/gtkaccessible.c:574
+msgctxt "accessibility"
+msgid "menu"
+msgstr ""
+
+#: gtk/gtkaccessible.c:575
+msgctxt "accessibility"
+msgid "menu bar"
+msgstr ""
+
+#: gtk/gtkaccessible.c:576
+msgctxt "accessibility"
+msgid "menu item"
+msgstr ""
+
+#: gtk/gtkaccessible.c:577
+msgctxt "accessibility"
+msgid "menu item checkbox"
+msgstr ""
+
+#: gtk/gtkaccessible.c:578
+msgctxt "accessibility"
+msgid "menu item radio"
+msgstr ""
+
+#: gtk/gtkaccessible.c:579
+#, fuzzy
+#| msgid "Animations"
+msgctxt "accessibility"
+msgid "navigation"
+msgstr "Animationen"
+
+#: gtk/gtkaccessible.c:580
+msgctxt "accessibility"
+msgid "none"
+msgstr ""
+
+#: gtk/gtkaccessible.c:581
+msgctxt "accessibility"
+msgid "note"
+msgstr ""
+
+#: gtk/gtkaccessible.c:582
+#, fuzzy
+#| msgid "Location"
+msgctxt "accessibility"
+msgid "option"
+msgstr "Standort"
+
+#: gtk/gtkaccessible.c:583
+#, fuzzy
+#| msgid "Presentation"
+msgctxt "accessibility"
+msgid "presentation"
+msgstr "Präsentation"
+
+#: gtk/gtkaccessible.c:584
+msgctxt "accessibility"
+msgid "progress bar"
+msgstr ""
+
+#: gtk/gtkaccessible.c:585
+msgctxt "accessibility"
+msgid "radio"
+msgstr ""
+
+#: gtk/gtkaccessible.c:586
+msgctxt "accessibility"
+msgid "radio group"
+msgstr ""
+
+#: gtk/gtkaccessible.c:587
+#, fuzzy
+#| msgctxt "Color name"
+#| msgid "Orange"
+msgctxt "accessibility"
+msgid "range"
+msgstr "Orange"
+
+#: gtk/gtkaccessible.c:588
+msgctxt "accessibility"
+msgid "region"
+msgstr ""
+
+#: gtk/gtkaccessible.c:589
+#, fuzzy
+#| msgid "Low"
+msgctxt "accessibility"
+msgid "row"
+msgstr "Niedrig"
+
+#: gtk/gtkaccessible.c:590
+msgctxt "accessibility"
+msgid "row group"
+msgstr ""
+
+#: gtk/gtkaccessible.c:591
+msgctxt "accessibility"
+msgid "row header"
+msgstr ""
+
+#: gtk/gtkaccessible.c:592
+msgctxt "accessibility"
+msgid "scroll bar"
+msgstr ""
+
+#: gtk/gtkaccessible.c:593
+#, fuzzy
+#| msgctxt "keyboard label"
+#| msgid "Search"
+msgctxt "accessibility"
+msgid "search"
+msgstr "Search"
+
+#: gtk/gtkaccessible.c:594
+#, fuzzy
+#| msgctxt "keyboard label"
+#| msgid "Search"
+msgctxt "accessibility"
+msgid "search box"
+msgstr "Search"
+
+#: gtk/gtkaccessible.c:595
+#, fuzzy
+#| msgid "Action"
+msgctxt "accessibility"
+msgid "section"
+msgstr "Aktion"
+
+#: gtk/gtkaccessible.c:596
+msgctxt "accessibility"
+msgid "section head"
+msgstr ""
+
+#: gtk/gtkaccessible.c:597
+#, fuzzy
+#| msgctxt "Action name"
+#| msgid "Select"
+msgctxt "accessibility"
+msgid "select"
+msgstr "Auswählen"
+
+#: gtk/gtkaccessible.c:598
+#, fuzzy
+#| msgctxt "OpenType layout"
+#| msgid "Numerators"
+msgctxt "accessibility"
+msgid "separator"
+msgstr "Zähler"
+
+#: gtk/gtkaccessible.c:599
+msgctxt "accessibility"
+msgid "slider"
+msgstr ""
+
+#: gtk/gtkaccessible.c:600
+msgctxt "accessibility"
+msgid "spin button"
+msgstr ""
+
+#: gtk/gtkaccessible.c:601
+#, fuzzy
+#| msgid "Status"
+msgctxt "accessibility"
+msgid "status"
+msgstr "Status"
+
+#: gtk/gtkaccessible.c:602
+msgctxt "accessibility"
+msgid "structure"
+msgstr ""
+
+#: gtk/gtkaccessible.c:603
+msgctxt "accessibility"
+msgid "switch"
+msgstr ""
+
+#: gtk/gtkaccessible.c:604
+#, fuzzy
+#| msgctxt "keyboard label"
+#| msgid "Tab"
+msgctxt "accessibility"
+msgid "tab"
+msgstr "Tabulator"
+
+#: gtk/gtkaccessible.c:605
+#, fuzzy
+#| msgid "Enabled"
+msgctxt "accessibility"
+msgid "table"
+msgstr "Aktiviert"
+
+#: gtk/gtkaccessible.c:606
+msgctxt "accessibility"
+msgid "tab list"
+msgstr ""
+
+#: gtk/gtkaccessible.c:607
+msgctxt "accessibility"
+msgid "tab panel"
+msgstr ""
+
+#: gtk/gtkaccessible.c:608
+msgctxt "accessibility"
+msgid "text box"
+msgstr ""
+
+#: gtk/gtkaccessible.c:609
+msgctxt "accessibility"
+msgid "time"
+msgstr ""
+
+#: gtk/gtkaccessible.c:610
+msgctxt "accessibility"
+msgid "timer"
+msgstr ""
+
+#: gtk/gtkaccessible.c:611
+msgctxt "accessibility"
+msgid "tool bar"
+msgstr ""
+
+#: gtk/gtkaccessible.c:612
+msgctxt "accessibility"
+msgid "tool tip"
+msgstr ""
+
+#: gtk/gtkaccessible.c:613
+msgctxt "accessibility"
+msgid "tree"
+msgstr ""
+
+#: gtk/gtkaccessible.c:614
+msgctxt "accessibility"
+msgid "tree grid"
+msgstr ""
+
+#: gtk/gtkaccessible.c:615
+msgctxt "accessibility"
+msgid "tree item"
+msgstr ""
+
+#: gtk/gtkaccessible.c:616
+msgctxt "accessibility"
+msgid "widget"
+msgstr ""
+
+# CHECK
+#: gtk/gtkaccessible.c:617
+#, fuzzy
+#| msgctxt "Stock label, media"
+#| msgid "R_ewind"
+msgctxt "accessibility"
+msgid "window"
+msgstr "_Zurückspulen"
+
#: gtk/gtkappchooserbutton.c:315
msgid "Other application…"
msgstr "Andere Anwendung …"
-#: gtk/gtkappchooserdialog.c:205 gtk/gtkappchooserdialog.c:256
+#: gtk/gtkappchooserdialog.c:204 gtk/gtkappchooserdialog.c:255
#: gtk/ui/gtkappchooserdialog.ui:4
msgid "Select Application"
msgstr "Anwendung auswählen"
#. Translators: %s is a filename
-#: gtk/gtkappchooserdialog.c:212
+#: gtk/gtkappchooserdialog.c:211
#, c-format
msgid "Opening “%s”."
msgstr "»%s« wird geöffnet."
-#: gtk/gtkappchooserdialog.c:213
+#: gtk/gtkappchooserdialog.c:212
#, c-format
msgid "No applications found for “%s”"
msgstr "Keine Anwendung zum Öffnen von »%s« gefunden"
#. Translators: %s is a file type description
-#: gtk/gtkappchooserdialog.c:218
+#: gtk/gtkappchooserdialog.c:217
#, c-format
msgid "Opening “%s” files."
msgstr "»%s«-Dateien werden geöffnet."
-#: gtk/gtkappchooserdialog.c:220
+#: gtk/gtkappchooserdialog.c:219
#, c-format
msgid "No applications found for “%s” files"
msgstr "Es wurde keine Anwendung für »%s«-Dateien gefunden"
-#: gtk/gtkappchooserdialog.c:422
+#: gtk/gtkappchooserdialog.c:421
msgid "Failed to start GNOME Software"
msgstr "Starten von GNOME Software schlug fehl"
@@ -1057,17 +1635,17 @@ msgstr "»%s« existiert nicht in der Lesezeichenliste"
msgid "%s already exists in the bookmarks list"
msgstr "»%s« existiert bereits in der Lesezeichenliste"
-#: gtk/gtkbuilder-menus.c:223
+#: gtk/gtkbuilder-menus.c:224
#, c-format
msgid "Element <%s> not allowed inside <%s>"
msgstr "Element »%s« ist innerhalb von »%s« nicht erlaubt"
-#: gtk/gtkbuilder-menus.c:229
+#: gtk/gtkbuilder-menus.c:230
#, c-format
msgid "Element <%s> not allowed at toplevel"
msgstr "Element »%s« ist in der obersten Ebene nicht erlaubt"
-#: gtk/gtkbuilder-menus.c:318
+#: gtk/gtkbuilder-menus.c:319
#, c-format
msgid "Text may not appear inside <%s>"
msgstr "Text darf nicht innerhalb von <%s> erscheinen"
@@ -1138,7 +1716,7 @@ msgstr "%d"
#. This label is displayed in a treeview cell displaying
#. * a disabled accelerator key combination.
#.
-#: gtk/gtkcellrendereraccel.c:297
+#: gtk/gtkcellrendereraccel.c:295
msgctxt "Accelerator"
msgid "Disabled"
msgstr "Ausgeschaltet"
@@ -1147,7 +1725,7 @@ msgstr "Ausgeschaltet"
#. * an accelerator key combination that is not valid according
#. * to gtk_accelerator_valid().
#.
-#: gtk/gtkcellrendereraccel.c:307
+#: gtk/gtkcellrendereraccel.c:305
msgctxt "Accelerator"
msgid "Invalid"
msgstr "Ungültig"
@@ -1155,206 +1733,271 @@ msgstr "Ungültig"
#. This label is displayed in a treeview cell displaying an accelerator
#. * when the cell is clicked to change the acelerator.
#.
-#: gtk/gtkcellrendereraccel.c:439 gtk/gtkcellrendereraccel.c:732
+#: gtk/gtkcellrendereraccel.c:437 gtk/gtkcellrendereraccel.c:730
msgid "New accelerator…"
msgstr "Neue Tastenkombination …"
-#: gtk/gtkcellrendererprogress.c:376 gtk/gtkcellrendererprogress.c:472
+#: gtk/gtkcellrendererprogress.c:374 gtk/gtkcellrendererprogress.c:470
#, c-format
msgctxt "progress bar label"
msgid "%d %%"
msgstr "%d %%"
-#: gtk/gtkcolorbutton.c:173 gtk/gtkcolorbutton.c:285
+#: gtk/gtkcolorbutton.c:165 gtk/gtkcolorbutton.c:267
msgid "Pick a Color"
msgstr "Wählen Sie eine Farbe"
-#: gtk/gtkcolorchooserwidget.c:383
+#: gtk/gtkcolorbutton.c:456 gtk/gtkcolorchooserwidget.c:307
+#, c-format
+msgid "Red %d%%, Green %d%%, Blue %d%%, Alpha %d%%"
+msgstr "Rot %d%%, Grün %d%%, Blau %d%%, Alpha %d%%"
+
+#: gtk/gtkcolorbutton.c:462 gtk/gtkcolorchooserwidget.c:313
+#, c-format
+msgid "Red %d%%, Green %d%%, Blue %d%%"
+msgstr "Rot %d%%, Grün %d%%, Blau %d%%"
+
+#: gtk/gtkcolorchooserwidget.c:370
+#, c-format
+msgid "Color: %s"
+msgstr "Farbe: %s"
+
+#: gtk/gtkcolorchooserwidget.c:435
msgctxt "Color name"
-msgid "Light Scarlet Red"
-msgstr "Helles Scharlachrot"
+msgid "Very Light Blue"
+msgstr "Sehr helles Blau"
-#: gtk/gtkcolorchooserwidget.c:384
+#: gtk/gtkcolorchooserwidget.c:436
msgctxt "Color name"
-msgid "Scarlet Red"
-msgstr "Scharlachrot"
+msgid "Light Blue"
+msgstr "Helles Blau"
-#: gtk/gtkcolorchooserwidget.c:385
+#: gtk/gtkcolorchooserwidget.c:437
msgctxt "Color name"
-msgid "Dark Scarlet Red"
-msgstr "Dunkles Scharlachrot"
+msgid "Blue"
+msgstr "Blau"
-#: gtk/gtkcolorchooserwidget.c:386
+#: gtk/gtkcolorchooserwidget.c:438
msgctxt "Color name"
-msgid "Light Orange"
-msgstr "Helles Orange"
+msgid "Dark Blue"
+msgstr "Dunkles Blau"
-#: gtk/gtkcolorchooserwidget.c:387
+#: gtk/gtkcolorchooserwidget.c:439
msgctxt "Color name"
-msgid "Orange"
-msgstr "Orange"
+msgid "Very Dark Blue"
+msgstr "Sehr dunkles Blau"
-#: gtk/gtkcolorchooserwidget.c:388
+#: gtk/gtkcolorchooserwidget.c:440
msgctxt "Color name"
-msgid "Dark Orange"
-msgstr "Dunkles Orange"
+msgid "Very Light Green"
+msgstr "Sehr helles Grün"
-#: gtk/gtkcolorchooserwidget.c:389
+#: gtk/gtkcolorchooserwidget.c:441
msgctxt "Color name"
-msgid "Light Butter"
-msgstr "Helle Butter"
+msgid "Light Green"
+msgstr "Helles Grün"
-#: gtk/gtkcolorchooserwidget.c:390
+#: gtk/gtkcolorchooserwidget.c:442
msgctxt "Color name"
-msgid "Butter"
-msgstr "Butter"
+msgid "Green"
+msgstr "Grün"
-#: gtk/gtkcolorchooserwidget.c:391
+#: gtk/gtkcolorchooserwidget.c:443
msgctxt "Color name"
-msgid "Dark Butter"
-msgstr "Dunkle Butter"
+msgid "Dark Green"
+msgstr "Dunkles Grün"
-#: gtk/gtkcolorchooserwidget.c:392
+#: gtk/gtkcolorchooserwidget.c:444
msgctxt "Color name"
-msgid "Light Chameleon"
-msgstr "Helles Chamäleon"
+msgid "Very Dark Green"
+msgstr "Sehr dunkles Grün"
-#: gtk/gtkcolorchooserwidget.c:393
+#: gtk/gtkcolorchooserwidget.c:445
msgctxt "Color name"
-msgid "Chameleon"
-msgstr "Chamäleon"
+msgid "Very Light Yellow"
+msgstr "Sehr helles Gelb"
-#: gtk/gtkcolorchooserwidget.c:394
+#: gtk/gtkcolorchooserwidget.c:446
msgctxt "Color name"
-msgid "Dark Chameleon"
-msgstr "Dunkles Chamäleon"
+msgid "Light Yellow"
+msgstr "Helles Gelb"
-#: gtk/gtkcolorchooserwidget.c:395
+#: gtk/gtkcolorchooserwidget.c:447
msgctxt "Color name"
-msgid "Light Sky Blue"
-msgstr "Helles Himmelblau"
+msgid "Yellow"
+msgstr "Gelb"
-#: gtk/gtkcolorchooserwidget.c:396
+#: gtk/gtkcolorchooserwidget.c:448
msgctxt "Color name"
-msgid "Sky Blue"
-msgstr "Himmelblau"
+msgid "Dark Yellow"
+msgstr "Dunkles Gelb"
-#: gtk/gtkcolorchooserwidget.c:397
+#: gtk/gtkcolorchooserwidget.c:449
msgctxt "Color name"
-msgid "Dark Sky Blue"
-msgstr "Dunkles Himmelblau"
+msgid "Very Dark Yellow"
+msgstr "Sehr dunkles Gelb"
-#: gtk/gtkcolorchooserwidget.c:398
+#: gtk/gtkcolorchooserwidget.c:450
msgctxt "Color name"
-msgid "Light Plum"
-msgstr "Helle Pflaume"
+msgid "Very Light Orange"
+msgstr "Sehr helles Orange"
-#: gtk/gtkcolorchooserwidget.c:399
+#: gtk/gtkcolorchooserwidget.c:451
msgctxt "Color name"
-msgid "Plum"
-msgstr "Pflaume"
+msgid "Light Orange"
+msgstr "Helles Orange"
-#: gtk/gtkcolorchooserwidget.c:400
+#: gtk/gtkcolorchooserwidget.c:452
msgctxt "Color name"
-msgid "Dark Plum"
-msgstr "Dunkle Pflaume"
+msgid "Orange"
+msgstr "Orange"
-#: gtk/gtkcolorchooserwidget.c:401
+#: gtk/gtkcolorchooserwidget.c:453
msgctxt "Color name"
-msgid "Light Chocolate"
-msgstr "Helle Schokolade"
+msgid "Dark Orange"
+msgstr "Dunkles Orange"
-#: gtk/gtkcolorchooserwidget.c:402
+#: gtk/gtkcolorchooserwidget.c:454
msgctxt "Color name"
-msgid "Chocolate"
-msgstr "Schokolade"
+msgid "Very Dark Orange"
+msgstr "Sehr dunkles Orange"
-#: gtk/gtkcolorchooserwidget.c:403
+#: gtk/gtkcolorchooserwidget.c:455
msgctxt "Color name"
-msgid "Dark Chocolate"
-msgstr "Dunkle Schokolade"
+msgid "Very Light Red"
+msgstr "Sehr helles Rot"
-#: gtk/gtkcolorchooserwidget.c:404
+#: gtk/gtkcolorchooserwidget.c:456
msgctxt "Color name"
-msgid "Light Aluminum 1"
-msgstr "Helles Aluminium 1"
+msgid "Light Red"
+msgstr "Helles Rot"
-#: gtk/gtkcolorchooserwidget.c:405
+#: gtk/gtkcolorchooserwidget.c:457
msgctxt "Color name"
-msgid "Aluminum 1"
-msgstr "Aluminium 1"
+msgid "Red"
+msgstr "Rot"
-#: gtk/gtkcolorchooserwidget.c:406
+#: gtk/gtkcolorchooserwidget.c:458
msgctxt "Color name"
-msgid "Dark Aluminum 1"
-msgstr "Dunkles Aluminium 1"
+msgid "Dark Red"
+msgstr "Dunkles Rot"
-#: gtk/gtkcolorchooserwidget.c:407
+#: gtk/gtkcolorchooserwidget.c:459
msgctxt "Color name"
-msgid "Light Aluminum 2"
-msgstr "Helles Aluminium 2"
+msgid "Very Dark Red"
+msgstr "Sehr dunkles Rot"
-#: gtk/gtkcolorchooserwidget.c:408
+#: gtk/gtkcolorchooserwidget.c:460
msgctxt "Color name"
-msgid "Aluminum 2"
-msgstr "Aluminium 2"
+msgid "Very Light Purple"
+msgstr "Sehr helles Violett"
-#: gtk/gtkcolorchooserwidget.c:409
+#: gtk/gtkcolorchooserwidget.c:461
msgctxt "Color name"
-msgid "Dark Aluminum 2"
-msgstr "Dunkles Aluminium 2"
+msgid "Light Purple"
+msgstr "Helles Violett"
-#: gtk/gtkcolorchooserwidget.c:423
+#: gtk/gtkcolorchooserwidget.c:462
msgctxt "Color name"
-msgid "Black"
-msgstr "Schwarz"
+msgid "Purple"
+msgstr "Violett"
-#: gtk/gtkcolorchooserwidget.c:424
+#: gtk/gtkcolorchooserwidget.c:463
msgctxt "Color name"
-msgid "Very Dark Gray"
-msgstr "Sehr dunkles Grau"
+msgid "Dark Purple"
+msgstr "Dunkles Violett"
-#: gtk/gtkcolorchooserwidget.c:425
+#: gtk/gtkcolorchooserwidget.c:464
msgctxt "Color name"
-msgid "Darker Gray"
-msgstr "Dunkleres Grau"
+msgid "Very Dark Purple"
+msgstr "Sehr dunkles Violett"
-#: gtk/gtkcolorchooserwidget.c:426
+#: gtk/gtkcolorchooserwidget.c:465
msgctxt "Color name"
-msgid "Dark Gray"
-msgstr "Dunkles Grau"
+msgid "Very Light Brown"
+msgstr "Sehr helles Braun"
-#: gtk/gtkcolorchooserwidget.c:427
+#: gtk/gtkcolorchooserwidget.c:466
msgctxt "Color name"
-msgid "Medium Gray"
-msgstr "Mittleres Grau"
+msgid "Light Brown"
+msgstr "Helles Braun"
-#: gtk/gtkcolorchooserwidget.c:428
+#: gtk/gtkcolorchooserwidget.c:467
msgctxt "Color name"
-msgid "Light Gray"
-msgstr "Helles Grau"
+msgid "Brown"
+msgstr "Braun"
-#: gtk/gtkcolorchooserwidget.c:429
+#: gtk/gtkcolorchooserwidget.c:468
msgctxt "Color name"
-msgid "Lighter Gray"
-msgstr "Helleres Grau"
+msgid "Dark Brown"
+msgstr "Dunkles Braun"
-#: gtk/gtkcolorchooserwidget.c:430
+#: gtk/gtkcolorchooserwidget.c:469
msgctxt "Color name"
-msgid "Very Light Gray"
-msgstr "Sehr helles Grau"
+msgid "Very Dark Brown"
+msgstr "Sehr dunkles Braun"
-#: gtk/gtkcolorchooserwidget.c:431
+#: gtk/gtkcolorchooserwidget.c:470
msgctxt "Color name"
msgid "White"
msgstr "Weiß"
+#: gtk/gtkcolorchooserwidget.c:471
+msgctxt "Color name"
+msgid "Light Gray 1"
+msgstr "Hellgrau 1"
+
+#: gtk/gtkcolorchooserwidget.c:472
+msgctxt "Color name"
+msgid "Light Gray 2"
+msgstr "Hellgrau 2"
+
+#: gtk/gtkcolorchooserwidget.c:473
+msgctxt "Color name"
+msgid "Light Gray 3"
+msgstr "Hellgrau 3"
+
+#: gtk/gtkcolorchooserwidget.c:474
+msgctxt "Color name"
+msgid "Light Gray 4"
+msgstr "Hellgrau 4"
+
+#: gtk/gtkcolorchooserwidget.c:475
+msgctxt "Color name"
+msgid "Dark Gray 1"
+msgstr "Dunkelgrau 1"
+
+#: gtk/gtkcolorchooserwidget.c:476
+msgctxt "Color name"
+msgid "Dark Gray 2"
+msgstr "Dunkelgrau 2"
+
+#: gtk/gtkcolorchooserwidget.c:477
+msgctxt "Color name"
+msgid "Dark Gray 3"
+msgstr "Dunkelgrau 3"
+
+#: gtk/gtkcolorchooserwidget.c:478
+msgctxt "Color name"
+msgid "Dark Gray 4"
+msgstr "Dunkelgrau 4"
+
+#: gtk/gtkcolorchooserwidget.c:479
+msgctxt "Color name"
+msgid "Black"
+msgstr "Schwarz"
+
#. translators: label for the custom section in the color chooser
-#: gtk/gtkcolorchooserwidget.c:512
+#: gtk/gtkcolorchooserwidget.c:551
msgid "Custom"
msgstr "Benutzerdefiniert"
-#: gtk/gtkcolorswatch.c:219
+#: gtk/gtkcolorchooserwidget.c:584
+#, c-format
+msgid "Custom color %d: %s"
+msgstr "Benutzerdefinierte Farbe %d: %s"
+
+#: gtk/gtkcolorswatch.c:230
msgid "Customize"
msgstr "Anpassen"
@@ -1373,16 +2016,21 @@ msgstr "default:mm"
msgid "Margins from Printer…"
msgstr "Ränder des Druckers …"
+#: gtk/gtkcustompaperunixdialog.c:348 gtk/gtkmessagedialog.c:737
+#: gtk/ui/gtkassistant.ui:40
+msgid "_Close"
+msgstr "_Schließen"
+
#. And show the custom paper dialog
-#: gtk/gtkcustompaperunixdialog.c:402 gtk/gtkprintunixdialog.c:2992
+#: gtk/gtkcustompaperunixdialog.c:402 gtk/gtkprintunixdialog.c:2988
msgid "Manage Custom Sizes"
msgstr "Benutzerdefinierte Größen verwalten"
-#: gtk/gtkcustompaperunixdialog.c:466 gtk/gtkpagesetupunixdialog.c:719
+#: gtk/gtkcustompaperunixdialog.c:466 gtk/gtkpagesetupunixdialog.c:718
msgid "inch"
msgstr "Zoll"
-#: gtk/gtkcustompaperunixdialog.c:468 gtk/gtkpagesetupunixdialog.c:717
+#: gtk/gtkcustompaperunixdialog.c:468 gtk/gtkpagesetupunixdialog.c:716
msgid "mm"
msgstr "mm"
@@ -1423,7 +2071,7 @@ msgstr "_Rechts:"
msgid "Paper Margins"
msgstr "Papierränder"
-#: gtk/gtkentry.c:3608
+#: gtk/gtkentry.c:3643
msgid "Insert Emoji"
msgstr "Emoticon einfügen"
@@ -1431,7 +2079,7 @@ msgstr "Emoticon einfügen"
msgid "Select a File"
msgstr "Datei auswählen"
-#: gtk/gtkfilechooserbutton.c:114 gtk/gtkplacessidebar.c:1059
+#: gtk/gtkfilechooserbutton.c:114 gtk/gtkplacessidebar.c:1039
msgid "Desktop"
msgstr "Schreibtisch"
@@ -1443,7 +2091,7 @@ msgstr "(keine)"
msgid "Other…"
msgstr "Andere …"
-#: gtk/gtkfilechooserdialog.c:559
+#: gtk/gtkfilechooserdialog.c:558
msgid "_Name"
msgstr "_Name"
@@ -1503,31 +2151,31 @@ msgstr "Ein Ordner gleichen Namens ist bereits vorhanden"
msgid "A file with that name already exists"
msgstr "Eine Datei gleichen Namens ist bereits vorhanden"
-#: gtk/gtkfilechoosernative.c:505 gtk/gtkfilechoosernative.c:576
-#: gtk/gtkfilechooserwidget.c:1212 gtk/gtkfilechooserwidget.c:5755
-#: gtk/gtkmessagedialog.c:742 gtk/gtkmessagedialog.c:751
-#: gtk/gtkmountoperation.c:608 gtk/gtkpagesetupunixdialog.c:284
+#: gtk/gtkfilechoosernative.c:504 gtk/gtkfilechoosernative.c:575
+#: gtk/gtkfilechooserwidget.c:1212 gtk/gtkfilechooserwidget.c:5762
+#: gtk/gtkmessagedialog.c:741 gtk/gtkmessagedialog.c:750
+#: gtk/gtkmountoperation.c:608 gtk/gtkpagesetupunixdialog.c:283
#: gtk/gtkprintbackend.c:643 gtk/gtkprinteroptionwidget.c:713
-#: gtk/gtkprintunixdialog.c:627 gtk/gtkprintunixdialog.c:782
-#: gtk/gtkwindow.c:6649 gtk/inspector/css-editor.c:248
-#: gtk/inspector/recorder.c:1010 gtk/ui/gtkappchooserdialog.ui:45
+#: gtk/gtkprintunixdialog.c:626 gtk/gtkprintunixdialog.c:782
+#: gtk/gtkwindow.c:6678 gtk/inspector/css-editor.c:248
+#: gtk/inspector/recorder.c:1200 gtk/ui/gtkappchooserdialog.ui:45
#: gtk/ui/gtkassistant.ui:52 gtk/ui/gtkcolorchooserdialog.ui:33
#: gtk/ui/gtkfontchooserdialog.ui:24
msgid "_Cancel"
msgstr "_Abbrechen"
-#: gtk/gtkfilechoosernative.c:506 gtk/gtkfilechoosernative.c:570
-#: gtk/gtkplacessidebar.c:3145 gtk/gtkplacessidebar.c:3230
+#: gtk/gtkfilechoosernative.c:505 gtk/gtkfilechoosernative.c:569
+#: gtk/gtkplacessidebar.c:3125 gtk/gtkplacessidebar.c:3210
#: gtk/gtkplacesview.c:1649
msgid "_Open"
msgstr "Ö_ffnen"
-#: gtk/gtkfilechoosernative.c:570 gtk/inspector/css-editor.c:249
-#: gtk/inspector/recorder.c:1011
+#: gtk/gtkfilechoosernative.c:569 gtk/inspector/css-editor.c:249
+#: gtk/inspector/recorder.c:1201
msgid "_Save"
msgstr "_Speichern"
-#: gtk/gtkfilechoosernativequartz.c:337 gtk/ui/gtkfilechooserwidget.ui:345
+#: gtk/gtkfilechoosernativequartz.c:338 gtk/ui/gtkfilechooserwidget.ui:345
msgid "Select which types of files are shown"
msgstr "Wählen Sie die anzuzeigenden Dateitypen"
@@ -1603,7 +2251,7 @@ msgid "If you delete an item, it will be permanently lost."
msgstr "Sobald Sie ein Objekt löschen, geht es dauerhaft verloren."
#: gtk/gtkfilechooserwidget.c:1213 gtk/gtkfilechooserwidget.c:1829
-#: gtk/gtklabel.c:5423 gtk/gtktext.c:5969 gtk/gtktextview.c:8558
+#: gtk/gtklabel.c:5429 gtk/gtktext.c:5960 gtk/gtktextview.c:8571
msgid "_Delete"
msgstr "_Löschen"
@@ -1631,8 +2279,8 @@ msgstr "O_rt kopieren"
msgid "_Add to Bookmarks"
msgstr "Zu Lesezeichen _hinzufügen"
-#: gtk/gtkfilechooserwidget.c:1825 gtk/gtkplacessidebar.c:2327
-#: gtk/gtkplacessidebar.c:3266 gtk/ui/gtkfilechooserwidget.ui:464
+#: gtk/gtkfilechooserwidget.c:1825 gtk/gtkplacessidebar.c:2307
+#: gtk/gtkplacessidebar.c:3246 gtk/ui/gtkfilechooserwidget.ui:464
msgid "_Rename"
msgstr "_Umbenennen"
@@ -1667,129 +2315,129 @@ msgid "Location"
msgstr "Standort"
#. Label
-#: gtk/gtkfilechooserwidget.c:2343
+#: gtk/gtkfilechooserwidget.c:2344
msgid "_Name:"
msgstr "_Name:"
-#: gtk/gtkfilechooserwidget.c:2880 gtk/gtkfilechooserwidget.c:2894
+#: gtk/gtkfilechooserwidget.c:2881 gtk/gtkfilechooserwidget.c:2895
#, c-format
msgid "Searching in %s"
msgstr "Suchen in %s"
-#: gtk/gtkfilechooserwidget.c:2900
+#: gtk/gtkfilechooserwidget.c:2901
msgid "Searching"
msgstr "Suchen"
-#: gtk/gtkfilechooserwidget.c:2906
+#: gtk/gtkfilechooserwidget.c:2907
msgid "Enter location or URL"
msgstr "Ort oder Adresse angeben"
# CHECK
-#: gtk/gtkfilechooserwidget.c:3794 gtk/gtkfilechooserwidget.c:6590
+#: gtk/gtkfilechooserwidget.c:3795 gtk/gtkfilechooserwidget.c:6597
#: gtk/ui/gtkfilechooserwidget.ui:225
msgid "Modified"
msgstr "Letzte Änderung"
-#: gtk/gtkfilechooserwidget.c:4053
+#: gtk/gtkfilechooserwidget.c:4054
#, c-format
msgid "Could not read the contents of %s"
msgstr "Inhalt von %s konnte nicht gelesen werden"
-#: gtk/gtkfilechooserwidget.c:4057
+#: gtk/gtkfilechooserwidget.c:4058
msgid "Could not read the contents of the folder"
msgstr "Inhalt des Ordners konnte nicht gelesen werden"
#. Translators: see g_date_time_format() for details on the format
-#: gtk/gtkfilechooserwidget.c:4197 gtk/gtkfilechooserwidget.c:4240
+#: gtk/gtkfilechooserwidget.c:4198 gtk/gtkfilechooserwidget.c:4241
msgid "%H:%M"
msgstr "%H:%M"
-#: gtk/gtkfilechooserwidget.c:4199 gtk/gtkfilechooserwidget.c:4242
+#: gtk/gtkfilechooserwidget.c:4200 gtk/gtkfilechooserwidget.c:4243
msgid "%l:%M %p"
msgstr "%l:%M %p"
-#: gtk/gtkfilechooserwidget.c:4203
+#: gtk/gtkfilechooserwidget.c:4204
msgid "Yesterday"
msgstr "Gestern"
-#: gtk/gtkfilechooserwidget.c:4211
+#: gtk/gtkfilechooserwidget.c:4212
msgid "%-e %b"
msgstr "%-e. %b"
-#: gtk/gtkfilechooserwidget.c:4215
+#: gtk/gtkfilechooserwidget.c:4216
msgid "%-e %b %Y"
msgstr "%-e. %b %Y"
-#: gtk/gtkfilechooserwidget.c:4304 gtk/gtkfilechooserwidget.c:4312
+#: gtk/gtkfilechooserwidget.c:4305 gtk/gtkfilechooserwidget.c:4313
msgid "Program"
msgstr "Programm"
-#: gtk/gtkfilechooserwidget.c:4305
+#: gtk/gtkfilechooserwidget.c:4306
msgid "Audio"
msgstr "Sprache"
-#: gtk/gtkfilechooserwidget.c:4306 gtk/gtkfontbutton.c:549
-#: gtk/inspector/visual.ui:211
+#: gtk/gtkfilechooserwidget.c:4307 gtk/gtkfontbutton.c:549
+#: gtk/inspector/visual.ui:187
msgid "Font"
msgstr "Schrift"
-#: gtk/gtkfilechooserwidget.c:4307
+#: gtk/gtkfilechooserwidget.c:4308
msgid "Image"
msgstr "Grafik"
-#: gtk/gtkfilechooserwidget.c:4308
+#: gtk/gtkfilechooserwidget.c:4309
msgid "Archive"
msgstr "Archiv"
-#: gtk/gtkfilechooserwidget.c:4309
+#: gtk/gtkfilechooserwidget.c:4310
msgid "Markup"
msgstr "Markup"
-#: gtk/gtkfilechooserwidget.c:4310 gtk/gtkfilechooserwidget.c:4311
+#: gtk/gtkfilechooserwidget.c:4311 gtk/gtkfilechooserwidget.c:4312
msgid "Text"
msgstr "Text"
-#: gtk/gtkfilechooserwidget.c:4313
+#: gtk/gtkfilechooserwidget.c:4314
msgid "Video"
msgstr "Video"
-#: gtk/gtkfilechooserwidget.c:4314
+#: gtk/gtkfilechooserwidget.c:4315
msgid "Contacts"
msgstr "Kontakte"
-#: gtk/gtkfilechooserwidget.c:4315
+#: gtk/gtkfilechooserwidget.c:4316
msgid "Calendar"
msgstr "Kalender"
-#: gtk/gtkfilechooserwidget.c:4316
+#: gtk/gtkfilechooserwidget.c:4317
msgid "Document"
msgstr "Dokument"
-#: gtk/gtkfilechooserwidget.c:4317
+#: gtk/gtkfilechooserwidget.c:4318
msgid "Presentation"
msgstr "Präsentation"
-#: gtk/gtkfilechooserwidget.c:4318
+#: gtk/gtkfilechooserwidget.c:4319
msgid "Spreadsheet"
msgstr "Tabellendokument"
#. Translators: We don't know whether this printer is
#. * available to print to.
-#: gtk/gtkfilechooserwidget.c:4349 gtk/gtkfilechooserwidget.c:4536
+#: gtk/gtkfilechooserwidget.c:4350 gtk/gtkfilechooserwidget.c:4537
#: modules/printbackends/gtkprintbackendcloudprint.c:729
msgid "Unknown"
msgstr "Unbekannt"
-#: gtk/gtkfilechooserwidget.c:4575 gtk/gtkplacessidebar.c:1044
+#: gtk/gtkfilechooserwidget.c:4576 gtk/gtkplacessidebar.c:1024
msgid "Home"
msgstr "Persönlicher Ordner"
-#: gtk/gtkfilechooserwidget.c:5748 gtk/gtkprintunixdialog.c:618
+#: gtk/gtkfilechooserwidget.c:5755 gtk/gtkprintunixdialog.c:617
#, c-format
msgid "A file named “%s” already exists. Do you want to replace it?"
msgstr "Eine Datei namens »%s« existiert bereits. Möchten Sie diese ersetzen?"
-#: gtk/gtkfilechooserwidget.c:5751 gtk/gtkprintunixdialog.c:622
+#: gtk/gtkfilechooserwidget.c:5758 gtk/gtkprintunixdialog.c:621
#, c-format
msgid ""
"The file already exists in “%s”. Replacing it will overwrite its contents."
@@ -1797,19 +2445,19 @@ msgstr ""
"Die Datei existiert bereits in »%s«. Durch ihr Ersetzen wird sämtlicher "
"Inhalt überschrieben."
-#: gtk/gtkfilechooserwidget.c:5756 gtk/gtkprintunixdialog.c:630
+#: gtk/gtkfilechooserwidget.c:5763 gtk/gtkprintunixdialog.c:629
msgid "_Replace"
msgstr "_Ersetzen"
-#: gtk/gtkfilechooserwidget.c:5917
+#: gtk/gtkfilechooserwidget.c:5924
msgid "You do not have access to the specified folder."
msgstr "Sie haben keinen Zugriff auf den angegebenen Ordner."
-#: gtk/gtkfilechooserwidget.c:6519
+#: gtk/gtkfilechooserwidget.c:6526
msgid "Could not send the search request"
msgstr "Die Suchanfrage konnte nicht gestellt werden"
-#: gtk/gtkfilechooserwidget.c:6829
+#: gtk/gtkfilechooserwidget.c:6836
msgid "Accessed"
msgstr "Zugegriffen"
@@ -1826,99 +2474,99 @@ msgctxt "font"
msgid "None"
msgstr "Keine"
-#: gtk/gtkfontchooserwidget.c:1111
+#: gtk/gtkfontchooserwidget.c:1552
msgid "Width"
msgstr "Breite"
-#: gtk/gtkfontchooserwidget.c:1112
+#: gtk/gtkfontchooserwidget.c:1553
msgid "Weight"
msgstr "Stärke"
-#: gtk/gtkfontchooserwidget.c:1113
+#: gtk/gtkfontchooserwidget.c:1554
msgid "Italic"
msgstr "Kursiv"
-#: gtk/gtkfontchooserwidget.c:1114
+#: gtk/gtkfontchooserwidget.c:1555
msgid "Slant"
msgstr "Schräg"
-#: gtk/gtkfontchooserwidget.c:1115
+#: gtk/gtkfontchooserwidget.c:1556
msgid "Optical Size"
msgstr "Optische Größe"
-#: gtk/gtkfontchooserwidget.c:1653
+#: gtk/gtkfontchooserwidget.c:2102
msgid "Default"
msgstr "Standard"
-#: gtk/gtkfontchooserwidget.c:1697
+#: gtk/gtkfontchooserwidget.c:2148
msgid "Ligatures"
msgstr "Ligaturen"
-#: gtk/gtkfontchooserwidget.c:1698
+#: gtk/gtkfontchooserwidget.c:2149
msgid "Letter Case"
msgstr "Groß-/Kleinschreibung"
-#: gtk/gtkfontchooserwidget.c:1699
+#: gtk/gtkfontchooserwidget.c:2150
msgid "Number Case"
msgstr "Zahlenschreibweise"
-#: gtk/gtkfontchooserwidget.c:1700
+#: gtk/gtkfontchooserwidget.c:2151
msgid "Number Spacing"
msgstr "Zahlenabstand"
-#: gtk/gtkfontchooserwidget.c:1701
+#: gtk/gtkfontchooserwidget.c:2152
msgid "Number Formatting"
msgstr "Zahlenformatierung"
-#: gtk/gtkfontchooserwidget.c:1702
+#: gtk/gtkfontchooserwidget.c:2153
msgid "Character Variants"
msgstr "Zeichenvarianten"
-#: gtk/gtkglarea.c:289
+#: gtk/gtkglarea.c:288
msgid "OpenGL context creation failed"
msgstr "Erstellen des OpenGL-Kontexts ist gescheitert"
-#: gtk/gtklabel.c:5420 gtk/gtktext.c:5957 gtk/gtktextview.c:8546
+#: gtk/gtklabel.c:5426 gtk/gtktext.c:5948 gtk/gtktextview.c:8559
msgid "Cu_t"
msgstr "_Ausschneiden"
-#: gtk/gtklabel.c:5421 gtk/gtktext.c:5961 gtk/gtktextview.c:8550
+#: gtk/gtklabel.c:5427 gtk/gtktext.c:5952 gtk/gtktextview.c:8563
msgid "_Copy"
msgstr "_Kopieren"
-#: gtk/gtklabel.c:5422 gtk/gtktext.c:5965 gtk/gtktextview.c:8554
+#: gtk/gtklabel.c:5428 gtk/gtktext.c:5956 gtk/gtktextview.c:8567
msgid "_Paste"
msgstr "E_infügen"
-#: gtk/gtklabel.c:5428 gtk/gtktext.c:5978 gtk/gtktextview.c:8579
+#: gtk/gtklabel.c:5434 gtk/gtktext.c:5969 gtk/gtktextview.c:8592
msgid "Select _All"
msgstr "_Alles auswählen"
-#: gtk/gtklabel.c:5433
+#: gtk/gtklabel.c:5439
msgid "_Open Link"
msgstr "Link ö_ffnen"
-#: gtk/gtklabel.c:5437
+#: gtk/gtklabel.c:5443
msgid "Copy _Link Address"
msgstr "Link-Adresse _kopieren"
-#: gtk/gtklinkbutton.c:259
+#: gtk/gtklinkbutton.c:258
msgid "_Copy URL"
msgstr "ADRESSE _kopieren"
-#: gtk/gtklinkbutton.c:544
+#: gtk/gtklinkbutton.c:543
msgid "Invalid URI"
msgstr "Ungültige Adresse"
-#: gtk/gtklockbutton.c:275 gtk/ui/gtklockbutton.ui:20
+#: gtk/gtklockbutton.c:274 gtk/ui/gtklockbutton.ui:20
msgid "Lock"
msgstr "Sperren"
-#: gtk/gtklockbutton.c:284 gtk/ui/gtklockbutton.ui:26
+#: gtk/gtklockbutton.c:283 gtk/ui/gtklockbutton.ui:26
msgid "Unlock"
msgstr "Entsperren"
-#: gtk/gtklockbutton.c:293
+#: gtk/gtklockbutton.c:292
msgid ""
"Dialog is unlocked.\n"
"Click to prevent further changes"
@@ -1927,7 +2575,7 @@ msgstr ""
"Klicken Sie, um Ände-\n"
"rungen zu verhindern"
-#: gtk/gtklockbutton.c:302
+#: gtk/gtklockbutton.c:301
msgid ""
"Dialog is locked.\n"
"Click to make changes"
@@ -1936,7 +2584,7 @@ msgstr ""
"Klicken Sie für\n"
"Änderungen"
-#: gtk/gtklockbutton.c:311
+#: gtk/gtklockbutton.c:310
msgid ""
"System policy prevents changes.\n"
"Contact your system administrator"
@@ -1949,7 +2597,7 @@ msgstr ""
#. * Do *not* translate it to "predefinito:LTR", if it
#. * it isn't default:LTR or default:RTL it will not work
#.
-#: gtk/gtkmain.c:970
+#: gtk/gtkmain.c:823
msgid "default:LTR"
msgstr "default:LTR"
@@ -2001,16 +2649,16 @@ msgctxt "short time format"
msgid "%d:%02d"
msgstr "%d:%02d"
-#: gtk/gtkmessagedialog.c:734 gtk/gtkmessagedialog.c:752
-#: gtk/gtkprintbackend.c:644 gtk/gtkwindow.c:6650
+#: gtk/gtkmessagedialog.c:733 gtk/gtkmessagedialog.c:751
+#: gtk/gtkprintbackend.c:644 gtk/gtkwindow.c:6679
msgid "_OK"
msgstr "_OK"
-#: gtk/gtkmessagedialog.c:746
+#: gtk/gtkmessagedialog.c:745
msgid "_No"
msgstr "_Nein"
-#: gtk/gtkmessagedialog.c:747
+#: gtk/gtkmessagedialog.c:746
msgid "_Yes"
msgstr "_Ja"
@@ -2018,70 +2666,69 @@ msgstr "_Ja"
msgid "Co_nnect"
msgstr "_Verbinden"
-#: gtk/gtkmountoperation.c:673
+#: gtk/gtkmountoperation.c:672
msgid "Connect As"
msgstr "Verbinden als"
-#: gtk/gtkmountoperation.c:682
+#: gtk/gtkmountoperation.c:681
msgid "_Anonymous"
msgstr "_Anonym verbinden"
-#: gtk/gtkmountoperation.c:690
+#: gtk/gtkmountoperation.c:687
msgid "Registered U_ser"
msgstr "Regi_strierter Benutzer"
-#: gtk/gtkmountoperation.c:700
+#: gtk/gtkmountoperation.c:697
msgid "_Username"
msgstr "_Benutzername"
-#: gtk/gtkmountoperation.c:705
+#: gtk/gtkmountoperation.c:702
msgid "_Domain"
msgstr "_Domäne"
-#: gtk/gtkmountoperation.c:714
-#| msgid "Volume Up"
+#: gtk/gtkmountoperation.c:711
msgid "Volume type"
msgstr "Datenträgertyp"
-#: gtk/gtkmountoperation.c:724
+#: gtk/gtkmountoperation.c:721
msgid "_Hidden"
msgstr "_Versteckt"
-#: gtk/gtkmountoperation.c:727
+#: gtk/gtkmountoperation.c:724
msgid "_Windows system"
msgstr "_Windows-System"
-#: gtk/gtkmountoperation.c:730
+#: gtk/gtkmountoperation.c:727
msgid "_PIM"
msgstr "_PIM"
-#: gtk/gtkmountoperation.c:736
+#: gtk/gtkmountoperation.c:733
msgid "_Password"
msgstr "_Passwort"
-#: gtk/gtkmountoperation.c:758
+#: gtk/gtkmountoperation.c:755
msgid "Forget password _immediately"
msgstr "Passwort sofort _vergessen"
-#: gtk/gtkmountoperation.c:768
+#: gtk/gtkmountoperation.c:765
msgid "Remember password until you _logout"
msgstr "Passwort erst beim Ab_melden vergessen"
-#: gtk/gtkmountoperation.c:778
+#: gtk/gtkmountoperation.c:776
msgid "Remember _forever"
msgstr "_Nie vergessen"
-#: gtk/gtkmountoperation.c:1203
+#: gtk/gtkmountoperation.c:1202
#, c-format
msgid "Unknown Application (PID %d)"
msgstr "Unbekannte Anwendung (Kennung %d)"
-#: gtk/gtkmountoperation.c:1402
+#: gtk/gtkmountoperation.c:1401
#, c-format
msgid "Unable to end process"
msgstr "Prozess kann nicht beendet werden"
-#: gtk/gtkmountoperation.c:1432
+#: gtk/gtkmountoperation.c:1431
msgid "_End Process"
msgstr "Prozess b_eenden"
@@ -2122,33 +2769,33 @@ msgstr "Prozess mit Kennung %d kann nicht abgewürgt werden: %s"
msgid "GTK could not find a media module. Check your installation."
msgstr "GTK konnte kein Medienmodul finden. Überprüfen Sie Ihre Installation."
-#: gtk/gtknotebook.c:4223 gtk/gtknotebook.c:6431
+#: gtk/gtknotebook.c:4247 gtk/gtknotebook.c:6451
#, c-format
msgid "Page %u"
msgstr "Seite %u"
-#: gtk/gtkpagesetup.c:608 gtk/gtkpapersize.c:946 gtk/gtkpapersize.c:986
+#: gtk/gtkpagesetup.c:606 gtk/gtkpapersize.c:944 gtk/gtkpapersize.c:984
msgid "Not a valid page setup file"
msgstr "Keine gültige Seiteneinstellungs-Datei"
-#: gtk/gtkpagesetupunixdialog.c:202 gtk/gtkprintunixdialog.c:712
+#: gtk/gtkpagesetupunixdialog.c:201 gtk/gtkprintunixdialog.c:711
msgid "Manage Custom Sizes…"
msgstr "Benutzerdefinierte Größen verwalten …"
-#: gtk/gtkpagesetupunixdialog.c:285 gtk/ui/gtkassistant.ui:98
+#: gtk/gtkpagesetupunixdialog.c:284 gtk/ui/gtkassistant.ui:98
msgid "_Apply"
msgstr "An_wenden"
-#: gtk/gtkpagesetupunixdialog.c:319 gtk/gtkpagesetupunixdialog.c:571
+#: gtk/gtkpagesetupunixdialog.c:318 gtk/gtkpagesetupunixdialog.c:570
msgid "Any Printer"
msgstr "Beliebiger Drucker"
# CHECK
-#: gtk/gtkpagesetupunixdialog.c:320
+#: gtk/gtkpagesetupunixdialog.c:319
msgid "For portable documents"
msgstr "Für portable Dokumente"
-#: gtk/gtkpagesetupunixdialog.c:737
+#: gtk/gtkpagesetupunixdialog.c:736
#, c-format
msgid ""
"Margins:\n"
@@ -2163,100 +2810,100 @@ msgstr ""
" Oben: %s %s\n"
" Unten: %s %s"
-#: gtk/gtkpagesetupunixdialog.c:783 gtk/ui/gtkpagesetupunixdialog.ui:5
+#: gtk/gtkpagesetupunixdialog.c:782 gtk/ui/gtkpagesetupunixdialog.ui:5
#: gtk/ui/gtkprintunixdialog.ui:711
msgid "Page Setup"
msgstr "Seite einrichten"
-#: gtk/gtkpasswordentry.c:146
+#: gtk/gtkpasswordentry.c:165
msgid "Hide text"
msgstr "Text verbergen"
-#: gtk/gtkpasswordentry.c:151 gtk/gtkpasswordentry.c:513
+#: gtk/gtkpasswordentry.c:170 gtk/gtkpasswordentry.c:578
msgid "Show text"
msgstr "Text anzeigen"
-#: gtk/gtkpasswordentry.c:170
+#: gtk/gtkpasswordentry.c:197
msgid "Caps Lock is on"
msgstr "Feststelltaste ist aktiviert"
-#: gtk/gtkpasswordentry.c:588
+#: gtk/gtkpasswordentry.c:650
msgid "_Show Text"
msgstr "Text _anzeigen"
#. translators: %s is the name of a cloud provider for files
-#: gtk/gtkplacessidebar.c:932
+#: gtk/gtkplacessidebar.c:912
#, c-format
msgid "Open %s"
msgstr "%s öffnen"
-#: gtk/gtkplacessidebar.c:1022
+#: gtk/gtkplacessidebar.c:1002
msgid "Recent"
msgstr "Zuletzt verwendet"
-#: gtk/gtkplacessidebar.c:1024
+#: gtk/gtkplacessidebar.c:1004
msgid "Recent files"
msgstr "Zuletzt verwendete Dateien"
-#: gtk/gtkplacessidebar.c:1033
+#: gtk/gtkplacessidebar.c:1013
msgid "Starred"
msgstr "Mit Stern markiert"
-#: gtk/gtkplacessidebar.c:1035
+#: gtk/gtkplacessidebar.c:1015
msgid "Starred files"
msgstr "Mit Stern markierte Dateien"
-#: gtk/gtkplacessidebar.c:1046
+#: gtk/gtkplacessidebar.c:1026
msgid "Open your personal folder"
msgstr "Ihren persönlichen Ordner öffnen"
-#: gtk/gtkplacessidebar.c:1061
+#: gtk/gtkplacessidebar.c:1041
msgid "Open the contents of your desktop in a folder"
msgstr "Inhalt Ihres Schreibtisch-Ordners in einem Ordner öffnen"
-#: gtk/gtkplacessidebar.c:1075
+#: gtk/gtkplacessidebar.c:1055
msgid "Enter Location"
msgstr "Geben Sie den Ort an"
-#: gtk/gtkplacessidebar.c:1077
+#: gtk/gtkplacessidebar.c:1057
msgid "Manually enter a location"
msgstr "Geben Sie den Ort manuell an"
-#: gtk/gtkplacessidebar.c:1087
+#: gtk/gtkplacessidebar.c:1067
msgid "Trash"
msgstr "Papierkorb"
-#: gtk/gtkplacessidebar.c:1089
+#: gtk/gtkplacessidebar.c:1069
msgid "Open the trash"
msgstr "Den Papierkorb öffnen"
-#: gtk/gtkplacessidebar.c:1200 gtk/gtkplacessidebar.c:1228
-#: gtk/gtkplacessidebar.c:1428
+#: gtk/gtkplacessidebar.c:1180 gtk/gtkplacessidebar.c:1208
+#: gtk/gtkplacessidebar.c:1408
#, c-format
msgid "Mount and open “%s”"
msgstr "»%s« einhängen und öffnen"
-#: gtk/gtkplacessidebar.c:1323
+#: gtk/gtkplacessidebar.c:1303
msgid "Open the contents of the file system"
msgstr "Inhalt des Dateisystems öffnen"
-#: gtk/gtkplacessidebar.c:1406
+#: gtk/gtkplacessidebar.c:1386
msgid "New bookmark"
msgstr "Neues Lesezeichen"
-#: gtk/gtkplacessidebar.c:1408
+#: gtk/gtkplacessidebar.c:1388
msgid "Add a new bookmark"
msgstr "Neues Lesezeichen hinzufügen"
-#: gtk/gtkplacessidebar.c:1473
+#: gtk/gtkplacessidebar.c:1453
msgid "Other Locations"
msgstr "Andere Orte"
-#: gtk/gtkplacessidebar.c:1474
+#: gtk/gtkplacessidebar.c:1454
msgid "Show other locations"
msgstr "Andere Orte anzeigen"
-#: gtk/gtkplacessidebar.c:1979 gtk/gtkplacessidebar.c:2980
+#: gtk/gtkplacessidebar.c:1959 gtk/gtkplacessidebar.c:2960
#, c-format
msgid "Unable to start “%s”"
msgstr "Starten von »%s« nicht möglich"
@@ -2264,127 +2911,127 @@ msgstr "Starten von »%s« nicht möglich"
#. Translators: This means that unlocking an encrypted storage
#. * device failed. %s is the name of the device.
#.
-#: gtk/gtkplacessidebar.c:2015
+#: gtk/gtkplacessidebar.c:1995
#, c-format
msgid "Error unlocking “%s”"
msgstr "Fehler beim Entsperren von »%s«"
-#: gtk/gtkplacessidebar.c:2017
+#: gtk/gtkplacessidebar.c:1997
#, c-format
msgid "Unable to access “%s”"
msgstr "Auf »%s« kann nicht zugegriffen werden"
-#: gtk/gtkplacessidebar.c:2248
+#: gtk/gtkplacessidebar.c:2228
msgid "This name is already taken"
msgstr "Dieser Name ist bereits vergeben"
-#: gtk/gtkplacessidebar.c:2321 gtk/inspector/actions.ui:19
+#: gtk/gtkplacessidebar.c:2301 gtk/inspector/actions.ui:19
#: gtk/inspector/css-node-tree.ui:35 gtk/inspector/prop-list.ui:23
#: gtk/ui/gtkfilechooserwidget.ui:167 gtk/ui/gtkfilechooserwidget.ui:439
#: gtk/ui/gtkprintunixdialog.ui:85
msgid "Name"
msgstr "Name"
-#: gtk/gtkplacessidebar.c:2521
+#: gtk/gtkplacessidebar.c:2501
#, c-format
msgid "Unable to unmount “%s”"
msgstr "»%s« kann nicht ausgehängt werden"
-#: gtk/gtkplacessidebar.c:2697
+#: gtk/gtkplacessidebar.c:2677
#, c-format
msgid "Unable to stop “%s”"
msgstr "Stoppen von »%s« nicht möglich"
-#: gtk/gtkplacessidebar.c:2726
+#: gtk/gtkplacessidebar.c:2706
#, c-format
msgid "Unable to eject “%s”"
msgstr "Auswerfen von »%s« nicht möglich"
-#: gtk/gtkplacessidebar.c:2755 gtk/gtkplacessidebar.c:2784
+#: gtk/gtkplacessidebar.c:2735 gtk/gtkplacessidebar.c:2764
#, c-format
msgid "Unable to eject %s"
msgstr "Auswerfen von %s nicht möglich"
-#: gtk/gtkplacessidebar.c:2932
+#: gtk/gtkplacessidebar.c:2912
#, c-format
msgid "Unable to poll “%s” for media changes"
msgstr "»%s« konnte nicht nach Datenträgeränderungen befragt werden"
-#: gtk/gtkplacessidebar.c:3151 gtk/gtkplacessidebar.c:3238
+#: gtk/gtkplacessidebar.c:3131 gtk/gtkplacessidebar.c:3218
#: gtk/gtkplacesview.c:1653
msgid "Open in New _Tab"
msgstr "In neuem _Reiter öffnen"
-#: gtk/gtkplacessidebar.c:3157 gtk/gtkplacessidebar.c:3247
+#: gtk/gtkplacessidebar.c:3137 gtk/gtkplacessidebar.c:3227
#: gtk/gtkplacesview.c:1658
msgid "Open in New _Window"
msgstr "In neuem _Fenster öffnen"
-#: gtk/gtkplacessidebar.c:3258
+#: gtk/gtkplacessidebar.c:3238
msgid "_Add Bookmark"
msgstr "Lesezeichen _hinzufügen"
-#: gtk/gtkplacessidebar.c:3262
+#: gtk/gtkplacessidebar.c:3242
msgid "_Remove"
msgstr "_Entfernen"
-#: gtk/gtkplacessidebar.c:3278 gtk/gtkplacesview.c:1683
+#: gtk/gtkplacessidebar.c:3258 gtk/gtkplacesview.c:1683
msgid "_Mount"
msgstr "_Einhängen"
-#: gtk/gtkplacessidebar.c:3287 gtk/gtkplacesview.c:1672
+#: gtk/gtkplacessidebar.c:3267 gtk/gtkplacesview.c:1672
msgid "_Unmount"
msgstr "_Aushängen"
-#: gtk/gtkplacessidebar.c:3294
+#: gtk/gtkplacessidebar.c:3274
msgid "_Eject"
msgstr "_Auswerfen"
-#: gtk/gtkplacessidebar.c:3304
+#: gtk/gtkplacessidebar.c:3284
msgid "_Detect Media"
msgstr "Medium _erkennen"
-#: gtk/gtkplacessidebar.c:3313
+#: gtk/gtkplacessidebar.c:3293
msgid "_Start"
msgstr "_Starten"
-#: gtk/gtkplacessidebar.c:3315
+#: gtk/gtkplacessidebar.c:3295
msgid "_Power On"
msgstr "An_schalten"
-#: gtk/gtkplacessidebar.c:3316
+#: gtk/gtkplacessidebar.c:3296
msgid "_Connect Drive"
msgstr "Laufwerk _verbinden"
-#: gtk/gtkplacessidebar.c:3317
+#: gtk/gtkplacessidebar.c:3297
msgid "_Start Multi-disk Device"
msgstr "Multimedienlaufwerk _starten"
-#: gtk/gtkplacessidebar.c:3318
+#: gtk/gtkplacessidebar.c:3298
msgid "_Unlock Device"
msgstr "Gerät _entsperren"
-#: gtk/gtkplacessidebar.c:3328
+#: gtk/gtkplacessidebar.c:3308
msgid "_Stop"
msgstr "_Stopp"
-#: gtk/gtkplacessidebar.c:3330
+#: gtk/gtkplacessidebar.c:3310
msgid "_Safely Remove Drive"
msgstr "Laufwerk _sicher entfernen"
-#: gtk/gtkplacessidebar.c:3331
+#: gtk/gtkplacessidebar.c:3311
msgid "_Disconnect Drive"
msgstr "Laufwerk _trennen"
-#: gtk/gtkplacessidebar.c:3332
+#: gtk/gtkplacessidebar.c:3312
msgid "_Stop Multi-disk Device"
msgstr "Multimedienlaufwerk _stoppen"
-#: gtk/gtkplacessidebar.c:3333
+#: gtk/gtkplacessidebar.c:3313
msgid "_Lock Device"
msgstr "Gerät _sperren"
-#: gtk/gtkplacessidebar.c:3821 gtk/gtkplacesview.c:1105
+#: gtk/gtkplacessidebar.c:3801 gtk/gtkplacesview.c:1105
msgid "Computer"
msgstr "Rechner"
@@ -2499,7 +3146,7 @@ msgstr "Aushängen"
msgid "Authentication"
msgstr "Legitimation"
-#: gtk/gtkprintbackend.c:719
+#: gtk/gtkprintbackend.c:718
msgid "_Remember password"
msgstr "Passwort _behalten"
@@ -2512,7 +3159,7 @@ msgstr "Dateiname auswählen"
msgid "_Select"
msgstr "Aus_wählen"
-#: gtk/gtkprinteroptionwidget.c:940
+#: gtk/gtkprinteroptionwidget.c:939
msgid "Not available"
msgstr "Nicht verfügbar"
@@ -2599,7 +3246,7 @@ msgstr ""
#. window
#: gtk/gtkprintoperation-portal.c:236 gtk/gtkprintoperation-portal.c:554
-#: gtk/gtkprintoperation-portal.c:623 gtk/gtkprintunixdialog.c:3032
+#: gtk/gtkprintoperation-portal.c:623 gtk/gtkprintunixdialog.c:3028
msgid "Print"
msgstr "Drucken"
@@ -2617,7 +3264,7 @@ msgstr "Kein Papier mehr"
#. Translators: this is a printer status.
#: gtk/gtkprintoperation-win32.c:638
-#: modules/printbackends/gtkprintbackendcups.c:2605
+#: modules/printbackends/gtkprintbackendcups.c:2607
msgid "Paused"
msgstr "Pausiert"
@@ -2674,7 +3321,7 @@ msgstr "_Drucken"
msgid "Getting printer information failed"
msgstr "Holen der Informationen über Drucker ist gescheitert"
-#: gtk/gtkprintunixdialog.c:1851
+#: gtk/gtkprintunixdialog.c:1847
msgid "Getting printer information…"
msgstr "Informationen über Drucker werden geholt …"
@@ -2684,93 +3331,93 @@ msgstr "Informationen über Drucker werden geholt …"
#. Translators: These strings name the possible arrangements of
#. * multiple pages on a sheet when printing
#.
-#: gtk/gtkprintunixdialog.c:2777
-#: modules/printbackends/gtkprintbackendcups.c:5463
+#: gtk/gtkprintunixdialog.c:2773
+#: modules/printbackends/gtkprintbackendcups.c:5465
msgid "Left to right, top to bottom"
msgstr "Links nach rechts, oben nach unten"
-#: gtk/gtkprintunixdialog.c:2777
-#: modules/printbackends/gtkprintbackendcups.c:5463
+#: gtk/gtkprintunixdialog.c:2773
+#: modules/printbackends/gtkprintbackendcups.c:5465
msgid "Left to right, bottom to top"
msgstr "Links nach rechts, unten nach oben"
-#: gtk/gtkprintunixdialog.c:2778
-#: modules/printbackends/gtkprintbackendcups.c:5464
+#: gtk/gtkprintunixdialog.c:2774
+#: modules/printbackends/gtkprintbackendcups.c:5466
msgid "Right to left, top to bottom"
msgstr "Rechts nach links, oben nach unten"
-#: gtk/gtkprintunixdialog.c:2778
-#: modules/printbackends/gtkprintbackendcups.c:5464
+#: gtk/gtkprintunixdialog.c:2774
+#: modules/printbackends/gtkprintbackendcups.c:5466
msgid "Right to left, bottom to top"
msgstr "Rechts nach links, unten nach oben"
-#: gtk/gtkprintunixdialog.c:2779
-#: modules/printbackends/gtkprintbackendcups.c:5465
+#: gtk/gtkprintunixdialog.c:2775
+#: modules/printbackends/gtkprintbackendcups.c:5467
msgid "Top to bottom, left to right"
msgstr "Oben nach unten, links nach rechts"
-#: gtk/gtkprintunixdialog.c:2779
-#: modules/printbackends/gtkprintbackendcups.c:5465
+#: gtk/gtkprintunixdialog.c:2775
+#: modules/printbackends/gtkprintbackendcups.c:5467
msgid "Top to bottom, right to left"
msgstr "Oben nach unten, rechts nach links"
-#: gtk/gtkprintunixdialog.c:2780
-#: modules/printbackends/gtkprintbackendcups.c:5466
+#: gtk/gtkprintunixdialog.c:2776
+#: modules/printbackends/gtkprintbackendcups.c:5468
msgid "Bottom to top, left to right"
msgstr "Unten nach oben, links nach rechts"
-#: gtk/gtkprintunixdialog.c:2780
-#: modules/printbackends/gtkprintbackendcups.c:5466
+#: gtk/gtkprintunixdialog.c:2776
+#: modules/printbackends/gtkprintbackendcups.c:5468
msgid "Bottom to top, right to left"
msgstr "Unten nach oben, rechts nach links"
-#: gtk/gtkprintunixdialog.c:2784 gtk/gtkprintunixdialog.c:2797
+#: gtk/gtkprintunixdialog.c:2780 gtk/gtkprintunixdialog.c:2793
msgid "Page Ordering"
msgstr "Reihenfolge"
-#: gtk/gtkprintunixdialog.c:2813
+#: gtk/gtkprintunixdialog.c:2809
msgid "Left to right"
msgstr "Links nach rechts"
-#: gtk/gtkprintunixdialog.c:2814
+#: gtk/gtkprintunixdialog.c:2810
msgid "Right to left"
msgstr "Rechts nach links"
-#: gtk/gtkprintunixdialog.c:2826
+#: gtk/gtkprintunixdialog.c:2822
msgid "Top to bottom"
msgstr "Oben nach unten"
-#: gtk/gtkprintunixdialog.c:2827
+#: gtk/gtkprintunixdialog.c:2823
msgid "Bottom to top"
msgstr "Unten nach oben"
-#: gtk/gtkprogressbar.c:597
+#: gtk/gtkprogressbar.c:599
#, c-format
msgctxt "progress bar label"
msgid "%.0f %%"
msgstr "%.0f %%"
-#: gtk/gtkrecentmanager.c:1032 gtk/gtkrecentmanager.c:1045
-#: gtk/gtkrecentmanager.c:1183 gtk/gtkrecentmanager.c:1193
-#: gtk/gtkrecentmanager.c:1243 gtk/gtkrecentmanager.c:1252
+#: gtk/gtkrecentmanager.c:1030 gtk/gtkrecentmanager.c:1043
+#: gtk/gtkrecentmanager.c:1181 gtk/gtkrecentmanager.c:1191
+#: gtk/gtkrecentmanager.c:1241 gtk/gtkrecentmanager.c:1250
#, c-format
msgid "Unable to find an item with URI “%s”"
msgstr "Es konnte kein Eintrag mit der Adresse »%s« gefunden werden"
-#: gtk/gtkrecentmanager.c:1267
+#: gtk/gtkrecentmanager.c:1265
#, c-format
msgid "Unable to move the item with URI “%s” to “%s”"
msgstr ""
"Das Objekt mit der Adresse »%s« konnte nicht nach »%s« verschoben werden"
-#: gtk/gtkrecentmanager.c:2319
+#: gtk/gtkrecentmanager.c:2317
#, c-format
msgid "No registered application with name “%s” for item with URI “%s” found"
msgstr ""
"Keine registrierte Anwendung namens »%s« für Objektadresse »%s« gefunden"
# _Löschen haben wir schon und ist unangebracht
-#: gtk/gtksearchentry.c:528
+#: gtk/gtksearchentry.c:574
msgid "Clear entry"
msgstr "Eintrag löschen"
@@ -2794,63 +3441,63 @@ msgctxt "keyboard side marker"
msgid "R"
msgstr "R"
-#: gtk/gtkshortcutssection.c:398
+#: gtk/gtkshortcutssection.c:397
msgid "_Show All"
msgstr "_Alle anzeigen"
-#: gtk/gtkshortcutsshortcut.c:144
+#: gtk/gtkshortcutsshortcut.c:143
msgid "Two finger pinch"
msgstr "Zweifinger-Stauchen"
-#: gtk/gtkshortcutsshortcut.c:148
+#: gtk/gtkshortcutsshortcut.c:147
msgid "Two finger stretch"
msgstr "Zweifinger-Strecken"
-#: gtk/gtkshortcutsshortcut.c:152
+#: gtk/gtkshortcutsshortcut.c:151
msgid "Rotate clockwise"
msgstr "Im Uhrzeigersinn drehen"
-#: gtk/gtkshortcutsshortcut.c:156
+#: gtk/gtkshortcutsshortcut.c:155
msgid "Rotate counterclockwise"
msgstr "Gegen den Uhrzeigersinn drehen"
-#: gtk/gtkshortcutsshortcut.c:160
+#: gtk/gtkshortcutsshortcut.c:159
msgid "Two finger swipe left"
msgstr "Zweifinger-Wischen nach links"
-#: gtk/gtkshortcutsshortcut.c:164
+#: gtk/gtkshortcutsshortcut.c:163
msgid "Two finger swipe right"
msgstr "Zweifinger-Wischen nach rechts"
-#: gtk/gtkshortcutsshortcut.c:168
+#: gtk/gtkshortcutsshortcut.c:167
msgid "Swipe left"
msgstr "Nach links wischen"
-#: gtk/gtkshortcutsshortcut.c:172
+#: gtk/gtkshortcutsshortcut.c:171
msgid "Swipe right"
msgstr "Nach rechts wischen"
#. Translators: This is the window title for the shortcuts window in normal mode
-#: gtk/gtkshortcutswindow.c:898 gtk/inspector/window.ui:520
+#: gtk/gtkshortcutswindow.c:875 gtk/inspector/window.ui:520
msgid "Shortcuts"
msgstr "Tastenkürzel"
#. Translators: This is the window title for the shortcuts window in search mode
-#: gtk/gtkshortcutswindow.c:903
+#: gtk/gtkshortcutswindow.c:880
msgid "Search Results"
msgstr "Suchergebnisse"
#. Translators: This is placeholder text for the search entry in the shortcuts window
-#: gtk/gtkshortcutswindow.c:933
+#: gtk/gtkshortcutswindow.c:910
msgid "Search Shortcuts"
msgstr "Nach Tastenkürzeln suchen"
-#: gtk/gtkshortcutswindow.c:992 gtk/ui/gtkemojichooser.ui:338
+#: gtk/gtkshortcutswindow.c:969 gtk/ui/gtkemojichooser.ui:338
#: gtk/ui/gtkfilechooserwidget.ui:296
msgid "No Results Found"
msgstr "Keine Ergebnisse gefunden"
-#: gtk/gtkshortcutswindow.c:998 gtk/ui/gtkemojichooser.ui:351
+#: gtk/gtkshortcutswindow.c:975 gtk/ui/gtkemojichooser.ui:351
#: gtk/ui/gtkfilechooserwidget.ui:309 gtk/ui/gtkplacesview.ui:231
msgid "Try a different search"
msgstr "Versuchen Sie eine andere Suche"
@@ -2859,15 +3506,15 @@ msgstr "Versuchen Sie eine andere Suche"
msgid "Could not show link"
msgstr "Link konnte nicht angezeigt werden"
-#: gtk/gtktext.c:5983 gtk/gtktextview.c:8584
+#: gtk/gtktext.c:5974 gtk/gtktextview.c:8597
msgid "Insert _Emoji"
msgstr "_Emoticon einfügen"
-#: gtk/gtktextview.c:8566
+#: gtk/gtktextview.c:8579
msgid "_Undo"
msgstr "_Rückgängig"
-#: gtk/gtktextview.c:8570
+#: gtk/gtktextview.c:8583
msgid "_Redo"
msgstr "_Wiederholen"
@@ -2890,12 +3537,12 @@ msgctxt "volume percentage"
msgid "%d %%"
msgstr "%d %%"
-#: gtk/gtkwindow.c:6637
+#: gtk/gtkwindow.c:6666
#, c-format
msgid "Do you want to use GTK Inspector?"
msgstr "Wollen Sie den GTK-Inspektor verwenden?"
-#: gtk/gtkwindow.c:6639
+#: gtk/gtkwindow.c:6668
#, c-format
msgid ""
"GTK Inspector is an interactive debugger that lets you explore and modify "
@@ -2906,7 +3553,7 @@ msgstr ""
"Interna einer beliebigen GTK+-Anwendung zu untersuchen und zu verändern. "
"Dabei kann die Anwendung unerwünscht arbeiten oder abstürzen."
-#: gtk/gtkwindow.c:6644
+#: gtk/gtkwindow.c:6673
msgid "Don’t show this message again"
msgstr "Diese Meldung nicht mehr anzeigen"
@@ -2930,11 +3577,15 @@ msgstr "Schließen"
msgid "Role"
msgstr "Rolle"
-#: gtk/inspector/a11y.ui:42
+#: gtk/inspector/a11y.ui:40
+msgid "Object path"
+msgstr "Objektpfad"
+
+#: gtk/inspector/a11y.ui:66
msgid "Attribute"
msgstr "Attribut"
-#: gtk/inspector/a11y.ui:54 gtk/inspector/css-node-tree.ui:119
+#: gtk/inspector/a11y.ui:78 gtk/inspector/css-node-tree.ui:119
#: gtk/inspector/prop-list.ui:56 gtk/inspector/recorder.ui:123
msgid "Value"
msgstr "Wert"
@@ -2960,22 +3611,22 @@ msgstr "Parametertyp"
msgid "State"
msgstr "Status"
-#: gtk/inspector/controllers.c:145
+#: gtk/inspector/controllers.c:144
msgctxt "event phase"
msgid "None"
msgstr "Keine"
-#: gtk/inspector/controllers.c:146
+#: gtk/inspector/controllers.c:145
msgctxt "event phase"
msgid "Capture"
msgstr "Erfassen"
-#: gtk/inspector/controllers.c:147
+#: gtk/inspector/controllers.c:146
msgctxt "event phase"
msgid "Bubble"
msgstr "Blase"
-#: gtk/inspector/controllers.c:148
+#: gtk/inspector/controllers.c:147
msgctxt "event phase"
msgid "Target"
msgstr "Ziel"
@@ -3024,79 +3675,79 @@ msgstr "Stilklassen"
msgid "CSS Property"
msgstr "CSS-Eigenschaft"
-#: gtk/inspector/general.c:355
+#: gtk/inspector/general.c:345
msgctxt "GL version"
msgid "None"
msgstr "Keine"
-#: gtk/inspector/general.c:356
+#: gtk/inspector/general.c:346
msgctxt "GL vendor"
msgid "None"
msgstr "Keiner"
-#: gtk/inspector/general.c:457
+#: gtk/inspector/general.c:447
msgctxt "Vulkan device"
msgid "None"
msgstr "Keine"
-#: gtk/inspector/general.c:458 gtk/inspector/general.c:459
+#: gtk/inspector/general.c:448 gtk/inspector/general.c:449
msgctxt "Vulkan version"
msgid "None"
msgstr "Keine"
-#: gtk/inspector/general.ui:36
+#: gtk/inspector/general.ui:32
msgid "GTK Version"
msgstr "GTK-Version"
-#: gtk/inspector/general.ui:66
+#: gtk/inspector/general.ui:58
msgid "GDK Backend"
msgstr "GDK-Backend"
-#: gtk/inspector/general.ui:96
+#: gtk/inspector/general.ui:84
msgid "GSK Renderer"
msgstr "GSK-Darstellung"
-#: gtk/inspector/general.ui:126
+#: gtk/inspector/general.ui:110
msgid "Pango Fontmap"
msgstr "Pango-Schriftzuweisung"
-#: gtk/inspector/general.ui:156
+#: gtk/inspector/general.ui:136
msgid "Media Backend"
msgstr "Medien-Backend"
-#: gtk/inspector/general.ui:199 gtk/ui/gtkplacesview.ui:80
+#: gtk/inspector/general.ui:175 gtk/ui/gtkplacesview.ui:80
msgid "Prefix"
msgstr "Präfix"
-#: gtk/inspector/general.ui:429
+#: gtk/inspector/general.ui:377
msgid "Display"
msgstr "Anzeige"
-#: gtk/inspector/general.ui:460
+#: gtk/inspector/general.ui:404
msgid "RGBA Visual"
msgstr "RGBA visuell"
-#: gtk/inspector/general.ui:490
+#: gtk/inspector/general.ui:430
msgid "Composited"
msgstr "Zusammengesetzt"
-#: gtk/inspector/general.ui:546
+#: gtk/inspector/general.ui:482
msgid "GL Version"
msgstr "GL-Version"
-#: gtk/inspector/general.ui:577
+#: gtk/inspector/general.ui:509
msgid "GL Vendor"
msgstr "GL-Hersteller"
-#: gtk/inspector/general.ui:621
+#: gtk/inspector/general.ui:549
msgid "Vulkan Device"
msgstr "Vulkan-Gerät"
-#: gtk/inspector/general.ui:652
+#: gtk/inspector/general.ui:576
msgid "Vulkan API version"
msgstr "Vulkan API-Version"
-#: gtk/inspector/general.ui:683
+#: gtk/inspector/general.ui:603
msgid "Vulkan driver version"
msgstr "Vulkan Treiber-Version"
@@ -3245,7 +3896,6 @@ msgid "Uneditable property type: %s"
msgstr "Nicht bearbeitbarer Eigenschaftentyp: %s"
#: gtk/inspector/prop-editor.c:1266
-#| msgid "None"
msgctxt "column number"
msgid "None"
msgstr "Keine"
@@ -3267,7 +3917,6 @@ msgstr "Spalte:"
#.
#: gtk/inspector/prop-editor.c:1410
#, c-format
-#| msgid "Object: %p (%s)"
msgid "Action from: %p (%s)"
msgstr "Aktion von: %p (%s)"
@@ -3276,31 +3925,26 @@ msgid "Reset"
msgstr "Zurücksetzen"
#: gtk/inspector/prop-editor.c:1473
-#| msgid "Default"
msgctxt "GtkSettings source"
msgid "Default"
msgstr "Standard"
#: gtk/inspector/prop-editor.c:1476
-#| msgid "Theme"
msgctxt "GtkSettings source"
msgid "Theme"
msgstr "Thema"
#: gtk/inspector/prop-editor.c:1479
-#| msgid "XSettings"
msgctxt "GtkSettings source"
msgid "XSettings"
msgstr "XSettings"
#: gtk/inspector/prop-editor.c:1483
-#| msgid "Application"
msgctxt "GtkSettings source"
msgid "Application"
msgstr "Anwendung"
#: gtk/inspector/prop-editor.c:1486
-#| msgid "Unknown"
msgctxt "GtkSettings source"
msgid "Unknown"
msgstr "Unbekannt"
@@ -3313,7 +3957,7 @@ msgstr "Quelle:"
msgid "Defined At"
msgstr "Definiert bei"
-#: gtk/inspector/recorder.c:981
+#: gtk/inspector/recorder.c:1171
#, c-format
msgid "Saving RenderNode failed"
msgstr "Speichern des RenderNode ist fehlgeschlagen"
@@ -3353,7 +3997,7 @@ msgid "Count"
msgstr "Zähler"
#: gtk/inspector/resource-list.ui:82 gtk/ui/gtkfilechooserwidget.ui:201
-#: gtk/ui/gtkfontchooserwidget.ui:142 gtk/ui/gtkfontchooserwidget.ui:290
+#: gtk/ui/gtkfontchooserwidget.ui:207 gtk/ui/gtkfontchooserwidget.ui:355
msgid "Size"
msgstr "Größe"
@@ -3373,27 +4017,27 @@ msgstr "Größe:"
msgid "Trigger"
msgstr "Auslöser"
-#: gtk/inspector/size-groups.c:226
+#: gtk/inspector/size-groups.c:225
msgctxt "sizegroup mode"
msgid "None"
msgstr "Keiner"
-#: gtk/inspector/size-groups.c:227
+#: gtk/inspector/size-groups.c:226
msgctxt "sizegroup mode"
msgid "Horizontal"
msgstr "Horizontal"
-#: gtk/inspector/size-groups.c:228
+#: gtk/inspector/size-groups.c:227
msgctxt "sizegroup mode"
msgid "Vertical"
msgstr "Vertikal"
-#: gtk/inspector/size-groups.c:229
+#: gtk/inspector/size-groups.c:228
msgctxt "sizegroup mode"
msgid "Both"
msgstr "Beides"
-#: gtk/inspector/size-groups.c:241
+#: gtk/inspector/size-groups.c:240
msgid "Mode"
msgstr "Modus"
@@ -3449,91 +4093,87 @@ msgstr "Das Thema ist fest einprogrammiert durch GTK_THEME"
msgid "Backend does not support window scaling"
msgstr "Backend unterstützt nicht das Skalieren von Fenstern"
-#: gtk/inspector/visual.c:931
-msgid "Setting is hardcoded by GTK_TEST_TOUCHSCREEN"
-msgstr "Die Einstellung ist fest einprogrammiert durch GTK_TEST_TOUCHSCREEN"
-
-#: gtk/inspector/visual.c:1034
+#: gtk/inspector/visual.c:1023
msgid "GL rendering is disabled"
msgstr "GL-Darstellung ist deaktiviert"
-#: gtk/inspector/visual.ui:63
+#: gtk/inspector/visual.ui:59
msgid "GTK Theme"
msgstr "GTK-Thema"
-#: gtk/inspector/visual.ui:91
+#: gtk/inspector/visual.ui:83
msgid "Dark Variant"
msgstr "Dunkle Variante"
-#: gtk/inspector/visual.ui:120
+#: gtk/inspector/visual.ui:108
msgid "Cursor Theme"
msgstr "Zeiger-Thema"
-#: gtk/inspector/visual.ui:149
+#: gtk/inspector/visual.ui:133
msgid "Cursor Size"
msgstr "Zeigergröße"
-#: gtk/inspector/visual.ui:182
+#: gtk/inspector/visual.ui:162
msgid "Icon Theme"
msgstr "Symbol-Thema"
-#: gtk/inspector/visual.ui:240
+#: gtk/inspector/visual.ui:212
msgid "Font Scale"
msgstr "Schriftskalierungsfaktor"
-#: gtk/inspector/visual.ui:281
+#: gtk/inspector/visual.ui:249
msgid "Text Direction"
msgstr "Textrichtung"
-#: gtk/inspector/visual.ui:296
+#: gtk/inspector/visual.ui:264
msgid "Left-to-Right"
msgstr "Links nach rechts"
-#: gtk/inspector/visual.ui:297
+#: gtk/inspector/visual.ui:265
msgid "Right-to-Left"
msgstr "Rechts nach links"
-#: gtk/inspector/visual.ui:319
+#: gtk/inspector/visual.ui:283
msgid "Window Scaling"
msgstr "Skalierungsfaktor des Fensters"
-#: gtk/inspector/visual.ui:349
+#: gtk/inspector/visual.ui:309
msgid "Animations"
msgstr "Animationen"
-#: gtk/inspector/visual.ui:378
+#: gtk/inspector/visual.ui:334
msgid "Slowdown"
msgstr "Verlangsamung"
-#: gtk/inspector/visual.ui:432
+#: gtk/inspector/visual.ui:384
msgid "Show fps overlay"
msgstr "fps(Bilder pro Sekunde)-Zähler einblenden"
-#: gtk/inspector/visual.ui:461
+#: gtk/inspector/visual.ui:409
msgid "Show Graphic Updates"
msgstr "Grafikaktualisierungen zeigen"
-#: gtk/inspector/visual.ui:490
+#: gtk/inspector/visual.ui:434
msgid "Show Fallback Rendering"
msgstr "Ausweichdarstellung anzeigen"
-#: gtk/inspector/visual.ui:519
+#: gtk/inspector/visual.ui:459
msgid "Show Baselines"
msgstr "Grundlinie zeigen"
-#: gtk/inspector/visual.ui:548
+#: gtk/inspector/visual.ui:484
msgid "Show Layout Borders"
msgstr "Layout-Ränder anzeigen"
-#: gtk/inspector/visual.ui:577
+#: gtk/inspector/visual.ui:509
msgid "Show Focus"
msgstr "Fokus anzeigen"
-#: gtk/inspector/visual.ui:620
+#: gtk/inspector/visual.ui:548
msgid "Simulate Touchscreen"
msgstr "Tastbildschirm simulieren"
-#: gtk/inspector/visual.ui:648
+#: gtk/inspector/visual.ui:572
msgid "Software GL"
msgstr "Software GL"
@@ -3567,8 +4207,6 @@ msgid "Toggle Sidebar"
msgstr "Seitenleiste anzeigen oder verbergen"
#: gtk/inspector/window.ui:255
-#| msgctxt "OpenType layout"
-#| msgid "Required Variation Alternates"
msgid "Refresh action state"
msgstr "Aktionsstatus aktualisieren"
@@ -3583,14 +4221,10 @@ msgstr "Unterelement"
# CHECK
#: gtk/inspector/window.ui:360
-#| msgctxt "Stock label, media"
-#| msgid "Pre_vious"
msgid "Previous sibling"
msgstr "Vorheriges Geschwister"
#: gtk/inspector/window.ui:369
-#| msgctxt "OpenType layout"
-#| msgid "Cursive Positioning"
msgid "List Position"
msgstr "Listenposition"
@@ -5987,6 +6621,92 @@ msgctxt "Script"
msgid "Zanabazar Square"
msgstr "Dsanabadsar-Quadratschrift"
+#: gtk/script-names.c:156
+#, fuzzy
+#| msgid "Program"
+msgctxt "Script"
+msgid "Dogra"
+msgstr "Programm"
+
+#: gtk/script-names.c:157
+#, fuzzy
+#| msgctxt "Script"
+#| msgid "Masaram Gondi"
+msgctxt "Script"
+msgid "Gunjala Gondi"
+msgstr "Masaram Gondi"
+
+#: gtk/script-names.c:158
+msgctxt "Script"
+msgid "Hanifi Rohingya"
+msgstr ""
+
+#: gtk/script-names.c:159
+msgctxt "Script"
+msgid "Makasar"
+msgstr ""
+
+#: gtk/script-names.c:160
+msgctxt "Script"
+msgid "Medefaidrin"
+msgstr ""
+
+#: gtk/script-names.c:161
+#, fuzzy
+#| msgctxt "Script"
+#| msgid "Old Hungarian"
+msgctxt "Script"
+msgid "Old Sogdian"
+msgstr "Alt-Ungarisch"
+
+#: gtk/script-names.c:162
+#, fuzzy
+#| msgctxt "Script"
+#| msgid "Lydian"
+msgctxt "Script"
+msgid "Sogdian"
+msgstr "Lydisch"
+
+#: gtk/script-names.c:165 gtk/script-names.c:170
+msgctxt "Script"
+msgid "Elym"
+msgstr ""
+
+#: gtk/script-names.c:166 gtk/script-names.c:171
+msgctxt "Script"
+msgid "Nand"
+msgstr ""
+
+#: gtk/script-names.c:167 gtk/script-names.c:172
+msgctxt "Script"
+msgid "Rohg"
+msgstr ""
+
+#: gtk/script-names.c:168 gtk/script-names.c:173
+msgctxt "Script"
+msgid "Wcho"
+msgstr ""
+
+#: gtk/script-names.c:176 gtk/script-names.c:181
+msgctxt "Script"
+msgid "Chorasmian"
+msgstr ""
+
+#: gtk/script-names.c:177 gtk/script-names.c:182
+msgctxt "Script"
+msgid "Dives Akuru"
+msgstr ""
+
+#: gtk/script-names.c:178 gtk/script-names.c:183
+msgctxt "Script"
+msgid "Khitan small script"
+msgstr ""
+
+#: gtk/script-names.c:179 gtk/script-names.c:184
+msgctxt "Script"
+msgid "Yezidi"
+msgstr ""
+
#: gtk/tools/encodesymbolic.c:39
msgid "Output to this directory instead of cwd"
msgstr "In diesen Ordner anstatt »cwd« ausgeben"
@@ -6013,24 +6733,6 @@ msgstr "Datenstrom kann nicht geschlossen werden"
#: gtk/tools/gtk-builder-tool.c:34
#, c-format
-#| msgid ""
-#| "Usage:\n"
-#| " gtk-builder-tool [COMMAND] FILE\n"
-#| "\n"
-#| "Commands:\n"
-#| " validate Validate the file\n"
-#| " simplify [OPTIONS] Simplify the file\n"
-#| " enumerate List all named objects\n"
-#| " preview [OPTIONS] Preview the file\n"
-#| "\n"
-#| "Simplify Options:\n"
-#| " --replace Replace the file\n"
-#| "\n"
-#| "Preview Options:\n"
-#| " --id=ID Preview only the named object\n"
-#| " --css=FILE Use style from CSS file\n"
-#| "\n"
-#| "Perform various tasks on GtkBuilder .ui files.\n"
msgid ""
"Usage:\n"
" gtk-builder-tool [COMMAND] [OPTION…] FILE\n"
@@ -6080,32 +6782,32 @@ msgstr "%s:%d: Wert für Eigenschaft »%s« konnte nicht verarbeitet werden: %s\
msgid "%s:%d: %sproperty %s::%s not found\n"
msgstr "%s:%d: %s-Eigenschaft %s::%s nicht gefunden\n"
-#: gtk/tools/gtk-builder-tool-simplify.c:2046
+#: gtk/tools/gtk-builder-tool-simplify.c:2145
#, c-format
msgid "Can’t load “%s”: %s\n"
msgstr "»%s« kann nicht geladen werden: %s\n"
-#: gtk/tools/gtk-builder-tool-simplify.c:2057
+#: gtk/tools/gtk-builder-tool-simplify.c:2156
#, c-format
msgid "Can’t parse “%s”: %s\n"
msgstr "»%s« kann nicht verarbeitet werden: %s\n"
-#: gtk/tools/gtk-builder-tool-simplify.c:2081
+#: gtk/tools/gtk-builder-tool-simplify.c:2180
#, c-format
msgid "Failed to read “%s”: %s\n"
msgstr "»%s« konnte nicht gelesen werden: %s\n"
-#: gtk/tools/gtk-builder-tool-simplify.c:2087
+#: gtk/tools/gtk-builder-tool-simplify.c:2186
#, c-format
msgid "Failed to write %s: “%s”\n"
msgstr "»%s« konnte nicht geschrieben werden: %s\n"
-#: gtk/tools/gtk-builder-tool-simplify.c:2127
+#: gtk/tools/gtk-builder-tool-simplify.c:2226
#, c-format
msgid "No .ui file specified\n"
msgstr "Es wurde keine .ui-Datei angegeben\n"
-#: gtk/tools/gtk-builder-tool-simplify.c:2133
+#: gtk/tools/gtk-builder-tool-simplify.c:2232
#, c-format
msgid "Can only simplify a single .ui file without --replace\n"
msgstr "Ohne --replace kann nur eine einzelne .ui-Datei vereinfacht werden\n"
@@ -6344,31 +7046,51 @@ msgstr "_Weiter"
msgid "Select a Color"
msgstr "Farbe auswählen"
-#: gtk/ui/gtkcoloreditor.ui:43
+#: gtk/ui/gtkcoloreditor.ui:43 gtk/ui/gtkcoloreditor.ui:53
msgid "Pick a color from the screen"
msgstr "Wählen Sie eine Farbe auf dem Bildschirm"
-#: gtk/ui/gtkcoloreditor.ui:143
+#: gtk/ui/gtkcoloreditor.ui:80
+msgid "Hexadecimal color or color name"
+msgstr ""
+
+#: gtk/ui/gtkcoloreditor.ui:95
+msgid "Hue"
+msgstr "Farbton"
+
+#: gtk/ui/gtkcoloreditor.ui:114
+#, fuzzy
+#| msgid "Alpha"
+msgid "Alpha value"
+msgstr "Alpha"
+
+#: gtk/ui/gtkcoloreditor.ui:132
+#, fuzzy
+#| msgid "Saturation"
+msgid "Saturation and value"
+msgstr "Sättigung"
+
+#: gtk/ui/gtkcoloreditor.ui:156
msgctxt "Color channel"
msgid "A"
msgstr "A"
-#: gtk/ui/gtkcoloreditor.ui:179
+#: gtk/ui/gtkcoloreditor.ui:192
msgctxt "Color channel"
msgid "H"
msgstr "H"
-#: gtk/ui/gtkcoloreditor.ui:216
+#: gtk/ui/gtkcoloreditor.ui:229
msgctxt "Color Channel"
msgid "S"
msgstr "S"
-#: gtk/ui/gtkcoloreditor.ui:225
+#: gtk/ui/gtkcoloreditor.ui:238
msgctxt "Color Channel"
msgid "V"
msgstr "V"
-#: gtk/ui/gtkdropdown.ui:62
+#: gtk/ui/gtkdropdown.ui:64
msgid "Search…"
msgstr "Suchen …"
@@ -6442,19 +7164,31 @@ msgstr "A_nlegen"
msgid "Select Font"
msgstr "Schriftart wählen"
-#: gtk/ui/gtkfontchooserwidget.ui:55
+#: gtk/ui/gtkfontchooserwidget.ui:64
msgid "Search font name"
msgstr "Schriftname suchen"
-#: gtk/ui/gtkfontchooserwidget.ui:126 gtk/ui/gtkfontchooserwidget.ui:263
+#: gtk/ui/gtkfontchooserwidget.ui:79
+msgid "Filter by"
+msgstr ""
+
+#: gtk/ui/gtkfontchooserwidget.ui:89
+msgid "Monospace"
+msgstr ""
+
+#: gtk/ui/gtkfontchooserwidget.ui:95
+msgid "Language"
+msgstr ""
+
+#: gtk/ui/gtkfontchooserwidget.ui:191 gtk/ui/gtkfontchooserwidget.ui:328
msgid "Preview text"
msgstr "Vorschautext"
-#: gtk/ui/gtkfontchooserwidget.ui:129 gtk/ui/gtkfontchooserwidget.ui:159
+#: gtk/ui/gtkfontchooserwidget.ui:194 gtk/ui/gtkfontchooserwidget.ui:224
msgid "horizontal"
msgstr "horizontal"
-#: gtk/ui/gtkfontchooserwidget.ui:209
+#: gtk/ui/gtkfontchooserwidget.ui:274
msgid "No Fonts Found"
msgstr "Keine Schriftarten gefunden"
@@ -6472,19 +7206,19 @@ msgstr "Ei_genschaften:"
msgid "_Orientation:"
msgstr "_Ausrichtung:"
-#: gtk/ui/gtkpagesetupunixdialog.ui:109 gtk/ui/gtkprintunixdialog.ui:677
+#: gtk/ui/gtkpagesetupunixdialog.ui:98 gtk/ui/gtkprintunixdialog.ui:677
msgid "Portrait"
msgstr "Hochformat"
-#: gtk/ui/gtkpagesetupunixdialog.ui:135 gtk/ui/gtkprintunixdialog.ui:679
+#: gtk/ui/gtkpagesetupunixdialog.ui:109 gtk/ui/gtkprintunixdialog.ui:679
msgid "Reverse portrait"
msgstr "Kopfstehendes Hochformat"
-#: gtk/ui/gtkpagesetupunixdialog.ui:161 gtk/ui/gtkprintunixdialog.ui:678
+#: gtk/ui/gtkpagesetupunixdialog.ui:121 gtk/ui/gtkprintunixdialog.ui:678
msgid "Landscape"
msgstr "Querformat"
-#: gtk/ui/gtkpagesetupunixdialog.ui:186 gtk/ui/gtkprintunixdialog.ui:680
+#: gtk/ui/gtkpagesetupunixdialog.ui:132 gtk/ui/gtkprintunixdialog.ui:680
msgid "Reverse landscape"
msgstr "Kopfstehendes Querformat"
@@ -6760,399 +7494,399 @@ msgstr "Verschollen"
msgid "Pages per _sheet:"
msgstr "Seiten pro _Blatt:"
-#: modules/printbackends/gtkprintbackendcups.c:1121
-#: modules/printbackends/gtkprintbackendcups.c:1430
+#: modules/printbackends/gtkprintbackendcups.c:1123
+#: modules/printbackends/gtkprintbackendcups.c:1432
msgid "Username:"
msgstr "Benutzername:"
-#: modules/printbackends/gtkprintbackendcups.c:1122
-#: modules/printbackends/gtkprintbackendcups.c:1439
+#: modules/printbackends/gtkprintbackendcups.c:1124
+#: modules/printbackends/gtkprintbackendcups.c:1441
msgid "Password:"
msgstr "Passwort:"
-#: modules/printbackends/gtkprintbackendcups.c:1161
-#: modules/printbackends/gtkprintbackendcups.c:1452
+#: modules/printbackends/gtkprintbackendcups.c:1163
+#: modules/printbackends/gtkprintbackendcups.c:1454
#, c-format
msgid "Authentication is required to print document “%s” on printer %s"
msgstr "Das Drucken des Dokuments »%s« auf Drucker %s erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1163
+#: modules/printbackends/gtkprintbackendcups.c:1165
#, c-format
msgid "Authentication is required to print a document on %s"
msgstr "Das Drucken eines Dokuments auf %s erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1167
+#: modules/printbackends/gtkprintbackendcups.c:1169
#, c-format
msgid "Authentication is required to get attributes of job “%s”"
msgstr ""
"Das Auslesen von Attributen des Druckauftrags »%s« erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1169
+#: modules/printbackends/gtkprintbackendcups.c:1171
msgid "Authentication is required to get attributes of a job"
msgstr "Das Auslesen von Attributen eines Druckauftrags erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1173
+#: modules/printbackends/gtkprintbackendcups.c:1175
#, c-format
msgid "Authentication is required to get attributes of printer %s"
msgstr "Das Auslesen von Attributen des Druckers %s erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1175
+#: modules/printbackends/gtkprintbackendcups.c:1177
msgid "Authentication is required to get attributes of a printer"
msgstr "Das Auslesen von Attributen eines Druckers erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1178
+#: modules/printbackends/gtkprintbackendcups.c:1180
#, c-format
msgid "Authentication is required to get default printer of %s"
msgstr "Das Feststellen des Vorgabedruckers auf %s erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1181
+#: modules/printbackends/gtkprintbackendcups.c:1183
#, c-format
msgid "Authentication is required to get printers from %s"
msgstr "Das Auslesen von Druckern auf %s erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1186
+#: modules/printbackends/gtkprintbackendcups.c:1188
#, c-format
msgid "Authentication is required to get a file from %s"
msgstr "Der Zugriff auf eine Datei von %s erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1188
+#: modules/printbackends/gtkprintbackendcups.c:1190
#, c-format
msgid "Authentication is required on %s"
msgstr "Der Zugriff auf %s erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1424
+#: modules/printbackends/gtkprintbackendcups.c:1426
msgid "Domain:"
msgstr "Domäne:"
-#: modules/printbackends/gtkprintbackendcups.c:1454
+#: modules/printbackends/gtkprintbackendcups.c:1456
#, c-format
msgid "Authentication is required to print document “%s”"
msgstr "Das Drucken des Dokuments »%s« erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1459
+#: modules/printbackends/gtkprintbackendcups.c:1461
#, c-format
msgid "Authentication is required to print this document on printer %s"
msgstr "Das Drucken dieses Dokuments auf Drucker %s erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:1461
+#: modules/printbackends/gtkprintbackendcups.c:1463
msgid "Authentication is required to print this document"
msgstr "Das Drucken dieses Dokuments erfordert Legitimation"
-#: modules/printbackends/gtkprintbackendcups.c:2534
+#: modules/printbackends/gtkprintbackendcups.c:2536
#, c-format
msgid "Printer “%s” is low on toner."
msgstr "Drucker »%s« hat nur noch wenig Toner."
-#: modules/printbackends/gtkprintbackendcups.c:2538
+#: modules/printbackends/gtkprintbackendcups.c:2540
#, c-format
msgid "Printer “%s” has no toner left."
msgstr "Drucker »%s« hat keinen Toner mehr."
#. Translators: "Developer" like on photo development context
-#: modules/printbackends/gtkprintbackendcups.c:2543
+#: modules/printbackends/gtkprintbackendcups.c:2545
#, c-format
msgid "Printer “%s” is low on developer."
msgstr "Drucker »%s« hat nur noch wenig Entwickler."
#. Translators: "Developer" like on photo development context
-#: modules/printbackends/gtkprintbackendcups.c:2548
+#: modules/printbackends/gtkprintbackendcups.c:2550
#, c-format
msgid "Printer “%s” is out of developer."
msgstr "Drucker »%s« hat keinen Entwickler mehr."
#. Translators: "marker" is one color bin of the printer
-#: modules/printbackends/gtkprintbackendcups.c:2553
+#: modules/printbackends/gtkprintbackendcups.c:2555
#, c-format
msgid "Printer “%s” is low on at least one marker supply."
msgstr ""
"Drucker »%s« hat nur noch wenig Farbe in mindestens einem Farbbehälter."
#. Translators: "marker" is one color bin of the printer
-#: modules/printbackends/gtkprintbackendcups.c:2558
+#: modules/printbackends/gtkprintbackendcups.c:2560
#, c-format
msgid "Printer “%s” is out of at least one marker supply."
msgstr "Drucker »%s« hat keine Farbe mehr in mindestens einem Farbbehälter."
-#: modules/printbackends/gtkprintbackendcups.c:2562
+#: modules/printbackends/gtkprintbackendcups.c:2564
#, c-format
msgid "The cover is open on printer “%s”."
msgstr "Die Abdeckung des Druckers »%s« ist offen."
-#: modules/printbackends/gtkprintbackendcups.c:2566
+#: modules/printbackends/gtkprintbackendcups.c:2568
#, c-format
msgid "The door is open on printer “%s”."
msgstr "Die Klappe des Druckers »%s« ist offen."
-#: modules/printbackends/gtkprintbackendcups.c:2570
+#: modules/printbackends/gtkprintbackendcups.c:2572
#, c-format
msgid "Printer “%s” is low on paper."
msgstr "Der Drucker »%s« hat nur noch wenig Papier."
-#: modules/printbackends/gtkprintbackendcups.c:2574
+#: modules/printbackends/gtkprintbackendcups.c:2576
#, c-format
msgid "Printer “%s” is out of paper."
msgstr "Der Drucker »%s« hat kein Papier mehr."
-#: modules/printbackends/gtkprintbackendcups.c:2578
+#: modules/printbackends/gtkprintbackendcups.c:2580
#, c-format
msgid "Printer “%s” is currently offline."
msgstr "Der Drucker »%s« ist momentan nicht betriebsbereit."
-#: modules/printbackends/gtkprintbackendcups.c:2582
+#: modules/printbackends/gtkprintbackendcups.c:2584
#, c-format
msgid "There is a problem on printer “%s”."
msgstr "Es besteht ein Problem mit dem Drucker »%s«."
#. Translators: this is a printer status.
-#: modules/printbackends/gtkprintbackendcups.c:2602
+#: modules/printbackends/gtkprintbackendcups.c:2604
msgid "Paused; Rejecting Jobs"
msgstr "Pausiert; Aufträge werden abgewiesen"
#. Translators: this is a printer status.
-#: modules/printbackends/gtkprintbackendcups.c:2608
+#: modules/printbackends/gtkprintbackendcups.c:2610
msgid "Rejecting Jobs"
msgstr "Aufträge werden abgewiesen"
#. Translators: this string connects multiple printer states together.
-#: modules/printbackends/gtkprintbackendcups.c:2649
+#: modules/printbackends/gtkprintbackendcups.c:2651
msgid "; "
msgstr "; "
-#: modules/printbackends/gtkprintbackendcups.c:4400
-#: modules/printbackends/gtkprintbackendcups.c:4467
+#: modules/printbackends/gtkprintbackendcups.c:4402
+#: modules/printbackends/gtkprintbackendcups.c:4469
msgctxt "printing option"
msgid "Two Sided"
msgstr "Beidseitig"
-#: modules/printbackends/gtkprintbackendcups.c:4401
+#: modules/printbackends/gtkprintbackendcups.c:4403
msgctxt "printing option"
msgid "Paper Type"
msgstr "Papierart"
-#: modules/printbackends/gtkprintbackendcups.c:4402
+#: modules/printbackends/gtkprintbackendcups.c:4404
msgctxt "printing option"
msgid "Paper Source"
msgstr "Papiereinzug"
-#: modules/printbackends/gtkprintbackendcups.c:4403
-#: modules/printbackends/gtkprintbackendcups.c:4468
+#: modules/printbackends/gtkprintbackendcups.c:4405
+#: modules/printbackends/gtkprintbackendcups.c:4470
msgctxt "printing option"
msgid "Output Tray"
msgstr "Ausgabeschacht"
-#: modules/printbackends/gtkprintbackendcups.c:4404
+#: modules/printbackends/gtkprintbackendcups.c:4406
msgctxt "printing option"
msgid "Resolution"
msgstr "Auflösung"
-#: modules/printbackends/gtkprintbackendcups.c:4405
+#: modules/printbackends/gtkprintbackendcups.c:4407
msgctxt "printing option"
msgid "GhostScript pre-filtering"
msgstr "GhostScript-Vorfilterung"
-#: modules/printbackends/gtkprintbackendcups.c:4414
+#: modules/printbackends/gtkprintbackendcups.c:4416
msgctxt "printing option value"
msgid "One Sided"
msgstr "Einseitig"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/gtkprintbackendcups.c:4416
+#: modules/printbackends/gtkprintbackendcups.c:4418
msgctxt "printing option value"
msgid "Long Edge (Standard)"
msgstr "Langer Rand (Vorgabe)"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/gtkprintbackendcups.c:4418
+#: modules/printbackends/gtkprintbackendcups.c:4420
msgctxt "printing option value"
msgid "Short Edge (Flip)"
msgstr "Kurzer Rand (Umdrehen)"
#. Translators: this is an option of "Paper Source"
-#: modules/printbackends/gtkprintbackendcups.c:4420
#: modules/printbackends/gtkprintbackendcups.c:4422
-#: modules/printbackends/gtkprintbackendcups.c:4430
+#: modules/printbackends/gtkprintbackendcups.c:4424
+#: modules/printbackends/gtkprintbackendcups.c:4432
msgctxt "printing option value"
msgid "Auto Select"
msgstr "Automatische Auswahl"
#. Translators: this is an option of "Paper Source"
#. Translators: this is an option of "Resolution"
-#: modules/printbackends/gtkprintbackendcups.c:4424
#: modules/printbackends/gtkprintbackendcups.c:4426
#: modules/printbackends/gtkprintbackendcups.c:4428
-#: modules/printbackends/gtkprintbackendcups.c:4432
+#: modules/printbackends/gtkprintbackendcups.c:4430
+#: modules/printbackends/gtkprintbackendcups.c:4434
msgctxt "printing option value"
msgid "Printer Default"
msgstr "Vorgabe-Drucker"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/gtkprintbackendcups.c:4434
+#: modules/printbackends/gtkprintbackendcups.c:4436
msgctxt "printing option value"
msgid "Embed GhostScript fonts only"
msgstr "Nur GhostScript-Schriften einbinden"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/gtkprintbackendcups.c:4436
+#: modules/printbackends/gtkprintbackendcups.c:4438
msgctxt "printing option value"
msgid "Convert to PS level 1"
msgstr "Zu PS Level 1 konvertieren"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/gtkprintbackendcups.c:4438
+#: modules/printbackends/gtkprintbackendcups.c:4440
msgctxt "printing option value"
msgid "Convert to PS level 2"
msgstr "Zu PS Level 2 konvertieren"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/gtkprintbackendcups.c:4440
+#: modules/printbackends/gtkprintbackendcups.c:4442
msgctxt "printing option value"
msgid "No pre-filtering"
msgstr "Keine Vorfilterung"
#. Translators: "Miscellaneous" is the label for a button, that opens
#. up an extra panel of settings in a print dialog.
-#: modules/printbackends/gtkprintbackendcups.c:4449
+#: modules/printbackends/gtkprintbackendcups.c:4451
msgctxt "printing option group"
msgid "Miscellaneous"
msgstr "Erweitert"
-#: modules/printbackends/gtkprintbackendcups.c:4476
+#: modules/printbackends/gtkprintbackendcups.c:4478
msgctxt "sides"
msgid "One Sided"
msgstr "Einseitig"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/gtkprintbackendcups.c:4478
+#: modules/printbackends/gtkprintbackendcups.c:4480
msgctxt "sides"
msgid "Long Edge (Standard)"
msgstr "Langer Rand (Vorgabe)"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/gtkprintbackendcups.c:4480
+#: modules/printbackends/gtkprintbackendcups.c:4482
msgctxt "sides"
msgid "Short Edge (Flip)"
msgstr "Kurzer Rand (Umdrehen)"
#. Translators: Top output bin
-#: modules/printbackends/gtkprintbackendcups.c:4483
+#: modules/printbackends/gtkprintbackendcups.c:4485
msgctxt "output-bin"
msgid "Top Bin"
msgstr "Oberer Bin"
#. Translators: Middle output bin
-#: modules/printbackends/gtkprintbackendcups.c:4485
+#: modules/printbackends/gtkprintbackendcups.c:4487
msgctxt "output-bin"
msgid "Middle Bin"
msgstr "Mittlerer Bin"
#. Translators: Bottom output bin
-#: modules/printbackends/gtkprintbackendcups.c:4487
+#: modules/printbackends/gtkprintbackendcups.c:4489
msgctxt "output-bin"
msgid "Bottom Bin"
msgstr "Unterer Bin"
#. Translators: Side output bin
-#: modules/printbackends/gtkprintbackendcups.c:4489
+#: modules/printbackends/gtkprintbackendcups.c:4491
msgctxt "output-bin"
msgid "Side Bin"
msgstr "Seiten-Bin"
#. Translators: Left output bin
-#: modules/printbackends/gtkprintbackendcups.c:4491
+#: modules/printbackends/gtkprintbackendcups.c:4493
msgctxt "output-bin"
msgid "Left Bin"
msgstr "Linker Bin"
#. Translators: Right output bin
-#: modules/printbackends/gtkprintbackendcups.c:4493
+#: modules/printbackends/gtkprintbackendcups.c:4495
msgctxt "output-bin"
msgid "Right Bin"
msgstr "Rechter Bin"
#. Translators: Center output bin
-#: modules/printbackends/gtkprintbackendcups.c:4495
+#: modules/printbackends/gtkprintbackendcups.c:4497
msgctxt "output-bin"
msgid "Center Bin"
msgstr "Mittlerer Bin"
#. Translators: Rear output bin
-#: modules/printbackends/gtkprintbackendcups.c:4497
+#: modules/printbackends/gtkprintbackendcups.c:4499
msgctxt "output-bin"
msgid "Rear Bin"
msgstr "Hinterer Bin"
#. Translators: Output bin where one sided output is oriented in the face-up position
-#: modules/printbackends/gtkprintbackendcups.c:4499
+#: modules/printbackends/gtkprintbackendcups.c:4501
msgctxt "output-bin"
msgid "Face Up Bin"
msgstr "Bin nach oben"
#. Translators: Output bin where one sided output is oriented in the face-down position
-#: modules/printbackends/gtkprintbackendcups.c:4501
+#: modules/printbackends/gtkprintbackendcups.c:4503
msgctxt "output-bin"
msgid "Face Down Bin"
msgstr "Bin nach unten"
#. Translators: Large capacity output bin
-#: modules/printbackends/gtkprintbackendcups.c:4503
+#: modules/printbackends/gtkprintbackendcups.c:4505
msgctxt "output-bin"
msgid "Large Capacity Bin"
msgstr "Großer Bin"
#. Translators: Output stacker number %d
-#: modules/printbackends/gtkprintbackendcups.c:4525
+#: modules/printbackends/gtkprintbackendcups.c:4527
#, c-format
msgctxt "output-bin"
msgid "Stacker %d"
msgstr "Stacker %d"
#. Translators: Output mailbox number %d
-#: modules/printbackends/gtkprintbackendcups.c:4529
+#: modules/printbackends/gtkprintbackendcups.c:4531
#, c-format
msgctxt "output-bin"
msgid "Mailbox %d"
msgstr "Postfach %d"
#. Translators: Private mailbox
-#: modules/printbackends/gtkprintbackendcups.c:4533
+#: modules/printbackends/gtkprintbackendcups.c:4535
msgctxt "output-bin"
msgid "My Mailbox"
msgstr "Eigenes Postfach"
#. Translators: Output tray number %d
-#: modules/printbackends/gtkprintbackendcups.c:4537
+#: modules/printbackends/gtkprintbackendcups.c:4539
#, c-format
msgctxt "output-bin"
msgid "Tray %d"
msgstr "Ablage %d"
-#: modules/printbackends/gtkprintbackendcups.c:5014
+#: modules/printbackends/gtkprintbackendcups.c:5016
msgid "Printer Default"
msgstr "Vorgabe-Drucker"
#. Translators: These strings name the possible values of the
#. * job priority option in the print dialog
#.
-#: modules/printbackends/gtkprintbackendcups.c:5458
+#: modules/printbackends/gtkprintbackendcups.c:5460
msgid "Urgent"
msgstr "Dringend"
-#: modules/printbackends/gtkprintbackendcups.c:5458
+#: modules/printbackends/gtkprintbackendcups.c:5460
msgid "High"
msgstr "Hoch"
-#: modules/printbackends/gtkprintbackendcups.c:5458
+#: modules/printbackends/gtkprintbackendcups.c:5460
msgid "Medium"
msgstr "Mittel"
-#: modules/printbackends/gtkprintbackendcups.c:5458
+#: modules/printbackends/gtkprintbackendcups.c:5460
msgid "Low"
msgstr "Niedrig"
#. Translators, this string is used to label the job priority option
#. * in the print dialog
#.
-#: modules/printbackends/gtkprintbackendcups.c:5488
+#: modules/printbackends/gtkprintbackendcups.c:5490
msgid "Job Priority"
msgstr "Priorität"
@@ -7160,44 +7894,44 @@ msgstr "Priorität"
#. Translators, this string is used to label the billing info entry
#. * in the print dialog
#.
-#: modules/printbackends/gtkprintbackendcups.c:5499
+#: modules/printbackends/gtkprintbackendcups.c:5501
msgid "Billing Info"
msgstr "Abrechnungsinfo"
#. Translators, these strings are names for various 'standard' cover
#. * pages that the printing system may support.
#.
-#: modules/printbackends/gtkprintbackendcups.c:5523
+#: modules/printbackends/gtkprintbackendcups.c:5525
msgctxt "cover page"
msgid "None"
msgstr "Keine"
-#: modules/printbackends/gtkprintbackendcups.c:5524
+#: modules/printbackends/gtkprintbackendcups.c:5526
msgctxt "cover page"
msgid "Classified"
msgstr "Klassifiziert"
-#: modules/printbackends/gtkprintbackendcups.c:5525
+#: modules/printbackends/gtkprintbackendcups.c:5527
msgctxt "cover page"
msgid "Confidential"
msgstr "Vertraulich"
-#: modules/printbackends/gtkprintbackendcups.c:5526
+#: modules/printbackends/gtkprintbackendcups.c:5528
msgctxt "cover page"
msgid "Secret"
msgstr "Geheim"
-#: modules/printbackends/gtkprintbackendcups.c:5527
+#: modules/printbackends/gtkprintbackendcups.c:5529
msgctxt "cover page"
msgid "Standard"
msgstr "Standard"
-#: modules/printbackends/gtkprintbackendcups.c:5528
+#: modules/printbackends/gtkprintbackendcups.c:5530
msgctxt "cover page"
msgid "Top Secret"
msgstr "Streng geheim"
-#: modules/printbackends/gtkprintbackendcups.c:5529
+#: modules/printbackends/gtkprintbackendcups.c:5531
msgctxt "cover page"
msgid "Unclassified"
msgstr "Unklassifiziert"
@@ -7205,7 +7939,7 @@ msgstr "Unklassifiziert"
#. Translators, this string is used to label the pages-per-sheet option
#. * in the print dialog
#.
-#: modules/printbackends/gtkprintbackendcups.c:5541
+#: modules/printbackends/gtkprintbackendcups.c:5543
msgctxt "printer option"
msgid "Pages per Sheet"
msgstr "Seiten pro Blatt"
@@ -7213,7 +7947,7 @@ msgstr "Seiten pro Blatt"
#. Translators, this string is used to label the option in the print
#. * dialog that controls in what order multiple pages are arranged
#.
-#: modules/printbackends/gtkprintbackendcups.c:5558
+#: modules/printbackends/gtkprintbackendcups.c:5560
msgctxt "printer option"
msgid "Page Ordering"
msgstr "Reihenfolge"
@@ -7221,7 +7955,7 @@ msgstr "Reihenfolge"
#. Translators, this is the label used for the option in the print
#. * dialog that controls the front cover page.
#.
-#: modules/printbackends/gtkprintbackendcups.c:5600
+#: modules/printbackends/gtkprintbackendcups.c:5602
msgctxt "printer option"
msgid "Before"
msgstr "Vorne"
@@ -7229,7 +7963,7 @@ msgstr "Vorne"
#. Translators, this is the label used for the option in the print
#. * dialog that controls the back cover page.
#.
-#: modules/printbackends/gtkprintbackendcups.c:5615
+#: modules/printbackends/gtkprintbackendcups.c:5617
msgctxt "printer option"
msgid "After"
msgstr "Hinten"
@@ -7238,7 +7972,7 @@ msgstr "Hinten"
#. * a print job is printed. Possible values are 'now', a specified time,
#. * or 'on hold'
#.
-#: modules/printbackends/gtkprintbackendcups.c:5635
+#: modules/printbackends/gtkprintbackendcups.c:5637
msgctxt "printer option"
msgid "Print at"
msgstr "Drucken um"
@@ -7246,7 +7980,7 @@ msgstr "Drucken um"
#. Translators: this is the name of the option that allows the user
#. * to specify a time when a print job will be printed.
#.
-#: modules/printbackends/gtkprintbackendcups.c:5646
+#: modules/printbackends/gtkprintbackendcups.c:5648
msgctxt "printer option"
msgid "Print at time"
msgstr "Drucken zu Uhrzeit"
@@ -7256,19 +7990,19 @@ msgstr "Drucken zu Uhrzeit"
#. * the width and height in points. E.g: "Custom
#. * 230.4x142.9"
#.
-#: modules/printbackends/gtkprintbackendcups.c:5693
+#: modules/printbackends/gtkprintbackendcups.c:5695
#, c-format
msgid "Custom %s×%s"
msgstr "Benutzerdefiniert %s×%s"
#. TRANSLATORS: this is the ICC color profile to use for this job
-#: modules/printbackends/gtkprintbackendcups.c:5804
+#: modules/printbackends/gtkprintbackendcups.c:5806
msgctxt "printer option"
msgid "Printer Profile"
msgstr "Druckerfarbprofil"
#. TRANSLATORS: this is when color profile information is unavailable
-#: modules/printbackends/gtkprintbackendcups.c:5811
+#: modules/printbackends/gtkprintbackendcups.c:5813
msgctxt "printer option value"
msgid "Unavailable"
msgstr "Nicht verfügbar"
@@ -7301,15 +8035,15 @@ msgstr "Datei"
msgid "_Output format"
msgstr "_Ausgabeformat"
-#: modules/printbackends/gtkprintbackendlpr.c:376
+#: modules/printbackends/gtkprintbackendlpr.c:377
msgid "Print to LPR"
msgstr "Drucken mit LPR"
-#: modules/printbackends/gtkprintbackendlpr.c:402
+#: modules/printbackends/gtkprintbackendlpr.c:406
msgid "Pages Per Sheet"
msgstr "Seiten pro Blatt"
-#: modules/printbackends/gtkprintbackendlpr.c:409
+#: modules/printbackends/gtkprintbackendlpr.c:413
msgid "Command Line"
msgstr "Befehlszeile"
@@ -7329,6 +8063,86 @@ msgstr "Kein Profil verfügbar"
msgid "Unspecified profile"
msgstr "Nicht angegebenes Profil"
+#~ msgid "Unable to create a GL pixel format"
+#~ msgstr "GL-Pixelformat kann nicht angelegt werden"
+
+#~ msgid "C_redits"
+#~ msgstr "_Mitwirkende"
+
+#~ msgid "_License"
+#~ msgstr "_Lizenz"
+
+#~ msgctxt "Color name"
+#~ msgid "Scarlet Red"
+#~ msgstr "Scharlachrot"
+
+#~ msgctxt "Color name"
+#~ msgid "Light Butter"
+#~ msgstr "Helle Butter"
+
+#~ msgctxt "Color name"
+#~ msgid "Butter"
+#~ msgstr "Butter"
+
+#~ msgctxt "Color name"
+#~ msgid "Chameleon"
+#~ msgstr "Chamäleon"
+
+#~ msgctxt "Color name"
+#~ msgid "Plum"
+#~ msgstr "Pflaume"
+
+#~ msgctxt "Color name"
+#~ msgid "Light Chocolate"
+#~ msgstr "Helle Schokolade"
+
+#~ msgctxt "Color name"
+#~ msgid "Chocolate"
+#~ msgstr "Schokolade"
+
+#~ msgctxt "Color name"
+#~ msgid "Dark Chocolate"
+#~ msgstr "Dunkle Schokolade"
+
+#~ msgctxt "Color name"
+#~ msgid "Light Aluminum 1"
+#~ msgstr "Helles Aluminium 1"
+
+#~ msgctxt "Color name"
+#~ msgid "Aluminum 1"
+#~ msgstr "Aluminium 1"
+
+#~ msgctxt "Color name"
+#~ msgid "Dark Aluminum 1"
+#~ msgstr "Dunkles Aluminium 1"
+
+#~ msgctxt "Color name"
+#~ msgid "Light Aluminum 2"
+#~ msgstr "Helles Aluminium 2"
+
+#~ msgctxt "Color name"
+#~ msgid "Aluminum 2"
+#~ msgstr "Aluminium 2"
+
+#~ msgctxt "Color name"
+#~ msgid "Dark Aluminum 2"
+#~ msgstr "Dunkles Aluminium 2"
+
+#~ msgctxt "Color name"
+#~ msgid "Darker Gray"
+#~ msgstr "Dunkleres Grau"
+
+#~ msgctxt "Color name"
+#~ msgid "Medium Gray"
+#~ msgstr "Mittleres Grau"
+
+#~ msgctxt "Color name"
+#~ msgid "Lighter Gray"
+#~ msgstr "Helleres Grau"
+
+#~ msgid "Setting is hardcoded by GTK_TEST_TOUCHSCREEN"
+#~ msgstr "Die Einstellung ist fest einprogrammiert durch GTK_TEST_TOUCHSCREEN"
+
#~ msgid "%s"
#~ msgstr "%s"
@@ -7364,18 +8178,6 @@ msgstr "Nicht angegebenes Profil"
#~ msgstr "Schaltet das Feld um"
#~ msgctxt "Action name"
-#~ msgid "Toggle"
-#~ msgstr "Umschalten"
-
-#~ msgctxt "Action name"
-#~ msgid "Click"
-#~ msgstr "Klicken"
-
-#~ msgctxt "Action description"
-#~ msgid "Clicks the button"
-#~ msgstr "Klickt den Knopf an"
-
-#~ msgctxt "Action name"
#~ msgid "Expand or contract"
#~ msgstr "Erweitern oder verkleinern"
@@ -7402,25 +8204,9 @@ msgstr "Nicht angegebenes Profil"
#~ msgstr "Aktiviert das Feld"
#~ msgctxt "Action name"
-#~ msgid "Select"
-#~ msgstr "Auswählen"
-
-#~ msgctxt "Action name"
#~ msgid "Customize"
#~ msgstr "Anpassen"
-#~ msgctxt "Action description"
-#~ msgid "Selects the color"
-#~ msgstr "Farbe auswählen"
-
-#~ msgctxt "Action description"
-#~ msgid "Activates the color"
-#~ msgstr "Aktiviert die Farbe"
-
-#~ msgctxt "Action description"
-#~ msgid "Customizes the color"
-#~ msgstr "Passt die Farbe an"
-
#~ msgctxt "Action name"
#~ msgid "Press"
#~ msgstr "Klicken"
@@ -7429,15 +8215,6 @@ msgstr "Nicht angegebenes Profil"
#~ msgid "Presses the combobox"
#~ msgstr "Klickt das Kombinationsfeld an"
-#~ msgctxt "Action description"
-#~ msgid "Activates the entry"
-#~ msgstr "Eintrag aktivieren"
-
-# expander?
-#~ msgctxt "Action description"
-#~ msgid "Activates the expander"
-#~ msgstr "Aktiviert den Ausklapper"
-
#~ msgctxt "Stock label"
#~ msgid "_About"
#~ msgstr "_Info"
@@ -7611,11 +8388,6 @@ msgstr "Nicht angegebenes Profil"
#~ msgid "_Record"
#~ msgstr "_Aufnahme"
-# CHECK
-#~ msgctxt "Stock label, media"
-#~ msgid "R_ewind"
-#~ msgstr "_Zurückspulen"
-
#~ msgctxt "Stock label, media"
#~ msgid "_Stop"
#~ msgstr "_Stopp"
@@ -7723,10 +8495,6 @@ msgstr "Nicht angegebenes Profil"
#~ msgstr "Ansicht ver_kleinern"
#~ msgctxt "Action description"
-#~ msgid "Clicks the menuitem"
-#~ msgstr "Klickt das Menüelement an"
-
-#~ msgctxt "Action description"
#~ msgid "Pops up the slider"
#~ msgstr "Aktiviert den Schieberegler"
@@ -7742,17 +8510,9 @@ msgstr "Nicht angegebenes Profil"
#~ msgid "Dismiss"
#~ msgstr "Verwerfen"
-#~ msgctxt "throbbing progress animation widget"
-#~ msgid "Spinner"
-#~ msgstr "Spinner"
-
#~ msgid "Provides visual indication of progress"
#~ msgstr "Ermöglicht die visuelle Darstellung des Fortschritts"
-#~ msgctxt "Action description"
-#~ msgid "Toggles the switch"
-#~ msgstr "Schaltet den Schalter um"
-
#~ msgid "Forget association"
#~ msgstr "Zuordnung aufheben"
@@ -7760,24 +8520,12 @@ msgstr "Nicht angegebenes Profil"
#~ msgid "2000"
#~ msgstr "2000"
-#~ msgid "Red %d%%, Green %d%%, Blue %d%%, Alpha %d%%"
-#~ msgstr "Rot %d%%, Grün %d%%, Blau %d%%, Alpha %d%%"
-
-#~ msgid "Red %d%%, Green %d%%, Blue %d%%"
-#~ msgstr "Rot %d%%, Grün %d%%, Blau %d%%"
-
-#~ msgid "Color: %s"
-#~ msgstr "Farbe: %s"
-
#~ msgid "Custom color"
#~ msgstr "Benutzerdefinierte Farbe"
#~ msgid "Create a custom color"
#~ msgstr "Benutzerdefinierte Farbe anlegen"
-#~ msgid "Custom color %d: %s"
-#~ msgstr "Benutzerdefinierte Farbe %d: %s"
-
# Keine Ahnung, ob das hier richtig ist. Laut Quelltext ist es die Beschriftung eines Knopfes und bezieht sich auf den barrierefreien Zugriff. Hier ist der Git-Diff dazu:
# http://mail.gnome.org/archives/commits-list/2012-February/msg00794.html
#~ msgid "Color Plane"
@@ -7896,15 +8644,6 @@ msgstr "Nicht angegebenes Profil"
#~ msgid "Color Name"
#~ msgstr "Farbname"
-#~ msgid "Alpha"
-#~ msgstr "Alpha"
-
-#~ msgid "Hue"
-#~ msgstr "Farbton"
-
-#~ msgid "Saturation"
-#~ msgstr "Sättigung"
-
#~ msgid "Files"
#~ msgstr "Dateien"
@@ -7976,9 +8715,6 @@ msgstr "Nicht angegebenes Profil"
#~ msgid "Focus Widget"
#~ msgstr "Widget fokussieren"
-#~ msgid "Object"
-#~ msgstr "Objekt"
-
#~ msgctxt "type name"
#~ msgid "Unknown"
#~ msgstr "Unbekannt"
diff --git a/po/pl.po b/po/pl.po
index 6b5c216a27..5d5215a45b 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -16,8 +16,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gtk\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-10-22 22:54+0000\n"
-"PO-Revision-Date: 2020-10-25 10:30+0100\n"
+"POT-Creation-Date: 2020-10-30 19:49+0000\n"
+"PO-Revision-Date: 2020-11-01 10:35+0100\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <community-poland@mozilla.org>\n"
"Language: pl\n"
@@ -63,15 +63,15 @@ msgstr "Przeciąganie z innych programów nie jest obsługiwane."
msgid "No compatible formats to transfer contents."
msgstr "Brak zgodnych formatów do przesłania zawartości."
-#: gdk/gdksurface.c:1071
+#: gdk/gdksurface.c:1078
msgid "GL support disabled via GDK_DEBUG"
msgstr "Obsługa GL została wyłączona przez zmienną GDK_DEBUG"
-#: gdk/gdksurface.c:1082
+#: gdk/gdksurface.c:1089
msgid "The current backend does not support OpenGL"
msgstr "Bieżący mechanizm nie obsługuje OpenGL"
-#: gdk/gdksurface.c:1190
+#: gdk/gdksurface.c:1197
msgid "Vulkan support disabled via GDK_DEBUG"
msgstr "Obsługa Vulkan została wyłączona przez zmienną GDK_DEBUG"
@@ -464,25 +464,21 @@ msgstr "Nie odnaleziono zgodnego formatu przesyłania"
msgid "Failed to decode contents with mime-type of '%s'"
msgstr "Dekodowanie treści o typie MIME „%s” się nie powiodło"
-#: gdk/macos/gdkmacosglcontext.c:105
-msgid "Unable to create a GL pixel format"
-msgstr "Nie można utworzyć formatu pikseli GL"
-
-#: gdk/macos/gdkmacosglcontext.c:116 gdk/wayland/gdkglcontext-wayland.c:151
-#: gdk/win32/gdkglcontext-win32.c:947 gdk/win32/gdkglcontext-win32.c:988
-#: gdk/x11/gdkglcontext-x11.c:834 gdk/x11/gdkglcontext-x11.c:884
+#: gdk/wayland/gdkglcontext-wayland.c:151 gdk/win32/gdkglcontext-win32.c:947
+#: gdk/win32/gdkglcontext-win32.c:988 gdk/x11/gdkglcontext-x11.c:581
+#: gdk/x11/gdkglcontext-x11.c:631
msgid "Unable to create a GL context"
msgstr "Nie można utworzyć kontekstu GL"
#: gdk/wayland/gdkglcontext-wayland.c:414
#: gdk/wayland/gdkglcontext-wayland.c:424 gdk/win32/gdkglcontext-win32.c:788
#: gdk/win32/gdkglcontext-win32.c:798 gdk/win32/gdkglcontext-win32.c:913
-#: gdk/x11/gdkglcontext-x11.c:1133
+#: gdk/x11/gdkglcontext-x11.c:879
msgid "No available configurations for the given pixel format"
msgstr "Brak dostępnych konfiguracji dla podanego formatu pikseli"
#: gdk/wayland/gdkglcontext-wayland.c:453 gdk/win32/gdkglcontext-win32.c:1072
-#: gdk/x11/gdkglcontext-x11.c:1436
+#: gdk/x11/gdkglcontext-x11.c:1182
msgid "No GL implementation is available"
msgstr "Brak dostępnej implementacji GL"
@@ -699,7 +695,7 @@ msgstr "Menedżer schowka nie może przechować zaznaczenia."
msgid "Cannot store clipboard. No clipboard manager is active."
msgstr "Nie można przechować schowka. Żaden menedżer schowka nie jest aktywny."
-#: gdk/x11/gdkglcontext-x11.c:1161
+#: gdk/x11/gdkglcontext-x11.c:907
#, c-format
msgid "No available configurations for the given RGBA pixel format"
msgstr "Brak dostępnych konfiguracji dla podanego formatu pikseli RGBA"
@@ -2017,12 +2013,12 @@ msgid "A file with that name already exists"
msgstr "Plik o tej nazwie już istnieje"
#: gtk/gtkfilechoosernative.c:504 gtk/gtkfilechoosernative.c:575
-#: gtk/gtkfilechooserwidget.c:1212 gtk/gtkfilechooserwidget.c:5759
+#: gtk/gtkfilechooserwidget.c:1212 gtk/gtkfilechooserwidget.c:5762
#: gtk/gtkmessagedialog.c:741 gtk/gtkmessagedialog.c:750
#: gtk/gtkmountoperation.c:608 gtk/gtkpagesetupunixdialog.c:283
#: gtk/gtkprintbackend.c:643 gtk/gtkprinteroptionwidget.c:713
#: gtk/gtkprintunixdialog.c:626 gtk/gtkprintunixdialog.c:782
-#: gtk/gtkwindow.c:6668 gtk/inspector/css-editor.c:248
+#: gtk/gtkwindow.c:6678 gtk/inspector/css-editor.c:248
#: gtk/inspector/recorder.c:1200 gtk/ui/gtkappchooserdialog.ui:45
#: gtk/ui/gtkassistant.ui:52 gtk/ui/gtkcolorchooserdialog.ui:33
#: gtk/ui/gtkfontchooserdialog.ui:24
@@ -2114,7 +2110,7 @@ msgid "If you delete an item, it will be permanently lost."
msgstr "Jeśli element zostanie usunięty, to zostanie on bezpowrotnie utracony."
#: gtk/gtkfilechooserwidget.c:1213 gtk/gtkfilechooserwidget.c:1829
-#: gtk/gtklabel.c:5426 gtk/gtktext.c:5988 gtk/gtktextview.c:8572
+#: gtk/gtklabel.c:5429 gtk/gtktext.c:5960 gtk/gtktextview.c:8571
msgid "_Delete"
msgstr "_Usuń"
@@ -2195,7 +2191,7 @@ msgstr "Wyszukiwanie"
msgid "Enter location or URL"
msgstr "Proszę wprowadzić położenie lub adres URL"
-#: gtk/gtkfilechooserwidget.c:3795 gtk/gtkfilechooserwidget.c:6594
+#: gtk/gtkfilechooserwidget.c:3795 gtk/gtkfilechooserwidget.c:6597
#: gtk/ui/gtkfilechooserwidget.ui:225
msgid "Modified"
msgstr "Modyfikacja"
@@ -2294,12 +2290,12 @@ msgstr "Nieznane"
msgid "Home"
msgstr "Katalog domowy"
-#: gtk/gtkfilechooserwidget.c:5752 gtk/gtkprintunixdialog.c:617
+#: gtk/gtkfilechooserwidget.c:5755 gtk/gtkprintunixdialog.c:617
#, c-format
msgid "A file named “%s” already exists. Do you want to replace it?"
msgstr "Plik o nazwie „%s” już istnieje. Zastąpić go?"
-#: gtk/gtkfilechooserwidget.c:5755 gtk/gtkprintunixdialog.c:621
+#: gtk/gtkfilechooserwidget.c:5758 gtk/gtkprintunixdialog.c:621
#, c-format
msgid ""
"The file already exists in “%s”. Replacing it will overwrite its contents."
@@ -2307,19 +2303,19 @@ msgstr ""
"Plik już istnieje w „%s”. Zastąpienie go spowoduje nadpisanie jego "
"zawartości."
-#: gtk/gtkfilechooserwidget.c:5760 gtk/gtkprintunixdialog.c:629
+#: gtk/gtkfilechooserwidget.c:5763 gtk/gtkprintunixdialog.c:629
msgid "_Replace"
msgstr "_Zastąp"
-#: gtk/gtkfilechooserwidget.c:5921
+#: gtk/gtkfilechooserwidget.c:5924
msgid "You do not have access to the specified folder."
msgstr "Brak dostępu do podanego katalogu."
-#: gtk/gtkfilechooserwidget.c:6523
+#: gtk/gtkfilechooserwidget.c:6526
msgid "Could not send the search request"
msgstr "Nie można wysłać żądania wyszukiwania"
-#: gtk/gtkfilechooserwidget.c:6833
+#: gtk/gtkfilechooserwidget.c:6836
msgid "Accessed"
msgstr "Dostęp"
@@ -2388,27 +2384,27 @@ msgstr "Warianty znaku"
msgid "OpenGL context creation failed"
msgstr "Utworzenie kontekstu OpenGL się nie powiodło"
-#: gtk/gtklabel.c:5423 gtk/gtktext.c:5976 gtk/gtktextview.c:8560
+#: gtk/gtklabel.c:5426 gtk/gtktext.c:5948 gtk/gtktextview.c:8559
msgid "Cu_t"
msgstr "_Wytnij"
-#: gtk/gtklabel.c:5424 gtk/gtktext.c:5980 gtk/gtktextview.c:8564
+#: gtk/gtklabel.c:5427 gtk/gtktext.c:5952 gtk/gtktextview.c:8563
msgid "_Copy"
msgstr "S_kopiuj"
-#: gtk/gtklabel.c:5425 gtk/gtktext.c:5984 gtk/gtktextview.c:8568
+#: gtk/gtklabel.c:5428 gtk/gtktext.c:5956 gtk/gtktextview.c:8567
msgid "_Paste"
msgstr "Wk_lej"
-#: gtk/gtklabel.c:5431 gtk/gtktext.c:5997 gtk/gtktextview.c:8593
+#: gtk/gtklabel.c:5434 gtk/gtktext.c:5969 gtk/gtktextview.c:8592
msgid "Select _All"
msgstr "Z_aznacz wszystko"
-#: gtk/gtklabel.c:5436
+#: gtk/gtklabel.c:5439
msgid "_Open Link"
msgstr "_Otwórz odnośnik"
-#: gtk/gtklabel.c:5440
+#: gtk/gtklabel.c:5443
msgid "Copy _Link Address"
msgstr "S_kopiuj adres odnośnika"
@@ -2510,7 +2506,7 @@ msgid "%d:%02d"
msgstr "%d∶%02d"
#: gtk/gtkmessagedialog.c:733 gtk/gtkmessagedialog.c:751
-#: gtk/gtkprintbackend.c:644 gtk/gtkwindow.c:6669
+#: gtk/gtkprintbackend.c:644 gtk/gtkwindow.c:6679
msgid "_OK"
msgstr "_OK"
@@ -2675,19 +2671,19 @@ msgstr ""
msgid "Page Setup"
msgstr "Ustawienia strony"
-#: gtk/gtkpasswordentry.c:162
+#: gtk/gtkpasswordentry.c:165
msgid "Hide text"
msgstr "Ukrywa tekst"
-#: gtk/gtkpasswordentry.c:167 gtk/gtkpasswordentry.c:570
+#: gtk/gtkpasswordentry.c:170 gtk/gtkpasswordentry.c:578
msgid "Show text"
msgstr "Wyświetla tekst"
-#: gtk/gtkpasswordentry.c:194
+#: gtk/gtkpasswordentry.c:197
msgid "Caps Lock is on"
msgstr "Klawisz Caps Lock jest włączony"
-#: gtk/gtkpasswordentry.c:642
+#: gtk/gtkpasswordentry.c:650
msgid "_Show Text"
msgstr "_Wyświetlanie tekstu"
@@ -3123,7 +3119,7 @@ msgstr "Brak papieru"
#. Translators: this is a printer status.
#: gtk/gtkprintoperation-win32.c:638
-#: modules/printbackends/gtkprintbackendcups.c:2603
+#: modules/printbackends/gtkprintbackendcups.c:2607
msgid "Paused"
msgstr "Wstrzymane"
@@ -3191,42 +3187,42 @@ msgstr "Pobieranie informacji o drukarce…"
#. * multiple pages on a sheet when printing
#.
#: gtk/gtkprintunixdialog.c:2773
-#: modules/printbackends/gtkprintbackendcups.c:5461
+#: modules/printbackends/gtkprintbackendcups.c:5465
msgid "Left to right, top to bottom"
msgstr "Od lewej do prawej, z góry do dołu"
#: gtk/gtkprintunixdialog.c:2773
-#: modules/printbackends/gtkprintbackendcups.c:5461
+#: modules/printbackends/gtkprintbackendcups.c:5465
msgid "Left to right, bottom to top"
msgstr "Od lewej do prawej, z dołu na górę"
#: gtk/gtkprintunixdialog.c:2774
-#: modules/printbackends/gtkprintbackendcups.c:5462
+#: modules/printbackends/gtkprintbackendcups.c:5466
msgid "Right to left, top to bottom"
msgstr "Od prawej do lewej, z góry na dół"
#: gtk/gtkprintunixdialog.c:2774
-#: modules/printbackends/gtkprintbackendcups.c:5462
+#: modules/printbackends/gtkprintbackendcups.c:5466
msgid "Right to left, bottom to top"
msgstr "Od prawej do lewej, z dołu na górę"
#: gtk/gtkprintunixdialog.c:2775
-#: modules/printbackends/gtkprintbackendcups.c:5463
+#: modules/printbackends/gtkprintbackendcups.c:5467
msgid "Top to bottom, left to right"
msgstr "Z góry do dołu, od lewej do prawej"
#: gtk/gtkprintunixdialog.c:2775
-#: modules/printbackends/gtkprintbackendcups.c:5463
+#: modules/printbackends/gtkprintbackendcups.c:5467
msgid "Top to bottom, right to left"
msgstr "Z góry do dołu, od prawej do lewej"
#: gtk/gtkprintunixdialog.c:2776
-#: modules/printbackends/gtkprintbackendcups.c:5464
+#: modules/printbackends/gtkprintbackendcups.c:5468
msgid "Bottom to top, left to right"
msgstr "Z dołu do góry, od lewej do prawej"
#: gtk/gtkprintunixdialog.c:2776
-#: modules/printbackends/gtkprintbackendcups.c:5464
+#: modules/printbackends/gtkprintbackendcups.c:5468
msgid "Bottom to top, right to left"
msgstr "Z dołu do góry, od prawej do lewej"
@@ -3275,7 +3271,7 @@ msgstr ""
"Nie odnaleziono zarejestrowanego programu o nazwie „%s” dla elementu "
"o adresie URI „%s”"
-#: gtk/gtksearchentry.c:565
+#: gtk/gtksearchentry.c:574
msgid "Clear entry"
msgstr "Czyści wpis"
@@ -3364,15 +3360,15 @@ msgstr "Proszę spróbować innych słów"
msgid "Could not show link"
msgstr "Nie można wyświetlić odnośnika"
-#: gtk/gtktext.c:6002 gtk/gtktextview.c:8598
+#: gtk/gtktext.c:5974 gtk/gtktextview.c:8597
msgid "Insert _Emoji"
msgstr "Wstaw _emoji"
-#: gtk/gtktextview.c:8580
+#: gtk/gtktextview.c:8579
msgid "_Undo"
msgstr "Cof_nij"
-#: gtk/gtktextview.c:8584
+#: gtk/gtktextview.c:8583
msgid "_Redo"
msgstr "P_onów"
@@ -3395,12 +3391,12 @@ msgctxt "volume percentage"
msgid "%d %%"
msgstr "%d%%"
-#: gtk/gtkwindow.c:6656
+#: gtk/gtkwindow.c:6666
#, c-format
msgid "Do you want to use GTK Inspector?"
msgstr "Użyć Inspektora biblioteki GTK?"
-#: gtk/gtkwindow.c:6658
+#: gtk/gtkwindow.c:6668
#, c-format
msgid ""
"GTK Inspector is an interactive debugger that lets you explore and modify "
@@ -3411,7 +3407,7 @@ msgstr ""
"i modyfikowanie wnętrza programu GTK. Jego użycie może spowodować awarię lub "
"uszkodzenie programu."
-#: gtk/gtkwindow.c:6663
+#: gtk/gtkwindow.c:6673
msgid "Don’t show this message again"
msgstr "Bez wyświetlania ponownie"
@@ -6873,31 +6869,47 @@ msgstr "_Dalej"
msgid "Select a Color"
msgstr "Wybór koloru"
-#: gtk/ui/gtkcoloreditor.ui:43
+#: gtk/ui/gtkcoloreditor.ui:43 gtk/ui/gtkcoloreditor.ui:53
msgid "Pick a color from the screen"
msgstr "Wybiera kolor z ekranu"
-#: gtk/ui/gtkcoloreditor.ui:143
+#: gtk/ui/gtkcoloreditor.ui:80
+msgid "Hexadecimal color or color name"
+msgstr "Kolor szesnastkowy lub nazwa koloru"
+
+#: gtk/ui/gtkcoloreditor.ui:95
+msgid "Hue"
+msgstr "Odcień"
+
+#: gtk/ui/gtkcoloreditor.ui:114
+msgid "Alpha value"
+msgstr "Wartość alfy"
+
+#: gtk/ui/gtkcoloreditor.ui:132
+msgid "Saturation and value"
+msgstr "Nasycenie i wartość"
+
+#: gtk/ui/gtkcoloreditor.ui:156
msgctxt "Color channel"
msgid "A"
msgstr "A"
-#: gtk/ui/gtkcoloreditor.ui:179
+#: gtk/ui/gtkcoloreditor.ui:192
msgctxt "Color channel"
msgid "H"
msgstr "O"
-#: gtk/ui/gtkcoloreditor.ui:216
+#: gtk/ui/gtkcoloreditor.ui:229
msgctxt "Color Channel"
msgid "S"
msgstr "N"
-#: gtk/ui/gtkcoloreditor.ui:225
+#: gtk/ui/gtkcoloreditor.ui:238
msgctxt "Color Channel"
msgid "V"
msgstr "W"
-#: gtk/ui/gtkdropdown.ui:62
+#: gtk/ui/gtkdropdown.ui:64
msgid "Search…"
msgstr "Wyszukiwanie…"
@@ -7293,443 +7305,443 @@ msgstr "Bezczynna"
msgid "Pages per _sheet:"
msgstr "Stron _na kartkę:"
-#: modules/printbackends/gtkprintbackendcups.c:1119
-#: modules/printbackends/gtkprintbackendcups.c:1428
+#: modules/printbackends/gtkprintbackendcups.c:1123
+#: modules/printbackends/gtkprintbackendcups.c:1432
msgid "Username:"
msgstr "Nazwa użytkownika:"
-#: modules/printbackends/gtkprintbackendcups.c:1120
-#: modules/printbackends/gtkprintbackendcups.c:1437
+#: modules/printbackends/gtkprintbackendcups.c:1124
+#: modules/printbackends/gtkprintbackendcups.c:1441
msgid "Password:"
msgstr "Hasło:"
-#: modules/printbackends/gtkprintbackendcups.c:1159
-#: modules/printbackends/gtkprintbackendcups.c:1450
+#: modules/printbackends/gtkprintbackendcups.c:1163
+#: modules/printbackends/gtkprintbackendcups.c:1454
#, c-format
msgid "Authentication is required to print document “%s” on printer %s"
msgstr ""
"Wymagane jest uwierzytelnienie, aby wydrukować dokument „%s” na drukarce %s"
-#: modules/printbackends/gtkprintbackendcups.c:1161
+#: modules/printbackends/gtkprintbackendcups.c:1165
#, c-format
msgid "Authentication is required to print a document on %s"
msgstr "Wymagane jest uwierzytelnienie, aby wydrukować dokument na %s"
-#: modules/printbackends/gtkprintbackendcups.c:1165
+#: modules/printbackends/gtkprintbackendcups.c:1169
#, c-format
msgid "Authentication is required to get attributes of job “%s”"
msgstr "Wymagane jest uwierzytelnienie, aby pobrać atrybuty zadania „%s”"
-#: modules/printbackends/gtkprintbackendcups.c:1167
+#: modules/printbackends/gtkprintbackendcups.c:1171
msgid "Authentication is required to get attributes of a job"
msgstr "Wymagane jest uwierzytelnienie, aby pobrać atrybuty zadania"
-#: modules/printbackends/gtkprintbackendcups.c:1171
+#: modules/printbackends/gtkprintbackendcups.c:1175
#, c-format
msgid "Authentication is required to get attributes of printer %s"
msgstr "Wymagane jest uwierzytelnienie, aby pobrać atrybuty drukarki %s"
-#: modules/printbackends/gtkprintbackendcups.c:1173
+#: modules/printbackends/gtkprintbackendcups.c:1177
msgid "Authentication is required to get attributes of a printer"
msgstr "Wymagane jest uwierzytelnienie, aby pobrać atrybuty drukarki"
-#: modules/printbackends/gtkprintbackendcups.c:1176
+#: modules/printbackends/gtkprintbackendcups.c:1180
#, c-format
msgid "Authentication is required to get default printer of %s"
msgstr "Wymagane jest uwierzytelnienie, aby pobrać domyślną drukarkę z %s"
-#: modules/printbackends/gtkprintbackendcups.c:1179
+#: modules/printbackends/gtkprintbackendcups.c:1183
#, c-format
msgid "Authentication is required to get printers from %s"
msgstr "Wymagane jest uwierzytelnienie, aby pobrać drukarki od %s"
-#: modules/printbackends/gtkprintbackendcups.c:1184
+#: modules/printbackends/gtkprintbackendcups.c:1188
#, c-format
msgid "Authentication is required to get a file from %s"
msgstr "Wymagane jest uwierzytelnienie, aby pobrać plik z %s"
-#: modules/printbackends/gtkprintbackendcups.c:1186
+#: modules/printbackends/gtkprintbackendcups.c:1190
#, c-format
msgid "Authentication is required on %s"
msgstr "Wymagane jest uwierzytelnienie na %s"
-#: modules/printbackends/gtkprintbackendcups.c:1422
+#: modules/printbackends/gtkprintbackendcups.c:1426
msgid "Domain:"
msgstr "Domena:"
-#: modules/printbackends/gtkprintbackendcups.c:1452
+#: modules/printbackends/gtkprintbackendcups.c:1456
#, c-format
msgid "Authentication is required to print document “%s”"
msgstr "Wymagane jest uwierzytelnienie, aby wydrukować dokument „%s”"
-#: modules/printbackends/gtkprintbackendcups.c:1457
+#: modules/printbackends/gtkprintbackendcups.c:1461
#, c-format
msgid "Authentication is required to print this document on printer %s"
msgstr ""
"Wymagane jest uwierzytelnienie, aby wydrukować ten dokument na drukarce %s"
-#: modules/printbackends/gtkprintbackendcups.c:1459
+#: modules/printbackends/gtkprintbackendcups.c:1463
msgid "Authentication is required to print this document"
msgstr "Wymagane jest uwierzytelnienie, aby wydrukować dokument"
-#: modules/printbackends/gtkprintbackendcups.c:2532
+#: modules/printbackends/gtkprintbackendcups.c:2536
#, c-format
msgid "Printer “%s” is low on toner."
msgstr "W drukarce „%s” kończy się toner."
-#: modules/printbackends/gtkprintbackendcups.c:2536
+#: modules/printbackends/gtkprintbackendcups.c:2540
#, c-format
msgid "Printer “%s” has no toner left."
msgstr "W drukarce „%s” skończył się toner."
#. Translators: "Developer" like on photo development context
-#: modules/printbackends/gtkprintbackendcups.c:2541
+#: modules/printbackends/gtkprintbackendcups.c:2545
#, c-format
msgid "Printer “%s” is low on developer."
msgstr "Niski poziom wywoływacza w drukarce „%s”."
#. Translators: "Developer" like on photo development context
-#: modules/printbackends/gtkprintbackendcups.c:2546
+#: modules/printbackends/gtkprintbackendcups.c:2550
#, c-format
msgid "Printer “%s” is out of developer."
msgstr "Brak wywoływacza w drukarce „%s”."
#. Translators: "marker" is one color bin of the printer
-#: modules/printbackends/gtkprintbackendcups.c:2551
+#: modules/printbackends/gtkprintbackendcups.c:2555
#, c-format
msgid "Printer “%s” is low on at least one marker supply."
msgstr "W drukarce „%s” kończy się co najmniej jedna składowa kolorów."
#. Translators: "marker" is one color bin of the printer
-#: modules/printbackends/gtkprintbackendcups.c:2556
+#: modules/printbackends/gtkprintbackendcups.c:2560
#, c-format
msgid "Printer “%s” is out of at least one marker supply."
msgstr "W drukarce „%s” skończyła się co najmniej jedna składowa kolorów."
-#: modules/printbackends/gtkprintbackendcups.c:2560
+#: modules/printbackends/gtkprintbackendcups.c:2564
#, c-format
msgid "The cover is open on printer “%s”."
msgstr "Pokrywa drukarki „%s” jest otwarta."
-#: modules/printbackends/gtkprintbackendcups.c:2564
+#: modules/printbackends/gtkprintbackendcups.c:2568
#, c-format
msgid "The door is open on printer “%s”."
msgstr "Drzwiczki drukarki „%s” są otwarte."
-#: modules/printbackends/gtkprintbackendcups.c:2568
+#: modules/printbackends/gtkprintbackendcups.c:2572
#, c-format
msgid "Printer “%s” is low on paper."
msgstr "W podajniku drukarki „%s” kończy się papier."
-#: modules/printbackends/gtkprintbackendcups.c:2572
+#: modules/printbackends/gtkprintbackendcups.c:2576
#, c-format
msgid "Printer “%s” is out of paper."
msgstr "W podajniku drukarki „%s” skończył się papier."
-#: modules/printbackends/gtkprintbackendcups.c:2576
+#: modules/printbackends/gtkprintbackendcups.c:2580
#, c-format
msgid "Printer “%s” is currently offline."
msgstr "Drukarka „%s” jest obecnie w trybie offline."
-#: modules/printbackends/gtkprintbackendcups.c:2580
+#: modules/printbackends/gtkprintbackendcups.c:2584
#, c-format
msgid "There is a problem on printer “%s”."
msgstr "Wystąpił problem z drukarką „%s”."
#. Translators: this is a printer status.
-#: modules/printbackends/gtkprintbackendcups.c:2600
+#: modules/printbackends/gtkprintbackendcups.c:2604
msgid "Paused; Rejecting Jobs"
msgstr "Wstrzymana, Odrzuca zadania"
#. Translators: this is a printer status.
-#: modules/printbackends/gtkprintbackendcups.c:2606
+#: modules/printbackends/gtkprintbackendcups.c:2610
msgid "Rejecting Jobs"
msgstr "Odrzuca zadania"
#. Translators: this string connects multiple printer states together.
-#: modules/printbackends/gtkprintbackendcups.c:2647
+#: modules/printbackends/gtkprintbackendcups.c:2651
msgid "; "
msgstr ", "
-#: modules/printbackends/gtkprintbackendcups.c:4398
-#: modules/printbackends/gtkprintbackendcups.c:4465
+#: modules/printbackends/gtkprintbackendcups.c:4402
+#: modules/printbackends/gtkprintbackendcups.c:4469
msgctxt "printing option"
msgid "Two Sided"
msgstr "Dwustronne"
-#: modules/printbackends/gtkprintbackendcups.c:4399
+#: modules/printbackends/gtkprintbackendcups.c:4403
msgctxt "printing option"
msgid "Paper Type"
msgstr "Rodzaj papieru"
-#: modules/printbackends/gtkprintbackendcups.c:4400
+#: modules/printbackends/gtkprintbackendcups.c:4404
msgctxt "printing option"
msgid "Paper Source"
msgstr "Źródło papieru"
-#: modules/printbackends/gtkprintbackendcups.c:4401
-#: modules/printbackends/gtkprintbackendcups.c:4466
+#: modules/printbackends/gtkprintbackendcups.c:4405
+#: modules/printbackends/gtkprintbackendcups.c:4470
msgctxt "printing option"
msgid "Output Tray"
msgstr "Tacka wyjściowa"
-#: modules/printbackends/gtkprintbackendcups.c:4402
+#: modules/printbackends/gtkprintbackendcups.c:4406
msgctxt "printing option"
msgid "Resolution"
msgstr "Rozdzielczość"
-#: modules/printbackends/gtkprintbackendcups.c:4403
+#: modules/printbackends/gtkprintbackendcups.c:4407
msgctxt "printing option"
msgid "GhostScript pre-filtering"
msgstr "Wstępne filtrowanie GhostScript"
-#: modules/printbackends/gtkprintbackendcups.c:4412
+#: modules/printbackends/gtkprintbackendcups.c:4416
msgctxt "printing option value"
msgid "One Sided"
msgstr "Jednostronne"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/gtkprintbackendcups.c:4414
+#: modules/printbackends/gtkprintbackendcups.c:4418
msgctxt "printing option value"
msgid "Long Edge (Standard)"
msgstr "Grzbiet wzdłuż dłuższej krawędzi (standard)"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/gtkprintbackendcups.c:4416
+#: modules/printbackends/gtkprintbackendcups.c:4420
msgctxt "printing option value"
msgid "Short Edge (Flip)"
msgstr "Grzbiet wzdłuż krótszej krawędzi (obrót)"
#. Translators: this is an option of "Paper Source"
-#: modules/printbackends/gtkprintbackendcups.c:4418
-#: modules/printbackends/gtkprintbackendcups.c:4420
-#: modules/printbackends/gtkprintbackendcups.c:4428
+#: modules/printbackends/gtkprintbackendcups.c:4422
+#: modules/printbackends/gtkprintbackendcups.c:4424
+#: modules/printbackends/gtkprintbackendcups.c:4432
msgctxt "printing option value"
msgid "Auto Select"
msgstr "Wybór automatyczny"
#. Translators: this is an option of "Paper Source"
#. Translators: this is an option of "Resolution"
-#: modules/printbackends/gtkprintbackendcups.c:4422
-#: modules/printbackends/gtkprintbackendcups.c:4424
#: modules/printbackends/gtkprintbackendcups.c:4426
+#: modules/printbackends/gtkprintbackendcups.c:4428
#: modules/printbackends/gtkprintbackendcups.c:4430
+#: modules/printbackends/gtkprintbackendcups.c:4434
msgctxt "printing option value"
msgid "Printer Default"
msgstr "Domyślne drukarki"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/gtkprintbackendcups.c:4432
+#: modules/printbackends/gtkprintbackendcups.c:4436
msgctxt "printing option value"
msgid "Embed GhostScript fonts only"
msgstr "Osadzanie tylko czcionek GhostScript"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/gtkprintbackendcups.c:4434
+#: modules/printbackends/gtkprintbackendcups.c:4438
msgctxt "printing option value"
msgid "Convert to PS level 1"
msgstr "Konwertowanie do „PS level 1”"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/gtkprintbackendcups.c:4436
+#: modules/printbackends/gtkprintbackendcups.c:4440
msgctxt "printing option value"
msgid "Convert to PS level 2"
msgstr "Konwertowanie do „PS level 2”"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/gtkprintbackendcups.c:4438
+#: modules/printbackends/gtkprintbackendcups.c:4442
msgctxt "printing option value"
msgid "No pre-filtering"
msgstr "Bez wstępnego filtrowania"
#. Translators: "Miscellaneous" is the label for a button, that opens
#. up an extra panel of settings in a print dialog.
-#: modules/printbackends/gtkprintbackendcups.c:4447
+#: modules/printbackends/gtkprintbackendcups.c:4451
msgctxt "printing option group"
msgid "Miscellaneous"
msgstr "Różne"
-#: modules/printbackends/gtkprintbackendcups.c:4474
+#: modules/printbackends/gtkprintbackendcups.c:4478
msgctxt "sides"
msgid "One Sided"
msgstr "Jednostronne"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/gtkprintbackendcups.c:4476
+#: modules/printbackends/gtkprintbackendcups.c:4480
msgctxt "sides"
msgid "Long Edge (Standard)"
msgstr "Grzbiet wzdłuż dłuższej krawędzi (standard)"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/gtkprintbackendcups.c:4478
+#: modules/printbackends/gtkprintbackendcups.c:4482
msgctxt "sides"
msgid "Short Edge (Flip)"
msgstr "Grzbiet wzdłuż krótszej krawędzi (obrót)"
#. Translators: Top output bin
-#: modules/printbackends/gtkprintbackendcups.c:4481
+#: modules/printbackends/gtkprintbackendcups.c:4485
msgctxt "output-bin"
msgid "Top Bin"
msgstr "Górny pojemnik"
#. Translators: Middle output bin
-#: modules/printbackends/gtkprintbackendcups.c:4483
+#: modules/printbackends/gtkprintbackendcups.c:4487
msgctxt "output-bin"
msgid "Middle Bin"
msgstr "Środkowy pojemnik"
#. Translators: Bottom output bin
-#: modules/printbackends/gtkprintbackendcups.c:4485
+#: modules/printbackends/gtkprintbackendcups.c:4489
msgctxt "output-bin"
msgid "Bottom Bin"
msgstr "Dolny pojemnik"
#. Translators: Side output bin
-#: modules/printbackends/gtkprintbackendcups.c:4487
+#: modules/printbackends/gtkprintbackendcups.c:4491
msgctxt "output-bin"
msgid "Side Bin"
msgstr "Boczny pojemnik"
#. Translators: Left output bin
-#: modules/printbackends/gtkprintbackendcups.c:4489
+#: modules/printbackends/gtkprintbackendcups.c:4493
msgctxt "output-bin"
msgid "Left Bin"
msgstr "Lewy pojemnik"
#. Translators: Right output bin
-#: modules/printbackends/gtkprintbackendcups.c:4491
+#: modules/printbackends/gtkprintbackendcups.c:4495
msgctxt "output-bin"
msgid "Right Bin"
msgstr "Prawy pojemnik"
#. Translators: Center output bin
-#: modules/printbackends/gtkprintbackendcups.c:4493
+#: modules/printbackends/gtkprintbackendcups.c:4497
msgctxt "output-bin"
msgid "Center Bin"
msgstr "Centralny pojemnik"
#. Translators: Rear output bin
-#: modules/printbackends/gtkprintbackendcups.c:4495
+#: modules/printbackends/gtkprintbackendcups.c:4499
msgctxt "output-bin"
msgid "Rear Bin"
msgstr "Tylny pojemnik"
#. Translators: Output bin where one sided output is oriented in the face-up position
-#: modules/printbackends/gtkprintbackendcups.c:4497
+#: modules/printbackends/gtkprintbackendcups.c:4501
msgctxt "output-bin"
msgid "Face Up Bin"
msgstr "Pojemnik wierzchem do góry"
#. Translators: Output bin where one sided output is oriented in the face-down position
-#: modules/printbackends/gtkprintbackendcups.c:4499
+#: modules/printbackends/gtkprintbackendcups.c:4503
msgctxt "output-bin"
msgid "Face Down Bin"
msgstr "Pojemnik wierzchem do dołu"
#. Translators: Large capacity output bin
-#: modules/printbackends/gtkprintbackendcups.c:4501
+#: modules/printbackends/gtkprintbackendcups.c:4505
msgctxt "output-bin"
msgid "Large Capacity Bin"
msgstr "Pojemnik o dużej pojemności"
#. Translators: Output stacker number %d
-#: modules/printbackends/gtkprintbackendcups.c:4523
+#: modules/printbackends/gtkprintbackendcups.c:4527
#, c-format
msgctxt "output-bin"
msgid "Stacker %d"
msgstr "%d. stertnik"
#. Translators: Output mailbox number %d
-#: modules/printbackends/gtkprintbackendcups.c:4527
+#: modules/printbackends/gtkprintbackendcups.c:4531
#, c-format
msgctxt "output-bin"
msgid "Mailbox %d"
msgstr "%d. skrzynka pocztowa"
#. Translators: Private mailbox
-#: modules/printbackends/gtkprintbackendcups.c:4531
+#: modules/printbackends/gtkprintbackendcups.c:4535
msgctxt "output-bin"
msgid "My Mailbox"
msgstr "Prywatna skrzynka pocztowa"
#. Translators: Output tray number %d
-#: modules/printbackends/gtkprintbackendcups.c:4535
+#: modules/printbackends/gtkprintbackendcups.c:4539
#, c-format
msgctxt "output-bin"
msgid "Tray %d"
msgstr "%d. tacka"
-#: modules/printbackends/gtkprintbackendcups.c:5012
+#: modules/printbackends/gtkprintbackendcups.c:5016
msgid "Printer Default"
msgstr "Domyślne drukarki"
#. Translators: These strings name the possible values of the
#. * job priority option in the print dialog
#.
-#: modules/printbackends/gtkprintbackendcups.c:5456
+#: modules/printbackends/gtkprintbackendcups.c:5460
msgid "Urgent"
msgstr "Ważne"
-#: modules/printbackends/gtkprintbackendcups.c:5456
+#: modules/printbackends/gtkprintbackendcups.c:5460
msgid "High"
msgstr "Wysoki"
-#: modules/printbackends/gtkprintbackendcups.c:5456
+#: modules/printbackends/gtkprintbackendcups.c:5460
msgid "Medium"
msgstr "Średni"
-#: modules/printbackends/gtkprintbackendcups.c:5456
+#: modules/printbackends/gtkprintbackendcups.c:5460
msgid "Low"
msgstr "Niski"
#. Translators, this string is used to label the job priority option
#. * in the print dialog
#.
-#: modules/printbackends/gtkprintbackendcups.c:5486
+#: modules/printbackends/gtkprintbackendcups.c:5490
msgid "Job Priority"
msgstr "Priorytet"
#. Translators, this string is used to label the billing info entry
#. * in the print dialog
#.
-#: modules/printbackends/gtkprintbackendcups.c:5497
+#: modules/printbackends/gtkprintbackendcups.c:5501
msgid "Billing Info"
msgstr "Informacje o opłatach"
#. Translators, these strings are names for various 'standard' cover
#. * pages that the printing system may support.
#.
-#: modules/printbackends/gtkprintbackendcups.c:5521
+#: modules/printbackends/gtkprintbackendcups.c:5525
msgctxt "cover page"
msgid "None"
msgstr "Brak"
-#: modules/printbackends/gtkprintbackendcups.c:5522
+#: modules/printbackends/gtkprintbackendcups.c:5526
msgctxt "cover page"
msgid "Classified"
msgstr "Niejawne"
-#: modules/printbackends/gtkprintbackendcups.c:5523
+#: modules/printbackends/gtkprintbackendcups.c:5527
msgctxt "cover page"
msgid "Confidential"
msgstr "Poufne"
-#: modules/printbackends/gtkprintbackendcups.c:5524
+#: modules/printbackends/gtkprintbackendcups.c:5528
msgctxt "cover page"
msgid "Secret"
msgstr "Tajne"
-#: modules/printbackends/gtkprintbackendcups.c:5525
+#: modules/printbackends/gtkprintbackendcups.c:5529
msgctxt "cover page"
msgid "Standard"
msgstr "Standardowe"
-#: modules/printbackends/gtkprintbackendcups.c:5526
+#: modules/printbackends/gtkprintbackendcups.c:5530
msgctxt "cover page"
msgid "Top Secret"
msgstr "Ściśle tajne"
-#: modules/printbackends/gtkprintbackendcups.c:5527
+#: modules/printbackends/gtkprintbackendcups.c:5531
msgctxt "cover page"
msgid "Unclassified"
msgstr "Jawne"
@@ -7737,7 +7749,7 @@ msgstr "Jawne"
#. Translators, this string is used to label the pages-per-sheet option
#. * in the print dialog
#.
-#: modules/printbackends/gtkprintbackendcups.c:5539
+#: modules/printbackends/gtkprintbackendcups.c:5543
msgctxt "printer option"
msgid "Pages per Sheet"
msgstr "Stron na kartkę"
@@ -7745,7 +7757,7 @@ msgstr "Stron na kartkę"
#. Translators, this string is used to label the option in the print
#. * dialog that controls in what order multiple pages are arranged
#.
-#: modules/printbackends/gtkprintbackendcups.c:5556
+#: modules/printbackends/gtkprintbackendcups.c:5560
msgctxt "printer option"
msgid "Page Ordering"
msgstr "Kolejność stron"
@@ -7753,7 +7765,7 @@ msgstr "Kolejność stron"
#. Translators, this is the label used for the option in the print
#. * dialog that controls the front cover page.
#.
-#: modules/printbackends/gtkprintbackendcups.c:5598
+#: modules/printbackends/gtkprintbackendcups.c:5602
msgctxt "printer option"
msgid "Before"
msgstr "Przed"
@@ -7761,7 +7773,7 @@ msgstr "Przed"
#. Translators, this is the label used for the option in the print
#. * dialog that controls the back cover page.
#.
-#: modules/printbackends/gtkprintbackendcups.c:5613
+#: modules/printbackends/gtkprintbackendcups.c:5617
msgctxt "printer option"
msgid "After"
msgstr "Po"
@@ -7770,7 +7782,7 @@ msgstr "Po"
#. * a print job is printed. Possible values are 'now', a specified time,
#. * or 'on hold'
#.
-#: modules/printbackends/gtkprintbackendcups.c:5633
+#: modules/printbackends/gtkprintbackendcups.c:5637
msgctxt "printer option"
msgid "Print at"
msgstr "Wydruk o"
@@ -7778,7 +7790,7 @@ msgstr "Wydruk o"
#. Translators: this is the name of the option that allows the user
#. * to specify a time when a print job will be printed.
#.
-#: modules/printbackends/gtkprintbackendcups.c:5644
+#: modules/printbackends/gtkprintbackendcups.c:5648
msgctxt "printer option"
msgid "Print at time"
msgstr "Wydruk o czasie"
@@ -7788,19 +7800,19 @@ msgstr "Wydruk o czasie"
#. * the width and height in points. E.g: "Custom
#. * 230.4x142.9"
#.
-#: modules/printbackends/gtkprintbackendcups.c:5691
+#: modules/printbackends/gtkprintbackendcups.c:5695
#, c-format
msgid "Custom %s×%s"
msgstr "Niestandardowy %s×%s"
#. TRANSLATORS: this is the ICC color profile to use for this job
-#: modules/printbackends/gtkprintbackendcups.c:5802
+#: modules/printbackends/gtkprintbackendcups.c:5806
msgctxt "printer option"
msgid "Printer Profile"
msgstr "Profil drukarki"
#. TRANSLATORS: this is when color profile information is unavailable
-#: modules/printbackends/gtkprintbackendcups.c:5809
+#: modules/printbackends/gtkprintbackendcups.c:5813
msgctxt "printer option value"
msgid "Unavailable"
msgstr "Niedostępny"
diff --git a/testsuite/css/change/meson.build b/testsuite/css/change/meson.build
index 83e37ae2f6..a52fc5348e 100644
--- a/testsuite/css/change/meson.build
+++ b/testsuite/css/change/meson.build
@@ -1,3 +1,12 @@
+changetest_env = environment()
+changetest_env.set('GTK_TEST_ACCESSIBLE', '1')
+changetest_env.set('GSK_RENDERER', 'cairo')
+changetest_env.set('G_TEST_SRCDIR', meson.current_source_dir())
+changetest_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
+changetest_env.set('GIO_USE_VFS', 'local')
+changetest_env.set('GSETTINGS_BACKEND', 'memory')
+changetest_env.set('G_ENABLE_DIAGNOSTIC', '0')
+
testexecdir = join_paths(installed_test_bindir, 'css', 'change')
testdatadir = join_paths(installed_test_datadir, 'css')
@@ -13,7 +22,7 @@ test_change = executable(
test('change', test_change,
args: [ '--tap', '-k' ],
protocol: 'tap',
- env: csstest_env,
+ env: changetest_env,
suite: 'css',
)
diff --git a/testsuite/css/data.c b/testsuite/css/data.c
index 72533fcfb2..978be0e55e 100644
--- a/testsuite/css/data.c
+++ b/testsuite/css/data.c
@@ -58,6 +58,15 @@ Test tests[] = {
{ "charset_base64",
"data:text/plain;charset=ISO-8859-5;base64,wOPh29DdILjW0ePb0OLe0g==",
"text/plain", CONTENTS("Руслан Ижбулатов") },
+ { "wrong_scheme",
+ "duda:,Hello",
+ NULL, NULL, 0 },
+ { "missing_comma",
+ "data:text/plain;charset=ISO-8859-1:bla",
+ NULL, NULL, 0 },
+ { "bad_escape",
+ "data:,abc%00",
+ NULL, NULL, -1 },
};
static void
@@ -70,17 +79,25 @@ test_parse (gconstpointer data)
bytes = gtk_css_data_url_parse (test->url, &mimetype, &error);
- g_assert (bytes != NULL);
- g_assert_no_error (error);
- if (test->mimetype == NULL)
- g_assert (mimetype == NULL);
- else
- g_assert_cmpstr (mimetype, ==, test->mimetype);
-
- g_assert_cmpmem (g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes),
- test->contents, test->contents_len);
+ if (test->contents)
+ {
+ g_assert_nonnull (bytes);
+ g_assert_no_error (error);
+ if (test->mimetype == NULL)
+ g_assert (mimetype == NULL);
+ else
+ g_assert_cmpstr (mimetype, ==, test->mimetype);
- g_bytes_unref (bytes);
+ g_assert_cmpmem (g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes),
+ test->contents, test->contents_len);
+ g_bytes_unref (bytes);
+ }
+ else
+ {
+ g_assert_null (bytes);
+ g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_FILENAME);
+ g_error_free (error);
+ }
}
int
diff --git a/testsuite/css/nodes/meson.build b/testsuite/css/nodes/meson.build
index 11ed48b9e5..313e06a112 100644
--- a/testsuite/css/nodes/meson.build
+++ b/testsuite/css/nodes/meson.build
@@ -1,3 +1,12 @@
+nodetest_env = environment()
+nodetest_env.set('GTK_TEST_ACCESSIBLE', '1')
+nodetest_env.set('GSK_RENDERER', 'cairo')
+nodetest_env.set('G_TEST_SRCDIR', meson.current_source_dir())
+nodetest_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
+nodetest_env.set('GIO_USE_VFS', 'local')
+nodetest_env.set('GSETTINGS_BACKEND', 'memory')
+nodetest_env.set('G_ENABLE_DIAGNOSTIC', '0')
+
testexecdir = join_paths(installed_test_bindir, 'css', 'nodes')
testdatadir = join_paths(installed_test_datadir, 'css')
@@ -9,7 +18,7 @@ test_nodes = executable('test-css-nodes', 'test-css-nodes.c',
test('nodes', test_nodes,
args: [ '--tap', '-k' ],
protocol: 'tap',
- env: csstest_env,
+ env: nodetest_env,
suite: 'css',
)
diff --git a/testsuite/css/parser/cdo-cdc.css b/testsuite/css/parser/cdo-cdc.css
new file mode 100644
index 0000000000..3670c19285
--- /dev/null
+++ b/testsuite/css/parser/cdo-cdc.css
@@ -0,0 +1,7 @@
+<!--
+
+label {
+ color: red;
+}
+
+-->
diff --git a/testsuite/css/parser/cdo-cdc.ref.css b/testsuite/css/parser/cdo-cdc.ref.css
new file mode 100644
index 0000000000..e53c8cfd5c
--- /dev/null
+++ b/testsuite/css/parser/cdo-cdc.ref.css
@@ -0,0 +1,3 @@
+label {
+ color: rgb(255,0,0);
+}
diff --git a/testsuite/css/parser/meson.build b/testsuite/css/parser/meson.build
index 7ffd5d2644..7e501aebda 100644
--- a/testsuite/css/parser/meson.build
+++ b/testsuite/css/parser/meson.build
@@ -197,6 +197,8 @@ test_data = [
'calc.ref.css',
'calc-simple.css',
'calc-simple.ref.css',
+ 'cdo-cdc.css',
+ 'cdo-cdc.ref.css',
'close-at-end-of-file.css',
'close-at-end-of-file.errors',
'close-at-end-of-file.ref.css',
@@ -372,6 +374,8 @@ test_data = [
'not-unclosed.ref.css',
'nth-child.css',
'nth-child.ref.css',
+ 'number-values.css',
+ 'number-values.ref.css',
'opacity.css',
'opacity.ref.css',
'outline-color.css',
@@ -440,6 +444,18 @@ test_data = [
'transition.ref.css',
'transition-timing-function.css',
'transition-timing-function.ref.css',
+ 'url-invalid1.css',
+ 'url-invalid1.errors',
+ 'url-invalid1.ref.css',
+ 'url-invalid2.css',
+ 'url-invalid2.errors',
+ 'url-invalid2.ref.css',
+ 'url-valid1.css',
+ 'url-valid1.ref.css',
+ 'url-valid2.css',
+ 'url-valid2.ref.css',
+ 'url-valid3.css',
+ 'url-valid3.ref.css',
'value-inherit.css',
'value-inherit.ref.css',
'value-inherit.errors',
diff --git a/testsuite/css/parser/url-invalid1.css b/testsuite/css/parser/url-invalid1.css
new file mode 100644
index 0000000000..903f2dc996
--- /dev/null
+++ b/testsuite/css/parser/url-invalid1.css
@@ -0,0 +1,4 @@
+
+label {
+ background-image: url(resource:///org/gtk/libgtk/icons/16x16(/places/user-trash.png);
+}
diff --git a/testsuite/css/parser/url-invalid1.errors b/testsuite/css/parser/url-invalid1.errors
new file mode 100644
index 0000000000..4fe152bf6e
--- /dev/null
+++ b/testsuite/css/parser/url-invalid1.errors
@@ -0,0 +1 @@
+url-invalid1.css:3:21-87: error: GTK_CSS_PARSER_ERROR_SYNTAX
diff --git a/testsuite/css/parser/url-invalid1.ref.css b/testsuite/css/parser/url-invalid1.ref.css
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuite/css/parser/url-invalid1.ref.css
diff --git a/testsuite/css/parser/url-invalid2.css b/testsuite/css/parser/url-invalid2.css
new file mode 100644
index 0000000000..340d29925c
--- /dev/null
+++ b/testsuite/css/parser/url-invalid2.css
@@ -0,0 +1,4 @@
+
+label {
+ background-image: url(resource:///org/gtk/ libgtk/icons/16x16/places/user-trash.png);
+}
diff --git a/testsuite/css/parser/url-invalid2.errors b/testsuite/css/parser/url-invalid2.errors
new file mode 100644
index 0000000000..7978a02772
--- /dev/null
+++ b/testsuite/css/parser/url-invalid2.errors
@@ -0,0 +1 @@
+url-invalid2.css:3:21-87: error: GTK_CSS_PARSER_ERROR_SYNTAX
diff --git a/testsuite/css/parser/url-invalid2.ref.css b/testsuite/css/parser/url-invalid2.ref.css
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuite/css/parser/url-invalid2.ref.css
diff --git a/testsuite/css/parser/url-valid1.css b/testsuite/css/parser/url-valid1.css
new file mode 100644
index 0000000000..c2f1984998
--- /dev/null
+++ b/testsuite/css/parser/url-valid1.css
@@ -0,0 +1,3 @@
+label {
+ background-image: url("resource:///org/gtk/libgtk/icons/16x16/places/user-trash.png");
+}
diff --git a/testsuite/css/parser/url-valid1.ref.css b/testsuite/css/parser/url-valid1.ref.css
new file mode 100644
index 0000000000..e0f30dafeb
--- /dev/null
+++ b/testsuite/css/parser/url-valid1.ref.css
@@ -0,0 +1,3 @@
+label {
+ background-image: none /* FIXME */;
+}
diff --git a/testsuite/css/parser/url-valid2.css b/testsuite/css/parser/url-valid2.css
new file mode 100644
index 0000000000..89f42f16cf
--- /dev/null
+++ b/testsuite/css/parser/url-valid2.css
@@ -0,0 +1,4 @@
+
+label {
+ background-image: url(resource:///org/gtk/libgtk/icons/16x16/places/user-trash.png);
+}
diff --git a/testsuite/css/parser/url-valid2.ref.css b/testsuite/css/parser/url-valid2.ref.css
new file mode 100644
index 0000000000..e0f30dafeb
--- /dev/null
+++ b/testsuite/css/parser/url-valid2.ref.css
@@ -0,0 +1,3 @@
+label {
+ background-image: none /* FIXME */;
+}
diff --git a/testsuite/css/parser/url-valid3.css b/testsuite/css/parser/url-valid3.css
new file mode 100644
index 0000000000..b9add7f7a7
--- /dev/null
+++ b/testsuite/css/parser/url-valid3.css
@@ -0,0 +1,4 @@
+
+label {
+ background-image: url( resource:///\6F rg/gtk/libgtk/icons/16x16/places/user-trash.png );
+}
diff --git a/testsuite/css/parser/url-valid3.ref.css b/testsuite/css/parser/url-valid3.ref.css
new file mode 100644
index 0000000000..e0f30dafeb
--- /dev/null
+++ b/testsuite/css/parser/url-valid3.ref.css
@@ -0,0 +1,3 @@
+label {
+ background-image: none /* FIXME */;
+}
diff --git a/testsuite/css/style/meson.build b/testsuite/css/style/meson.build
index b54adf7c68..a7af27deb3 100644
--- a/testsuite/css/style/meson.build
+++ b/testsuite/css/style/meson.build
@@ -1,3 +1,12 @@
+styletest_env = environment()
+styletest_env.set('GTK_TEST_ACCESSIBLE', '1')
+styletest_env.set('GSK_RENDERER', 'cairo')
+styletest_env.set('G_TEST_SRCDIR', meson.current_source_dir())
+styletest_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
+styletest_env.set('GIO_USE_VFS', 'local')
+styletest_env.set('GSETTINGS_BACKEND', 'memory')
+styletest_env.set('G_ENABLE_DIAGNOSTIC', '0')
+
testexecdir = join_paths(installed_test_bindir, 'css', 'style')
testdatadir = join_paths(installed_test_datadir, 'css')
@@ -19,7 +28,7 @@ test_style = executable(
test('style', test_style,
args: [ '--tap', '-k' ],
protocol: 'tap',
- env: csstest_env,
+ env: styletest_env,
suite: 'css',
)
diff --git a/testsuite/gdk/cursor.c b/testsuite/gdk/cursor.c
new file mode 100644
index 0000000000..546f73bd39
--- /dev/null
+++ b/testsuite/gdk/cursor.c
@@ -0,0 +1,69 @@
+#include <gtk/gtk.h>
+#include <cairo-gobject.h>
+
+static void
+test_cursor_named (void)
+{
+ GdkCursor *cursor;
+
+ cursor = gdk_cursor_new_from_name ("default", NULL);
+
+ g_assert_cmpstr (gdk_cursor_get_name (cursor), ==, "default");
+ g_assert_null (gdk_cursor_get_fallback (cursor));
+ g_assert_cmpint (gdk_cursor_get_hotspot_x (cursor), ==, 0);
+ g_assert_cmpint (gdk_cursor_get_hotspot_y (cursor), ==, 0);
+ g_assert_null (gdk_cursor_get_texture (cursor));
+
+ g_object_unref (cursor);
+}
+
+static void
+test_cursor_texture (void)
+{
+ GdkPixbuf *pixbuf;
+ GdkTexture *texture;
+ GdkCursor *cursor;
+
+ pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 32, 32);
+ texture = gdk_texture_new_for_pixbuf (pixbuf);
+ cursor = gdk_cursor_new_from_texture (texture, 1, 2, NULL);
+
+ g_assert_null (gdk_cursor_get_name (cursor));
+ g_assert_null (gdk_cursor_get_fallback (cursor));
+ g_assert_cmpint (gdk_cursor_get_hotspot_x (cursor), ==, 1);
+ g_assert_cmpint (gdk_cursor_get_hotspot_y (cursor), ==, 2);
+ g_assert_true (gdk_cursor_get_texture (cursor) == texture);
+
+ g_object_unref (cursor);
+ g_object_unref (texture);
+ g_object_unref (pixbuf);
+}
+
+static void
+test_cursor_fallback (void)
+{
+ GdkCursor *fallback;
+ GdkCursor *cursor;
+
+ fallback = gdk_cursor_new_from_name ("default", NULL);
+ cursor = gdk_cursor_new_from_name ("text", fallback);
+
+ g_assert_true (gdk_cursor_get_fallback (cursor) == fallback);
+
+ g_object_unref (cursor);
+ g_object_unref (fallback);
+}
+
+int
+main (int argc, char *argv[])
+{
+ g_test_init (&argc, &argv, NULL);
+
+ gtk_init ();
+
+ g_test_add_func ("/cursor/named", test_cursor_named);
+ g_test_add_func ("/cursor/texture", test_cursor_texture);
+ g_test_add_func ("/cursor/fallback", test_cursor_fallback);
+
+ return g_test_run ();
+}
diff --git a/testsuite/gdk/displaymanager.c b/testsuite/gdk/displaymanager.c
new file mode 100644
index 0000000000..ce7c0d974f
--- /dev/null
+++ b/testsuite/gdk/displaymanager.c
@@ -0,0 +1,55 @@
+#include <gtk/gtk.h>
+
+static void
+test_basic (void)
+{
+ GdkDisplayManager *manager;
+ GdkDisplay *d, *d2;
+ GSList *list;
+
+ manager = gdk_display_manager_get ();
+ g_assert_nonnull (manager);
+
+ d = gdk_display_manager_get_default_display (manager);
+ g_assert_nonnull (d);
+ g_object_get (manager, "default-display", &d2, NULL);
+ g_assert_true (d == d2);
+ g_object_unref (d2);
+
+ list = gdk_display_manager_list_displays (manager);
+ g_assert_nonnull (g_slist_find (list, d));
+ g_slist_free (list);
+}
+
+static void
+test_set_default (void)
+{
+ GdkDisplayManager *manager;
+ GdkDisplay *d, *d2;
+ const char *name;
+
+ manager = gdk_display_manager_get ();
+ g_assert_nonnull (manager);
+
+ d = gdk_display_manager_get_default_display (manager);
+ name = gdk_display_get_name (d);
+ d2 = gdk_display_manager_open_display (manager, name);
+ g_object_set (manager, "default-display", d2, NULL);
+
+ d = gdk_display_manager_get_default_display (manager);
+ g_assert_true (d == d2);
+}
+
+int
+main (int argc, char *argv[])
+{
+ g_test_init (&argc, &argv, NULL);
+
+ /* Open default display */
+ gdk_display_open (NULL);
+
+ g_test_add_func ("/displaymanager/basic", test_basic);
+ g_test_add_func ("/displaymanager/set-default", test_set_default);
+
+ return g_test_run ();
+}
diff --git a/testsuite/gdk/keysyms.c b/testsuite/gdk/keysyms.c
index 217b8a4600..481aafae4c 100644
--- a/testsuite/gdk/keysyms.c
+++ b/testsuite/gdk/keysyms.c
@@ -54,7 +54,77 @@ test_keysyms_xf86 (void)
g_assert_cmpuint (gdk_keyval_from_name ("Display"), ==, GDK_KEY_Display);
}
-int main (int argc, char *argv[])
+#define UNICODE_KEYVAL(wc) ((wc) | 0x01000000)
+
+static void
+test_key_case (void)
+{
+ struct {
+ guint lower;
+ guint upper;
+ } tests[] = {
+ { GDK_KEY_a, GDK_KEY_A },
+ { GDK_KEY_agrave, GDK_KEY_Agrave },
+ { GDK_KEY_thorn, GDK_KEY_Thorn },
+ { GDK_KEY_oslash, GDK_KEY_Oslash },
+ { GDK_KEY_aogonek, GDK_KEY_Aogonek },
+ { GDK_KEY_lstroke, GDK_KEY_Lstroke },
+ { GDK_KEY_scaron, GDK_KEY_Scaron },
+ { GDK_KEY_zcaron, GDK_KEY_Zcaron },
+ { GDK_KEY_racute, GDK_KEY_Racute },
+ { GDK_KEY_hstroke, GDK_KEY_Hstroke },
+ { GDK_KEY_jcircumflex, GDK_KEY_Jcircumflex },
+ { GDK_KEY_cabovedot, GDK_KEY_Cabovedot },
+ { GDK_KEY_rcedilla, GDK_KEY_Rcedilla },
+ { GDK_KEY_eng, GDK_KEY_ENG },
+ { GDK_KEY_amacron, GDK_KEY_Amacron },
+ { GDK_KEY_Serbian_dje, GDK_KEY_Serbian_DJE },
+ { GDK_KEY_Cyrillic_yu, GDK_KEY_Cyrillic_YU },
+ { GDK_KEY_Greek_alphaaccent, GDK_KEY_Greek_ALPHAaccent },
+ { GDK_KEY_Greek_omega, GDK_KEY_Greek_OMEGA },
+ { GDK_KEY_Greek_sigma, GDK_KEY_Greek_SIGMA },
+
+ { GDK_KEY_space, GDK_KEY_space },
+ { GDK_KEY_0, GDK_KEY_0 },
+ { GDK_KEY_KP_0, GDK_KEY_KP_0 },
+
+ /* Face Savouring Delicious Food */
+ { UNICODE_KEYVAL (0x1f60b), UNICODE_KEYVAL (0x1f60b) },
+ };
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (tests); i++)
+ {
+ g_assert_true (gdk_keyval_is_lower (tests[i].lower));
+ g_assert_true (gdk_keyval_is_upper (tests[i].upper));
+ g_assert_cmpuint (gdk_keyval_to_upper (tests[i].lower), ==, tests[i].upper);
+ g_assert_cmpuint (gdk_keyval_to_lower (tests[i].upper), ==, tests[i].lower);
+ }
+}
+
+static void
+test_key_unicode (void)
+{
+ struct {
+ guint key;
+ gunichar ch;
+ } tests[] = {
+ { GDK_KEY_a, 'a' },
+ { GDK_KEY_A, 'A' },
+ { GDK_KEY_EuroSign, 0x20ac },
+ { UNICODE_KEYVAL (0x1f60b), 0x1f60b },
+ };
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (tests); i++)
+ {
+ g_assert_cmpuint (gdk_keyval_to_unicode (tests[i].key), ==, tests[i].ch);
+ g_assert_cmpuint (gdk_unicode_to_keyval (tests[i].ch), ==, tests[i].key);
+ }
+}
+
+int
+main (int argc, char *argv[])
{
setlocale (LC_ALL, "");
@@ -64,6 +134,8 @@ int main (int argc, char *argv[])
g_test_add_func ("/keysyms/basic", test_keysyms_basic);
g_test_add_func ("/keysyms/void", test_keysyms_void);
g_test_add_func ("/keysyms/xf86", test_keysyms_xf86);
+ g_test_add_func ("/keys/case", test_key_case);
+ g_test_add_func ("/keys/unicode", test_key_unicode);
return g_test_run ();
}
diff --git a/testsuite/gdk/meson.build b/testsuite/gdk/meson.build
index aa93f8384d..cc3125de37 100644
--- a/testsuite/gdk/meson.build
+++ b/testsuite/gdk/meson.build
@@ -5,13 +5,16 @@ tests = [
'array',
'cairo',
'clipboard',
+ 'cursor',
'display',
+ 'displaymanager',
'encoding',
'keysyms',
'memorytexture',
'rectangle',
'rgba',
'seat',
+ 'texture',
]
foreach t : tests
diff --git a/testsuite/gdk/rectangle.c b/testsuite/gdk/rectangle.c
index ead270eea7..bf8f9983b3 100644
--- a/testsuite/gdk/rectangle.c
+++ b/testsuite/gdk/rectangle.c
@@ -1,4 +1,5 @@
#include <gtk/gtk.h>
+#include <cairo-gobject.h>
static void
test_rectangle_equal (void)
@@ -65,6 +66,47 @@ test_rectangle_union (void)
g_assert_true (gdk_rectangle_equal (&f, &g));
}
+/* Test that GdkRectangle works as a boxed type */
+
+static void
+test_rectangle_type (void)
+{
+ GValue value = G_VALUE_INIT;
+ GdkRectangle b = { 5, 5, 10, 10 };
+ GdkRectangle *c;
+ GValue value2 = G_VALUE_INIT;
+ cairo_rectangle_int_t *c2;
+
+ g_value_init (&value, GDK_TYPE_RECTANGLE);
+ g_value_set_boxed (&value, &b);
+ c = g_value_get_boxed (&value);
+
+ g_assert_true (gdk_rectangle_equal (&b, c));
+
+ g_assert_true (g_value_type_transformable (GDK_TYPE_RECTANGLE, CAIRO_GOBJECT_TYPE_RECTANGLE_INT));
+ g_value_init (&value2, CAIRO_GOBJECT_TYPE_RECTANGLE_INT);
+ g_assert_true (g_value_transform (&value, &value2));
+ c2 = g_value_get_boxed (&value2);
+ g_assert_cmpint (c->x, ==, c2->x);
+ g_assert_cmpint (c->y, ==, c2->y);
+ g_assert_cmpint (c->width, ==, c2->width);
+ g_assert_cmpint (c->height, ==, c2->height);
+
+ g_value_unset (&value);
+ g_value_unset (&value2);
+}
+
+static void
+test_rectangle_contains (void)
+{
+ GdkRectangle b = { 5, 5, 5, 5 };
+
+ g_assert_true (gdk_rectangle_contains_point (&b, 5, 5));
+ g_assert_true (gdk_rectangle_contains_point (&b, 9, 9));
+ g_assert_false (gdk_rectangle_contains_point (&b, 4, 8));
+ g_assert_false (gdk_rectangle_contains_point (&b, 10, 6));
+}
+
int
main (int argc, char *argv[])
{
@@ -75,6 +117,8 @@ main (int argc, char *argv[])
g_test_add_func ("/rectangle/equal", test_rectangle_equal);
g_test_add_func ("/rectangle/intersect", test_rectangle_intersect);
g_test_add_func ("/rectangle/union", test_rectangle_union);
+ g_test_add_func ("/rectangle/type", test_rectangle_type);
+ g_test_add_func ("/rectangle/contains", test_rectangle_contains);
return g_test_run ();
}
diff --git a/testsuite/gdk/seat.c b/testsuite/gdk/seat.c
index bd98236132..75fd9616fd 100644
--- a/testsuite/gdk/seat.c
+++ b/testsuite/gdk/seat.c
@@ -38,11 +38,12 @@ test_list_seats (void)
static void
test_default_seat (void)
{
- GdkDisplay *display;
+ GdkDisplay *display, *d;
GdkSeat *seat0;
GdkSeatCapabilities caps;
GdkDevice *pointer0, *keyboard0, *device;
- GList *physical_devices, *l;
+ GList *physical_devices, *tools, *l;
+ GdkDeviceTool *tool;
display = gdk_display_get_default ();
seat0 = gdk_display_get_default_seat (display);
@@ -55,9 +56,14 @@ test_default_seat (void)
g_assert_true (GDK_IS_SEAT (seat0));
+ g_assert_true (gdk_seat_get_display (seat0) == display);
+ g_object_get (seat0, "display", &d, NULL);
+ g_assert_true (display == d);
+ g_object_unref (d);
+
caps = gdk_seat_get_capabilities (seat0);
- g_assert (caps != GDK_SEAT_CAPABILITY_NONE);
+ g_assert_true (caps != GDK_SEAT_CAPABILITY_NONE);
pointer0 = gdk_seat_get_pointer (seat0);
physical_devices = gdk_seat_get_devices (seat0, GDK_SEAT_CAPABILITY_POINTER);
@@ -65,15 +71,15 @@ test_default_seat (void)
if ((caps & GDK_SEAT_CAPABILITY_POINTER) != 0)
{
g_assert_nonnull (pointer0);
- g_assert (gdk_device_get_display (pointer0) == display);
- g_assert (gdk_device_get_seat (pointer0) == seat0);
+ g_assert_true (gdk_device_get_display (pointer0) == display);
+ g_assert_true (gdk_device_get_seat (pointer0) == seat0);
g_assert_nonnull (physical_devices);
for (l = physical_devices; l; l = l->next)
{
device = l->data;
- g_assert (gdk_device_get_display (device) == display);
- g_assert (gdk_device_get_seat (device) == seat0);
+ g_assert_true (gdk_device_get_display (device) == display);
+ g_assert_true (gdk_device_get_seat (device) == seat0);
}
g_list_free (physical_devices);
}
@@ -89,17 +95,17 @@ test_default_seat (void)
if ((caps & GDK_SEAT_CAPABILITY_KEYBOARD) != 0)
{
g_assert_nonnull (keyboard0);
- g_assert (gdk_device_get_display (keyboard0) == display);
- g_assert (gdk_device_get_seat (keyboard0) == seat0);
- g_assert (gdk_device_get_source (keyboard0) == GDK_SOURCE_KEYBOARD);
+ g_assert_true (gdk_device_get_display (keyboard0) == display);
+ g_assert_true (gdk_device_get_seat (keyboard0) == seat0);
+ g_assert_true (gdk_device_get_source (keyboard0) == GDK_SOURCE_KEYBOARD);
g_assert_nonnull (physical_devices);
for (l = physical_devices; l; l = l->next)
{
device = l->data;
- g_assert (gdk_device_get_display (device) == display);
- g_assert (gdk_device_get_seat (device) == seat0);
- g_assert (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD);
+ g_assert_true (gdk_device_get_display (device) == display);
+ g_assert_true (gdk_device_get_seat (device) == seat0);
+ g_assert_true (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD);
}
g_list_free (physical_devices);
}
@@ -109,6 +115,13 @@ test_default_seat (void)
g_assert_null (physical_devices);
}
+ tools = gdk_seat_get_tools (seat0);
+ for (l = tools; l; l = l->next)
+ {
+ tool = l->data;
+ g_assert_true (GDK_IS_DEVICE_TOOL (tool));
+ }
+ g_list_free (tools);
}
int
diff --git a/testsuite/gdk/texture.c b/testsuite/gdk/texture.c
new file mode 100644
index 0000000000..fc1f728c7c
--- /dev/null
+++ b/testsuite/gdk/texture.c
@@ -0,0 +1,120 @@
+#include <gtk.h>
+
+static gboolean
+compare_pixels (int width,
+ int height,
+ guchar *data1,
+ gsize stride1,
+ guchar *data2,
+ gsize stride2)
+{
+ int i;
+ for (i = 0; i < height; i++)
+ {
+ gconstpointer p1 = data1 + i * stride1;
+ gconstpointer p2 = data2 + i * stride2;
+ if (memcmp (p1, p2, width * 4) != 0)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void
+test_texture_from_pixbuf (void)
+{
+ GdkPixbuf *pixbuf;
+ GdkTexture *texture;
+ GError *error = NULL;
+ guchar *data;
+ int width, height;
+ gsize stride;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+
+ pixbuf = gdk_pixbuf_new_from_resource ("/org/gtk/libgtk/icons/16x16/places/user-trash.png", &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (pixbuf);
+ g_assert_true (gdk_pixbuf_get_has_alpha (pixbuf));
+
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+
+ texture = gdk_texture_new_for_pixbuf (pixbuf);
+
+ g_assert_nonnull (texture);
+ g_assert_cmpint (gdk_texture_get_width (texture), ==, width);
+ g_assert_cmpint (gdk_texture_get_height (texture), ==, height);
+
+ stride = 4 * width;
+ data = g_new0 (guchar, stride * height);
+ gdk_texture_download (texture, data, stride);
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+ cr = cairo_create (surface);
+ gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
+ cairo_paint (cr);
+ cairo_destroy (cr);
+
+ g_assert_true (compare_pixels (width, height,
+ data, stride,
+ cairo_image_surface_get_data (surface),
+ cairo_image_surface_get_stride (surface)));
+
+ g_free (data);
+
+ g_object_unref (pixbuf);
+ g_object_unref (texture);
+ cairo_surface_destroy (surface);
+}
+
+static void
+test_texture_from_resource (void)
+{
+ GdkTexture *texture;
+ int width, height;
+
+ texture = gdk_texture_new_from_resource ("/org/gtk/libgtk/icons/16x16/places/user-trash.png");
+
+ g_assert_nonnull (texture);
+ g_object_get (texture,
+ "width", &width,
+ "height", &height,
+ NULL);
+ g_assert_cmpint (width, ==, 16);
+ g_assert_cmpint (height, ==, 16);
+
+ g_object_unref (texture);
+}
+
+static void
+test_texture_save_to_png (void)
+{
+ GdkTexture *texture;
+ GError *error = NULL;
+ GFile *file;
+ GdkTexture *texture2;
+
+ texture = gdk_texture_new_from_resource ("/org/gtk/libgtk/icons/16x16/places/user-trash.png");
+
+ gdk_texture_save_to_png (texture, "test.png");
+ file = g_file_new_for_path ("test.png");
+ texture2 = gdk_texture_new_from_file (file, &error);
+ g_object_unref (file);
+ g_assert_no_error (error);
+
+ g_object_unref (texture);
+ g_object_unref (texture2);
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* We want to use resources from libgtk, so we need gtk initialized */
+ gtk_test_init (&argc, &argv, NULL);
+
+ g_test_add_func ("/texture/from-pixbuf", test_texture_from_pixbuf);
+ g_test_add_func ("/texture/from-resource", test_texture_from_resource);
+ g_test_add_func ("/texture/save-to-png", test_texture_save_to_png);
+
+ return g_test_run ();
+}
diff --git a/testsuite/gtk/expression.c b/testsuite/gtk/expression.c
index a874e562a4..cea66f3ae9 100644
--- a/testsuite/gtk/expression.c
+++ b/testsuite/gtk/expression.c
@@ -61,6 +61,16 @@ test_property (void)
g_object_unref (filter);
}
+static void
+test_interface_property (void)
+{
+ GtkExpression *expr;
+
+ expr = gtk_property_expression_new (GTK_TYPE_ORIENTABLE, NULL, "orientation");
+ g_assert_cmpstr (gtk_property_expression_get_pspec (expr)->name, ==, "orientation");
+ gtk_expression_unref (expr);
+}
+
static char *
print_filter_info (GtkStringFilter *filter,
const char *search,
@@ -75,7 +85,7 @@ print_filter_info (GtkStringFilter *filter,
}
static void
-test_closure (void)
+test_cclosure (void)
{
GValue value = G_VALUE_INIT;
GtkExpression *expr, *pexpr[3];
@@ -127,11 +137,34 @@ test_closure (void)
g_object_unref (filter);
}
+static char *
+make_string (void)
+{
+ return g_strdup ("Hello");
+}
+
+static void
+test_closure (void)
+{
+ GValue value = G_VALUE_INIT;
+ GtkExpression *expr;
+ GClosure *closure;
+
+ closure = g_cclosure_new (G_CALLBACK (make_string), NULL, NULL);
+ expr = gtk_closure_expression_new (G_TYPE_STRING, closure, 0, NULL);
+ g_assert (gtk_expression_evaluate (expr, NULL, &value));
+ g_assert_cmpstr (g_value_get_string (&value), ==, "Hello");
+ g_value_unset (&value);
+
+ gtk_expression_unref (expr);
+}
+
static void
test_constant (void)
{
GtkExpression *expr;
GValue value = G_VALUE_INIT;
+ const GValue *v;
gboolean res;
expr = gtk_constant_expression_new (G_TYPE_INT, 22);
@@ -142,6 +175,9 @@ test_constant (void)
g_assert_true (res);
g_assert_cmpint (g_value_get_int (&value), ==, 22);
+ v = gtk_constant_expression_get_value (expr);
+ g_assert_cmpint (g_value_get_int (v), ==, 22);
+
gtk_expression_unref (expr);
}
@@ -155,6 +191,7 @@ test_object (void)
GObject *obj;
GValue value = G_VALUE_INIT;
gboolean res;
+ GObject *o;
obj = G_OBJECT (gtk_string_filter_new (NULL));
@@ -167,6 +204,9 @@ test_object (void)
g_assert_true (g_value_get_object (&value) == obj);
g_value_unset (&value);
+ o = gtk_object_expression_get_object (expr);
+ g_assert_true (o == obj);
+
g_clear_object (&obj);
res = gtk_expression_evaluate (expr, NULL, &value);
g_assert_false (res);
@@ -650,6 +690,9 @@ test_binds (void)
expr2 = gtk_property_expression_new (GTK_TYPE_STRING_FILTER, gtk_expression_ref (filter2_expr), "ignore-case");
+ g_assert_true (gtk_property_expression_get_expression (expr2) == filter2_expr);
+ g_assert_cmpstr (gtk_property_expression_get_pspec (expr2)->name, ==, "ignore-case");
+
gtk_expression_bind (gtk_expression_ref (expr), filter3, "search", NULL);
gtk_expression_bind (gtk_expression_ref (expr2), filter3, "ignore-case", NULL);
@@ -704,6 +747,28 @@ test_bind_object (void)
g_object_unref (model);
}
+static void
+test_value (void)
+{
+ GValue value = G_VALUE_INIT;
+ GtkExpression *expr;
+
+ expr = gtk_constant_expression_new (G_TYPE_INT, 22);
+
+ g_value_init (&value, GTK_TYPE_EXPRESSION);
+ gtk_value_take_expression (&value, expr);
+ g_assert_true (G_VALUE_TYPE (&value) == GTK_TYPE_EXPRESSION);
+
+ expr = gtk_value_dup_expression (&value);
+ gtk_expression_unref (expr);
+
+ expr = gtk_constant_expression_new (G_TYPE_INT, 23);
+ gtk_value_set_expression (&value, expr);
+ gtk_expression_unref (expr);
+
+ g_value_unset (&value);
+}
+
int
main (int argc, char *argv[])
{
@@ -711,6 +776,8 @@ main (int argc, char *argv[])
setlocale (LC_ALL, "C");
g_test_add_func ("/expression/property", test_property);
+ g_test_add_func ("/expression/interface-property", test_interface_property);
+ g_test_add_func ("/expression/cclosure", test_cclosure);
g_test_add_func ("/expression/closure", test_closure);
g_test_add_func ("/expression/constant", test_constant);
g_test_add_func ("/expression/constant-watch-this-destroyed", test_constant_watch_this_destroyed);
@@ -726,6 +793,7 @@ main (int argc, char *argv[])
g_test_add_func ("/expression/double-bind", test_double_bind);
g_test_add_func ("/expression/binds", test_binds);
g_test_add_func ("/expression/bind-object", test_bind_object);
+ g_test_add_func ("/expression/value", test_value);
return g_test_run ();
}
diff --git a/testsuite/gtk/filter.c b/testsuite/gtk/filter.c
index b16c5c4321..d6fb3fdb0e 100644
--- a/testsuite/gtk/filter.c
+++ b/testsuite/gtk/filter.c
@@ -219,6 +219,7 @@ test_any_simple (void)
{
GtkFilterListModel *model;
GtkFilter *any, *filter1, *filter2;
+ gpointer item;
any = GTK_FILTER (gtk_any_filter_new ());
filter1 = GTK_FILTER (gtk_custom_filter_new (divisible_by, GUINT_TO_POINTER (3), NULL));
@@ -233,6 +234,12 @@ test_any_simple (void)
gtk_multi_filter_append (GTK_MULTI_FILTER (any), filter2);
assert_model (model, "3 5 6 9 10 12 15 18 20");
+ g_assert_true (g_list_model_get_item_type (G_LIST_MODEL (any)) == GTK_TYPE_FILTER);
+ g_assert_cmpuint (2, ==, g_list_model_get_n_items (G_LIST_MODEL (any)));
+ item = g_list_model_get_item (G_LIST_MODEL (any), 1);
+ g_assert_true (GTK_FILTER (item) == filter2);
+ g_object_unref (item);
+
gtk_multi_filter_remove (GTK_MULTI_FILTER (any), 0);
assert_model (model, "5 10 15 20");
@@ -275,13 +282,15 @@ test_string_properties (void)
{
GtkFilterListModel *model;
GtkFilter *filter;
+ GtkExpression *expr;
- filter = GTK_FILTER (gtk_string_filter_new (
- gtk_cclosure_expression_new (G_TYPE_STRING,
- NULL,
- 0, NULL,
- G_CALLBACK (get_spelled_out),
- NULL, NULL)));
+ expr = gtk_cclosure_expression_new (G_TYPE_STRING,
+ NULL,
+ 0, NULL,
+ G_CALLBACK (get_spelled_out),
+ NULL, NULL);
+ filter = GTK_FILTER (gtk_string_filter_new (expr));
+ g_assert_true (expr == gtk_string_filter_get_expression (GTK_STRING_FILTER (filter)));
model = new_model (1000, filter);
gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "thirte");
@@ -296,12 +305,18 @@ test_string_properties (void)
gtk_string_filter_set_search (GTK_STRING_FILTER (filter), "Thirteen");
assert_model (model, "13");
+ gtk_string_filter_set_match_mode (GTK_STRING_FILTER (filter), GTK_STRING_FILTER_MATCH_MODE_PREFIX);
+ assert_model (model, "13");
+
gtk_string_filter_set_match_mode (GTK_STRING_FILTER (filter), GTK_STRING_FILTER_MATCH_MODE_EXACT);
assert_model (model, "13");
gtk_string_filter_set_ignore_case (GTK_STRING_FILTER (filter), TRUE);
assert_model (model, "13");
+ gtk_string_filter_set_match_mode (GTK_STRING_FILTER (filter), GTK_STRING_FILTER_MATCH_MODE_PREFIX);
+ assert_model (model, "13");
+
gtk_string_filter_set_match_mode (GTK_STRING_FILTER (filter), GTK_STRING_FILTER_MATCH_MODE_SUBSTRING);
assert_model (model, "13 113 213 313 413 513 613 713 813 913");
@@ -326,9 +341,11 @@ test_bool_simple (void)
assert_model (model, "3 6 9 12 15 18");
gtk_bool_filter_set_invert (GTK_BOOL_FILTER (filter), TRUE);
+ g_assert_true (gtk_bool_filter_get_invert (GTK_BOOL_FILTER (filter)));
assert_model (model, "1 2 4 5 7 8 10 11 13 14 16 17 19 20");
gtk_bool_filter_set_invert (GTK_BOOL_FILTER (filter), FALSE);
+ g_assert_false (gtk_bool_filter_get_invert (GTK_BOOL_FILTER (filter)));
assert_model (model, "3 6 9 12 15 18");
expr = gtk_cclosure_expression_new (G_TYPE_BOOLEAN,
@@ -337,6 +354,7 @@ test_bool_simple (void)
G_CALLBACK (divisible_by),
GUINT_TO_POINTER (5), NULL);
gtk_bool_filter_set_expression (GTK_BOOL_FILTER (filter), expr);
+ g_assert_true (expr == gtk_bool_filter_get_expression (GTK_BOOL_FILTER (filter)));
gtk_expression_unref (expr);
assert_model (model, "5 10 15 20");
diff --git a/testsuite/gtk/main.c b/testsuite/gtk/main.c
index 20a3c63083..d1d3e6ee1b 100644
--- a/testsuite/gtk/main.c
+++ b/testsuite/gtk/main.c
@@ -9,6 +9,21 @@ test_init (void)
g_assert (gtk_is_initialized () == TRUE);
}
+static void
+test_version (void)
+{
+ g_assert_cmpuint (gtk_get_major_version (), ==, GTK_MAJOR_VERSION);
+ g_assert_cmpuint (gtk_get_minor_version (), ==, GTK_MINOR_VERSION);
+ g_assert_cmpuint (gtk_get_micro_version (), ==, GTK_MICRO_VERSION);
+ g_assert_cmpuint (gtk_get_binary_age (), ==, GTK_BINARY_AGE);
+ g_assert_cmpuint (gtk_get_interface_age (), ==, GTK_INTERFACE_AGE);
+
+ g_assert_null (gtk_check_version (GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION));
+ g_assert_nonnull (gtk_check_version (5, 0, 0));
+ g_assert_nonnull (gtk_check_version (1, 0, 0));
+ g_assert_nonnull (gtk_check_version (3, 1000, 10));
+}
+
int
main (int argc, char *argv[])
{
@@ -18,6 +33,7 @@ main (int argc, char *argv[])
setlocale (LC_ALL, "C");
g_test_add_func ("/main/init", test_init);
+ g_test_add_func ("/main/version", test_version);
return g_test_run ();
}
diff --git a/testsuite/gtk/sorter.c b/testsuite/gtk/sorter.c
index ad6d94ebbb..6822c9ad08 100644
--- a/testsuite/gtk/sorter.c
+++ b/testsuite/gtk/sorter.c
@@ -405,6 +405,7 @@ test_multi (void)
GtkSorter *sorter1;
GtkSorter *sorter2;
GtkExpression *expression;
+ gpointer item;
model = new_model (20, NULL);
assert_not_model (model, "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20");
@@ -424,6 +425,12 @@ test_multi (void)
gtk_multi_sorter_append (GTK_MULTI_SORTER (sorter), sorter1);
gtk_multi_sorter_append (GTK_MULTI_SORTER (sorter), sorter2);
+ g_assert_true (GTK_TYPE_SORTER == g_list_model_get_item_type (G_LIST_MODEL (sorter)));
+ g_assert_cmpuint (2, ==, g_list_model_get_n_items (G_LIST_MODEL (sorter)));
+ item = g_list_model_get_item (G_LIST_MODEL (sorter), 1);
+ g_assert_true (item == sorter2);
+ g_object_unref (item);
+
assert_model (model, "2 4 6 8 10 12 14 16 18 20 1 3 5 7 9 11 13 15 17 19");
/* This doesn't do anything */
diff --git a/testsuite/gtk/stringlist.c b/testsuite/gtk/stringlist.c
index 12169be13e..63a1f6def4 100644
--- a/testsuite/gtk/stringlist.c
+++ b/testsuite/gtk/stringlist.c
@@ -110,12 +110,24 @@ new_model (const char **strings)
}
static void
+test_string_object (void)
+{
+ GtkStringObject *so;
+
+ so = gtk_string_object_new ("Hello");
+ g_assert_cmpstr (gtk_string_object_get_string (so), ==, "Hello");
+ g_object_unref (so);
+}
+
+static void
test_create_empty (void)
{
GtkStringList *list;
list = new_model ((const char *[]){ NULL });
+ g_assert_true (g_type_is_a (g_list_model_get_item_type (G_LIST_MODEL (list)), G_TYPE_OBJECT));
+
assert_model (list, "");
assert_changes (list, "");
@@ -237,6 +249,7 @@ main (int argc, char *argv[])
changes_quark = g_quark_from_static_string ("What did I see? Can I believe what I saw?");
+ g_test_add_func ("/stringobject/basic", test_string_object);
g_test_add_func ("/stringlist/create/empty", test_create_empty);
g_test_add_func ("/stringlist/create/strv", test_create_strv);
g_test_add_func ("/stringlist/create/builder", test_create_builder);
diff --git a/testsuite/gtk/ui/constraints.expected b/testsuite/gtk/ui/constraints.expected
new file mode 100644
index 0000000000..ff43ca4091
--- /dev/null
+++ b/testsuite/gtk/ui/constraints.expected
@@ -0,0 +1 @@
+SUCCESS
diff --git a/testsuite/gtk/ui/constraints.ui b/testsuite/gtk/ui/constraints.ui
new file mode 100644
index 0000000000..9dadad61e1
--- /dev/null
+++ b/testsuite/gtk/ui/constraints.ui
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <object class="GtkWindow" id="window1">
+ <property name="title" translatable="yes">Constraints</property>
+ <child>
+ <object class="GtkBox">
+ <property name="layout-manager">
+ <object class="GtkConstraintLayout">
+ <constraints>
+ <guide name="space"
+ min-width="10" min-height="10"
+ nat-width="100" nat-height="10"
+ max-width="200" max-height="20"
+ strength="strong"/>
+ <constraint target="button1" target-attribute="width"
+ relation="le"
+ constant="200"
+ multiplier="2.5"
+ strength="required"/>
+ <constraint target="super" target-attribute="start"
+ relation="eq"
+ source="button1" source-attribute="start"
+ constant="-8"
+ multiplier="100"
+ strength="strong"/>
+ <constraint target="button1" target-attribute="width"
+ relation="eq"
+ source="button2" source-attribute="left"
+ strength="medium"/>
+ <constraint target="button1" target-attribute="end"
+ relation="eq"
+ source="space" source-attribute="right"
+ strength="weak"/>
+ <constraint target="space" target-attribute="end"
+ relation="eq"
+ source="button2" source-attribute="center-x"
+ strength="required"/>
+ <constraint target="super" target-attribute="center-y"
+ relation="eq"
+ source="button2" source-attribute="baseline"
+ constant="8"
+ strength="required"/>
+ <constraint target="super" target-attribute="start"
+ relation="eq"
+ source="button3" source-attribute="start"
+ constant="-8"
+ strength="required"/>
+ <constraint target="super" target-attribute="end"
+ relation="eq"
+ source="button3" source-attribute="end"
+ constant="8"
+ strength="required"/>
+ <constraint target="super" target-attribute="top"
+ relation="eq"
+ source="button1" source-attribute="top"
+ constant="-8"
+ strength="required"/>
+ <constraint target="super" target-attribute="top"
+ relation="eq"
+ source="button2" source-attribute="top"
+ constant="-8"
+ strength="required"/>
+ <constraint target="button1" target-attribute="bottom"
+ relation="eq"
+ source="button3" source-attribute="top"
+ constant="-12"
+ strength="required"/>
+ <constraint target="button2" target-attribute="bottom"
+ relation="eq"
+ source="button3" source-attribute="top"
+ constant="-12"
+ strength="required"/>
+ <constraint target="button3" target-attribute="height"
+ relation="eq"
+ source="button1" source-attribute="height"
+ strength="required"/>
+ <constraint target="button3" target-attribute="height"
+ relation="eq"
+ source="button2" source-attribute="height"
+ strength="required"/>
+ <constraint target="super" target-attribute="bottom"
+ relation="eq"
+ source="button3" source-attribute="bottom"
+ constant="8"
+ strength="required"/>
+ </constraints>
+ </object>
+ </property>
+ <child>
+ <object class="GtkButton" id="button1">
+ <property name="label">Child 1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button2">
+ <property name="label">Child 2</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button3">
+ <property name="label">Child 3</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/testsuite/tools/meson.build b/testsuite/tools/meson.build
index 1369ccfedc..54b9312e7a 100644
--- a/testsuite/tools/meson.build
+++ b/testsuite/tools/meson.build
@@ -5,7 +5,7 @@ bash = find_program('bash', required : false)
if bash.found()
test_env = environment()
- foreach t : ['simplify', 'simplify-3to4', 'settings']
+ foreach t : ['simplify', 'simplify-3to4', 'validate', 'settings']
if get_option('install-tests')
configure_file(output: t,
input: '@0@.in'.format(t),
@@ -44,4 +44,5 @@ if get_option('install-tests')
install_subdir('simplify-data', install_dir: testexecdir)
install_subdir('simplify-data-3to4', install_dir: testexecdir)
+ install_subdir('validate-data', install_dir: testexecdir)
endif
diff --git a/testsuite/tools/simplify-3to4.in b/testsuite/tools/simplify-3to4.in
index 31d7da0970..35b8a8272f 100755
--- a/testsuite/tools/simplify-3to4.in
+++ b/testsuite/tools/simplify-3to4.in
@@ -7,13 +7,14 @@ TEST_RESULT_DIR=${TEST_RESULT_DIR:-/tmp}
shopt -s nullglob
TESTS=( "$TEST_DATA_DIR"/*.ui )
-echo "1..${#TESTS[*]}"
+echo "1..$((2 * ${#TESTS[*]}))"
I=1
for t in ${TESTS[*]}; do
name=$(basename $t .ui)
expected="$TEST_DATA_DIR/$name.expected"
result="$TEST_RESULT_DIR/$name.out"
+ result2="$TEST_RESULT_DIR/$name.out2"
diff="$TEST_RESULT_DIR/$name.diff"
ref="$TEST_RESULT_DIR/$name.ref"
@@ -28,4 +29,17 @@ for t in ${TESTS[*]}; do
fi
I=$((I+1))
+
+ cp $t $result2
+ $GTK_BUILDER_TOOL simplify --3to4 --replace $result2 2>/dev/null
+
+ if diff -u "$expected" "$result2" > "$diff"; then
+ echo "ok $I $name (--replace)"
+ rm "$diff"
+ else
+ echo "not ok $I $name (--replace)"
+ cp "$expected" "$ref"
+ fi
+
+ I=$((I+1))
done
diff --git a/testsuite/tools/simplify-data-3to4/actionbar.expected b/testsuite/tools/simplify-data-3to4/actionbar.expected
new file mode 100644
index 0000000000..a063c7f2b6
--- /dev/null
+++ b/testsuite/tools/simplify-data-3to4/actionbar.expected
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkActionBar">
+ <property name="visible">0</property>
+ <child type="start">
+ <object class="GtkButton" id="button">
+ <property name="visible">0</property>
+ <property name="icon-name">document-new</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/testsuite/tools/simplify-data-3to4/actionbar.ui b/testsuite/tools/simplify-data-3to4/actionbar.ui
new file mode 100644
index 0000000000..efae5962d9
--- /dev/null
+++ b/testsuite/tools/simplify-data-3to4/actionbar.ui
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkActionBar">
+ <child>
+ <object class="GtkButton" id="button">
+ <property name="icon-name">document-new</property>
+ </object>
+ <packing>
+ <property name="pack-type">start</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/testsuite/tools/simplify-data-3to4/fixed.expected b/testsuite/tools/simplify-data-3to4/fixed.expected
new file mode 100644
index 0000000000..74953b12c6
--- /dev/null
+++ b/testsuite/tools/simplify-data-3to4/fixed.expected
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkFixed">
+ <child>
+ <object class="GtkButton" id="button">
+ <layout>
+ <property name="transform">translate(10, 15)</property>
+ </layout>
+ <property name="visible">0</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/testsuite/tools/simplify-data-3to4/fixed.ui b/testsuite/tools/simplify-data-3to4/fixed.ui
new file mode 100644
index 0000000000..699bea2e07
--- /dev/null
+++ b/testsuite/tools/simplify-data-3to4/fixed.ui
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.2 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkFixed">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkButton" id="button">
+ </object>
+ <packing>
+ <property name="x">10</property>
+ <property name="y">15</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/testsuite/tools/simplify-data-3to4/headerbar.expected b/testsuite/tools/simplify-data-3to4/headerbar.expected
index aa7351fc06..5b642b28d8 100644
--- a/testsuite/tools/simplify-data-3to4/headerbar.expected
+++ b/testsuite/tools/simplify-data-3to4/headerbar.expected
@@ -4,6 +4,11 @@
<child type="titlebar">
<object class="GtkHeaderBar" id="headerbar1">
<property name="title-widget">box1</property>
+ <child type="end">
+ <object class="GtkButton">
+ <property name="label">A!</property>
+ </object>
+ </child>
</object>
</child>
</object>
diff --git a/testsuite/tools/simplify-data-3to4/headerbar.ui b/testsuite/tools/simplify-data-3to4/headerbar.ui
index 9ad70329d7..c12d3d9ed1 100644
--- a/testsuite/tools/simplify-data-3to4/headerbar.ui
+++ b/testsuite/tools/simplify-data-3to4/headerbar.ui
@@ -7,6 +7,15 @@
<property name="visible">True</property>
<property name="show-close-button">True</property>
<property name="custom-title">box1</property>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">True</property>
+ <property name="label">A!</property>
+ </object>
+ <packing>
+ <property name="pack-type">end</property>
+ </packing>
+ </child>
</object>
</child>
</object>
diff --git a/testsuite/tools/simplify-data-3to4/overlay.expected b/testsuite/tools/simplify-data-3to4/overlay.expected
new file mode 100644
index 0000000000..67e6ccade1
--- /dev/null
+++ b/testsuite/tools/simplify-data-3to4/overlay.expected
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkOverlay">
+ <child type="overlay">
+ <object class="GtkButton" id="button">
+ <property name="can-target">0</property>
+ <property name="icon-name">document-new</property>
+ </object>
+ </child>
+ <property name="child">
+ <object class="GtkLabel" id="label">
+ <property name="visible">0</property>
+ </object>
+ </property>
+ </object>
+</interface>
diff --git a/testsuite/tools/simplify-data-3to4/overlay.ui b/testsuite/tools/simplify-data-3to4/overlay.ui
new file mode 100644
index 0000000000..d83a16149f
--- /dev/null
+++ b/testsuite/tools/simplify-data-3to4/overlay.ui
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkOverlay">
+ <property name="visible">1</property>
+ <child type="overlay">
+ <object class="GtkButton" id="button">
+ <property name="visible">1</property>
+ <property name="icon-name">document-new</property>
+ </object>
+ <packing>
+ <property name="pass-through">True</property>
+ <property name="index">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label"/>
+ </child>
+ </object>
+</interface>
diff --git a/testsuite/tools/simplify-data-3to4/paned.expected b/testsuite/tools/simplify-data-3to4/paned.expected
new file mode 100644
index 0000000000..a1acaae442
--- /dev/null
+++ b/testsuite/tools/simplify-data-3to4/paned.expected
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkPaned">
+ <property name="resize-end-child">0</property>
+ <property name="shrink-start-child">0</property>
+ <child>
+ <object class="GtkButton" id="button"/>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label"/>
+ </child>
+ </object>
+</interface>
diff --git a/testsuite/tools/simplify-data-3to4/paned.ui b/testsuite/tools/simplify-data-3to4/paned.ui
new file mode 100644
index 0000000000..13f736438a
--- /dev/null
+++ b/testsuite/tools/simplify-data-3to4/paned.ui
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkPaned">
+ <property name="visible">1</property>
+ <child>
+ <object class="GtkButton" id="button">
+ <property name="visible">1</property>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="visible">1</property>
+ </object>
+ <packing>
+ <property name="resize">0</property>
+ <property name="shrink">1</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/testsuite/tools/simplify-data-3to4/test1.expected b/testsuite/tools/simplify-data-3to4/test1.expected
deleted file mode 100644
index 0ddbcae8f5..0000000000
--- a/testsuite/tools/simplify-data-3to4/test1.expected
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<interface>
- <object class="GtkWindow">
- <child>
- <object class="GtkLabel">
- <property name="visible">0</property>
- </object>
- </child>
- </object>
-</interface>
diff --git a/testsuite/tools/simplify-data-3to4/toolbar.expected b/testsuite/tools/simplify-data-3to4/toolbar.expected
new file mode 100644
index 0000000000..fa090a9284
--- /dev/null
+++ b/testsuite/tools/simplify-data-3to4/toolbar.expected
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkBox">
+ <style>
+ <class name="toolbar"/>
+ </style>
+ <child>
+ <object class="GtkButton">
+ <property name="label" translatable="yes">New</property>
+ <property name="icon-name">document-new</property>
+ <property name="tooltip-text" translatable="yes">Create a new document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator">
+ <property name="orientation">vertical</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleButton"/>
+ </child>
+ </object>
+</interface>
diff --git a/testsuite/tools/simplify-data-3to4/toolbar.ui b/testsuite/tools/simplify-data-3to4/toolbar.ui
new file mode 100644
index 0000000000..3f45466024
--- /dev/null
+++ b/testsuite/tools/simplify-data-3to4/toolbar.ui
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkToolbar">
+ <property name="visible">1</property>
+ <child>
+ <object class="GtkToolButton">
+ <property name="visible">1</property>
+ <property name="label" translatable="yes">New</property>
+ <property name="icon-name">document-new</property>
+ <property name="tooltip-text" translatable="yes">Create a new document</property>
+ </object>
+ <packing>
+ <property name="homogeneous">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparatorToolItem">
+ <property name="visible">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton">
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/testsuite/tools/simplify.in b/testsuite/tools/simplify.in
index c92c5c6d9c..e90437337b 100755
--- a/testsuite/tools/simplify.in
+++ b/testsuite/tools/simplify.in
@@ -7,13 +7,14 @@ TEST_RESULT_DIR=${TEST_RESULT_DIR:-/tmp}
shopt -s nullglob
TESTS=( "$TEST_DATA_DIR"/*.ui )
-echo "1..${#TESTS[*]}"
+echo "1..$((2 * ${#TESTS[*]}))"
I=1
for t in ${TESTS[*]}; do
name=$(basename $t .ui)
expected="$TEST_DATA_DIR/$name.expected"
result="$TEST_RESULT_DIR/$name.out"
+ result2="$TEST_RESULT_DIR/$name.out2"
diff="$TEST_RESULT_DIR/$name.diff"
ref="$TEST_RESULT_DIR/$name.ref"
@@ -28,4 +29,17 @@ for t in ${TESTS[*]}; do
fi
I=$((I+1))
+
+ cp $t $result2
+ $GTK_BUILDER_TOOL simplify --replace $result2 2>/dev/null
+
+ if diff -u "$expected" "$result2" > "$diff"; then
+ echo "ok $I $name (--replace)"
+ rm "$diff"
+ else
+ echo "not ok $I $name (--replace)"
+ cp "$expected" "$ref"
+ fi
+
+ I=$((I+1))
done
diff --git a/testsuite/tools/validate-data/invalid1.expected b/testsuite/tools/validate-data/invalid1.expected
new file mode 100644
index 0000000000..77c70ce0dc
--- /dev/null
+++ b/testsuite/tools/validate-data/invalid1.expected
@@ -0,0 +1 @@
+invalid1.ui:3:1 <child> is not a valid tag here
diff --git a/testsuite/tools/validate-data/invalid1.ui b/testsuite/tools/validate-data/invalid1.ui
new file mode 100644
index 0000000000..0b969c34d8
--- /dev/null
+++ b/testsuite/tools/validate-data/invalid1.ui
@@ -0,0 +1,5 @@
+<interface>
+ <child>
+ <object class="GtkLabel"/>
+ </child>
+</interface>
diff --git a/testsuite/tools/validate-data/invalid2.expected b/testsuite/tools/validate-data/invalid2.expected
new file mode 100644
index 0000000000..c05e26fece
--- /dev/null
+++ b/testsuite/tools/validate-data/invalid2.expected
@@ -0,0 +1 @@
+invalid2.ui:4:1 <object> is not a valid tag here
diff --git a/testsuite/tools/validate-data/invalid2.ui b/testsuite/tools/validate-data/invalid2.ui
new file mode 100644
index 0000000000..887b3bcd4b
--- /dev/null
+++ b/testsuite/tools/validate-data/invalid2.ui
@@ -0,0 +1,6 @@
+<interface>
+ <object class="GtkBox">
+ <object class="GtkButton">
+ </object>
+ </object>
+</interface>
diff --git a/testsuite/tools/validate-data/invalid3.expected b/testsuite/tools/validate-data/invalid3.expected
new file mode 100644
index 0000000000..824ce933e6
--- /dev/null
+++ b/testsuite/tools/validate-data/invalid3.expected
@@ -0,0 +1 @@
+invalid3.ui:3:1 <object> requires attribute 'class'
diff --git a/testsuite/tools/validate-data/invalid3.ui b/testsuite/tools/validate-data/invalid3.ui
new file mode 100644
index 0000000000..9deb45b268
--- /dev/null
+++ b/testsuite/tools/validate-data/invalid3.ui
@@ -0,0 +1,4 @@
+<interface>
+ <object>
+ </object>
+</interface>
diff --git a/testsuite/tools/validate-data/invalid4.expected b/testsuite/tools/validate-data/invalid4.expected
new file mode 100644
index 0000000000..7a565ffb3b
--- /dev/null
+++ b/testsuite/tools/validate-data/invalid4.expected
@@ -0,0 +1 @@
+Gtk-WARNING: Failed to find accessible property “text”: Could not parse enum: 'text'
diff --git a/testsuite/tools/validate-data/invalid4.ui b/testsuite/tools/validate-data/invalid4.ui
new file mode 100644
index 0000000000..21e3248b73
--- /dev/null
+++ b/testsuite/tools/validate-data/invalid4.ui
@@ -0,0 +1,7 @@
+<interface>
+ <object class="GtkBox">
+ <accessibility>
+ <property name="text">Download</property>
+ </accessibility>
+ </object>
+</interface>
diff --git a/testsuite/tools/validate-data/valid1.expected b/testsuite/tools/validate-data/valid1.expected
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuite/tools/validate-data/valid1.expected
diff --git a/testsuite/tools/validate-data/valid1.ui b/testsuite/tools/validate-data/valid1.ui
new file mode 100644
index 0000000000..2a9a3f594c
--- /dev/null
+++ b/testsuite/tools/validate-data/valid1.ui
@@ -0,0 +1,3 @@
+<interface>
+ <object class="GtkLabel"/>
+</interface>
diff --git a/testsuite/tools/validate-data/valid2.expected b/testsuite/tools/validate-data/valid2.expected
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuite/tools/validate-data/valid2.expected
diff --git a/testsuite/tools/validate-data/valid2.ui b/testsuite/tools/validate-data/valid2.ui
new file mode 100644
index 0000000000..e0f4cf75df
--- /dev/null
+++ b/testsuite/tools/validate-data/valid2.ui
@@ -0,0 +1,4 @@
+<interface>
+ <template class="GtkEmojiChooser" parent="GtkPopover">
+ </template>
+</interface>
diff --git a/testsuite/tools/validate.in b/testsuite/tools/validate.in
new file mode 100755
index 0000000000..82de80e31d
--- /dev/null
+++ b/testsuite/tools/validate.in
@@ -0,0 +1,35 @@
+#! /bin/bash
+
+GTK_BUILDER_TOOL=${GTK_BUILDER_TOOL:-gtk4-builder-tool}
+TEST_DATA_DIR=${G_TEST_SRCDIR:-.}/validate-data
+TEST_RESULT_DIR=${TEST_RESULT_DIR:-/tmp}
+
+shopt -s nullglob
+TESTS=( "$TEST_DATA_DIR"/*.ui )
+
+echo "1..${#TESTS[*]}"
+
+I=1
+for t in ${TESTS[*]}; do
+ name=$(basename $t .ui)
+ expected="$TEST_DATA_DIR/$name.expected"
+ result="$TEST_RESULT_DIR/$name.out"
+ diff="$TEST_RESULT_DIR/$name.diff"
+ ref="$TEST_RESULT_DIR/$name.ref"
+
+ cd $TEST_DATA_DIR
+
+ $GTK_BUILDER_TOOL validate $(basename $t) 2>$result
+
+ cd $OLDPWD
+
+ if diff -u "$expected" "$result" > "$diff"; then
+ echo "ok $I $name"
+ rm "$diff"
+ else
+ echo "not ok $I $name"
+ cp "$expected" "$ref"
+ fi
+
+ I=$((I+1))
+done