diff options
179 files changed, 5006 insertions, 2674 deletions
@@ -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, ®ion, 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, ®ion, 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, ®ion, 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, ®ion, (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, + ®ion, + 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, ®ion, 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 @@ -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" @@ -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 |