summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS50
-rw-r--r--configure.ac6
-rw-r--r--demos/widget-factory/widget-factory.ui1
-rw-r--r--docs/reference/gdk/gdk-docs.sgml4
-rw-r--r--docs/reference/gdk/gdk3-sections.txt1
-rw-r--r--docs/reference/gtk/gtk-docs.sgml4
-rw-r--r--docs/reference/gtk/gtk3-sections.txt5
-rw-r--r--gdk/gdk-private.c1
-rw-r--r--gdk/gdk-private.h16
-rw-r--r--gdk/gdkversionmacros.h.in16
-rw-r--r--gdk/gdkwindow.c3
-rw-r--r--gdk/gdkwindow.h9
-rw-r--r--gtk/Makefile.am2
-rw-r--r--gtk/gtkcssgadget.c16
-rw-r--r--gtk/gtkemojichooser.c18
-rw-r--r--gtk/gtkemojicompletion.c699
-rw-r--r--gtk/gtkemojicompletion.h41
-rw-r--r--gtk/gtkentry.c52
-rw-r--r--gtk/gtkentryprivate.h6
-rw-r--r--gtk/gtkfontbutton.c46
-rw-r--r--gtk/gtkfontchooser.c104
-rw-r--r--gtk/gtkfontchooser.h14
-rw-r--r--gtk/gtkfontchooserdialog.c2
-rw-r--r--gtk/gtkfontchooserwidget.c441
-rw-r--r--gtk/gtkimcontextsimple.c293
-rw-r--r--gtk/gtkmenu.c22
-rw-r--r--gtk/gtkstyleprovider.h2
-rw-r--r--gtk/gtktreeview.c17
-rw-r--r--gtk/gtkwidget.c2
-rw-r--r--gtk/gtkwindow.c3
-rw-r--r--gtk/theme/Adwaita/_common.scss16
-rw-r--r--gtk/ui/gtkemojicompletion.ui17
-rw-r--r--gtk/ui/gtkfontchooserwidget.ui195
-rw-r--r--po/POTFILES.in2
-rw-r--r--po/ca.po2069
35 files changed, 3356 insertions, 839 deletions
diff --git a/NEWS b/NEWS
index 22995c6f56..c2ffa7f438 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,53 @@
+Overview of Changes in GTK+ 3.23.0
+==================================
+
+* Dependency bumps:
+ - Require libepoxy 1.4
+ - Require pango 1.41
+
+* New font chooser features:
+ - Allow setting OpenType font features
+ - Show examples for OpenType font features
+ - Allow selecting OpenType font variations
+ - Support levels of details for selection
+
+* New Emoji features:
+ - Support a completion popup for Emoji
+ - Drop Ctrl-Shift-e shortcut
+
+* Bugs fixed:
+ #85 widgetDragDestFindTarget introspection data does not show nullable...
+ #154 Documentation: Lifecycle of Editables inside GtkCellRenderers is no...
+ #193 Document that GtkUIManager is deprecated by GtkBuilder
+ #199 MenuButton not notified when its Popover is destroyed, still access...
+ #292 GtkRanges should send ::change-value even if not realized
+ #450 Menu navigation triangle doesn't work anymore
+ #792 Focus events are not always matched
+ #898 emoji-chooser: search for flags doesn't work
+ #1053 Scroll cursor gets left behind if a child widget steals the scroll
+ #1059 -Wparentheses warnings in GTK+ headers when compiling C++ code with...
+ #1065 GtkScrollbar horizontal mouse wheel scroll direction is wrong
+ #1069 Thread 1 "glade" received signal SIGFPE, Arithmetic exception.
+ #1115 gtk icon theme searches system dirs before user dirs
+ 407242 GtkScale: Up/Down keys decrease/increase value, which is opposite...
+ 686109 gtk_print_context_get_hard_margins should return page size specif...
+ 765327 GtkPlug scaled to half the expected size on HiDPI screens
+ 772817 File Chooser: Path arrow button frames are reversed and detached ...
+ 775279 early calls to libepoxy cause all gtk3 programs to abort when the...
+ 786524 ocument GTK_OVERLAY_SCROLLING environment variable
+ 787867 OSX macports pango text size appears to vary between version 1.40...
+ 789215 GtkScrolledWindow and GtkIconView atk objects can cause a segfaul...
+ 791542 GDK 3 Selections documentation makes references to X
+ 791802 Fix direction value moves on scroll/keypress over RTL/inverted ra...
+
+* Translation updates:
+ Catalan
+ Finnish
+ Polish
+ Russian
+ Spanish
+
+
Overview of Changes in GTK+ 3.22.30
===================================
diff --git a/configure.ac b/configure.ac
index 9171ae0ae3..994e7689d3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -9,9 +9,9 @@
# set GTK_BINARY_AGE and GTK_INTERFACE_AGE to 0.
m4_define([gtk_major_version], [3])
-m4_define([gtk_minor_version], [22])
-m4_define([gtk_micro_version], [30])
-m4_define([gtk_interface_age], [30])
+m4_define([gtk_minor_version], [23])
+m4_define([gtk_micro_version], [0])
+m4_define([gtk_interface_age], [0])
m4_define([gtk_binary_age],
[m4_eval(100 * gtk_minor_version + gtk_micro_version)])
m4_define([gtk_version],
diff --git a/demos/widget-factory/widget-factory.ui b/demos/widget-factory/widget-factory.ui
index 2d7426f16c..ad847df23e 100644
--- a/demos/widget-factory/widget-factory.ui
+++ b/demos/widget-factory/widget-factory.ui
@@ -493,6 +493,7 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
<object class="GtkEntry" id="entry1">
<property name="visible">1</property>
<property name="can_focus">1</property>
+ <property name="enable-emoji-completion">1</property>
<property name="invisible_char">•</property>
<property name="placeholder-text" translatable="yes">Click icon to change mode</property>
<property name="secondary_icon_name">view-refresh-symbolic</property>
diff --git a/docs/reference/gdk/gdk-docs.sgml b/docs/reference/gdk/gdk-docs.sgml
index bc102c2dc1..54c295546e 100644
--- a/docs/reference/gdk/gdk-docs.sgml
+++ b/docs/reference/gdk/gdk-docs.sgml
@@ -113,6 +113,10 @@
<title>Index of new symbols in 3.22</title>
<xi:include href="xml/api-index-3.22.xml"><xi:fallback /></xi:include>
</index>
+ <index id="api-index-3-24" role="3.24">
+ <title>Index of new symbols in 3.24</title>
+ <xi:include href="xml/api-index-3.24.xml"><xi:fallback /></xi:include>
+ </index>
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt
index 4e5c403670..344f257028 100644
--- a/docs/reference/gdk/gdk3-sections.txt
+++ b/docs/reference/gdk/gdk3-sections.txt
@@ -386,6 +386,7 @@ gdk_window_move
gdk_window_resize
gdk_window_move_resize
gdk_window_scroll
+gdk_window_move_to_rect
gdk_window_move_region
gdk_window_flush
gdk_window_has_native
diff --git a/docs/reference/gtk/gtk-docs.sgml b/docs/reference/gtk/gtk-docs.sgml
index 1c3a12e804..ef315f8984 100644
--- a/docs/reference/gtk/gtk-docs.sgml
+++ b/docs/reference/gtk/gtk-docs.sgml
@@ -494,6 +494,10 @@
<title>Index of new symbols in 3.22</title>
<xi:include href="xml/api-index-3.22.xml"><xi:fallback /></xi:include>
</index>
+ <index id="api-index-3-24" role="3.24">
+ <title>Index of new symbols in 3.24</title>
+ <xi:include href="xml/api-index-3.24.xml"><xi:fallback /></xi:include>
+ </index>
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt
index 974d8ca6dc..718976af6d 100644
--- a/docs/reference/gtk/gtk3-sections.txt
+++ b/docs/reference/gtk/gtk3-sections.txt
@@ -1665,6 +1665,11 @@ GtkFontFilterFunc
gtk_font_chooser_set_filter_func
gtk_font_chooser_set_font_map
gtk_font_chooser_get_font_map
+gtk_font_chooser_set_level
+gtk_font_chooser_get_level
+gtk_font_chooser_get_font_features
+gtk_font_chooser_set_language
+gtk_font_chooser_get_language
<SUBSECTION Standard>
GtkFontChooserIface
diff --git a/gdk/gdk-private.c b/gdk/gdk-private.c
index 37a4ee60c3..98a0b15b0d 100644
--- a/gdk/gdk-private.c
+++ b/gdk/gdk-private.c
@@ -17,7 +17,6 @@ gdk__private__ (void)
gdk_display_set_rendering_mode,
gdk_display_get_debug_updates,
gdk_display_set_debug_updates,
- gdk_window_move_to_rect
};
return &table;
diff --git a/gdk/gdk-private.h b/gdk/gdk-private.h
index e292429fd4..5d35eb54d8 100644
--- a/gdk/gdk-private.h
+++ b/gdk/gdk-private.h
@@ -31,14 +31,6 @@ gboolean gdk_display_get_debug_updates (GdkDisplay *display);
void gdk_display_set_debug_updates (GdkDisplay *display,
gboolean debug_updates);
-void gdk_window_move_to_rect (GdkWindow *window,
- const GdkRectangle *rect,
- GdkGravity rect_anchor,
- GdkGravity window_anchor,
- GdkAnchorHints anchor_hints,
- gint rect_anchor_dx,
- gint rect_anchor_dy);
-
typedef struct {
/* add all private functions here, initialize them in gdk-private.c */
gboolean (* gdk_device_grab_info) (GdkDisplay *display,
@@ -64,14 +56,6 @@ typedef struct {
gboolean (* gdk_display_get_debug_updates) (GdkDisplay *display);
void (* gdk_display_set_debug_updates) (GdkDisplay *display,
gboolean debug_updates);
-
- void (* gdk_window_move_to_rect) (GdkWindow *window,
- const GdkRectangle *rect,
- GdkGravity rect_anchor,
- GdkGravity window_anchor,
- GdkAnchorHints anchor_hints,
- gint rect_anchor_dx,
- gint rect_anchor_dy);
} GdkPrivateVTable;
GDK_AVAILABLE_IN_ALL
diff --git a/gdk/gdkversionmacros.h.in b/gdk/gdkversionmacros.h.in
index bc2365df3d..410abcbe6a 100644
--- a/gdk/gdkversionmacros.h.in
+++ b/gdk/gdkversionmacros.h.in
@@ -172,6 +172,16 @@
*/
#define GDK_VERSION_3_22 (G_ENCODE_VERSION (3, 22))
+/**
+ * GDK_VERSION_3_24:
+ *
+ * A macro that evaluates to the 3.24 version of GDK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 3.24
+ */
+#define GDK_VERSION_3_24 (G_ENCODE_VERSION (3, 24))
+
/* evaluates to the current stable version; for development cycles,
* this means the next stable target
*/
@@ -412,5 +422,11 @@
# define GDK_AVAILABLE_IN_3_22 _GDK_EXTERN
#endif
+#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_3_24
+# define GDK_AVAILABLE_IN_3_24 GDK_UNAVAILABLE(3, 24)
+#else
+# define GDK_AVAILABLE_IN_3_24 _GDK_EXTERN
+#endif
+
#endif /* __GDK_VERSION_MACROS_H__ */
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 5ac1a69b4c..6b231f067e 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -6233,8 +6233,7 @@ gdk_window_move_resize (GdkWindow *window,
* Connect to the #GdkWindow::moved-to-rect signal to find out how it was
* actually positioned.
*
- * Since: 3.22
- * Stability: Private
+ * Since: 3.24
*/
void
gdk_window_move_to_rect (GdkWindow *window,
diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h
index 3614a76b9f..b1efbb984e 100644
--- a/gdk/gdkwindow.h
+++ b/gdk/gdkwindow.h
@@ -550,6 +550,15 @@ void gdk_window_move_resize (GdkWindow *window,
gint y,
gint width,
gint height);
+
+GDK_AVAILABLE_IN_3_24
+void gdk_window_move_to_rect (GdkWindow *window,
+ const GdkRectangle *rect,
+ GdkGravity rect_anchor,
+ GdkGravity window_anchor,
+ GdkAnchorHints anchor_hints,
+ gint rect_anchor_dx,
+ gint rect_anchor_dy);
GDK_AVAILABLE_IN_ALL
void gdk_window_reparent (GdkWindow *window,
GdkWindow *new_parent,
diff --git a/gtk/Makefile.am b/gtk/Makefile.am
index a903078efa..54a2ca4908 100644
--- a/gtk/Makefile.am
+++ b/gtk/Makefile.am
@@ -469,6 +469,7 @@ gtk_private_h_sources = \
gtkdialogprivate.h \
gtkdndprivate.h \
gtkemojichooser.h \
+ gtkemojicompletion.h \
gtkentryprivate.h \
gtkeventcontrollerprivate.h \
gtkfilechooserembed.h \
@@ -747,6 +748,7 @@ gtk_base_c_sources = \
gtkdrawingarea.c \
gtkeditable.c \
gtkemojichooser.c \
+ gtkemojicompletion.c \
gtkentry.c \
gtkentrybuffer.c \
gtkentrycompletion.c \
diff --git a/gtk/gtkcssgadget.c b/gtk/gtkcssgadget.c
index 7d4ba9c73b..09e9fdfa38 100644
--- a/gtk/gtkcssgadget.c
+++ b/gtk/gtkcssgadget.c
@@ -459,6 +459,14 @@ get_number (GtkCssStyle *style,
return floor (d);
}
+/* Special-case min-width|height to round upwards, to avoid underalloc by 1px */
+static int
+get_number_ceil (GtkCssStyle *style,
+ guint property)
+{
+ return ceil (_gtk_css_number_value_get (gtk_css_style_get_value (style, property), 100));
+}
+
static void
get_box_margin (GtkCssStyle *style,
GtkBorder *margin)
@@ -643,16 +651,16 @@ gtk_css_gadget_get_preferred_size (GtkCssGadget *gadget,
extra_size = margin.left + margin.right + border.left + border.right + padding.left + padding.right;
extra_opposite = margin.top + margin.bottom + border.top + border.bottom + padding.top + padding.bottom;
extra_baseline = margin.left + border.left + padding.left;
- min_size = get_number (style, GTK_CSS_PROPERTY_MIN_WIDTH);
- min_for_size = get_number (style, GTK_CSS_PROPERTY_MIN_HEIGHT);
+ min_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_WIDTH);
+ min_for_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_HEIGHT);
}
else
{
extra_size = margin.top + margin.bottom + border.top + border.bottom + padding.top + padding.bottom;
extra_opposite = margin.left + margin.right + border.left + border.right + padding.left + padding.right;
extra_baseline = margin.top + border.top + padding.top;
- min_size = get_number (style, GTK_CSS_PROPERTY_MIN_HEIGHT);
- min_for_size = get_number (style, GTK_CSS_PROPERTY_MIN_WIDTH);
+ min_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_HEIGHT);
+ min_for_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_WIDTH);
}
if (for_size > -1)
diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c
index 9697dad4b6..64ec1959ce 100644
--- a/gtk/gtkemojichooser.c
+++ b/gtk/gtkemojichooser.c
@@ -35,6 +35,8 @@
#include "gtkintl.h"
#include "gtkprivate.h"
+#define BOX_SPACE 6
+
typedef struct {
GtkWidget *box;
GtkWidget *heading;
@@ -124,7 +126,7 @@ scroll_to_section (GtkButton *button,
if (section->heading)
gtk_widget_get_allocation (section->heading, &alloc);
- gtk_adjustment_animate_to_value (adj, alloc.y);
+ gtk_adjustment_animate_to_value (adj, alloc.y - BOX_SPACE);
}
static void
@@ -142,6 +144,7 @@ populate_recent_section (GtkEmojiChooser *chooser)
GVariant *variant;
GVariant *item;
GVariantIter iter;
+ gboolean empty = FALSE;
variant = g_settings_get_value (chooser->settings, "recent-emoji");
g_variant_iter_init (&iter, variant);
@@ -155,6 +158,13 @@ populate_recent_section (GtkEmojiChooser *chooser)
add_emoji (chooser->recent.box, FALSE, emoji_data, modifier, chooser);
g_variant_unref (emoji_data);
g_variant_unref (item);
+ empty = FALSE;
+ }
+
+ if (!empty)
+ {
+ gtk_widget_show (chooser->recent.box);
+ gtk_widget_set_sensitive (chooser->recent.button, TRUE);
}
g_variant_unref (variant);
}
@@ -197,6 +207,10 @@ add_recent_item (GtkEmojiChooser *chooser,
add_emoji (chooser->recent.box, TRUE, item, modifier, chooser);
+ /* Enable recent */
+ gtk_widget_show (chooser->recent.box);
+ gtk_widget_set_sensitive (chooser->recent.button, TRUE);
+
g_settings_set_value (chooser->settings, "recent-emoji", g_variant_builder_end (&builder));
g_variant_unref (item);
@@ -493,7 +507,7 @@ adj_value_changed (GtkAdjustment *adj,
else
gtk_widget_get_allocation (section->box, &alloc);
- if (value < alloc.y)
+ if (value < alloc.y - BOX_SPACE)
break;
select_section = section;
diff --git a/gtk/gtkemojicompletion.c b/gtk/gtkemojicompletion.c
new file mode 100644
index 0000000000..664629be49
--- /dev/null
+++ b/gtk/gtkemojicompletion.c
@@ -0,0 +1,699 @@
+/* gtkemojicompletion.c: An Emoji picker widget
+ * Copyright 2017, Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gtkemojicompletion.h"
+
+#include "gtkentryprivate.h"
+#include "gtkbox.h"
+#include "gtkcssprovider.h"
+#include "gtklistbox.h"
+#include "gtklabel.h"
+#include "gtkpopover.h"
+#include "gtkintl.h"
+#include "gtkprivate.h"
+#include "gtkgesturelongpress.h"
+#include "gtkflowbox.h"
+#include "gtkstack.h"
+
+struct _GtkEmojiCompletion
+{
+ GtkPopover parent_instance;
+
+ GtkEntry *entry;
+ char *text;
+ guint length;
+ guint offset;
+ gulong changed_id;
+ guint n_matches;
+
+ GtkWidget *list;
+ GtkWidget *active;
+ GtkWidget *active_variation;
+
+ GVariant *data;
+
+ GtkGesture *long_press;
+};
+
+struct _GtkEmojiCompletionClass {
+ GtkPopoverClass parent_class;
+};
+
+static void connect_signals (GtkEmojiCompletion *completion,
+ GtkEntry *entry);
+static void disconnect_signals (GtkEmojiCompletion *completion);
+static int populate_completion (GtkEmojiCompletion *completion,
+ const char *text,
+ guint offset);
+
+#define MAX_ROWS 5
+
+G_DEFINE_TYPE (GtkEmojiCompletion, gtk_emoji_completion, GTK_TYPE_POPOVER)
+
+static void
+gtk_emoji_completion_finalize (GObject *object)
+{
+ GtkEmojiCompletion *completion = GTK_EMOJI_COMPLETION (object);
+
+ disconnect_signals (completion);
+
+ g_free (completion->text);
+ g_variant_unref (completion->data);
+
+ g_clear_object (&completion->long_press);
+
+ G_OBJECT_CLASS (gtk_emoji_completion_parent_class)->finalize (object);
+}
+
+static void
+update_completion (GtkEmojiCompletion *completion)
+{
+ const char *text;
+ guint length;
+ guint n_matches;
+
+ n_matches = 0;
+
+ text = gtk_entry_get_text (GTK_ENTRY (completion->entry));
+ length = strlen (text);
+
+ if (length > 0)
+ {
+ gboolean found_candidate = FALSE;
+ const char *p;
+
+ p = text + length;
+ do
+ {
+next:
+ p = g_utf8_prev_char (p);
+ if (*p == ':')
+ {
+ if (p + 1 == text + length)
+ goto next;
+
+ if (p == text || !g_unichar_isalnum (g_utf8_get_char (p - 1)))
+ {
+ found_candidate = TRUE;
+ }
+
+ break;
+ }
+ }
+ while (g_unichar_isalnum (g_utf8_get_char (p)) || *p == '_');
+
+ if (found_candidate)
+ n_matches = populate_completion (completion, p, 0);
+ }
+
+ if (n_matches > 0)
+ gtk_popover_popup (GTK_POPOVER (completion));
+ else
+ gtk_popover_popdown (GTK_POPOVER (completion));
+}
+
+static void
+entry_changed (GtkEntry *entry, GtkEmojiCompletion *completion)
+{
+ update_completion (completion);
+}
+
+static void
+emoji_activated (GtkWidget *row,
+ GtkEmojiCompletion *completion)
+{
+ const char *emoji;
+ guint length;
+
+ gtk_popover_popdown (GTK_POPOVER (completion));
+
+ emoji = (const char *)g_object_get_data (G_OBJECT (row), "text");
+
+ g_signal_handler_block (completion->entry, completion->changed_id);
+
+ length = g_utf8_strlen (gtk_entry_get_text (completion->entry), -1);
+ gtk_entry_set_positions (completion->entry, length - completion->length, length);
+ gtk_entry_enter_text (completion->entry, emoji);
+
+ g_signal_handler_unblock (completion->entry, completion->changed_id);
+}
+
+static void
+row_activated (GtkListBox *list,
+ GtkListBoxRow *row,
+ gpointer data)
+{
+ GtkEmojiCompletion *completion = data;
+
+ emoji_activated (GTK_WIDGET (row), completion);
+}
+
+static void
+child_activated (GtkFlowBox *box,
+ GtkFlowBoxChild *child,
+ gpointer data)
+{
+ GtkEmojiCompletion *completion = data;
+
+ emoji_activated (GTK_WIDGET (child), completion);
+}
+
+static void
+move_active_row (GtkEmojiCompletion *completion,
+ int direction)
+{
+ GtkWidget *child;
+ GtkWidget *base;
+ GList *children, *l, *active, *last;
+
+ active = NULL;
+ last = NULL;
+ children = gtk_container_get_children (GTK_CONTAINER (completion->list));
+ for (l = children; l; l = l->next)
+ {
+ child = l->data;
+
+ if (completion->active == child)
+ active = l;
+
+ if (l->next == NULL)
+ last = l;
+
+ gtk_widget_unset_state_flags (child, GTK_STATE_FLAG_PRELIGHT);
+ base = GTK_WIDGET (g_object_get_data (G_OBJECT (child), "base"));
+ gtk_widget_unset_state_flags (base, GTK_STATE_FLAG_PRELIGHT);
+ }
+
+ if (completion->active != NULL)
+ {
+ if (direction == 1)
+ completion->active = (active && active->next) ? active->next->data : NULL;
+ else
+ completion->active = (active && active->prev) ? active->prev->data : NULL;
+ }
+
+ if (completion->active == NULL)
+ {
+ if (direction == 1)
+ completion->active = children->data;
+ else
+ completion->active = last->data;
+ }
+
+ if (completion->active != NULL)
+ gtk_widget_set_state_flags (completion->active, GTK_STATE_FLAG_PRELIGHT, FALSE);
+
+ if (completion->active_variation)
+ {
+ gtk_widget_unset_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT);
+ completion->active_variation = NULL;
+ }
+
+ g_list_free (children);
+}
+
+static void
+activate_active_row (GtkEmojiCompletion *completion)
+{
+ if (GTK_IS_FLOW_BOX_CHILD (completion->active_variation))
+ emoji_activated (completion->active_variation, completion);
+ else if (completion->active != NULL)
+ emoji_activated (completion->active, completion);
+}
+
+static void
+show_variations (GtkEmojiCompletion *completion,
+ GtkWidget *row,
+ gboolean visible)
+{
+ GtkWidget *stack;
+ GtkWidget *box;
+ gboolean is_visible;
+
+ if (!row)
+ return;
+
+ stack = GTK_WIDGET (g_object_get_data (G_OBJECT (row), "stack"));
+ box = gtk_stack_get_child_by_name (GTK_STACK (stack), "variations");
+ if (!box)
+ return;
+
+ is_visible = gtk_stack_get_visible_child (GTK_STACK (stack)) == box;
+ if (is_visible == visible)
+ return;
+
+ if (visible)
+ gtk_widget_unset_state_flags (row, GTK_STATE_FLAG_PRELIGHT);
+ else
+ gtk_widget_set_state_flags (row, GTK_STATE_FLAG_PRELIGHT, FALSE);
+
+ gtk_stack_set_visible_child_name (GTK_STACK (stack), visible ? "variations" : "text");
+ if (completion->active_variation)
+ {
+ gtk_widget_unset_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT);
+ completion->active_variation = NULL;
+ }
+}
+
+static gboolean
+move_active_variation (GtkEmojiCompletion *completion,
+ int direction)
+{
+ GtkWidget *base;
+ GtkWidget *stack;
+ GtkWidget *box;
+ GtkWidget *next;
+ GList *children, *l, *active;
+
+ if (!completion->active)
+ return FALSE;
+
+ base = GTK_WIDGET (g_object_get_data (G_OBJECT (completion->active), "base"));
+ stack = GTK_WIDGET (g_object_get_data (G_OBJECT (completion->active), "stack"));
+ box = gtk_stack_get_child_by_name (GTK_STACK (stack), "variations");
+
+ if (gtk_stack_get_visible_child (GTK_STACK (stack)) != box)
+ return FALSE;
+
+ next = NULL;
+
+ active = NULL;
+ children = gtk_container_get_children (GTK_CONTAINER (box));
+ for (l = children; l; l = l->next)
+ {
+ if (l->data == completion->active_variation)
+ active = l;
+ }
+
+ if (!completion->active_variation)
+ next = base;
+ else if (completion->active_variation == base && direction == 1)
+ next = children->data;
+ else if (completion->active_variation == children->data && direction == -1)
+ next = base;
+ else if (direction == 1)
+ next = (active && active->next) ? active->next->data : NULL;
+ else if (direction == -1)
+ next = (active && active->prev) ? active->prev->data : NULL;
+
+ if (next)
+ {
+ if (completion->active_variation)
+ gtk_widget_unset_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT);
+ completion->active_variation = next;
+ gtk_widget_set_state_flags (completion->active_variation, GTK_STATE_FLAG_PRELIGHT, FALSE);
+ }
+
+ g_list_free (children);
+
+ return next != NULL;
+}
+
+static gboolean
+entry_key_press (GtkEntry *entry,
+ GdkEventKey *event,
+ GtkEmojiCompletion *completion)
+{
+ guint keyval;
+
+ if (!gtk_widget_get_visible (GTK_WIDGET (completion)))
+ return FALSE;
+
+ gdk_event_get_keyval ((GdkEvent*)event, &keyval);
+
+ if (keyval == GDK_KEY_Escape)
+ {
+ gtk_popover_popdown (GTK_POPOVER (completion));
+ return TRUE;
+ }
+
+ if (keyval == GDK_KEY_Tab)
+ {
+ show_variations (completion, completion->active, FALSE);
+
+ guint offset = completion->offset + MAX_ROWS;
+ if (offset >= completion->n_matches)
+ offset = 0;
+ populate_completion (completion, completion->text, offset);
+ return TRUE;
+ }
+
+ if (keyval == GDK_KEY_Up)
+ {
+ show_variations (completion, completion->active, FALSE);
+
+ move_active_row (completion, -1);
+ return TRUE;
+ }
+
+ if (keyval == GDK_KEY_Down)
+ {
+ show_variations (completion, completion->active, FALSE);
+
+ move_active_row (completion, 1);
+ return TRUE;
+ }
+
+ if (keyval == GDK_KEY_Return ||
+ keyval == GDK_KEY_KP_Enter ||
+ keyval == GDK_KEY_ISO_Enter)
+ {
+ activate_active_row (completion);
+ return TRUE;
+ }
+
+ if (keyval == GDK_KEY_Right)
+ {
+ show_variations (completion, completion->active, TRUE);
+ move_active_variation (completion, 1);
+ return TRUE;
+ }
+
+ if (keyval == GDK_KEY_Left)
+ {
+ if (!move_active_variation (completion, -1))
+ show_variations (completion, completion->active, FALSE);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+entry_focus_out (GtkWidget *entry,
+ GParamSpec *pspec,
+ GtkEmojiCompletion *completion)
+{
+ if (!gtk_widget_has_focus (entry))
+ gtk_popover_popdown (GTK_POPOVER (completion));
+ return FALSE;
+}
+
+static void
+connect_signals (GtkEmojiCompletion *completion,
+ GtkEntry *entry)
+{
+ completion->entry = entry;
+
+ completion->changed_id = g_signal_connect (entry, "changed", G_CALLBACK (entry_changed), completion);
+ g_signal_connect (entry, "key-press-event", G_CALLBACK (entry_key_press), completion);
+ g_signal_connect (entry, "notify::has-focus", G_CALLBACK (entry_focus_out), completion);
+}
+
+static void
+disconnect_signals (GtkEmojiCompletion *completion)
+{
+ g_signal_handlers_disconnect_by_func (completion->entry, entry_changed, completion);
+ g_signal_handlers_disconnect_by_func (completion->entry, entry_key_press, completion);
+ g_signal_handlers_disconnect_by_func (completion->entry, entry_focus_out, completion);
+
+ completion->entry = NULL;
+}
+
+static gboolean
+has_variations (GVariant *emoji_data)
+{
+ GVariant *codes;
+ int i;
+ gboolean has_variations;
+
+ has_variations = FALSE;
+ codes = g_variant_get_child_value (emoji_data, 0);
+ for (i = 0; i < g_variant_n_children (codes); i++)
+ {
+ gunichar code;
+ g_variant_get_child (codes, i, "u", &code);
+ if (code == 0)
+ {
+ has_variations = TRUE;
+ break;
+ }
+ }
+ g_variant_unref (codes);
+
+ return has_variations;
+}
+
+static void
+get_text (GVariant *emoji_data,
+ gunichar modifier,
+ char *text,
+ gsize length)
+{
+ GVariant *codes;
+ int i;
+ char *p;
+
+ p = text;
+ codes = g_variant_get_child_value (emoji_data, 0);
+ for (i = 0; i < g_variant_n_children (codes); i++)
+ {
+ gunichar code;
+
+ g_variant_get_child (codes, i, "u", &code);
+ if (code == 0)
+ code = modifier;
+ if (code != 0)
+ p += g_unichar_to_utf8 (code, p);
+ }
+ g_variant_unref (codes);
+ p[0] = 0;
+}
+
+static void
+add_emoji_variation (GtkWidget *box,
+ GVariant *emoji_data,
+ gunichar modifier)
+{
+ GtkWidget *child;
+ GtkWidget *label;
+ PangoAttrList *attrs;
+ char text[64];
+
+ get_text (emoji_data, modifier, text, 64);
+
+ label = gtk_label_new (text);
+ gtk_widget_show (label);
+ attrs = pango_attr_list_new ();
+ pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_X_LARGE));
+ gtk_label_set_attributes (GTK_LABEL (label), attrs);
+ pango_attr_list_unref (attrs);
+
+ child = gtk_flow_box_child_new ();
+ gtk_widget_show (child);
+ gtk_style_context_add_class (gtk_widget_get_style_context (child), "emoji");
+ g_object_set_data_full (G_OBJECT (child), "text", g_strdup (text), g_free);
+ g_object_set_data_full (G_OBJECT (child), "emoji-data",
+ g_variant_ref (emoji_data),
+ (GDestroyNotify)g_variant_unref);
+ if (modifier != 0)
+ g_object_set_data (G_OBJECT (child), "modifier", GUINT_TO_POINTER (modifier));
+
+ gtk_container_add (GTK_CONTAINER (child), label);
+ gtk_flow_box_insert (GTK_FLOW_BOX (box), child, -1);
+}
+
+static void
+add_emoji (GtkWidget *list,
+ GVariant *emoji_data,
+ GtkEmojiCompletion *completion)
+{
+ GtkWidget *child;
+ GtkWidget *label;
+ GtkWidget *box;
+ PangoAttrList *attrs;
+ char text[64];
+ const char *shortname;
+ GtkWidget *stack;
+ gunichar modifier;
+
+ get_text (emoji_data, 0, text, 64);
+
+ label = gtk_label_new (text);
+ gtk_widget_show (label);
+ attrs = pango_attr_list_new ();
+ pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_X_LARGE));
+ gtk_label_set_attributes (GTK_LABEL (label), attrs);
+ pango_attr_list_unref (attrs);
+ gtk_style_context_add_class (gtk_widget_get_style_context (label), "emoji");
+
+ child = gtk_list_box_row_new ();
+ gtk_widget_show (child);
+ gtk_widget_set_focus_on_click (child, FALSE);
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_widget_show (box);
+ gtk_container_add (GTK_CONTAINER (child), box);
+ gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
+ g_object_set_data (G_OBJECT (child), "base", label);
+
+ stack = gtk_stack_new ();
+ gtk_widget_show (stack);
+ gtk_stack_set_homogeneous (GTK_STACK (stack), TRUE);
+ gtk_stack_set_transition_type (GTK_STACK (stack), GTK_STACK_TRANSITION_TYPE_OVER_RIGHT_LEFT);
+ gtk_box_pack_start (GTK_BOX (box), stack, FALSE, FALSE, 0);
+ g_object_set_data (G_OBJECT (child), "stack", stack);
+
+ g_variant_get_child (emoji_data, 2, "&s", &shortname);
+ label = gtk_label_new (shortname);
+ gtk_widget_show (label);
+ gtk_label_set_xalign (GTK_LABEL (label), 0);
+
+ gtk_stack_add_named (GTK_STACK (stack), label, "text");
+
+ if (has_variations (emoji_data))
+ {
+ box = gtk_flow_box_new ();
+ gtk_widget_show (box);
+ gtk_flow_box_set_homogeneous (GTK_FLOW_BOX (box), TRUE);
+ gtk_flow_box_set_min_children_per_line (GTK_FLOW_BOX (box), 5);
+ gtk_flow_box_set_max_children_per_line (GTK_FLOW_BOX (box), 5);
+ gtk_flow_box_set_activate_on_single_click (GTK_FLOW_BOX (box), TRUE);
+ gtk_flow_box_set_selection_mode (GTK_FLOW_BOX (box), GTK_SELECTION_NONE);
+ g_signal_connect (box, "child-activated", G_CALLBACK (child_activated), completion);
+ for (modifier = 0x1f3fb; modifier <= 0x1f3ff; modifier++)
+ add_emoji_variation (box, emoji_data, modifier);
+
+ gtk_stack_add_named (GTK_STACK (stack), box, "variations");
+ }
+
+ g_object_set_data_full (G_OBJECT (child), "text", g_strdup (text), g_free);
+ g_object_set_data_full (G_OBJECT (child), "emoji-data",
+ g_variant_ref (emoji_data), (GDestroyNotify)g_variant_unref);
+ gtk_style_context_add_class (gtk_widget_get_style_context (child), "emoji-completion-row");
+
+ gtk_list_box_insert (GTK_LIST_BOX (list), child, -1);
+}
+
+static int
+populate_completion (GtkEmojiCompletion *completion,
+ const char *text,
+ guint offset)
+{
+ GList *children, *l;
+ int n_matches;
+ int n_added;
+ GVariantIter iter;
+ GVariant *item;
+
+ text = g_strdup (text);
+ g_free (completion->text);
+ completion->text = g_strdup (text);
+ completion->length = g_utf8_strlen (text, -1);
+ completion->offset = offset;
+
+ children = gtk_container_get_children (GTK_CONTAINER (completion->list));
+ for (l = children; l; l = l->next)
+ gtk_widget_destroy (GTK_WIDGET (l->data));
+ g_list_free (children);
+
+ completion->active = NULL;
+
+ n_matches = 0;
+ n_added = 0;
+ g_variant_iter_init (&iter, completion->data);
+ while ((item = g_variant_iter_next_value (&iter)))
+ {
+ const char *shortname;
+
+ g_variant_get_child (item, 2, "&s", &shortname);
+ if (g_str_has_prefix (shortname, text))
+ {
+ n_matches++;
+
+ if (n_matches > offset && n_added < MAX_ROWS)
+ {
+ add_emoji (completion->list, item, completion);
+ n_added++;
+ }
+ }
+ }
+
+ completion->n_matches = n_matches;
+
+ if (n_added > 0)
+ {
+ GList *children;
+
+ children = gtk_container_get_children (GTK_CONTAINER (completion->list));
+ completion->active = children->data;
+ g_list_free (children);
+ gtk_widget_set_state_flags (completion->active, GTK_STATE_FLAG_PRELIGHT, FALSE);
+ }
+
+ return n_added;
+}
+
+static void
+long_pressed_cb (GtkGesture *gesture,
+ double x,
+ double y,
+ gpointer data)
+{
+ GtkEmojiCompletion *completion = data;
+ GtkWidget *row;
+
+ row = GTK_WIDGET (gtk_list_box_get_row_at_y (GTK_LIST_BOX (completion->list), y));
+ if (!row)
+ return;
+
+ show_variations (completion, row, TRUE);
+}
+
+static void
+gtk_emoji_completion_init (GtkEmojiCompletion *completion)
+{
+ g_autoptr(GBytes) bytes = NULL;
+
+ gtk_widget_init_template (GTK_WIDGET (completion));
+
+ bytes = g_resources_lookup_data ("/org/gtk/libgtk/emoji/emoji.data", 0, NULL);
+ completion->data = g_variant_ref_sink (g_variant_new_from_bytes (G_VARIANT_TYPE ("a(auss)"), bytes, TRUE));
+
+ completion->long_press = gtk_gesture_long_press_new (completion->list);
+ g_signal_connect (completion->long_press, "pressed", G_CALLBACK (long_pressed_cb), completion);
+}
+
+static void
+gtk_emoji_completion_class_init (GtkEmojiCompletionClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->finalize = gtk_emoji_completion_finalize;
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/ui/gtkemojicompletion.ui");
+
+ gtk_widget_class_bind_template_child (widget_class, GtkEmojiCompletion, list);
+
+ gtk_widget_class_bind_template_callback (widget_class, row_activated);
+}
+
+GtkWidget *
+gtk_emoji_completion_new (GtkEntry *entry)
+{
+ GtkEmojiCompletion *completion;
+
+ completion = GTK_EMOJI_COMPLETION (g_object_new (GTK_TYPE_EMOJI_COMPLETION,
+ "relative-to", entry,
+ NULL));
+
+ connect_signals (completion, entry);
+
+ return GTK_WIDGET (completion);
+}
diff --git a/gtk/gtkemojicompletion.h b/gtk/gtkemojicompletion.h
new file mode 100644
index 0000000000..ff7cb1fa63
--- /dev/null
+++ b/gtk/gtkemojicompletion.h
@@ -0,0 +1,41 @@
+/* gtkemojicompletion.h: An Emoji picker widget
+ * Copyright 2017, Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
+#error "Only <gtk/gtk.h> can be included directly."
+#endif
+
+#include <gtk/gtkentry.h>
+
+G_BEGIN_DECLS
+
+#define GTK_TYPE_EMOJI_COMPLETION (gtk_emoji_completion_get_type ())
+#define GTK_EMOJI_COMPLETION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_EMOJI_COMPLETION, GtkEmojiCompletion))
+#define GTK_EMOJI_COMPLETION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_EMOJI_COMPLETION, GtkEmojiCompletionClass))
+#define GTK_IS_EMOJI_COMPLETION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_EMOJI_COMPLETION))
+#define GTK_IS_EMOJI_COMPLETION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_EMOJI_COMPLETION))
+#define GTK_EMOJI_COMPLETION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_EMOJI_COMPLETION, GtkEmojiCompletionClass))
+
+typedef struct _GtkEmojiCompletion GtkEmojiCompletion;
+typedef struct _GtkEmojiCompletionClass GtkEmojiCompletionClass;
+
+GType gtk_emoji_completion_get_type (void) G_GNUC_CONST;
+GtkWidget *gtk_emoji_completion_new (GtkEntry *entry);
+
+G_END_DECLS
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index a01684101f..35995d84bb 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -39,6 +39,9 @@
#include "gtkentry.h"
#include "gtkentrybuffer.h"
#include "gtkiconhelperprivate.h"
+#include "gtkemojichooser.h"
+#include "gtkemojicompletion.h"
+#include "gtkentrybuffer.h"
#include "gtkimcontextsimple.h"
#include "gtkimmulticontext.h"
#include "gtkintl.h"
@@ -72,6 +75,7 @@
#include "gtkcsscustomgadgetprivate.h"
#include "gtkprogresstrackerprivate.h"
#include "gtkemojichooser.h"
+#include "gtkwindow.h"
#include "a11y/gtkentryaccessible.h"
@@ -250,6 +254,7 @@ struct _GtkEntryPrivate
guint shadow_type : 4;
guint editable : 1;
guint show_emoji_icon : 1;
+ guint enable_emoji_completion : 1;
guint in_drag : 1;
guint overwrite_mode : 1;
guint visible : 1;
@@ -378,6 +383,7 @@ enum {
PROP_POPULATE_ALL,
PROP_TABS,
PROP_SHOW_EMOJI_ICON,
+ PROP_ENABLE_EMOJI_COMPLETION,
PROP_EDITING_CANCELED,
NUM_PROPERTIES = PROP_EDITING_CANCELED
};
@@ -589,11 +595,6 @@ static void gtk_entry_drag_gesture_end (GtkGestureDrag *gesture,
/* Internal routines
*/
-static void gtk_entry_enter_text (GtkEntry *entry,
- const gchar *str);
-static void gtk_entry_set_positions (GtkEntry *entry,
- gint current_pos,
- gint selection_bound);
static void gtk_entry_draw_text (GtkEntry *entry,
cairo_t *cr);
static void gtk_entry_draw_cursor (GtkEntry *entry,
@@ -703,6 +704,8 @@ static void buffer_disconnect_signals (GtkEntry *entry);
static GtkEntryBuffer *get_buffer (GtkEntry *entry);
static void set_show_emoji_icon (GtkEntry *entry,
gboolean value);
+static void set_enable_emoji_completion (GtkEntry *entry,
+ gboolean value);
static void gtk_entry_measure (GtkCssGadget *gadget,
GtkOrientation orientation,
@@ -1536,6 +1539,13 @@ gtk_entry_class_init (GtkEntryClass *class)
FALSE,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ entry_props[PROP_ENABLE_EMOJI_COMPLETION] =
+ g_param_spec_boolean ("enable-emoji-completion",
+ P_("Enable Emoji completion"),
+ P_("Whether to suggest Emoji replacements"),
+ FALSE,
+ GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, entry_props);
/**
@@ -2446,6 +2456,10 @@ gtk_entry_set_property (GObject *object,
set_show_emoji_icon (entry, g_value_get_boolean (value));
break;
+ case PROP_ENABLE_EMOJI_COMPLETION:
+ set_enable_emoji_completion (entry, g_value_get_boolean (value));
+ break;
+
case PROP_SCROLL_OFFSET:
case PROP_CURSOR_POSITION:
default:
@@ -2702,6 +2716,10 @@ gtk_entry_get_property (GObject *object,
g_value_set_boolean (value, priv->show_emoji_icon);
break;
+ case PROP_ENABLE_EMOJI_COMPLETION:
+ g_value_set_boolean (value, priv->enable_emoji_completion);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -6109,7 +6127,7 @@ gtk_entry_delete_surrounding_cb (GtkIMContext *slave,
*/
/* Used for im_commit_cb and inserting Unicode chars */
-static void
+void
gtk_entry_enter_text (GtkEntry *entry,
const gchar *str)
{
@@ -6144,7 +6162,7 @@ gtk_entry_enter_text (GtkEntry *entry,
/* All changes to priv->current_pos and priv->selection_bound
* should go through this function.
*/
-static void
+void
gtk_entry_set_positions (GtkEntry *entry,
gint current_pos,
gint selection_bound)
@@ -11143,3 +11161,23 @@ set_show_emoji_icon (GtkEntry *entry,
g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_SHOW_EMOJI_ICON]);
gtk_widget_queue_resize (GTK_WIDGET (entry));
}
+
+static void
+set_enable_emoji_completion (GtkEntry *entry,
+ gboolean value)
+{
+ GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
+
+ if (priv->enable_emoji_completion == value)
+ return;
+
+ priv->enable_emoji_completion = value;
+
+ if (priv->enable_emoji_completion)
+ g_object_set_data (G_OBJECT (entry), "emoji-completion-popup",
+ gtk_emoji_completion_new (entry));
+ else
+ g_object_set_data (G_OBJECT (entry), "emoji-completion-popup", NULL);
+
+ g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_ENABLE_EMOJI_COMPLETION]);
+}
diff --git a/gtk/gtkentryprivate.h b/gtk/gtkentryprivate.h
index 53a90785d6..048d92aacf 100644
--- a/gtk/gtkentryprivate.h
+++ b/gtk/gtkentryprivate.h
@@ -95,6 +95,12 @@ void _gtk_entry_grab_focus (GtkEntry *entry,
/* in gtkspinbutton.c (because I'm too lazy to create gtkspinbuttonprivate.h) */
gint gtk_spin_button_get_text_width (GtkSpinButton *spin_button);
+void gtk_entry_enter_text (GtkEntry *entry,
+ const char *text);
+void gtk_entry_set_positions (GtkEntry *entry,
+ int current_pos,
+ int selection_bound);
+
G_END_DECLS
#endif /* __GTK_ENTRY_PRIVATE_H__ */
diff --git a/gtk/gtkfontbutton.c b/gtk/gtkfontbutton.c
index e36c000f91..0964c516bc 100644
--- a/gtk/gtkfontbutton.c
+++ b/gtk/gtkfontbutton.c
@@ -85,7 +85,7 @@ struct _GtkFontButtonPrivate
PangoFontMap *font_map;
gint font_size;
char *font_features;
- char *language;
+ PangoLanguage *language;
gchar *preview_text;
GtkFontFilterFunc font_filter;
gpointer font_filter_data;
@@ -137,11 +137,12 @@ static void dialog_destroy (GtkWidget *widget,
static void gtk_font_button_label_use_font (GtkFontButton *gfs);
static void gtk_font_button_update_font_info (GtkFontButton *gfs);
-static void font_button_set_font_name (GtkFontButton *font_button,
- const char *fontname);
-static void gtk_font_button_set_level (GtkFontButton *font_button,
- GtkFontChooserLevel level);
-
+static void font_button_set_font_name (GtkFontButton *button,
+ const char *fontname);
+static void gtk_font_button_set_level (GtkFontButton *font_button,
+ GtkFontChooserLevel level);
+static void gtk_font_button_set_language (GtkFontButton *button,
+ const char *language);
static guint font_button_signals[LAST_SIGNAL] = { 0 };
@@ -167,9 +168,6 @@ clear_font_data (GtkFontButton *font_button)
g_free (priv->font_features);
priv->font_features = NULL;
-
- g_free (priv->language);
- priv->language = NULL;
}
static void
@@ -581,7 +579,7 @@ gtk_font_button_class_init (GtkFontButtonClass *klass)
* @widget: the object which received the signal.
*
* The ::font-set signal is emitted when the user selects a font.
- * When handling this signal, use gtk_font_button_get_font_name()
+ * When handling this signal, use gtk_font_chooser_get_font()
* to find out which font was just selected.
*
* Note that this signal is only emitted when the user
@@ -629,6 +627,7 @@ gtk_font_button_init (GtkFontButton *font_button)
font_button->priv->level = GTK_FONT_CHOOSER_LEVEL_FAMILY |
GTK_FONT_CHOOSER_LEVEL_STYLE |
GTK_FONT_CHOOSER_LEVEL_SIZE;
+ font_button->priv->language = pango_language_get_default ();
gtk_widget_init_template (GTK_WIDGET (font_button));
@@ -681,6 +680,9 @@ gtk_font_button_set_property (GObject *object,
case GTK_FONT_CHOOSER_PROP_FONT_DESC:
gtk_font_button_take_font_desc (font_button, g_value_dup_boxed (value));
break;
+ case GTK_FONT_CHOOSER_PROP_LANGUAGE:
+ gtk_font_button_set_language (font_button, g_value_get_string (value));
+ break;
case GTK_FONT_CHOOSER_PROP_LEVEL:
gtk_font_button_set_level (font_button, g_value_get_flags (value));
break;
@@ -733,7 +735,7 @@ gtk_font_button_get_property (GObject *object,
g_value_set_string (value, priv->font_features);
break;
case GTK_FONT_CHOOSER_PROP_LANGUAGE:
- g_value_set_string (value, priv->language);
+ g_value_set_string (value, pango_language_to_string (priv->language));
break;
case GTK_FONT_CHOOSER_PROP_LEVEL:
g_value_set_flags (value, priv->level);
@@ -1100,7 +1102,9 @@ gtk_font_button_clicked (GtkButton *button)
if (priv->font_map)
gtk_font_chooser_set_font_map (font_dialog, priv->font_map);
gtk_font_chooser_set_show_preview_entry (font_dialog, priv->show_preview_entry);
- g_object_set (font_dialog, "level", priv->level, NULL);
+ gtk_font_chooser_set_level (GTK_FONT_CHOOSER (font_dialog), priv->level);
+ gtk_font_chooser_set_language (GTK_FONT_CHOOSER (font_dialog), pango_language_to_string
+(priv->language));
if (priv->preview_text)
{
@@ -1185,9 +1189,8 @@ response_cb (GtkDialog *dialog,
g_object_ref (priv->font_face);
priv->font_size = gtk_font_chooser_get_font_size (font_chooser);
g_free (priv->font_features);
- g_object_get (font_chooser, "font-features", &priv->font_features, NULL);
- g_free (priv->language);
- g_object_get (font_chooser, "language", &priv->language, NULL);
+ priv->font_features = gtk_font_chooser_get_font_features (font_chooser);
+ priv->language = pango_language_from_string (gtk_font_chooser_get_language (font_chooser));
/* Set label font */
gtk_font_button_update_font_info (font_button);
@@ -1438,3 +1441,16 @@ gtk_font_button_set_level (GtkFontButton *button,
g_object_notify (G_OBJECT (button), "level");
}
+static void
+gtk_font_button_set_language (GtkFontButton *button,
+ const char *language)
+{
+ GtkFontButtonPrivate *priv = button->priv;
+
+ priv->language = pango_language_from_string (language);
+
+ if (priv->font_dialog)
+ gtk_font_chooser_set_language (GTK_FONT_CHOOSER (priv->font_dialog), language);
+
+ g_object_notify (G_OBJECT (button), "language");
+}
diff --git a/gtk/gtkfontchooser.c b/gtk/gtkfontchooser.c
index c5dbb6177b..16df10bd7c 100644
--- a/gtk/gtkfontchooser.c
+++ b/gtk/gtkfontchooser.c
@@ -154,7 +154,7 @@ gtk_font_chooser_default_init (GtkFontChooserInterface *iface)
P_("Language"),
P_("Language for which features have been selected"),
"",
- GTK_PARAM_READABLE));
+ GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
/**
* GtkFontChooser::font-activated:
@@ -532,3 +532,105 @@ gtk_font_chooser_get_font_map (GtkFontChooser *fontchooser)
return fontmap;
}
+
+/**
+ * gtk_font_chooser_set_level:
+ * @fontchooser: a #GtkFontChooser
+ * @level: the desired level of granularity
+ *
+ * Sets the desired level of granularity for selecting fonts.
+ *
+ * Since: 3.24
+ */
+void
+gtk_font_chooser_set_level (GtkFontChooser *fontchooser,
+ GtkFontChooserLevel level)
+{
+ g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
+
+ g_object_set (fontchooser, "level", level, NULL);
+}
+
+/**
+ * gtk_font_chooser_get_level:
+ * @fontchooser: a #GtkFontChooser
+ *
+ * Returns the current level of granularity for selecting fonts.
+ *
+ * Returns: the current granularity level
+ *
+ * Since: 3.24
+ */
+GtkFontChooserLevel
+gtk_font_chooser_get_level (GtkFontChooser *fontchooser)
+{
+ GtkFontChooserLevel level;
+
+ g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), 0);
+
+ g_object_get (fontchooser, "level", &level, NULL);
+
+ return level;
+}
+
+/**
+ * gtk_font_chooser_get_font_features:
+ * @fontchooser: a #GtkFontChooser
+ *
+ * Gets the currently-selected font features.
+ *
+ * Returns: the currently selected font features
+ *
+ * Since: 3.24
+ */
+char *
+gtk_font_chooser_get_font_features (GtkFontChooser *fontchooser)
+{
+ char *text;
+
+ g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
+
+ g_object_get (fontchooser, "font-features", &text, NULL);
+
+ return text;
+}
+
+/**
+ * gtk_font_chooser_get_language:
+ * @fontchooser: a #GtkFontChooser
+ *
+ * Gets the language that is used for font features.
+ *
+ * Returns: the currently selected language
+ *
+ * Since: 3.24
+ */
+char *
+gtk_font_chooser_get_language (GtkFontChooser *fontchooser)
+{
+ char *text;
+
+ g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
+
+ g_object_get (fontchooser, "language", &text, NULL);
+
+ return text;
+}
+
+/**
+ * gtk_font_chooser_set_language:
+ * @fontchooser: a #GtkFontChooser
+ * @language: a language
+ *
+ * Sets the language to use for font features.
+ *
+ * Since: 3.24
+ */
+void
+gtk_font_chooser_set_language (GtkFontChooser *fontchooser,
+ const char *language)
+{
+ g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
+
+ g_object_set (fontchooser, "language", language, NULL);
+}
diff --git a/gtk/gtkfontchooser.h b/gtk/gtkfontchooser.h
index f4bdaae2c4..73ed983af3 100644
--- a/gtk/gtkfontchooser.h
+++ b/gtk/gtkfontchooser.h
@@ -145,7 +145,19 @@ void gtk_font_chooser_set_font_map (GtkFontChooser *fo
GDK_AVAILABLE_IN_3_18
PangoFontMap * gtk_font_chooser_get_font_map (GtkFontChooser *fontchooser);
-
+GDK_AVAILABLE_IN_3_24
+void gtk_font_chooser_set_level (GtkFontChooser *fontchooser,
+ GtkFontChooserLevel level);
+GDK_AVAILABLE_IN_3_24
+GtkFontChooserLevel
+ gtk_font_chooser_get_level (GtkFontChooser *fontchooser);
+GDK_AVAILABLE_IN_3_24
+char * gtk_font_chooser_get_font_features (GtkFontChooser *fontchooser);
+GDK_AVAILABLE_IN_3_24
+char * gtk_font_chooser_get_language (GtkFontChooser *fontchooser);
+GDK_AVAILABLE_IN_3_24
+void gtk_font_chooser_set_language (GtkFontChooser *fontchooser,
+ const char *language);
G_END_DECLS
diff --git a/gtk/gtkfontchooserdialog.c b/gtk/gtkfontchooserdialog.c
index 7d9a9471c4..723412f2a8 100644
--- a/gtk/gtkfontchooserdialog.c
+++ b/gtk/gtkfontchooserdialog.c
@@ -222,7 +222,7 @@ gtk_font_chooser_dialog_class_init (GtkFontChooserDialogClass *klass)
/* Bind class to template
*/
gtk_widget_class_set_template_from_resource (widget_class,
- "/org/gtk/libgtk/ui/gtkfontchooserdialog.ui");
+ "/org/gtk/libgtk/ui/gtkfontchooserdialog.ui");
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserDialog, fontchooser);
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserDialog, select_button);
diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c
index 3749e8968c..b34f28fcda 100644
--- a/gtk/gtkfontchooserwidget.c
+++ b/gtk/gtkfontchooserwidget.c
@@ -118,13 +118,12 @@ struct _GtkFontChooserWidgetPrivate
GtkWidget *axis_grid;
GtkWidget *feature_box;
- GtkWidget *feature_language_combo;
PangoFontMap *font_map;
PangoFontDescription *font_desc;
char *font_features;
- PangoLanguage *font_language;
+ PangoLanguage *language;
GtkTreeIter font_iter; /* invalid if font not available or pointer into model
(not filter_model) to the row containing font */
GtkFontFilterFunc filter_func;
@@ -222,14 +221,16 @@ static void gtk_font_chooser_widget_cell_data_func (GtkTreeViewColum
static void selection_changed (GtkTreeSelection *selection,
GtkFontChooserWidget *fontchooser);
static void update_font_features (GtkFontChooserWidget *fontchooser);
-static void update_language (GtkFontChooserWidget *fontchooser);
static void gtk_font_chooser_widget_set_level (GtkFontChooserWidget *fontchooser,
GtkFontChooserLevel level);
static GtkFontChooserLevel gtk_font_chooser_widget_get_level (GtkFontChooserWidget *fontchooser);
+static void gtk_font_chooser_widget_set_language (GtkFontChooserWidget *fontchooser,
+ const char *language);
static void selection_changed (GtkTreeSelection *selection,
GtkFontChooserWidget *fontchooser);
+static void update_font_features (GtkFontChooserWidget *fontchooser);
static void gtk_font_chooser_widget_iface_init (GtkFontChooserIface *iface);
@@ -320,6 +321,9 @@ gtk_font_chooser_widget_set_property (GObject *object,
case GTK_FONT_CHOOSER_PROP_LEVEL:
gtk_font_chooser_widget_set_level (fontchooser, g_value_get_flags (value));
break;
+ case GTK_FONT_CHOOSER_PROP_LANGUAGE:
+ gtk_font_chooser_widget_set_language (fontchooser, g_value_get_string (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -358,7 +362,7 @@ gtk_font_chooser_widget_get_property (GObject *object,
g_value_set_string (value, fontchooser->priv->font_features);
break;
case GTK_FONT_CHOOSER_PROP_LANGUAGE:
- g_value_set_string (value, pango_language_to_string (fontchooser->priv->font_language));
+ g_value_set_string (value, pango_language_to_string (fontchooser->priv->language));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -617,8 +621,8 @@ gtk_font_chooser_widget_update_preview_attributes (GtkFontChooserWidget *fontcho
pango_attr_list_insert (attrs, pango_attr_font_desc_new (priv->font_desc));
if (priv->font_features)
pango_attr_list_insert (attrs, pango_attr_font_features_new (priv->font_features));
- if (priv->font_language)
- pango_attr_list_insert (attrs, pango_attr_language_new (priv->font_language));
+ if (priv->language)
+ pango_attr_list_insert (attrs, pango_attr_language_new (priv->language));
gtk_entry_set_attributes (GTK_ENTRY (priv->preview), attrs);
pango_attr_list_unref (attrs);
@@ -717,7 +721,6 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass)
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, stack);
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, font_name_label);
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, feature_box);
- gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, feature_language_combo);
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, axis_grid);
gtk_widget_class_bind_template_callback (widget_class, text_changed_cb);
@@ -732,9 +735,8 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass)
gtk_widget_class_bind_template_callback (widget_class, size_change_cb);
gtk_widget_class_bind_template_callback (widget_class, output_cb);
gtk_widget_class_bind_template_callback (widget_class, selection_changed);
- gtk_widget_class_bind_template_callback (widget_class, update_language);
- gtk_widget_class_set_css_name (widget_class, "fontchooser");
+ gtk_widget_class_set_css_name (widget_class, I_("fontchooser"));
}
static void
@@ -827,6 +829,10 @@ gtk_font_chooser_widget_init (GtkFontChooserWidget *fontchooser)
priv->preview_text = g_strdup (pango_language_get_sample_string (NULL));
priv->show_preview_entry = TRUE;
priv->font_desc = pango_font_description_new ();
+ priv->level = GTK_FONT_CHOOSER_LEVEL_FAMILY |
+ GTK_FONT_CHOOSER_LEVEL_STYLE |
+ GTK_FONT_CHOOSER_LEVEL_SIZE;
+ priv->language = pango_language_get_default ();
/* Set default preview text */
gtk_entry_set_text (GTK_ENTRY (priv->preview), priv->preview_text);
@@ -1644,102 +1650,28 @@ gtk_font_chooser_widget_update_font_variations (GtkFontChooserWidget *fontchoose
/* OpenType features */
+/* look for a lang / script combination that matches the
+ * language property and is supported by the hb_face. If
+ * none is found, return the default lang / script tags.
+ */
static void
-add_script (GtkListStore *store,
- guint script_index,
- hb_tag_t script,
- guint lang_index,
- hb_tag_t lang)
-{
- char langbuf[5];
- const char *langname;
-
- if (lang == HB_OT_TAG_DEFAULT_LANGUAGE)
- langname = C_("Language", "Default");
- else
- {
- langname = get_language_name_for_tag (lang);
- if (!langname)
- {
- hb_tag_to_string (lang, langbuf);
- langbuf[4] = 0;
- langname = langbuf;
- }
- }
-
- gtk_list_store_insert_with_values (store, NULL, -1,
- 0, langname,
- 1, script_index,
- 2, lang_index,
- 3, lang,
- -1);
-}
-
-static int
-feature_language_sort_func (GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data)
-{
- char *sa, *sb;
- int ret;
-
- gtk_tree_model_get (model, a, 0, &sa, -1);
- gtk_tree_model_get (model, b, 0, &sb, -1);
-
- ret = strcmp (sa, sb);
-
- g_free (sa);
- g_free (sb);
-
- return ret;
-}
-
-typedef struct {
- hb_tag_t script_tag;
- hb_tag_t lang_tag;
- unsigned int script_index;
- unsigned int lang_index;
-} TagPair;
-
-static guint
-tag_pair_hash (gconstpointer data)
-{
- const TagPair *pair = data;
-
- return pair->script_tag + pair->lang_tag;
-}
-
-static gboolean
-tag_pair_equal (gconstpointer a, gconstpointer b)
-{
- const TagPair *pair_a = a;
- const TagPair *pair_b = b;
-
- return pair_a->script_tag == pair_b->script_tag && pair_a->lang_tag == pair_b->lang_tag;
-}
-
-static void
-update_language_combo (GtkFontChooserWidget *fontchooser,
- hb_face_t *hb_face)
+find_language_and_script (GtkFontChooserWidget *fontchooser,
+ hb_face_t *hb_face,
+ hb_tag_t *lang_tag,
+ hb_tag_t *script_tag)
{
GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
- GtkListStore *store;
gint i, j, k;
hb_tag_t scripts[80];
unsigned int n_scripts;
unsigned int count;
hb_tag_t table[2] = { HB_OT_TAG_GSUB, HB_OT_TAG_GPOS };
- GHashTable *tags;
- GHashTableIter iter;
- TagPair *pair;
+ hb_language_t lang;
+ const char *langname, *p;
- tags = g_hash_table_new_full (tag_pair_hash, tag_pair_equal, g_free, NULL);
-
- pair = g_new (TagPair, 1);
- pair->script_tag = HB_OT_TAG_DEFAULT_SCRIPT;
- pair->lang_tag = HB_OT_TAG_DEFAULT_LANGUAGE;
- g_hash_table_add (tags, pair);
+ langname = pango_language_to_string (priv->language);
+ p = strchr (langname, '-');
+ lang = hb_language_from_string (langname, p ? p - langname : -1);
n_scripts = 0;
for (i = 0; i < 2; i++)
@@ -1764,36 +1696,25 @@ update_language_combo (GtkFontChooserWidget *fontchooser,
for (k = 0; k < n_languages; k++)
{
- pair = g_new (TagPair, 1);
- pair->script_tag = scripts[j];
- pair->lang_tag = languages[k];
- pair->script_index = j;
- pair->lang_index = k;
- g_hash_table_add (tags, pair);
+ if (lang == hb_ot_tag_to_language (languages[k]))
+ {
+ *script_tag = scripts[j];
+ *lang_tag = languages[k];
+ return;
+ }
}
}
- store = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT);
-
- g_hash_table_iter_init (&iter, tags);
- while (g_hash_table_iter_next (&iter, (gpointer *)&pair, NULL))
- add_script (store, pair->script_index, pair->script_tag, pair->lang_index, pair->lang_tag);
-
- g_hash_table_unref (tags);
-
- gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (store),
- feature_language_sort_func, NULL, NULL);
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
- GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
- GTK_SORT_ASCENDING);
- gtk_combo_box_set_model (GTK_COMBO_BOX (priv->feature_language_combo), GTK_TREE_MODEL (store));
- gtk_combo_box_set_active (GTK_COMBO_BOX (priv->feature_language_combo), 0);
+ *lang_tag = HB_OT_TAG_DEFAULT_LANGUAGE;
+ *script_tag = HB_OT_TAG_DEFAULT_SCRIPT;
}
typedef struct {
hb_tag_t tag;
const char *name;
+ GtkWidget *top;
GtkWidget *feat;
+ GtkWidget *example;
} FeatureItem;
static const char *
@@ -1849,6 +1770,180 @@ feat_pressed (GtkGesture *gesture,
set_inconsistent (GTK_CHECK_BUTTON (feat), !inconsistent);
}
+static char *
+find_affected_text (hb_tag_t feature_tag,
+ hb_face_t *hb_face,
+ hb_tag_t script_tag,
+ hb_tag_t lang_tag,
+ int max_chars)
+{
+ unsigned int script_index = 0;
+ unsigned int lang_index = 0;
+ unsigned int feature_index = 0;
+ GString *chars;
+
+ chars = g_string_new ("");
+
+ hb_ot_layout_table_find_script (hb_face, HB_OT_TAG_GSUB, script_tag, &script_index);
+ hb_ot_layout_script_find_language (hb_face, HB_OT_TAG_GSUB, script_index, lang_tag, &lang_index);
+ if (hb_ot_layout_language_find_feature (hb_face, HB_OT_TAG_GSUB, script_index, lang_index, feature_tag, &feature_index))
+ {
+ unsigned int lookup_indexes[32];
+ unsigned int lookup_count = 32;
+ int count;
+ int n_chars = 0;
+
+ count = hb_ot_layout_feature_get_lookups (hb_face,
+ HB_OT_TAG_GSUB,
+ feature_index,
+ 0,
+ &lookup_count,
+ lookup_indexes);
+ if (count > 0)
+ {
+ hb_set_t* glyphs_before = NULL;
+ hb_set_t* glyphs_input = NULL;
+ hb_set_t* glyphs_after = NULL;
+ hb_set_t* glyphs_output = NULL;
+ hb_font_t *hb_font = NULL;
+ hb_codepoint_t gid;
+
+ glyphs_input = hb_set_create ();
+
+ // XXX For now, just look at first index
+ hb_ot_layout_lookup_collect_glyphs (hb_face,
+ HB_OT_TAG_GSUB,
+ lookup_indexes[0],
+ glyphs_before,
+ glyphs_input,
+ glyphs_after,
+ glyphs_output);
+
+ hb_font = hb_font_create (hb_face);
+ hb_ft_font_set_funcs (hb_font);
+
+ gid = -1;
+ while (hb_set_next (glyphs_input, &gid)) {
+ hb_codepoint_t ch;
+ if (n_chars == max_chars)
+ {
+ g_string_append (chars, "…");
+ break;
+ }
+ for (ch = 0; ch < 0xffff; ch++) {
+ hb_codepoint_t glyph = 0;
+ hb_font_get_nominal_glyph (hb_font, ch, &glyph);
+ if (glyph == gid) {
+ g_string_append_unichar (chars, (gunichar)ch);
+ n_chars++;
+ break;
+ }
+ }
+ }
+ hb_set_destroy (glyphs_input);
+ hb_font_destroy (hb_font);
+ }
+ }
+
+ return g_string_free (chars, FALSE);
+}
+
+static void
+update_feature_example (FeatureItem *item,
+ hb_face_t *hb_face,
+ hb_tag_t script_tag,
+ hb_tag_t lang_tag,
+ PangoFontDescription *font_desc)
+{
+ const char *letter_case[] = { "smcp", "c2sc", "pcap", "c2pc", "unic", "cpsp", "case", NULL };
+ const char *number_case[] = { "xxxx", "lnum", "onum", NULL };
+ const char *number_spacing[] = { "xxxx", "pnum", "tnum", NULL };
+ const char *number_formatting[] = { "zero", "nalt", NULL };
+ const char *char_variants[] = {
+ "swsh", "cswh", "calt", "falt", "hist", "salt", "jalt", "titl", "rand",
+ "ss01", "ss02", "ss03", "ss04", "ss05", "ss06", "ss07", "ss08", "ss09", "ss10",
+ "ss11", "ss12", "ss13", "ss14", "ss15", "ss16", "ss17", "ss18", "ss19", "ss20",
+ NULL };
+
+ if (g_strv_contains (number_case, item->name) ||
+ g_strv_contains (number_spacing, item->name))
+ {
+ PangoAttrList *attrs;
+ PangoAttribute *attr;
+ PangoFontDescription *desc;
+ char *str;
+
+ attrs = pango_attr_list_new ();
+
+ desc = pango_font_description_copy (font_desc);
+ pango_font_description_unset_fields (desc, PANGO_FONT_MASK_SIZE);
+ pango_attr_list_insert (attrs, pango_attr_font_desc_new (desc));
+ pango_font_description_free (desc);
+ str = g_strconcat (item->name, " 1", NULL);
+ attr = pango_attr_font_features_new (str);
+ pango_attr_list_insert (attrs, attr);
+
+ gtk_label_set_text (GTK_LABEL (item->example), "0123456789");
+ gtk_label_set_attributes (GTK_LABEL (item->example), attrs);
+
+ pango_attr_list_unref (attrs);
+ }
+ else if (g_strv_contains (letter_case, item->name) ||
+ g_strv_contains (number_formatting, item->name) ||
+ g_strv_contains (char_variants, item->name))
+ {
+ char *input = NULL;
+ char *text;
+
+ if (strcmp (item->name, "case") == 0)
+ input = g_strdup ("A-B[Cq]");
+ else if (g_strv_contains (letter_case, item->name))
+ input = g_strdup ("AaBbCc…");
+ else if (strcmp (item->name, "zero") == 0)
+ input = g_strdup ("0");
+ else if (strcmp (item->name, "nalt") == 0)
+ input = find_affected_text (item->tag, hb_face, script_tag, lang_tag, 3);
+ else
+ input = find_affected_text (item->tag, hb_face, script_tag, lang_tag, 10);
+
+ if (input[0] != '\0')
+ {
+ PangoAttrList *attrs;
+ PangoAttribute *attr;
+ PangoFontDescription *desc;
+ char *str;
+
+ text = g_strconcat (input, " ⟶ ", input, NULL);
+
+ attrs = pango_attr_list_new ();
+
+ desc = pango_font_description_copy (font_desc);
+ pango_font_description_unset_fields (desc, PANGO_FONT_MASK_SIZE);
+ pango_attr_list_insert (attrs, pango_attr_font_desc_new (desc));
+ pango_font_description_free (desc);
+ str = g_strconcat (item->name, " 0", NULL);
+ attr = pango_attr_font_features_new (str);
+ attr->start_index = 0;
+ attr->end_index = strlen (input);
+ pango_attr_list_insert (attrs, attr);
+ str = g_strconcat (item->name, " 1", NULL);
+ attr = pango_attr_font_features_new (str);
+ attr->start_index = strlen (input) + strlen (" ⟶ ");
+ attr->end_index = attr->start_index + strlen (input);
+ pango_attr_list_insert (attrs, attr);
+
+ gtk_label_set_text (GTK_LABEL (item->example), text);
+ gtk_label_set_attributes (GTK_LABEL (item->example), attrs);
+
+ g_free (text);
+ pango_attr_list_unref (attrs);
+ }
+ else
+ gtk_label_set_markup (GTK_LABEL (item->example), "");
+ g_free (input);
+ }
+}
+
static void
add_check_group (GtkFontChooserWidget *fontchooser,
const char *title,
@@ -1861,7 +1956,8 @@ add_check_group (GtkFontChooserWidget *fontchooser,
int i;
group = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
- gtk_widget_set_halign (group, GTK_ALIGN_START);
+ gtk_widget_show (group);
+ gtk_widget_set_halign (group, GTK_ALIGN_FILL);
label = gtk_label_new (title);
gtk_widget_show (label);
@@ -1880,12 +1976,14 @@ add_check_group (GtkFontChooserWidget *fontchooser,
GtkWidget *feat;
FeatureItem *item;
GtkGesture *gesture;
+ GtkWidget *box;
+ GtkWidget *example;
tag = hb_tag_from_string (tags[i], -1);
feat = gtk_check_button_new_with_label (get_feature_display_name (tag));
+ gtk_widget_show (feat);
set_inconsistent (GTK_CHECK_BUTTON (feat), TRUE);
-
g_signal_connect_swapped (feat, "notify::active", G_CALLBACK (update_font_features), fontchooser);
g_signal_connect_swapped (feat, "notify::inconsistent", G_CALLBACK (update_font_features), fontchooser);
g_signal_connect (feat, "clicked", G_CALLBACK (feat_clicked), NULL);
@@ -1896,12 +1994,24 @@ add_check_group (GtkFontChooserWidget *fontchooser,
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY);
g_signal_connect (gesture, "pressed", G_CALLBACK (feat_pressed), feat);
- gtk_container_add (GTK_CONTAINER (group), feat);
+ example = gtk_label_new ("");
+ gtk_widget_show (example);
+ gtk_label_set_selectable (GTK_LABEL (example), TRUE);
+ gtk_widget_set_halign (example, GTK_ALIGN_START);
+
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
+ gtk_widget_show (box);
+ gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
+ gtk_container_add (GTK_CONTAINER (box), feat);
+ gtk_container_add (GTK_CONTAINER (box), example);
+ gtk_container_add (GTK_CONTAINER (group), box);
item = g_new (FeatureItem, 1);
item->name = tags[i];
item->tag = tag;
+ item->top = box;
item->feat = feat;
+ item->example = example;
priv->feature_items = g_list_prepend (priv->feature_items, item);
}
@@ -1922,7 +2032,8 @@ add_radio_group (GtkFontChooserWidget *fontchooser,
PangoAttrList *attrs;
group = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
- gtk_widget_set_halign (group, GTK_ALIGN_START);
+ gtk_widget_show (group);
+ gtk_widget_set_halign (group, GTK_ALIGN_FILL);
label = gtk_label_new (title);
gtk_widget_show (label);
@@ -1941,24 +2052,39 @@ add_radio_group (GtkFontChooserWidget *fontchooser,
GtkWidget *feat;
FeatureItem *item;
const char *name;
+ GtkWidget *box;
+ GtkWidget *example;
tag = hb_tag_from_string (tags[i], -1);
name = get_feature_display_name (tag);
feat = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (group_button),
name ? name : _("Default"));
+ gtk_widget_show (feat);
if (group_button == NULL)
group_button = feat;
g_signal_connect_swapped (feat, "notify::active", G_CALLBACK (update_font_features), fontchooser);
g_object_set_data (G_OBJECT (feat), "default", group_button);
- gtk_container_add (GTK_CONTAINER (group), feat);
+ example = gtk_label_new ("");
+ gtk_widget_show (example);
+ gtk_label_set_selectable (GTK_LABEL (example), TRUE);
+ gtk_widget_set_halign (example, GTK_ALIGN_START);
+
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
+ gtk_widget_show (box);
+ gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
+ gtk_container_add (GTK_CONTAINER (box), feat);
+ gtk_container_add (GTK_CONTAINER (box), example);
+ gtk_container_add (GTK_CONTAINER (group), box);
item = g_new (FeatureItem, 1);
item->name = tags[i];
item->tag = tag;
+ item->top = box;
item->feat = feat;
+ item->example = example;
priv->feature_items = g_list_prepend (priv->feature_items, item);
}
@@ -1974,7 +2100,11 @@ gtk_font_chooser_widget_populate_features (GtkFontChooserWidget *fontchooser)
const char *number_case[] = { "xxxx", "lnum", "onum", NULL };
const char *number_spacing[] = { "xxxx", "pnum", "tnum", NULL };
const char *number_formatting[] = { "zero", "nalt", NULL };
- const char *char_variants[] = { "swsh", "cswh", "calt", "falt", "hist", "salt", "jalt", "titl", "rand", NULL };
+ const char *char_variants[] = {
+ "swsh", "cswh", "calt", "falt", "hist", "salt", "jalt", "titl", "rand",
+ "ss01", "ss02", "ss03", "ss04", "ss05", "ss06", "ss07", "ss08", "ss09", "ss10",
+ "ss11", "ss12", "ss13", "ss14", "ss15", "ss16", "ss17", "ss18", "ss19", "ss20",
+ NULL };
add_check_group (fontchooser, _("Ligatures"), ligatures);
add_check_group (fontchooser, _("Letter Case"), letter_case);
@@ -1993,21 +2123,19 @@ gtk_font_chooser_widget_update_font_features (GtkFontChooserWidget *fontchooser)
PangoFont *pango_font;
FT_Face ft_face;
hb_font_t *hb_font;
- hb_tag_t script_tag = FT_MAKE_TAG('l','a','t','n');
- hb_tag_t lang_tag = FT_MAKE_TAG('D','E','U',' ');
+ hb_tag_t script_tag;
+ hb_tag_t lang_tag;
guint script_index = 0;
guint lang_index = 0;
int i, j;
GList *l;
gboolean has_feature = FALSE;
- gtk_widget_hide (priv->feature_language_combo);
-
for (l = priv->feature_items; l; l = l->next)
{
FeatureItem *item = l->data;
- gtk_widget_hide (item->feat);
- gtk_widget_hide (gtk_widget_get_parent (item->feat));
+ gtk_widget_hide (item->top);
+ gtk_widget_hide (gtk_widget_get_parent (item->top));
}
if ((priv->level & GTK_FONT_CHOOSER_LEVEL_FEATURES) == 0)
@@ -2028,7 +2156,7 @@ gtk_font_chooser_widget_update_font_features (GtkFontChooserWidget *fontchooser)
hb_face = hb_font_get_face (hb_font);
- update_language_combo (fontchooser, hb_face);
+ find_language_and_script (fontchooser, hb_face, &lang_tag, &script_tag);
n_features = 0;
for (i = 0; i < 2; i++)
@@ -2055,14 +2183,15 @@ gtk_font_chooser_widget_update_font_features (GtkFontChooserWidget *fontchooser)
continue;
has_feature = TRUE;
- gtk_widget_show (item->feat);
- gtk_widget_show (gtk_widget_get_parent (item->feat));
- gtk_widget_show (priv->feature_language_combo);
+ gtk_widget_show (item->top);
+ gtk_widget_show (gtk_widget_get_parent (item->top));
+
+ update_feature_example (item, hb_face, script_tag, lang_tag, priv->font_desc);
if (GTK_IS_RADIO_BUTTON (item->feat))
{
GtkWidget *def = GTK_WIDGET (g_object_get_data (G_OBJECT (item->feat), "default"));
- gtk_widget_show (def);
+ gtk_widget_show (gtk_widget_get_parent (def));
}
else if (GTK_IS_CHECK_BUTTON (item->feat))
{
@@ -2127,33 +2256,6 @@ update_font_features (GtkFontChooserWidget *fontchooser)
gtk_font_chooser_widget_update_preview_attributes (fontchooser);
}
-static void
-update_language (GtkFontChooserWidget *fontchooser)
-{
- GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
- GtkTreeIter iter;
-
- if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->feature_language_combo), &iter))
- {
- GtkTreeModel *model;
- PangoLanguage *lang;
- hb_tag_t lang_tag;
-
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (priv->feature_language_combo));
- gtk_tree_model_get (model, &iter,
- 3, &lang_tag,
- -1);
- lang = pango_language_from_string (hb_language_to_string (hb_ot_tag_to_language (lang_tag)));
- if (priv->font_language != lang)
- {
- priv->font_language = lang;
- g_object_notify (G_OBJECT (fontchooser), "language");
- }
- }
-
- gtk_font_chooser_widget_update_preview_attributes (fontchooser);
-}
-
#endif
static void
@@ -2383,6 +2485,23 @@ gtk_font_chooser_widget_get_level (GtkFontChooserWidget *fontchooser)
}
static void
+gtk_font_chooser_widget_set_language (GtkFontChooserWidget *fontchooser,
+ const char *language)
+{
+ GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
+ PangoLanguage *lang;
+
+ lang = pango_language_from_string (language);
+ if (priv->language == lang)
+ return;
+
+ priv->language = lang;
+ g_object_notify (G_OBJECT (fontchooser), "language");
+
+ gtk_font_chooser_widget_update_preview_attributes (fontchooser);
+}
+
+static void
gtk_font_chooser_widget_iface_init (GtkFontChooserIface *iface)
{
iface->get_font_family = gtk_font_chooser_widget_get_family;
diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c
index ae62ac81b8..6ec29dd193 100644
--- a/gtk/gtkimcontextsimple.c
+++ b/gtk/gtkimcontextsimple.c
@@ -59,63 +59,19 @@
* Compose file). The syntax of these files is described in the Compose(5)
* manual page.
*
- * ## Unicode characters
- *
* GtkIMContextSimple also supports numeric entry of Unicode characters
* by typing Ctrl-Shift-u, followed by a hexadecimal Unicode codepoint.
* For example, Ctrl-Shift-u 1 2 3 Enter yields U+0123 LATIN SMALL LETTER
* G WITH CEDILLA, i.e. ģ.
- *
- * ## Emoji
- *
- * GtkIMContextSimple also supports entry of Emoji by their name.
- * This works by first typing Ctrl-Shift-e, followed by an Emoji name.
- *
- * The following names are supported:
- * - :-) 🙂
- * - 8-) 😍
- * - <3 ❤
- * - kiss 💋
- * - grin 😁
- * - joy 😂
- * - :-* 😚
- * - xD 😆
- * - like 👍
- * - dislike 👎
- * - up 👆
- * - v ✌
- * - ok 👌
- * - B-) 😎
- * - ;-) 😉
- * - ;-P 😜
- * - :-p 😋
- * - 3( 😔
- * - :-( 😞
- * - :] 😏
- * - :'( 😢
- * - :_( 😭
- * - :(( 😩
- * - :o 😨
- * - :| 😐
- * - 3-) 😌
- * - >( 😠
- * - >(( 😡
- * - O:) 😇
- * - ;o 😰
- * - 8| 😳
- * - 8o 😲
- * - :X 😷
- * - }:) 😈
*/
struct _GtkIMContextSimplePrivate
{
- guint16 compose_buffer[MAX(GTK_MAX_COMPOSE_LEN + 1, 9)];
+ guint16 compose_buffer[GTK_MAX_COMPOSE_LEN + 1];
gunichar tentative_match;
gint tentative_match_len;
guint in_hex_sequence : 1;
- guint in_emoji_sequence : 1;
guint modifiers_dropped : 1;
};
@@ -339,10 +295,9 @@ gtk_im_context_simple_commit_char (GtkIMContext *context,
len = g_unichar_to_utf8 (ch, buf);
buf[len] = '\0';
- if (priv->tentative_match || priv->in_hex_sequence || priv->in_emoji_sequence)
+ if (priv->tentative_match || priv->in_hex_sequence)
{
priv->in_hex_sequence = FALSE;
- priv->in_emoji_sequence = FALSE;
priv->tentative_match = 0;
priv->tentative_match_len = 0;
g_signal_emit_by_name (context_simple, "preedit-changed");
@@ -910,110 +865,6 @@ check_hex (GtkIMContextSimple *context_simple,
return TRUE;
}
-typedef struct {
- const char *name;
- gunichar ch;
-} EmojiItem;
-
-static EmojiItem emoji[] = {
- { ":-)", 0x1f642 },
- { "8-)", 0x1f60d },
- { "<3", 0x02764 },
- { "kiss", 0x1f48b },
- { "grin", 0x1f601 },
- { "joy", 0x1f602 },
- { ":-*", 0x1f61a },
- { "xD", 0x1f606 },
- { "like", 0x1f44d },
- { "dislike", 0x1f44e },
- { "up", 0x1f446 },
- { "v", 0x0270c },
- { "ok", 0x1f44c },
- { "B-)", 0x1f60e },
- { ":-D", 0x1f603 },
- { ";-)", 0x1f609 },
- { ";-P", 0x1f61c },
- { ":-p", 0x1f60b },
- { "3(", 0x1f614 },
- { ":-(", 0x1f61e },
- { ":]", 0x1f60f },
- { ":'(", 0x1f622 },
- { ":_(", 0x1f62d },
- { ":((", 0x1f629 },
- { ":o", 0x1f628 },
- { ":|", 0x1f610 },
- { "3-)", 0x1f60c },
- { ">(", 0x1f620 },
- { ">((", 0x1f621 },
- { "O:)", 0x1f607 },
- { ";o", 0x1f630 },
- { "8|", 0x1f633 },
- { "8o", 0x1f632 },
- { ":X", 0x1f637 },
- { "}:)", 0x1f608 },
- { NULL, 0 }
-};
-
-static gboolean
-check_emoji (GtkIMContextSimple *context_simple,
- gint n_compose)
-{
- GtkIMContextSimplePrivate *priv = context_simple->priv;
- GString *str;
- gint i;
- gchar buf[7];
- char *lower;
- gboolean has_completion;
-
- priv->tentative_match = 0;
- priv->tentative_match_len = 0;
-
- str = g_string_new (NULL);
-
- i = 0;
- while (i < n_compose)
- {
- gunichar ch;
-
- ch = gdk_keyval_to_unicode (priv->compose_buffer[i]);
-
- if (ch == 0)
- return FALSE;
-
- buf[g_unichar_to_utf8 (ch, buf)] = '\0';
-
- g_string_append (str, buf);
-
- ++i;
- }
-
- lower = g_utf8_strdown (str->str, str->len);
-
- has_completion = FALSE;
- for (i = 0; emoji[i].name; i++)
- {
- if (strcmp (str->str, emoji[i].name) == 0 ||
- strcmp (lower, emoji[i].name) == 0)
- {
- priv->tentative_match = emoji[i].ch;
- priv->tentative_match_len = n_compose;
- break;
- }
-
- if (!has_completion &&
- (g_str_has_prefix (emoji[i].name, str->str) ||
- g_str_has_prefix (emoji[i].name, lower)))
- {
- has_completion = TRUE;
- }
- }
-
- g_string_free (str, TRUE);
- g_free (lower);
-
- return priv->tentative_match != 0 || has_completion;
-}
-
static void
beep_window (GdkWindow *window)
{
@@ -1133,12 +984,6 @@ canonical_hex_keyval (GdkEventKey *event)
return 0;
}
-static guint
-canonical_emoji_keyval (GdkEventKey *event)
-{
- return event->keyval;
-}
-
static gboolean
gtk_im_context_simple_filter_keypress (GtkIMContext *context,
GdkEventKey *event)
@@ -1146,17 +991,15 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
GtkIMContextSimple *context_simple = GTK_IM_CONTEXT_SIMPLE (context);
GtkIMContextSimplePrivate *priv = context_simple->priv;
GdkDisplay *display = gdk_window_get_display (event->window);
- GSList *tmp_list;
+ GSList *tmp_list;
int n_compose = 0;
GdkModifierType hex_mod_mask;
gboolean have_hex_mods;
gboolean is_hex_start;
- gboolean is_end;
- gboolean is_emoji_start;
+ gboolean is_hex_end;
gboolean is_backspace;
gboolean is_escape;
guint hex_keyval;
- guint emoji_keyval;
int i;
gboolean compose_finish;
gboolean compose_match;
@@ -1167,43 +1010,38 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
if (event->type == GDK_KEY_RELEASE)
{
- if ((event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ||
+ if (priv->in_hex_sequence &&
+ (event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ||
event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R))
{
- if ((priv->in_hex_sequence || priv->in_emoji_sequence) &&
- priv->tentative_match &&
+ if (priv->tentative_match &&
g_unichar_validate (priv->tentative_match))
{
gtk_im_context_simple_commit_char (context, priv->tentative_match);
priv->compose_buffer[0] = 0;
- return TRUE;
}
- else if (priv->in_emoji_sequence ||
- (priv->in_hex_sequence && n_compose == 0))
+ else if (n_compose == 0)
{
priv->modifiers_dropped = TRUE;
-
- return TRUE;
}
- else if (priv->in_hex_sequence)
+ else
{
/* invalid hex sequence */
beep_window (event->window);
-
+
priv->tentative_match = 0;
priv->in_hex_sequence = FALSE;
- priv->in_emoji_sequence = FALSE;
priv->compose_buffer[0] = 0;
-
+
g_signal_emit_by_name (context_simple, "preedit-changed");
g_signal_emit_by_name (context_simple, "preedit-end");
-
- return TRUE;
}
- }
- return FALSE;
+ return TRUE;
+ }
+ else
+ return FALSE;
}
/* Ignore modifier key presses */
@@ -1215,21 +1053,19 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
GDK_MODIFIER_INTENT_PRIMARY_ACCELERATOR);
hex_mod_mask |= GDK_SHIFT_MASK;
- if ((priv->in_hex_sequence || priv->in_emoji_sequence) && priv->modifiers_dropped)
+ if (priv->in_hex_sequence && priv->modifiers_dropped)
have_hex_mods = TRUE;
else
have_hex_mods = (event->state & (hex_mod_mask)) == hex_mod_mask;
is_hex_start = event->keyval == GDK_KEY_U;
- is_emoji_start = (event->keyval == GDK_KEY_E) && !priv->in_hex_sequence;
- is_end = (event->keyval == GDK_KEY_space ||
- event->keyval == GDK_KEY_KP_Space ||
- event->keyval == GDK_KEY_Return ||
- event->keyval == GDK_KEY_ISO_Enter ||
- event->keyval == GDK_KEY_KP_Enter);
+ is_hex_end = (event->keyval == GDK_KEY_space ||
+ event->keyval == GDK_KEY_KP_Space ||
+ event->keyval == GDK_KEY_Return ||
+ event->keyval == GDK_KEY_ISO_Enter ||
+ event->keyval == GDK_KEY_KP_Enter);
is_backspace = event->keyval == GDK_KEY_BackSpace;
is_escape = event->keyval == GDK_KEY_Escape;
hex_keyval = canonical_hex_keyval (event);
- emoji_keyval = canonical_emoji_keyval (event);
/* If we are already in a non-hex sequence, or
* this keystroke is not hex modifiers + hex digit, don't filter
@@ -1239,11 +1075,10 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
* ISO_Level3_Switch.
*/
if (!have_hex_mods ||
- (n_compose > 0 && !priv->in_hex_sequence && !priv->in_emoji_sequence) ||
- (n_compose == 0 && !priv->in_hex_sequence && !priv->in_emoji_sequence &&
- !is_hex_start && !is_emoji_start) ||
+ (n_compose > 0 && !priv->in_hex_sequence) ||
+ (n_compose == 0 && !priv->in_hex_sequence && !is_hex_start) ||
(priv->in_hex_sequence && !hex_keyval &&
- !is_hex_start && !is_end && !is_escape && !is_backspace))
+ !is_hex_start && !is_hex_end && !is_escape && !is_backspace))
{
GdkModifierType no_text_input_mask;
@@ -1252,7 +1087,7 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
GDK_MODIFIER_INTENT_NO_TEXT_INPUT);
if (event->state & no_text_input_mask ||
- ((priv->in_hex_sequence || priv->in_emoji_sequence) && priv->modifiers_dropped &&
+ (priv->in_hex_sequence && priv->modifiers_dropped &&
(event->keyval == GDK_KEY_Return ||
event->keyval == GDK_KEY_ISO_Enter ||
event->keyval == GDK_KEY_KP_Enter)))
@@ -1262,21 +1097,17 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
}
/* Handle backspace */
- if ((priv->in_hex_sequence || priv->in_emoji_sequence) && have_hex_mods && is_backspace)
+ if (priv->in_hex_sequence && have_hex_mods && is_backspace)
{
if (n_compose > 0)
{
n_compose--;
priv->compose_buffer[n_compose] = 0;
- if (priv->in_hex_sequence)
- check_hex (context_simple, n_compose);
- else if (priv->in_emoji_sequence)
- check_emoji (context_simple, n_compose);
+ check_hex (context_simple, n_compose);
}
else
{
priv->in_hex_sequence = FALSE;
- priv->in_emoji_sequence = FALSE;
}
g_signal_emit_by_name (context_simple, "preedit-changed");
@@ -1296,7 +1127,7 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
gtk_im_context_simple_commit_char (context, priv->tentative_match);
priv->compose_buffer[0] = 0;
}
- else
+ else
{
/* invalid hex sequence */
if (n_compose > 0)
@@ -1322,20 +1153,6 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
return TRUE;
}
- /* Check for emoji sequence start */
- if (!priv->in_emoji_sequence && have_hex_mods && is_emoji_start)
- {
- priv->compose_buffer[0] = 0;
- priv->in_emoji_sequence = TRUE;
- priv->modifiers_dropped = FALSE;
- priv->tentative_match = 0;
-
- g_signal_emit_by_name (context_simple, "preedit-start");
- g_signal_emit_by_name (context_simple, "preedit-changed");
-
- return TRUE;
- }
-
/* Then, check for compose sequences */
if (priv->in_hex_sequence)
{
@@ -1344,54 +1161,29 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
else if (is_escape)
{
gtk_im_context_simple_reset (context);
+
return TRUE;
}
- else if (!is_end)
+ else if (!is_hex_end)
{
/* non-hex character in hex sequence */
beep_window (event->window);
+
return TRUE;
}
}
- else if (priv->in_emoji_sequence)
- {
- if (emoji_keyval)
- priv->compose_buffer[n_compose++] = emoji_keyval;
- else if (is_escape)
- {
- gtk_im_context_simple_reset (context);
- return TRUE;
- }
- else
- {
- beep_window (event->window);
- return TRUE;
- }
- }
else
priv->compose_buffer[n_compose++] = event->keyval;
- if (n_compose == MAX(GTK_MAX_COMPOSE_LEN + 1, 9))
- {
- beep_window (event->window);
- priv->tentative_match = 0;
- priv->in_hex_sequence = FALSE;
- priv->in_emoji_sequence = FALSE;
- priv->compose_buffer[0] = 0;
- g_signal_emit_by_name (context_simple, "preedit-changed");
-
- return TRUE;
- }
-
priv->compose_buffer[n_compose] = 0;
- if (priv->in_hex_sequence || priv->in_emoji_sequence)
+ if (priv->in_hex_sequence)
{
/* If the modifiers are still held down, consider the sequence again */
if (have_hex_mods)
{
/* space or return ends the sequence, and we eat the key */
- if (n_compose > 0 && is_end)
+ if (n_compose > 0 && is_hex_end)
{
if (priv->tentative_match &&
g_unichar_validate (priv->tentative_match))
@@ -1406,17 +1198,15 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
priv->tentative_match = 0;
priv->in_hex_sequence = FALSE;
- priv->in_emoji_sequence = FALSE;
priv->compose_buffer[0] = 0;
}
}
- else if ((priv->in_hex_sequence && !check_hex (context_simple, n_compose)) ||
- (priv->in_emoji_sequence && !check_emoji (context_simple, n_compose)))
+ else if (!check_hex (context_simple, n_compose))
beep_window (event->window);
-
+
g_signal_emit_by_name (context_simple, "preedit-changed");
- if (!priv->in_hex_sequence && !priv->in_emoji_sequence)
+ if (!priv->in_hex_sequence)
g_signal_emit_by_name (context_simple, "preedit-end");
return TRUE;
@@ -1540,10 +1330,9 @@ gtk_im_context_simple_reset (GtkIMContext *context)
priv->compose_buffer[0] = 0;
- if (priv->tentative_match || priv->in_hex_sequence || priv->in_emoji_sequence)
+ if (priv->tentative_match || priv->in_hex_sequence)
{
priv->in_hex_sequence = FALSE;
- priv->in_emoji_sequence = FALSE;
priv->tentative_match = 0;
priv->tentative_match_len = 0;
g_signal_emit_by_name (context_simple, "preedit-changed");
@@ -1562,11 +1351,11 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext *context,
char outbuf[37]; /* up to 6 hex digits */
int len = 0;
- if (priv->in_hex_sequence || priv->in_emoji_sequence)
+ if (priv->in_hex_sequence)
{
int hexchars = 0;
- outbuf[0] = priv->in_hex_sequence ? 'u' : 'e';
+ outbuf[0] = 'u';
len = 1;
while (priv->compose_buffer[hexchars] != 0)
@@ -1580,8 +1369,8 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext *context,
}
else if (priv->tentative_match)
len = g_unichar_to_utf8 (priv->tentative_match, outbuf);
-
- outbuf[len] = '\0';
+
+ outbuf[len] = '\0';
if (str)
*str = g_strdup (outbuf);
diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index 8f7715022f..8ab4634878 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -602,7 +602,6 @@ gtk_menu_class_init (GtkMenuClass *class)
* #GtkMenu:menu-type-hint.
*
* Since: 3.22
- * Stability: Unstable
*/
menu_signals[POPPED_UP] =
g_signal_new_class_handler (I_("popped-up"),
@@ -770,7 +769,6 @@ gtk_menu_class_init (GtkMenuClass *class)
* #GtkMenu:rect-anchor-dy, #GtkMenu:menu-type-hint, and #GtkMenu::popped-up.
*
* Since: 3.22
- * Stability: Unstable
*/
g_object_class_install_property (gobject_class,
PROP_ANCHOR_HINTS,
@@ -799,7 +797,6 @@ gtk_menu_class_init (GtkMenuClass *class)
* #GtkMenu:rect-anchor-dy, #GtkMenu:menu-type-hint, and #GtkMenu::popped-up.
*
* Since: 3.22
- * Stability: Unstable
*/
g_object_class_install_property (gobject_class,
PROP_RECT_ANCHOR_DX,
@@ -826,7 +823,6 @@ gtk_menu_class_init (GtkMenuClass *class)
* #GtkMenu:rect-anchor-dx, #GtkMenu:menu-type-hint, and #GtkMenu::popped-up.
*
* Since: 3.22
- * Stability: Unstable
*/
g_object_class_install_property (gobject_class,
PROP_RECT_ANCHOR_DY,
@@ -853,7 +849,6 @@ gtk_menu_class_init (GtkMenuClass *class)
* #GtkMenu:rect-anchor-dx, #GtkMenu:rect-anchor-dy, and #GtkMenu::popped-up.
*
* Since: 3.22
- * Stability: Unstable
*/
g_object_class_install_property (gobject_class,
PROP_MENU_TYPE_HINT,
@@ -2213,7 +2208,6 @@ get_device_for_event (const GdkEvent *event)
* #GtkMenu::popped-up signal to find out how it was actually positioned.
*
* Since: 3.22
- * Stability: Unstable
*/
void
gtk_menu_popup_at_rect (GtkMenu *menu,
@@ -2299,7 +2293,6 @@ gtk_menu_popup_at_rect (GtkMenu *menu,
* #GtkMenu::popped-up signal to find out how it was actually positioned.
*
* Since: 3.22
- * Stability: Unstable
*/
void
gtk_menu_popup_at_widget (GtkMenu *menu,
@@ -2381,7 +2374,6 @@ gtk_menu_popup_at_widget (GtkMenu *menu,
* out how it was actually positioned.
*
* Since: 3.22
- * Stability: Unstable
*/
void
gtk_menu_popup_at_pointer (GtkMenu *menu,
@@ -5282,13 +5274,13 @@ gtk_menu_position (GtkMenu *menu,
g_signal_connect (toplevel, "moved-to-rect", G_CALLBACK (moved_to_rect_cb),
menu);
- GDK_PRIVATE_CALL (gdk_window_move_to_rect) (toplevel,
- &rect,
- rect_anchor,
- menu_anchor,
- anchor_hints,
- rect_anchor_dx,
- rect_anchor_dy);
+ gdk_window_move_to_rect (toplevel,
+ &rect,
+ rect_anchor,
+ menu_anchor,
+ anchor_hints,
+ rect_anchor_dx,
+ rect_anchor_dy);
}
static void
diff --git a/gtk/gtkstyleprovider.h b/gtk/gtkstyleprovider.h
index cbfd9df2a2..2223b1767d 100644
--- a/gtk/gtkstyleprovider.h
+++ b/gtk/gtkstyleprovider.h
@@ -79,7 +79,7 @@ G_BEGIN_DECLS
* GTK_STYLE_PROVIDER_PRIORITY_USER:
*
* The priority used for the style information from
- * `~/.gtk-3.0.css`.
+ * `XDG_CONFIG_HOME/gtk-3.0/gtk.css`.
*
* You should not use priorities higher than this, to
* give the user the last word.
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 758e3e2168..44ae4fad91 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -10296,11 +10296,13 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
gint x2;
gint vertical_separator;
GtkCellRendererState flags = 0;
+ gint expander_size;
widget = GTK_WIDGET (tree_view);
context = gtk_widget_get_style_context (widget);
gtk_widget_style_get (widget,
+ "expander-size", &expander_size,
"vertical-separator", &vertical_separator,
NULL);
@@ -10335,6 +10337,21 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
gtk_style_context_set_state (context, state);
gtk_style_context_add_class (context, GTK_STYLE_CLASS_EXPANDER);
+ if (expander_size > 0)
+ {
+ if (expander_size < area.width && area.width % expander_size != 0)
+ {
+ area.x += (area.width % expander_size) / 2;
+ area.width = expander_size;
+ }
+
+ if (expander_size < area.height && area.height % expander_size != 0)
+ {
+ area.y += (area.height % expander_size) / 2;
+ area.height = expander_size;
+ }
+ }
+
gtk_render_expander (context, cr,
area.x, area.y,
area.width, area.height);
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index dd353998b5..ca0281cdd9 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -292,7 +292,7 @@
*
* An example of a UI definition fragment specifying an accessible:
* |[
- * <object class="GtkButton" id="label1"/>
+ * <object class="GtkLabel" id="label1"/>
* <property name="label">I am a Label for a Button</property>
* </object>
* <object class="GtkButton" id="button1">
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index c6aa5425ff..b5f4b5af3d 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -4576,7 +4576,8 @@ icon_from_list (GList *list,
for (l = list; l; l = l->next)
{
pixbuf = list->data;
- if (gdk_pixbuf_get_width (pixbuf) <= size)
+ if (gdk_pixbuf_get_width (pixbuf) <= size &&
+ gdk_pixbuf_get_height (pixbuf) <= size)
{
best = g_object_ref (pixbuf);
break;
diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss
index 85c60c41de..f095083b8f 100644
--- a/gtk/theme/Adwaita/_common.scss
+++ b/gtk/theme/Adwaita/_common.scss
@@ -4557,7 +4557,7 @@ button.emoji-section {
&:checked label { opacity: 1; }
}
-.emoji {
+popover.emoji-picker .emoji {
font-size: x-large;
padding: 6px;
border-radius: 6px;
@@ -4566,3 +4566,17 @@ button.emoji-section {
background: $selected_bg_color;
}
}
+
+popover.emoji-completion arrow {
+ border: none;
+ background: none;
+}
+
+popover.emoji-completion contents row box {
+ border-spacing: 10px;
+ padding: 2px 10px;
+}
+
+popover.emoji-completion .emoji:hover {
+ background: $popover_hover_color;
+}
diff --git a/gtk/ui/gtkemojicompletion.ui b/gtk/ui/gtkemojicompletion.ui
new file mode 100644
index 0000000000..7f5f3ef49a
--- /dev/null
+++ b/gtk/ui/gtkemojicompletion.ui
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="gtk40">
+ <template class="GtkEmojiCompletion" parent="GtkPopover">
+ <property name="modal">0</property>
+ <style>
+ <class name="emoji-completion"/>
+ </style>
+ <child>
+ <object class="GtkListBox" id="list">
+ <property name="visible">1</property>
+ <property name="selection-mode">none</property>
+ <property name="activate-on-single-click">1</property>
+ <signal name="row-activated" handler="row_activated"/>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/gtk/ui/gtkfontchooserwidget.ui b/gtk/ui/gtkfontchooserwidget.ui
index 9c5e3c90a1..f1b003cf95 100644
--- a/gtk/ui/gtkfontchooserwidget.ui
+++ b/gtk/ui/gtkfontchooserwidget.ui
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<interface domain="gtk30">
+<interface domain="gtk40">
<!-- interface-requires gtk+ 3.10 -->
<object class="GtkListStore" id="model">
<columns>
@@ -35,7 +35,7 @@
<object class="GtkStack" id="stack">
<property name="visible">1</property>
<child>
- <object class="GtkGrid" id="grid1">
+ <object class="GtkGrid" id="grid">
<property name="visible">1</property>
<property name="row-spacing">6</property>
<property name="column-spacing">6</property>
@@ -57,22 +57,21 @@
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
- <property name="width">2</property>
</packing>
</child>
<child>
<object class="GtkStack" id="list_stack">
<property name="visible">1</property>
<child>
- <object class="GtkGrid">
+ <object class="GtkGrid" id="font_grid">
<property name="visible">1</property>
<property name="row-spacing">6</property>
<property name="column-spacing">6</property>
<child>
<object class="GtkScrolledWindow" id="list_scrolled_window">
+ <property name="visible">1</property>
<property name="width-request">400</property>
<property name="height-request">300</property>
- <property name="visible">1</property>
<property name="can-focus">1</property>
<property name="hexpand">1</property>
<property name="vexpand">1</property>
@@ -112,21 +111,33 @@
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
- <property name="width">2</property>
+ <property name="width">3</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="preview">
<property name="visible">1</property>
<property name="can-focus">1</property>
- <property name="invisible-char">•</property>
<property name="placeholder-text" translatable="yes">Preview text</property>
+ <property name="valign">baseline</property>
<signal name="scroll-event" handler="resize_by_scroll_cb" swapped="no"/>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
- <property name="width">2</property>
+ <property name="width">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="size_label">
+ <property name="visible">1</property>
+ <property name="label" translatable="yes">Size</property>
+ <property name="xalign">0</property>
+ <property name="valign">baseline</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
</packing>
</child>
<child>
@@ -137,11 +148,10 @@
<property name="adjustment">slider_adjustment</property>
<property name="draw-value">0</property>
<property name="round-digits">0</property>
- <property name="valign">baseline</property>
<signal name="scroll-event" handler="resize_by_scroll_cb" swapped="no"/>
</object>
<packing>
- <property name="left-attach">0</property>
+ <property name="left-attach">1</property>
<property name="top-attach">3</property>
</packing>
</child>
@@ -149,13 +159,12 @@
<object class="GtkSpinButton" id="size_spin">
<property name="visible">1</property>
<property name="can-focus">1</property>
- <property name="invisible-char">•</property>
- <property name="valign">baseline</property>
<property name="adjustment">spin_adjustment</property>
+ <property name="valign">center</property>
<signal name="output" handler="output_cb"/>
</object>
<packing>
- <property name="left-attach">1</property>
+ <property name="left-attach">2</property>
<property name="top-attach">3</property>
</packing>
</child>
@@ -209,7 +218,6 @@
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
- <property name="width">2</property>
</packing>
</child>
</object>
@@ -221,92 +229,95 @@
<object class="GtkBox">
<property name="visible">1</property>
<property name="orientation">vertical</property>
- <property name="spacing">12</property>
- <property name="margin">12</property>
-
- <child>
-- <object class="GtkLabel" id="font_name_label">
- <property name="visible">1</property>
-- <property name="margin-top">6</property>
-- <property name="margin-bottom">6</property>
-- <property name="margin-start">12</property>
-- <property name="margin-end">12</property>
-- <property name="ellipsize">end</property>
-- <property name="xalign">0</property>
-- </object>
-- </child>
-- <child>
-- <object class="GtkEntry" id="preview2">
- <property name="visible">1</property>
-- <property name="can-focus">1</property>
-- <property name="placeholder-text" translatable="yes">Preview text</property>
-- <property name="text" bind-source="preview" bind-property="text" bind-flags="bidirectional"/>
-- <property name="attributes" bind-source="preview" bind-property="attributes" bind-flags="bidirectional"/>
- </object>
- </child>
+ <property name="spacing">6</property>
<child>
- <object class="GtkGrid" id="axis_grid">
- <property name="row-spacing">6</property>
- <property name="column-spacing">12</property>
+ <object class="GtkLabel" id="font_name_label">
<property name="visible">1</property>
- <child>
- <object class="GtkLabel" id="size_label2">
- <property name="visible">1</property>
- <property name="label" translatable="yes">Size</property>
- <property name="xalign">0</property>
- <property name="valign">baseline</property>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScale" id="size_slider2">
- <property name="visible">1</property>
- <property name="can-focus">1</property>
- <property name="hexpand">1</property>
- <property name="adjustment">slider_adjustment</property>
- <property name="draw-value">0</property>
- <property name="round-digits">0</property>
- <property name="valign">baseline</property>
- <signal name="scroll-event" handler="resize_by_scroll_cb" swapped="no"/>
- </object>
- <packing>
- <property name="left-attach">1</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="size_spin2">
- <property name="visible">1</property>
- <property name="can-focus">1</property>
- <property name="adjustment">spin_adjustment</property>
- <property name="valign">baseline</property>
- <signal name="output" handler="output_cb"/>
- </object>
- <packing>
- <property name="left-attach">2</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
+ <property name="margin-top">6</property>
+ <property name="margin-bottom">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="ellipsize">end</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="preview2">
+ <property name="visible">1</property>
+ <property name="can-focus">1</property>
+ <property name="placeholder-text" translatable="yes">Preview text</property>
+ <property name="text" bind-source="preview" bind-property="text" bind-flags="bidirectional"/>
+ <property name="attributes" bind-source="preview" bind-property="attributes" bind-flags="bidirectional"/>
</object>
</child>
<child>
- <object class="GtkBox" id="feature_box">
+ <object class="GtkScrolledWindow">
<property name="visible">1</property>
- <property name="orientation">vertical</property>
- <property name="spacing">12</property>
+ <property name="hscrollbar-policy">never</property>
+ <property name="shadow-type">in</property>
+ <property name="vexpand">1</property>
+ <style>
+ <class name="view"/>
+ </style>
<child>
- <object class="GtkComboBox" id="feature_language_combo">
- <property name="halign">start</property>
- <property name="margin-top">10</property>
- <signal name="changed" handler="update_language" swapped="yes"/>
+ <object class="GtkBox">
+ <property name="visible">1</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <property name="margin">12</property>
<child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
+ <object class="GtkGrid" id="axis_grid">
+ <property name="visible">1</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="size_label2">
+ <property name="visible">1</property>
+ <property name="label" translatable="yes">Size</property>
+ <property name="xalign">0</property>
+ <property name="valign">baseline</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScale" id="size_slider2">
+ <property name="visible">1</property>
+ <property name="can-focus">1</property>
+ <property name="hexpand">1</property>
+ <property name="adjustment">slider_adjustment</property>
+ <property name="draw-value">0</property>
+ <property name="round-digits">0</property>
+ <signal name="scroll-event" handler="resize_by_scroll_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="size_spin2">
+ <property name="visible">1</property>
+ <property name="can-focus">1</property>
+ <property name="adjustment">spin_adjustment</property>
+ <property name="valign">center</property>
+ <signal name="output" handler="output_cb"/>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="feature_box">
+ <property name="visible">1</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ </object>
</child>
</object>
</child>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index b72b837f29..a2cd6f5c86 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -136,6 +136,7 @@ gtk/gtkdragsource.c
gtk/gtkdrawingarea.c
gtk/gtkeditable.c
gtk/gtkemojichooser.c
+gtk/gtkemojicompletion.c
gtk/gtkentrybuffer.c
gtk/gtkentry.c
gtk/gtkentrycompletion.c
@@ -357,6 +358,7 @@ gtk/ui/gtkcoloreditor.ui
gtk/ui/gtkdialog.ui
gtk/ui/gtkemojichooser.ui
gtk/ui/gtkfilechooserbutton.ui
+gtk/ui/gtkemojicompletion.ui
gtk/ui/gtkfilechooserdialog.ui
gtk/ui/gtkfilechooserwidget.ui
gtk/ui/gtkfontbutton.ui
diff --git a/po/ca.po b/po/ca.po
index 7c889d1f6b..acc3198844 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -11,7 +11,7 @@
# Gil Forcada <gilforcada@guifi.net>, 2012, 2013, 2014.
# Jordi Serratosa <jordis@softcatala.cat>, 2012.
# Josep Sànchez <papapep@gmx.com>, 2013.
-# Jordi Mas i Hernàndez <jmas@softcatala.org>, 2015-2016
+# Jordi Mas i Hernàndez <jmas@softcatala.org>, 2015-2018
#
# Recull de termes
#
@@ -34,9 +34,9 @@ msgid ""
msgstr ""
"Project-Id-Version: gtk+ 2.8.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-03-31 11:29+0000\n"
-"PO-Revision-Date: 2018-03-31 20:22+0200\n"
-"Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n"
+"POT-Creation-Date: 2018-05-31 20:42+0000\n"
+"PO-Revision-Date: 2018-06-03 11:58+0200\n"
+"Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
@@ -499,7 +499,7 @@ msgstr "Atura temporalment"
#: gdk/mir/gdkmirglcontext.c:48 gdk/mir/gdkmirwindowimpl.c:2226
#: gdk/wayland/gdkglcontext-wayland.c:468 gdk/win32/gdkglcontext-win32.c:814
-#: gdk/x11/gdkglcontext-x11.c:1274
+#: gdk/x11/gdkglcontext-x11.c:1277
msgid "No GL implementation is available"
msgstr "No hi ha cap implementació GL disponible"
@@ -512,7 +512,7 @@ msgstr "No s'ha pogut crear el context GL"
#: gdk/mir/gdkmirwindowimpl.c:2188 gdk/mir/gdkmirwindowimpl.c:2198
#: gdk/wayland/gdkglcontext-wayland.c:418
#: gdk/wayland/gdkglcontext-wayland.c:428 gdk/win32/gdkglcontext-win32.c:719
-#: gdk/x11/gdkglcontext-x11.c:968
+#: gdk/x11/gdkglcontext-x11.c:971
msgid "No available configurations for the given pixel format"
msgstr ""
"No hi ha cap configuració disponible pel tipus de format de píxel donat"
@@ -577,7 +577,7 @@ msgid_plural "Opening %d Items"
msgstr[0] "S'està obrint %d element"
msgstr[1] "S'estan obrint %d elements"
-#: gdk/x11/gdkglcontext-x11.c:996
+#: gdk/x11/gdkglcontext-x11.c:999
#, c-format
msgid "No available configurations for the given RGBA pixel format"
msgstr ""
@@ -683,32 +683,32 @@ msgstr "Activa l'expansor"
#. FIXME these need accelerators when appropriate, and
#. * need the mnemonics to be rationalized
#.
-#: gtk/a11y/gtkimageaccessible.c:53 gtk/deprecated/gtkstock.c:341
+#: gtk/a11y/gtkimageaccessible.c:53 gtk/deprecated/gtkstock.c:345
msgctxt "Stock label"
msgid "_About"
msgstr "_Quant a"
-#: gtk/a11y/gtkimageaccessible.c:54 gtk/deprecated/gtkstock.c:342
+#: gtk/a11y/gtkimageaccessible.c:54 gtk/deprecated/gtkstock.c:346
msgctxt "Stock label"
msgid "_Add"
msgstr "_Afegeix"
-#: gtk/a11y/gtkimageaccessible.c:55 gtk/deprecated/gtkstock.c:344
+#: gtk/a11y/gtkimageaccessible.c:55 gtk/deprecated/gtkstock.c:348
msgctxt "Stock label"
msgid "_Bold"
msgstr "_Negreta"
-#: gtk/a11y/gtkimageaccessible.c:56 gtk/deprecated/gtkstock.c:346
+#: gtk/a11y/gtkimageaccessible.c:56 gtk/deprecated/gtkstock.c:350
msgctxt "Stock label"
msgid "_CD-ROM"
msgstr "_CD-ROM"
-#: gtk/a11y/gtkimageaccessible.c:57 gtk/deprecated/gtkstock.c:347
+#: gtk/a11y/gtkimageaccessible.c:57 gtk/deprecated/gtkstock.c:351
msgctxt "Stock label"
msgid "_Clear"
msgstr "_Neteja"
-#: gtk/a11y/gtkimageaccessible.c:58 gtk/deprecated/gtkstock.c:348
+#: gtk/a11y/gtkimageaccessible.c:58 gtk/deprecated/gtkstock.c:352
msgctxt "Stock label"
msgid "_Close"
msgstr "_Tanca"
@@ -725,364 +725,364 @@ msgstr "Maximitza"
msgid "Restore"
msgstr "Restaura"
-#: gtk/a11y/gtkimageaccessible.c:62 gtk/deprecated/gtkstock.c:351
+#: gtk/a11y/gtkimageaccessible.c:62 gtk/deprecated/gtkstock.c:355
msgctxt "Stock label"
msgid "_Copy"
msgstr "_Copia"
-#: gtk/a11y/gtkimageaccessible.c:63 gtk/deprecated/gtkstock.c:352
+#: gtk/a11y/gtkimageaccessible.c:63 gtk/deprecated/gtkstock.c:356
msgctxt "Stock label"
msgid "Cu_t"
msgstr "Re_talla"
-#: gtk/a11y/gtkimageaccessible.c:64 gtk/deprecated/gtkstock.c:353
+#: gtk/a11y/gtkimageaccessible.c:64 gtk/deprecated/gtkstock.c:357
msgctxt "Stock label"
msgid "_Delete"
msgstr "_Suprimeix"
-#: gtk/a11y/gtkimageaccessible.c:65 gtk/deprecated/gtkstock.c:335
+#: gtk/a11y/gtkimageaccessible.c:65 gtk/deprecated/gtkstock.c:339
msgctxt "Stock label"
msgid "Error"
msgstr "Error"
#. KEEP IN SYNC with gtkiconfactory.c stock icons, when appropriate
-#: gtk/a11y/gtkimageaccessible.c:66 gtk/deprecated/gtkstock.c:333
+#: gtk/a11y/gtkimageaccessible.c:66 gtk/deprecated/gtkstock.c:337
msgctxt "Stock label"
msgid "Information"
msgstr "Informació"
-#: gtk/a11y/gtkimageaccessible.c:67 gtk/deprecated/gtkstock.c:336
+#: gtk/a11y/gtkimageaccessible.c:67 gtk/deprecated/gtkstock.c:340
msgctxt "Stock label"
msgid "Question"
msgstr "Pregunta"
-#: gtk/a11y/gtkimageaccessible.c:68 gtk/deprecated/gtkstock.c:334
+#: gtk/a11y/gtkimageaccessible.c:68 gtk/deprecated/gtkstock.c:338
msgctxt "Stock label"
msgid "Warning"
msgstr "Avís"
-#: gtk/a11y/gtkimageaccessible.c:69 gtk/deprecated/gtkstock.c:356
+#: gtk/a11y/gtkimageaccessible.c:69 gtk/deprecated/gtkstock.c:360
msgctxt "Stock label"
msgid "_Execute"
msgstr "_Executa"
-#: gtk/a11y/gtkimageaccessible.c:70 gtk/deprecated/gtkstock.c:358
+#: gtk/a11y/gtkimageaccessible.c:70 gtk/deprecated/gtkstock.c:362
msgctxt "Stock label"
msgid "_File"
msgstr "_Fitxer"
-#: gtk/a11y/gtkimageaccessible.c:71 gtk/deprecated/gtkstock.c:359
+#: gtk/a11y/gtkimageaccessible.c:71 gtk/deprecated/gtkstock.c:363
msgctxt "Stock label"
msgid "_Find"
msgstr "_Cerca"
-#: gtk/a11y/gtkimageaccessible.c:72 gtk/deprecated/gtkstock.c:360
+#: gtk/a11y/gtkimageaccessible.c:72 gtk/deprecated/gtkstock.c:364
msgctxt "Stock label"
msgid "Find and _Replace"
msgstr "Cerca i _reemplaça"
-#: gtk/a11y/gtkimageaccessible.c:73 gtk/deprecated/gtkstock.c:361
+#: gtk/a11y/gtkimageaccessible.c:73 gtk/deprecated/gtkstock.c:365
msgctxt "Stock label"
msgid "_Floppy"
msgstr "_Disquet"
-#: gtk/a11y/gtkimageaccessible.c:74 gtk/deprecated/gtkstock.c:362
+#: gtk/a11y/gtkimageaccessible.c:74 gtk/deprecated/gtkstock.c:366
msgctxt "Stock label"
msgid "_Fullscreen"
msgstr "_Pantalla completa"
#. This is a navigation label as in "go to the bottom of the page"
-#: gtk/a11y/gtkimageaccessible.c:75 gtk/deprecated/gtkstock.c:365
+#: gtk/a11y/gtkimageaccessible.c:75 gtk/deprecated/gtkstock.c:369
msgctxt "Stock label, navigation"
msgid "_Bottom"
msgstr "_Inferior"
#. This is a navigation label as in "go to the first page"
-#: gtk/a11y/gtkimageaccessible.c:76 gtk/deprecated/gtkstock.c:367
+#: gtk/a11y/gtkimageaccessible.c:76 gtk/deprecated/gtkstock.c:371
msgctxt "Stock label, navigation"
msgid "_First"
msgstr "_Primer"
#. This is a navigation label as in "go to the last page"
-#: gtk/a11y/gtkimageaccessible.c:77 gtk/deprecated/gtkstock.c:369
+#: gtk/a11y/gtkimageaccessible.c:77 gtk/deprecated/gtkstock.c:373
msgctxt "Stock label, navigation"
msgid "_Last"
msgstr "Ú_ltim"
#. This is a navigation label as in "go to the top of the page"
-#: gtk/a11y/gtkimageaccessible.c:78 gtk/deprecated/gtkstock.c:371
+#: gtk/a11y/gtkimageaccessible.c:78 gtk/deprecated/gtkstock.c:375
msgctxt "Stock label, navigation"
msgid "_Top"
msgstr "_Superior"
#. This is a navigation label as in "go back"
-#: gtk/a11y/gtkimageaccessible.c:79 gtk/deprecated/gtkstock.c:373
+#: gtk/a11y/gtkimageaccessible.c:79 gtk/deprecated/gtkstock.c:377
msgctxt "Stock label, navigation"
msgid "_Back"
msgstr "_Enrere"
#. This is a navigation label as in "go down"
-#: gtk/a11y/gtkimageaccessible.c:80 gtk/deprecated/gtkstock.c:375
+#: gtk/a11y/gtkimageaccessible.c:80 gtk/deprecated/gtkstock.c:379
msgctxt "Stock label, navigation"
msgid "_Down"
msgstr "A_vall"
#. This is a navigation label as in "go forward"
-#: gtk/a11y/gtkimageaccessible.c:81 gtk/deprecated/gtkstock.c:377
+#: gtk/a11y/gtkimageaccessible.c:81 gtk/deprecated/gtkstock.c:381
msgctxt "Stock label, navigation"
msgid "_Forward"
msgstr "E_ndavant"
#. This is a navigation label as in "go up"
-#: gtk/a11y/gtkimageaccessible.c:82 gtk/deprecated/gtkstock.c:379
+#: gtk/a11y/gtkimageaccessible.c:82 gtk/deprecated/gtkstock.c:383
msgctxt "Stock label, navigation"
msgid "_Up"
msgstr "A_munt"
-#: gtk/a11y/gtkimageaccessible.c:83 gtk/deprecated/gtkstock.c:380
+#: gtk/a11y/gtkimageaccessible.c:83 gtk/deprecated/gtkstock.c:384
msgctxt "Stock label"
msgid "_Hard Disk"
msgstr "_Disc dur"
-#: gtk/a11y/gtkimageaccessible.c:84 gtk/deprecated/gtkstock.c:381
+#: gtk/a11y/gtkimageaccessible.c:84 gtk/deprecated/gtkstock.c:385
msgctxt "Stock label"
msgid "_Help"
msgstr "A_juda"
-#: gtk/a11y/gtkimageaccessible.c:85 gtk/deprecated/gtkstock.c:382
+#: gtk/a11y/gtkimageaccessible.c:85 gtk/deprecated/gtkstock.c:386
msgctxt "Stock label"
msgid "_Home"
msgstr "_Inici"
-#: gtk/a11y/gtkimageaccessible.c:86 gtk/deprecated/gtkstock.c:383
+#: gtk/a11y/gtkimageaccessible.c:86 gtk/deprecated/gtkstock.c:387
msgctxt "Stock label"
msgid "Increase Indent"
msgstr "Augmenta el sagnat"
-#: gtk/a11y/gtkimageaccessible.c:87 gtk/deprecated/gtkstock.c:387
+#: gtk/a11y/gtkimageaccessible.c:87 gtk/deprecated/gtkstock.c:391
msgctxt "Stock label"
msgid "_Italic"
msgstr "Curs_iva"
-#: gtk/a11y/gtkimageaccessible.c:88 gtk/deprecated/gtkstock.c:388
+#: gtk/a11y/gtkimageaccessible.c:88 gtk/deprecated/gtkstock.c:392
msgctxt "Stock label"
msgid "_Jump to"
msgstr "_Vés-hi"
#. This is about text justification, "centered text"
-#: gtk/a11y/gtkimageaccessible.c:89 gtk/deprecated/gtkstock.c:390
+#: gtk/a11y/gtkimageaccessible.c:89 gtk/deprecated/gtkstock.c:394
msgctxt "Stock label"
msgid "_Center"
msgstr "_Centrat"
#. This is about text justification
-#: gtk/a11y/gtkimageaccessible.c:90 gtk/deprecated/gtkstock.c:392
+#: gtk/a11y/gtkimageaccessible.c:90 gtk/deprecated/gtkstock.c:396
msgctxt "Stock label"
msgid "_Fill"
msgstr "_Justificat"
#. This is about text justification, "left-justified text"
-#: gtk/a11y/gtkimageaccessible.c:91 gtk/deprecated/gtkstock.c:394
+#: gtk/a11y/gtkimageaccessible.c:91 gtk/deprecated/gtkstock.c:398
msgctxt "Stock label"
msgid "_Left"
msgstr "_Esquerra"
#. This is about text justification, "right-justified text"
-#: gtk/a11y/gtkimageaccessible.c:92 gtk/deprecated/gtkstock.c:396
+#: gtk/a11y/gtkimageaccessible.c:92 gtk/deprecated/gtkstock.c:400
msgctxt "Stock label"
msgid "_Right"
msgstr "_Dreta"
-#: gtk/a11y/gtkimageaccessible.c:93 gtk/deprecated/gtkstock.c:363
+#: gtk/a11y/gtkimageaccessible.c:93 gtk/deprecated/gtkstock.c:367
msgctxt "Stock label"
msgid "_Leave Fullscreen"
msgstr "_Surt de la pantalla completa"
#. Media label, as in "fast forward"
-#: gtk/a11y/gtkimageaccessible.c:94 gtk/deprecated/gtkstock.c:399
+#: gtk/a11y/gtkimageaccessible.c:94 gtk/deprecated/gtkstock.c:403
msgctxt "Stock label, media"
msgid "_Forward"
msgstr "E_ndavant"
#. Media label, as in "next song"
-#: gtk/a11y/gtkimageaccessible.c:95 gtk/deprecated/gtkstock.c:401
+#: gtk/a11y/gtkimageaccessible.c:95 gtk/deprecated/gtkstock.c:405
msgctxt "Stock label, media"
msgid "_Next"
msgstr "_Següent"
#. Media label, as in "pause music"
-#: gtk/a11y/gtkimageaccessible.c:96 gtk/deprecated/gtkstock.c:403
+#: gtk/a11y/gtkimageaccessible.c:96 gtk/deprecated/gtkstock.c:407
msgctxt "Stock label, media"
msgid "P_ause"
msgstr "En _pausa"
#. Media label, as in "play music"
-#: gtk/a11y/gtkimageaccessible.c:97 gtk/deprecated/gtkstock.c:405
+#: gtk/a11y/gtkimageaccessible.c:97 gtk/deprecated/gtkstock.c:409
msgctxt "Stock label, media"
msgid "_Play"
msgstr "_Reprodueix"
#. Media label, as in "previous song"
-#: gtk/a11y/gtkimageaccessible.c:98 gtk/deprecated/gtkstock.c:407
+#: gtk/a11y/gtkimageaccessible.c:98 gtk/deprecated/gtkstock.c:411
msgctxt "Stock label, media"
msgid "Pre_vious"
msgstr "An_terior"
#. Media label
-#: gtk/a11y/gtkimageaccessible.c:99 gtk/deprecated/gtkstock.c:409
+#: gtk/a11y/gtkimageaccessible.c:99 gtk/deprecated/gtkstock.c:413
msgctxt "Stock label, media"
msgid "_Record"
msgstr "En_registra"
#. Media label
-#: gtk/a11y/gtkimageaccessible.c:100 gtk/deprecated/gtkstock.c:411
+#: gtk/a11y/gtkimageaccessible.c:100 gtk/deprecated/gtkstock.c:415
msgctxt "Stock label, media"
msgid "R_ewind"
msgstr "R_ebobina"
#. Media label
-#: gtk/a11y/gtkimageaccessible.c:101 gtk/deprecated/gtkstock.c:413
+#: gtk/a11y/gtkimageaccessible.c:101 gtk/deprecated/gtkstock.c:417
msgctxt "Stock label, media"
msgid "_Stop"
msgstr "_Atura"
-#: gtk/a11y/gtkimageaccessible.c:102 gtk/deprecated/gtkstock.c:414
+#: gtk/a11y/gtkimageaccessible.c:102 gtk/deprecated/gtkstock.c:418
msgctxt "Stock label"
msgid "_Network"
msgstr "_Xarxa"
-#: gtk/a11y/gtkimageaccessible.c:103 gtk/deprecated/gtkstock.c:415
+#: gtk/a11y/gtkimageaccessible.c:103 gtk/deprecated/gtkstock.c:419
msgctxt "Stock label"
msgid "_New"
msgstr "_Nou"
-#: gtk/a11y/gtkimageaccessible.c:104 gtk/deprecated/gtkstock.c:418
+#: gtk/a11y/gtkimageaccessible.c:104 gtk/deprecated/gtkstock.c:422
msgctxt "Stock label"
msgid "_Open"
msgstr "_Obre"
-#: gtk/a11y/gtkimageaccessible.c:105 gtk/deprecated/gtkstock.c:428
+#: gtk/a11y/gtkimageaccessible.c:105 gtk/deprecated/gtkstock.c:432
msgctxt "Stock label"
msgid "_Paste"
msgstr "_Enganxa"
-#: gtk/a11y/gtkimageaccessible.c:106 gtk/deprecated/gtkstock.c:430
+#: gtk/a11y/gtkimageaccessible.c:106 gtk/deprecated/gtkstock.c:434
msgctxt "Stock label"
msgid "_Print"
msgstr "_Imprimeix"
-#: gtk/a11y/gtkimageaccessible.c:107 gtk/deprecated/gtkstock.c:431
+#: gtk/a11y/gtkimageaccessible.c:107 gtk/deprecated/gtkstock.c:435
msgctxt "Stock label"
msgid "Print Pre_view"
msgstr "Pre_visualització de la impressió"
-#: gtk/a11y/gtkimageaccessible.c:108 gtk/deprecated/gtkstock.c:432
+#: gtk/a11y/gtkimageaccessible.c:108 gtk/deprecated/gtkstock.c:436
msgctxt "Stock label"
msgid "_Properties"
msgstr "_Propietats"
-#: gtk/a11y/gtkimageaccessible.c:109 gtk/deprecated/gtkstock.c:433
+#: gtk/a11y/gtkimageaccessible.c:109 gtk/deprecated/gtkstock.c:437
msgctxt "Stock label"
msgid "_Quit"
msgstr "_Surt"
-#: gtk/a11y/gtkimageaccessible.c:110 gtk/deprecated/gtkstock.c:434
+#: gtk/a11y/gtkimageaccessible.c:110 gtk/deprecated/gtkstock.c:438
msgctxt "Stock label"
msgid "_Redo"
msgstr "_Refés"
-#: gtk/a11y/gtkimageaccessible.c:111 gtk/deprecated/gtkstock.c:435
+#: gtk/a11y/gtkimageaccessible.c:111 gtk/deprecated/gtkstock.c:439
msgctxt "Stock label"
msgid "_Refresh"
msgstr "_Actualitza"
-#: gtk/a11y/gtkimageaccessible.c:112 gtk/deprecated/gtkstock.c:436
+#: gtk/a11y/gtkimageaccessible.c:112 gtk/deprecated/gtkstock.c:440
msgctxt "Stock label"
msgid "_Remove"
msgstr "_Suprimeix"
-#: gtk/a11y/gtkimageaccessible.c:113 gtk/deprecated/gtkstock.c:437
+#: gtk/a11y/gtkimageaccessible.c:113 gtk/deprecated/gtkstock.c:441
msgctxt "Stock label"
msgid "_Revert"
msgstr "_Restaura"
-#: gtk/a11y/gtkimageaccessible.c:114 gtk/deprecated/gtkstock.c:438
+#: gtk/a11y/gtkimageaccessible.c:114 gtk/deprecated/gtkstock.c:442
msgctxt "Stock label"
msgid "_Save"
msgstr "_Desa"
-#: gtk/a11y/gtkimageaccessible.c:115 gtk/deprecated/gtkstock.c:439
+#: gtk/a11y/gtkimageaccessible.c:115 gtk/deprecated/gtkstock.c:443
msgctxt "Stock label"
msgid "Save _As"
msgstr "_Anomena i desa"
-#: gtk/a11y/gtkimageaccessible.c:116 gtk/deprecated/gtkstock.c:440
+#: gtk/a11y/gtkimageaccessible.c:116 gtk/deprecated/gtkstock.c:444
msgctxt "Stock label"
msgid "Select _All"
msgstr "Seleccion_a-ho tot"
#. Sorting direction
-#: gtk/a11y/gtkimageaccessible.c:117 gtk/deprecated/gtkstock.c:444
+#: gtk/a11y/gtkimageaccessible.c:117 gtk/deprecated/gtkstock.c:448
msgctxt "Stock label"
msgid "_Ascending"
msgstr "_Ascendent"
#. Sorting direction
-#: gtk/a11y/gtkimageaccessible.c:118 gtk/deprecated/gtkstock.c:446
+#: gtk/a11y/gtkimageaccessible.c:118 gtk/deprecated/gtkstock.c:450
msgctxt "Stock label"
msgid "_Descending"
msgstr "_Descendent"
-#: gtk/a11y/gtkimageaccessible.c:119 gtk/deprecated/gtkstock.c:447
+#: gtk/a11y/gtkimageaccessible.c:119 gtk/deprecated/gtkstock.c:451
msgctxt "Stock label"
msgid "_Spell Check"
msgstr "_Verifica l'ortografia"
-#: gtk/a11y/gtkimageaccessible.c:120 gtk/deprecated/gtkstock.c:448
+#: gtk/a11y/gtkimageaccessible.c:120 gtk/deprecated/gtkstock.c:452
msgctxt "Stock label"
msgid "_Stop"
msgstr "_Atura"
#. Font variant
-#: gtk/a11y/gtkimageaccessible.c:121 gtk/deprecated/gtkstock.c:450
+#: gtk/a11y/gtkimageaccessible.c:121 gtk/deprecated/gtkstock.c:454
msgctxt "Stock label"
msgid "_Strikethrough"
msgstr "_Barrat"
#. Font variant
-#: gtk/a11y/gtkimageaccessible.c:122 gtk/deprecated/gtkstock.c:453
+#: gtk/a11y/gtkimageaccessible.c:122 gtk/deprecated/gtkstock.c:457
msgctxt "Stock label"
msgid "_Underline"
msgstr "S_ubratlla"
-#: gtk/a11y/gtkimageaccessible.c:123 gtk/deprecated/gtkstock.c:454
+#: gtk/a11y/gtkimageaccessible.c:123 gtk/deprecated/gtkstock.c:458
msgctxt "Stock label"
msgid "_Undo"
msgstr "_Desfés"
-#: gtk/a11y/gtkimageaccessible.c:124 gtk/deprecated/gtkstock.c:384
+#: gtk/a11y/gtkimageaccessible.c:124 gtk/deprecated/gtkstock.c:388
msgctxt "Stock label"
msgid "Decrease Indent"
msgstr "Disminueix el sagnat"
#. Zoom
-#: gtk/a11y/gtkimageaccessible.c:125 gtk/deprecated/gtkstock.c:457
+#: gtk/a11y/gtkimageaccessible.c:125 gtk/deprecated/gtkstock.c:461
msgctxt "Stock label"
msgid "_Normal Size"
msgstr "Mida _normal"
#. Zoom
-#: gtk/a11y/gtkimageaccessible.c:126 gtk/deprecated/gtkstock.c:459
+#: gtk/a11y/gtkimageaccessible.c:126 gtk/deprecated/gtkstock.c:463
msgctxt "Stock label"
msgid "Best _Fit"
msgstr "Millor a_just"
-#: gtk/a11y/gtkimageaccessible.c:127 gtk/deprecated/gtkstock.c:460
+#: gtk/a11y/gtkimageaccessible.c:127 gtk/deprecated/gtkstock.c:464
msgctxt "Stock label"
msgid "Zoom _In"
msgstr "_Amplia"
-#: gtk/a11y/gtkimageaccessible.c:128 gtk/deprecated/gtkstock.c:461
+#: gtk/a11y/gtkimageaccessible.c:128 gtk/deprecated/gtkstock.c:465
msgctxt "Stock label"
msgid "Zoom _Out"
msgstr "_Redueix"
@@ -1271,7 +1271,7 @@ msgstr ""
#: gtk/gtkfilechooserwidget.c:1475 gtk/gtkfilechooserwidget.c:6330
#: gtk/gtkmessagedialog.c:952 gtk/gtkmessagedialog.c:965
#: gtk/gtkmountoperation.c:545 gtk/gtkpagesetupunixdialog.c:196
-#: gtk/gtkprintbackend.c:763 gtk/gtkprinteroptionwidget.c:545
+#: gtk/gtkprintbackend.c:781 gtk/gtkprinteroptionwidget.c:545
#: gtk/gtkprintunixdialog.c:673 gtk/gtkprintunixdialog.c:746
#: gtk/gtkwindow.c:12698 gtk/inspector/css-editor.c:201
#: gtk/ui/gtkappchooserdialog.ui:61 gtk/ui/gtkassistant.ui:125
@@ -1322,7 +1322,7 @@ msgid "_Apply"
msgstr "_Aplica"
#: gtk/deprecated/gtkfontsel.c:1698 gtk/gtkmessagedialog.c:944
-#: gtk/gtkmessagedialog.c:966 gtk/gtkprintbackend.c:764 gtk/gtkwindow.c:12699
+#: gtk/gtkmessagedialog.c:966 gtk/gtkprintbackend.c:782 gtk/gtkwindow.c:12699
msgid "_OK"
msgstr "_D'acord"
@@ -1339,127 +1339,127 @@ msgctxt "Number format"
msgid "%d"
msgstr "%d"
-#: gtk/deprecated/gtkstock.c:343
+#: gtk/deprecated/gtkstock.c:347
msgctxt "Stock label"
msgid "_Apply"
msgstr "_Aplica"
-#: gtk/deprecated/gtkstock.c:345
+#: gtk/deprecated/gtkstock.c:349
msgctxt "Stock label"
msgid "_Cancel"
msgstr "_Cancel·la"
-#: gtk/deprecated/gtkstock.c:349
+#: gtk/deprecated/gtkstock.c:353
msgctxt "Stock label"
msgid "C_onnect"
msgstr "C_onnecta"
-#: gtk/deprecated/gtkstock.c:350
+#: gtk/deprecated/gtkstock.c:354
msgctxt "Stock label"
msgid "_Convert"
msgstr "_Converteix"
-#: gtk/deprecated/gtkstock.c:354
+#: gtk/deprecated/gtkstock.c:358
msgctxt "Stock label"
msgid "_Discard"
msgstr "_Descarta"
-#: gtk/deprecated/gtkstock.c:355
+#: gtk/deprecated/gtkstock.c:359
msgctxt "Stock label"
msgid "_Disconnect"
msgstr "_Desconnecta"
-#: gtk/deprecated/gtkstock.c:357
+#: gtk/deprecated/gtkstock.c:361
msgctxt "Stock label"
msgid "_Edit"
msgstr "_Edita"
-#: gtk/deprecated/gtkstock.c:385
+#: gtk/deprecated/gtkstock.c:389
msgctxt "Stock label"
msgid "_Index"
msgstr "Índe_x"
-#: gtk/deprecated/gtkstock.c:386
+#: gtk/deprecated/gtkstock.c:390
msgctxt "Stock label"
msgid "_Information"
msgstr "_Informació"
-#: gtk/deprecated/gtkstock.c:416
+#: gtk/deprecated/gtkstock.c:420
msgctxt "Stock label"
msgid "_No"
msgstr "_No"
-#: gtk/deprecated/gtkstock.c:417
+#: gtk/deprecated/gtkstock.c:421
msgctxt "Stock label"
msgid "_OK"
msgstr "_D'acord"
#. Page orientation
-#: gtk/deprecated/gtkstock.c:420
+#: gtk/deprecated/gtkstock.c:424
msgctxt "Stock label"
msgid "Landscape"
msgstr "Apaïsat"
#. Page orientation
-#: gtk/deprecated/gtkstock.c:422
+#: gtk/deprecated/gtkstock.c:426
msgctxt "Stock label"
msgid "Portrait"
msgstr "Vertical"
#. Page orientation
-#: gtk/deprecated/gtkstock.c:424
+#: gtk/deprecated/gtkstock.c:428
msgctxt "Stock label"
msgid "Reverse landscape"
msgstr "Apaïsat del revés"
#. Page orientation
-#: gtk/deprecated/gtkstock.c:426
+#: gtk/deprecated/gtkstock.c:430
msgctxt "Stock label"
msgid "Reverse portrait"
msgstr "Vertical del revés"
-#: gtk/deprecated/gtkstock.c:427
+#: gtk/deprecated/gtkstock.c:431
msgctxt "Stock label"
msgid "Page Set_up"
msgstr "Confi_guració de la pàgina"
-#: gtk/deprecated/gtkstock.c:429
+#: gtk/deprecated/gtkstock.c:433
msgctxt "Stock label"
msgid "_Preferences"
msgstr "_Preferències"
-#: gtk/deprecated/gtkstock.c:441
+#: gtk/deprecated/gtkstock.c:445
msgctxt "Stock label"
msgid "_Color"
msgstr "_Color"
-#: gtk/deprecated/gtkstock.c:442
+#: gtk/deprecated/gtkstock.c:446
msgctxt "Stock label"
msgid "_Font"
msgstr "_Tipus de lletra"
-#: gtk/deprecated/gtkstock.c:451
+#: gtk/deprecated/gtkstock.c:455
msgctxt "Stock label"
msgid "_Undelete"
msgstr "Rec_upera"
-#: gtk/deprecated/gtkstock.c:455
+#: gtk/deprecated/gtkstock.c:459
msgctxt "Stock label"
msgid "_Yes"
msgstr "_Sí"
-#: gtk/deprecated/gtkuimanager.c:1776
+#: gtk/deprecated/gtkuimanager.c:1782
#, c-format
msgid "Unexpected start tag '%s' on line %d char %d"
msgstr ""
"S'ha trobat una etiqueta d'inici «%s» inesperada a la línia %d, caràcter %d"
-#: gtk/deprecated/gtkuimanager.c:1866
+#: gtk/deprecated/gtkuimanager.c:1872
#, c-format
msgid "Unexpected character data on line %d char %d"
msgstr "S'han trobat dades de caràcter inesperades a la línia %d, caràcter %d"
-#: gtk/deprecated/gtkuimanager.c:2703
+#: gtk/deprecated/gtkuimanager.c:2709
msgid "Empty"
msgstr "Buit"
@@ -1546,10 +1546,8 @@ msgid "GNU Affero General Public License, version 3 or later"
msgstr "Llicència Pública General GNU Affero, versió 3 o posterior"
#: gtk/gtkaboutdialog.c:128
-#, fuzzy
-#| msgid "GNU General Public License, version 3 only"
msgid "GNU Affero General Public License, version 3 only"
-msgstr "Llicència Pública General GNU, només versió 3"
+msgstr "Llicència Pública General GNU Affero, només versió 3"
#: gtk/gtkaboutdialog.c:697
msgid "C_redits"
@@ -1742,7 +1740,7 @@ msgstr "Aplicacions relacionades"
msgid "Other Applications"
msgstr "Altres aplicacions"
-#: gtk/gtkapplicationwindow.c:345 gtk/gtkprintoperation-unix.c:484
+#: gtk/gtkapplicationwindow.c:345 gtk/gtkprintoperation-unix.c:485
#: gtk/gtkprintoperation-win32.c:1453 gtk/inspector/prop-editor.c:1686
msgid "Application"
msgstr "Aplicació"
@@ -2246,44 +2244,44 @@ msgstr "_Dret:"
msgid "Paper Margins"
msgstr "Marges del paper"
-#: gtk/gtkentry.c:9564 gtk/gtklabel.c:6680 gtk/gtktextview.c:9491
+#: gtk/gtkentry.c:9564 gtk/gtklabel.c:6680 gtk/gtktextview.c:9493
msgid "Cu_t"
msgstr "Re_talla"
-#: gtk/gtkentry.c:9568 gtk/gtklabel.c:6681 gtk/gtktextview.c:9495
+#: gtk/gtkentry.c:9568 gtk/gtklabel.c:6681 gtk/gtktextview.c:9497
msgid "_Copy"
msgstr "_Copia"
-#: gtk/gtkentry.c:9572 gtk/gtklabel.c:6682 gtk/gtktextview.c:9497
+#: gtk/gtkentry.c:9572 gtk/gtklabel.c:6682 gtk/gtktextview.c:9499
msgid "_Paste"
msgstr "_Enganxa"
#: gtk/gtkentry.c:9575 gtk/gtkfilechooserwidget.c:1476
-#: gtk/gtkfilechooserwidget.c:2276 gtk/gtklabel.c:6684 gtk/gtktextview.c:9500
+#: gtk/gtkfilechooserwidget.c:2276 gtk/gtklabel.c:6684 gtk/gtktextview.c:9502
msgid "_Delete"
msgstr "_Suprimeix"
-#: gtk/gtkentry.c:9586 gtk/gtklabel.c:6693 gtk/gtktextview.c:9514
+#: gtk/gtkentry.c:9586 gtk/gtklabel.c:6693 gtk/gtktextview.c:9516
msgid "Select _All"
msgstr "Seleccion_a-ho tot"
-#: gtk/gtkentry.c:9596 gtk/gtktextview.c:9524
+#: gtk/gtkentry.c:9596 gtk/gtktextview.c:9526
msgid "Insert _Emoji"
msgstr "_Insereix Emoji"
-#: gtk/gtkentry.c:9772 gtk/gtktextview.c:9749
+#: gtk/gtkentry.c:9772 gtk/gtktextview.c:9746
msgid "Select all"
msgstr "Selecciona-ho tot"
-#: gtk/gtkentry.c:9775 gtk/gtktextview.c:9752
+#: gtk/gtkentry.c:9775 gtk/gtktextview.c:9749
msgid "Cut"
msgstr "Retalla"
-#: gtk/gtkentry.c:9778 gtk/gtktextview.c:9755
+#: gtk/gtkentry.c:9778 gtk/gtktextview.c:9752
msgid "Copy"
msgstr "Copia"
-#: gtk/gtkentry.c:9781 gtk/gtktextview.c:9758
+#: gtk/gtkentry.c:9781 gtk/gtktextview.c:9755
msgid "Paste"
msgstr "Enganxa"
@@ -2318,7 +2316,7 @@ msgstr "_Nom:"
#. Open item is always present
#: gtk/gtkfilechoosernative.c:541 gtk/gtkfilechoosernative.c:626
#: gtk/gtkplacessidebar.c:3594 gtk/gtkplacessidebar.c:3662
-#: gtk/gtkplacesview.c:1629
+#: gtk/gtkplacesview.c:1633
msgid "_Open"
msgstr "_Obre"
@@ -2629,19 +2627,73 @@ msgstr "Accedit"
msgid "File System"
msgstr "Sistema de fitxers"
-#: gtk/gtkfontbutton.c:368 gtk/gtkfontbutton.c:498
+#: gtk/gtkfontbutton.c:381 gtk/gtkfontbutton.c:511
msgid "Sans 12"
msgstr "Sans 12"
-#: gtk/gtkfontbutton.c:481 gtk/gtkfontbutton.c:615
+#: gtk/gtkfontbutton.c:494 gtk/gtkfontbutton.c:628
msgid "Pick a Font"
msgstr "Trieu un tipus de lletra"
-#: gtk/gtkfontbutton.c:1355
+#: gtk/gtkfontbutton.c:1390
msgctxt "font"
msgid "None"
msgstr "Cap"
+#: gtk/gtkfontchooserwidget.c:1515
+msgid "Width"
+msgstr "Amplada"
+
+#: gtk/gtkfontchooserwidget.c:1516
+msgid "Weight"
+msgstr "Pes"
+
+#: gtk/gtkfontchooserwidget.c:1517
+msgid "Italic"
+msgstr "Cursiva"
+
+#: gtk/gtkfontchooserwidget.c:1518
+msgid "Slant"
+msgstr "Inclina"
+
+#: gtk/gtkfontchooserwidget.c:1519
+msgid "Optical Size"
+msgstr "Mida òptica"
+
+#: gtk/gtkfontchooserwidget.c:1658
+msgctxt "Language"
+msgid "Default"
+msgstr "Per defecte"
+
+#: gtk/gtkfontchooserwidget.c:1949 gtk/inspector/prop-editor.c:1676
+msgid "Default"
+msgstr "Per defecte"
+
+#: gtk/gtkfontchooserwidget.c:1979
+msgid "Ligatures"
+msgstr "Lligadures"
+
+#: gtk/gtkfontchooserwidget.c:1980
+msgid "Letter Case"
+msgstr "Ignora les diferències entre majúscules i minúscules"
+
+#: gtk/gtkfontchooserwidget.c:1981
+#, fuzzy
+msgid "Number Case"
+msgstr ""
+
+#: gtk/gtkfontchooserwidget.c:1982
+msgid "Number Spacing"
+msgstr "Espaiat dels nombres"
+
+#: gtk/gtkfontchooserwidget.c:1983
+msgid "Number Formatting"
+msgstr "Formatació dels nombres"
+
+#: gtk/gtkfontchooserwidget.c:1984
+msgid "Character Variants"
+msgstr "Variants del caràcter"
+
#: gtk/gtkglarea.c:313
msgid "OpenGL context creation failed"
msgstr "S'ha produït un error en la creació del context OpenGL"
@@ -3165,12 +3217,12 @@ msgid "Unable to poll “%s” for media changes"
msgstr "No es pot comprovar «%s» per si hi ha canvis de suports"
#: gtk/gtkplacessidebar.c:3599 gtk/gtkplacessidebar.c:3665
-#: gtk/gtkplacesview.c:1639
+#: gtk/gtkplacesview.c:1643
msgid "Open in New _Tab"
msgstr "Obre en una _pestanya nova"
#: gtk/gtkplacessidebar.c:3605 gtk/gtkplacessidebar.c:3668
-#: gtk/gtkplacesview.c:1650
+#: gtk/gtkplacesview.c:1654
msgid "Open in New _Window"
msgstr "Obre en una _finestra nova"
@@ -3186,11 +3238,11 @@ msgstr "_Elimina"
msgid "Rename…"
msgstr "Canvia el nom…"
-#: gtk/gtkplacessidebar.c:3678 gtk/gtkplacesview.c:1684
+#: gtk/gtkplacessidebar.c:3678 gtk/gtkplacesview.c:1688
msgid "_Mount"
msgstr "_Munta"
-#: gtk/gtkplacessidebar.c:3679 gtk/gtkplacesview.c:1674
+#: gtk/gtkplacessidebar.c:3679 gtk/gtkplacesview.c:1678
msgid "_Unmount"
msgstr "_Desmunta"
@@ -3202,55 +3254,55 @@ msgstr "_Expulsa"
msgid "_Detect Media"
msgstr "_Detecta el suport"
-#: gtk/gtkplacessidebar.c:4127 gtk/gtkplacesview.c:1118
+#: gtk/gtkplacessidebar.c:4127 gtk/gtkplacesview.c:1121
msgid "Computer"
msgstr "Ordinador"
-#: gtk/gtkplacesview.c:894
+#: gtk/gtkplacesview.c:897
msgid "Searching for network locations"
msgstr "S'estan cercant ubicacions de xarxa"
-#: gtk/gtkplacesview.c:901
+#: gtk/gtkplacesview.c:904
msgid "No network locations found"
msgstr "No s'ha trobat cap ubicació de xarxa"
#. if it wasn't cancelled show a dialog
-#: gtk/gtkplacesview.c:1228 gtk/gtkplacesview.c:1303
+#: gtk/gtkplacesview.c:1231 gtk/gtkplacesview.c:1306
msgid "Unable to access location"
msgstr "No s'ha pogut accedir a la ubicació"
#. Restore from Cancel to Connect
-#: gtk/gtkplacesview.c:1246 gtk/ui/gtkplacesview.ui:449
+#: gtk/gtkplacesview.c:1249 gtk/ui/gtkplacesview.ui:449
msgid "Con_nect"
msgstr "C_onnecta"
#. if it wasn't cancelled show a dialog
-#: gtk/gtkplacesview.c:1366
+#: gtk/gtkplacesview.c:1369
msgid "Unable to unmount volume"
msgstr "No es pot desmuntar el volum"
#. Allow to cancel the operation
-#: gtk/gtkplacesview.c:1466
+#: gtk/gtkplacesview.c:1470
msgid "Cance_l"
msgstr "_Cancel·la"
-#: gtk/gtkplacesview.c:1674
+#: gtk/gtkplacesview.c:1678
msgid "_Disconnect"
msgstr "_Desconnecta"
-#: gtk/gtkplacesview.c:1684
+#: gtk/gtkplacesview.c:1688
msgid "_Connect"
msgstr "C_onnecta"
-#: gtk/gtkplacesview.c:1825
+#: gtk/gtkplacesview.c:1829
msgid "Unable to get remote server location"
msgstr "No s'ha pogut obtenir la ubicació del servidor remot"
-#: gtk/gtkplacesview.c:2013 gtk/gtkplacesview.c:2022
+#: gtk/gtkplacesview.c:2017 gtk/gtkplacesview.c:2026
msgid "Networks"
msgstr "Xarxes"
-#: gtk/gtkplacesview.c:2013 gtk/gtkplacesview.c:2022
+#: gtk/gtkplacesview.c:2017 gtk/gtkplacesview.c:2026
msgid "On This Computer"
msgstr "En aquest ordinador"
@@ -3274,11 +3326,11 @@ msgstr "Desconnecta"
msgid "Unmount"
msgstr "Desmunta"
-#: gtk/gtkprintbackend.c:762
+#: gtk/gtkprintbackend.c:780
msgid "Authentication"
msgstr "Autenticació"
-#: gtk/gtkprintbackend.c:833
+#: gtk/gtkprintbackend.c:851
msgid "_Remember password"
msgstr "_Recorda la contrasenya"
@@ -3387,7 +3439,7 @@ msgstr "No hi ha paper"
#. Translators: this is a printer status.
#: gtk/gtkprintoperation-win32.c:621
-#: modules/printbackends/cups/gtkprintbackendcups.c:2596
+#: modules/printbackends/cups/gtkprintbackendcups.c:2603
msgid "Paused"
msgstr "En pausa"
@@ -3455,42 +3507,42 @@ msgstr "S'està obtenint informació de la impressora…"
#. * multiple pages on a sheet when printing
#.
#: gtk/gtkprintunixdialog.c:3119
-#: modules/printbackends/cups/gtkprintbackendcups.c:5434
+#: modules/printbackends/cups/gtkprintbackendcups.c:5441
msgid "Left to right, top to bottom"
msgstr "D'esquerra a dreta, de dalt a baix"
#: gtk/gtkprintunixdialog.c:3119
-#: modules/printbackends/cups/gtkprintbackendcups.c:5434
+#: modules/printbackends/cups/gtkprintbackendcups.c:5441
msgid "Left to right, bottom to top"
msgstr "D'esquerra a dreta, de baix a dalt"
#: gtk/gtkprintunixdialog.c:3120
-#: modules/printbackends/cups/gtkprintbackendcups.c:5435
+#: modules/printbackends/cups/gtkprintbackendcups.c:5442
msgid "Right to left, top to bottom"
msgstr "De dreta a esquerra, de dalt a baix"
#: gtk/gtkprintunixdialog.c:3120
-#: modules/printbackends/cups/gtkprintbackendcups.c:5435
+#: modules/printbackends/cups/gtkprintbackendcups.c:5442
msgid "Right to left, bottom to top"
msgstr "De dreta a esquerra, de baix a dalt"
#: gtk/gtkprintunixdialog.c:3121
-#: modules/printbackends/cups/gtkprintbackendcups.c:5436
+#: modules/printbackends/cups/gtkprintbackendcups.c:5443
msgid "Top to bottom, left to right"
msgstr "De dalt a baix, d'esquerra a dreta"
#: gtk/gtkprintunixdialog.c:3121
-#: modules/printbackends/cups/gtkprintbackendcups.c:5436
+#: modules/printbackends/cups/gtkprintbackendcups.c:5443
msgid "Top to bottom, right to left"
msgstr "De dalt a baix, de dreta a esquerra"
#: gtk/gtkprintunixdialog.c:3122
-#: modules/printbackends/cups/gtkprintbackendcups.c:5437
+#: modules/printbackends/cups/gtkprintbackendcups.c:5444
msgid "Bottom to top, left to right"
msgstr "De baix a dalt, d'esquerra a dreta"
#: gtk/gtkprintunixdialog.c:3122
-#: modules/printbackends/cups/gtkprintbackendcups.c:5437
+#: modules/printbackends/cups/gtkprintbackendcups.c:5444
msgid "Bottom to top, right to left"
msgstr "De baix a dalt, de dreta a esquerra"
@@ -4246,12 +4298,6 @@ msgstr "Font:"
msgid "Reset"
msgstr "Reinicia"
-# Premi a qui va ficar "Per defecte:LTR. M'ha costat
-# trobar en quin mòdul estava l'error. jm
-#: gtk/inspector/prop-editor.c:1676
-msgid "Default"
-msgstr "Per defecte"
-
#: gtk/inspector/prop-editor.c:1679
msgid "Theme"
msgstr "Tema"
@@ -4285,6 +4331,7 @@ msgid "Count"
msgstr "Compte"
#: gtk/inspector/resource-list.ui:130 gtk/ui/gtkfilechooserwidget.ui:223
+#: gtk/ui/gtkfontchooserwidget.ui:255
msgid "Size"
msgstr "Mida"
@@ -4617,6 +4664,803 @@ msgstr "Visualització"
msgid "General"
msgstr "General"
+#: gtk/open-type-layout.h:13
+#, fuzzy
+#| msgid "Accessible name"
+msgctxt "OpenType layout"
+msgid "Access All Alternates"
+msgstr "Pot veure els anuncis de tots els grups"
+
+#: gtk/open-type-layout.h:14
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Above-base Forms"
+msgstr "Formularis"
+
+#: gtk/open-type-layout.h:15
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Above-base Mark Positioning"
+msgstr "Qualificació base {$a}"
+
+#: gtk/open-type-layout.h:16
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Above-base Substitutions"
+msgstr "Substitucions"
+
+#: gtk/open-type-layout.h:17
+msgctxt "OpenType layout"
+msgid "Alternative Fractions"
+msgstr "Fraccions alternatives"
+
+#: gtk/open-type-layout.h:18
+msgctxt "OpenType layout"
+msgid "Akhands"
+msgstr "Akhands"
+
+#: gtk/open-type-layout.h:19
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Below-base Forms"
+msgstr "Formularis"
+
+#: gtk/open-type-layout.h:20
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Below-base Mark Positioning"
+msgstr "Qualificació base {$a}"
+
+#: gtk/open-type-layout.h:21
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Below-base Substitutions"
+msgstr "Substitucions"
+
+#: gtk/open-type-layout.h:22
+#
+msgctxt "OpenType layout"
+msgid "Contextual Alternates"
+msgstr "Alternatives contextuals"
+
+#: gtk/open-type-layout.h:23
+msgctxt "OpenType layout"
+msgid "Case-Sensitive Forms"
+msgstr "Distingeix entre majúscules i minúscules a les formes"
+
+#: gtk/open-type-layout.h:24
+msgctxt "OpenType layout"
+msgid "Glyph Composition / Decomposition"
+msgstr "Composició / Descomposició de gilfs"
+
+#: gtk/open-type-layout.h:25
+msgctxt "OpenType layout"
+msgid "Conjunct Form After Ro"
+msgstr ""
+
+#: gtk/open-type-layout.h:26
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Conjunct Forms"
+msgstr "Formularis"
+
+#: gtk/open-type-layout.h:27
+msgctxt "OpenType layout"
+msgid "Contextual Ligatures"
+msgstr "Lligadures contextuals"
+
+#: gtk/open-type-layout.h:28
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Centered CJK Punctuation"
+msgstr "Puntuació i símbols CJK"
+
+#: gtk/open-type-layout.h:29
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Capital Spacing"
+msgstr "Capital:"
+
+#: gtk/open-type-layout.h:30
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Contextual Swash"
+msgstr "Contextuals"
+
+#: gtk/open-type-layout.h:31
+msgctxt "OpenType layout"
+msgid "Cursive Positioning"
+msgstr "Posicionament de la cursiva"
+
+#: gtk/open-type-layout.h:32
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Petite Capitals From Capitals"
+msgstr "Versaletes"
+
+#: gtk/open-type-layout.h:33
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Small Capitals From Capitals"
+msgstr "Versaletes"
+
+#: gtk/open-type-layout.h:34
+msgctxt "OpenType layout"
+msgid "Distances"
+msgstr "Distàncies"
+
+#: gtk/open-type-layout.h:35
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Discretionary Ligatures"
+msgstr ""
+"Lligadures discrecionals. Desactivat per defecte. Taula d'OpenType: «hlig»"
+
+#: gtk/open-type-layout.h:36
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Denominators"
+msgstr ""
+"alineant nombres i denominadors, per exemple, <emph>{alignl a}over{b+c}</"
+"emph>"
+
+#: gtk/open-type-layout.h:37
+msgctxt "OpenType layout"
+msgid "Dotless Forms"
+msgstr "Formes sense punts"
+
+#: gtk/open-type-layout.h:38
+msgctxt "OpenType layout"
+msgid "Expert Forms"
+msgstr "Formes expertes"
+
+#: gtk/open-type-layout.h:39
+msgctxt "OpenType layout"
+msgid "Final Glyph on Line Alternates"
+msgstr ""
+
+#: gtk/open-type-layout.h:40
+msgctxt "OpenType layout"
+msgid "Terminal Forms #2"
+msgstr "Formes de terminal núm. 2"
+
+#: gtk/open-type-layout.h:41
+msgctxt "OpenType layout"
+msgid "Terminal Forms #3"
+msgstr "Formes de terminal núm. 3"
+
+#: gtk/open-type-layout.h:42
+msgctxt "OpenType layout"
+msgid "Terminal Forms"
+msgstr "Formes de terminal"
+
+#: gtk/open-type-layout.h:43
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Flattened accent forms"
+msgstr "sobreescriu l'aplanat"
+
+#: gtk/open-type-layout.h:44
+msgctxt "OpenType layout"
+msgid "Fractions"
+msgstr "Fraccions"
+
+#: gtk/open-type-layout.h:45
+msgctxt "OpenType layout"
+msgid "Full Widths"
+msgstr "Amplada completa"
+
+#: gtk/open-type-layout.h:46
+msgctxt "OpenType layout"
+msgid "Half Forms"
+msgstr "Formes mitjanes"
+
+#: gtk/open-type-layout.h:47
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Halant Forms"
+msgstr "Formularis"
+
+#: gtk/open-type-layout.h:48
+msgctxt "OpenType layout"
+msgid "Alternate Half Widths"
+msgstr "Formes mitjanes alternatives"
+
+#: gtk/open-type-layout.h:49
+msgctxt "OpenType layout"
+msgid "Historical Forms"
+msgstr "Formes històriques"
+
+#: gtk/open-type-layout.h:50
+msgctxt "OpenType layout"
+msgid "Horizontal Kana Alternates"
+msgstr "Alternativa Kana horitzontal"
+
+#: gtk/open-type-layout.h:51
+msgctxt "OpenType layout"
+msgid "Historical Ligatures"
+msgstr "Lligadures històriques"
+
+#: gtk/open-type-layout.h:52
+msgctxt "OpenType layout"
+msgid "Hangul"
+msgstr "Hangul"
+
+#: gtk/open-type-layout.h:53
+msgctxt "OpenType layout"
+msgid "Hojo Kanji Forms"
+msgstr "Formes Hojo Kanji"
+
+#: gtk/open-type-layout.h:54
+msgctxt "OpenType layout"
+msgid "Half Widths"
+msgstr "Amplada mitja"
+
+#: gtk/open-type-layout.h:55
+msgctxt "OpenType layout"
+msgid "Initial Forms"
+msgstr "Formes inicials"
+
+#: gtk/open-type-layout.h:56
+msgctxt "OpenType layout"
+msgid "Isolated Forms"
+msgstr "Formes aïllades"
+
+#: gtk/open-type-layout.h:57
+msgctxt "OpenType layout"
+msgid "Italics"
+msgstr "Cursives"
+
+#: gtk/open-type-layout.h:58
+msgctxt "OpenType layout"
+msgid "Justification Alternates"
+msgstr "Alternatives de justificació"
+
+#: gtk/open-type-layout.h:59
+msgctxt "OpenType layout"
+msgid "JIS78 Forms"
+msgstr "Formes JIS78"
+
+#: gtk/open-type-layout.h:60
+msgctxt "OpenType layout"
+msgid "JIS83 Forms"
+msgstr "Formes JIS83"
+
+#: gtk/open-type-layout.h:61
+msgctxt "OpenType layout"
+msgid "JIS90 Forms"
+msgstr "Formes JIS90"
+
+#: gtk/open-type-layout.h:62
+msgctxt "OpenType layout"
+msgid "JIS2004 Forms"
+msgstr "Formes JIS2004"
+
+#: gtk/open-type-layout.h:63
+msgctxt "OpenType layout"
+msgid "Kerning"
+msgstr "Interlletratge"
+
+#: gtk/open-type-layout.h:64
+#| msgid "Left Bin"
+msgctxt "OpenType layout"
+msgid "Left Bounds"
+msgstr "Límit esquerre"
+
+#: gtk/open-type-layout.h:65
+msgctxt "OpenType layout"
+msgid "Standard Ligatures"
+msgstr "Lligadures estàndards"
+
+#: gtk/open-type-layout.h:66
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Leading Jamo Forms"
+msgstr "Hangul Jamo"
+
+#: gtk/open-type-layout.h:67
+msgctxt "OpenType layout"
+msgid "Lining Figures"
+msgstr "Figures lineals"
+
+#: gtk/open-type-layout.h:68
+msgctxt "OpenType layout"
+msgid "Localized Forms"
+msgstr "Formes localitzades"
+
+#: gtk/open-type-layout.h:69
+msgctxt "OpenType layout"
+msgid "Left-to-right alternates"
+msgstr "Alternatives esquerra-dreta"
+
+#: gtk/open-type-layout.h:70
+#, fuzzy
+#| msgid "LRM _Left-to-right mark"
+msgctxt "OpenType layout"
+msgid "Left-to-right mirrored forms"
+msgstr "() esquerre-dret - \\esquerre(..\\dret)"
+
+#: gtk/open-type-layout.h:71
+msgctxt "OpenType layout"
+msgid "Mark Positioning"
+msgstr "Posicionament de la marca"
+
+#: gtk/open-type-layout.h:72
+msgctxt "OpenType layout"
+msgid "Medial Forms #2"
+msgstr "Formes mitjanes núm. 2"
+
+#: gtk/open-type-layout.h:73
+msgctxt "OpenType layout"
+msgid "Medial Forms"
+msgstr "Formes mitjanes"
+
+#: gtk/open-type-layout.h:74
+msgctxt "OpenType layout"
+msgid "Mathematical Greek"
+msgstr "Grecs matemàtics"
+
+#: gtk/open-type-layout.h:75
+msgctxt "OpenType layout"
+msgid "Mark to Mark Positioning"
+msgstr "Posicionament marca a marca"
+
+#: gtk/open-type-layout.h:76
+msgctxt "OpenType layout"
+msgid "Mark Positioning via Substitution"
+msgstr "Posicionament de marca per substitució"
+
+#: gtk/open-type-layout.h:77
+msgctxt "OpenType layout"
+msgid "Alternate Annotation Forms"
+msgstr "Formes anotades alternatives"
+
+#: gtk/open-type-layout.h:78
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "NLC Kanji Forms"
+msgstr "Kanji"
+
+#: gtk/open-type-layout.h:79
+msgctxt "OpenType layout"
+msgid "Nukta Forms"
+msgstr "Formes Nukta"
+
+#: gtk/open-type-layout.h:80
+msgctxt "OpenType layout"
+msgid "Numerators"
+msgstr "Numeradors"
+
+#: gtk/open-type-layout.h:81
+msgctxt "OpenType layout"
+msgid "Oldstyle Figures"
+msgstr "Figures amb estil antic"
+
+#: gtk/open-type-layout.h:82
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Optical Bounds"
+msgstr "Òptics"
+
+#: gtk/open-type-layout.h:83
+msgctxt "OpenType layout"
+msgid "Ordinals"
+msgstr "Ordinals"
+
+#: gtk/open-type-layout.h:84
+msgctxt "OpenType layout"
+msgid "Ornaments"
+msgstr "Ornaments"
+
+#: gtk/open-type-layout.h:85
+msgctxt "OpenType layout"
+msgid "Proportional Alternate Widths"
+msgstr "Amplades proporcionals alternatives"
+
+#: gtk/open-type-layout.h:86
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Petite Capitals"
+msgstr "Majúscules"
+
+#: gtk/open-type-layout.h:87
+msgctxt "OpenType layout"
+msgid "Proportional Kana"
+msgstr "Kana proporcional"
+
+#: gtk/open-type-layout.h:88
+msgctxt "OpenType layout"
+msgid "Proportional Figures"
+msgstr "Figures proporcionals"
+
+#: gtk/open-type-layout.h:89
+msgctxt "OpenType layout"
+msgid "Pre-Base Forms"
+msgstr "Formes pre-base"
+
+#: gtk/open-type-layout.h:90
+msgctxt "OpenType layout"
+msgid "Pre-base Substitutions"
+msgstr "Substitucions pre-base"
+
+#: gtk/open-type-layout.h:91
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Post-base Forms"
+msgstr "Formularis"
+
+#: gtk/open-type-layout.h:92
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Post-base Substitutions"
+msgstr "Substitucions"
+
+#: gtk/open-type-layout.h:93
+msgctxt "OpenType layout"
+msgid "Proportional Widths"
+msgstr "Amplades proporcionals"
+
+#: gtk/open-type-layout.h:94
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Quarter Widths"
+msgstr "Trimestre"
+
+#: gtk/open-type-layout.h:95
+msgctxt "OpenType layout"
+msgid "Randomize"
+msgstr "Aleatoritza"
+
+#: gtk/open-type-layout.h:96
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Required Contextual Alternates"
+msgstr "Contextuals"
+
+#: gtk/open-type-layout.h:97
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Rakar Forms"
+msgstr "Formularis"
+
+#: gtk/open-type-layout.h:98
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Required Ligatures"
+msgstr "Lligadures"
+
+#: gtk/open-type-layout.h:99
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Reph Forms"
+msgstr "Formularis"
+
+#: gtk/open-type-layout.h:100
+#, fuzzy
+#| msgctxt "output-bin"
+#| msgid "Right Bin"
+msgctxt "OpenType layout"
+msgid "Right Bounds"
+msgstr ": límits"
+
+#: gtk/open-type-layout.h:101
+#, fuzzy
+#| msgid "RLM _Right-to-left mark"
+msgctxt "OpenType layout"
+msgid "Right-to-left alternates"
+msgstr "() esquerre-dret - \\esquerre(..\\dret)"
+
+#: gtk/open-type-layout.h:102
+#, fuzzy
+#| msgid "RLM _Right-to-left mark"
+msgctxt "OpenType layout"
+msgid "Right-to-left mirrored forms"
+msgstr "() esquerre-dret - \\esquerre(..\\dret)"
+
+#: gtk/open-type-layout.h:103
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Ruby Notation Forms"
+msgstr "Formularis"
+
+#: gtk/open-type-layout.h:104
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Required Variation Alternates"
+msgstr "_Variació:"
+
+#: gtk/open-type-layout.h:105
+msgctxt "OpenType layout"
+msgid "Stylistic Alternates"
+msgstr ""
+
+#: gtk/open-type-layout.h:106
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Scientific Inferiors"
+msgstr "Científic"
+
+#: gtk/open-type-layout.h:107
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Optical size"
+msgstr "Òptics"
+
+#: gtk/open-type-layout.h:108
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Small Capitals"
+msgstr "Versaletes"
+
+#: gtk/open-type-layout.h:109
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Simplified Forms"
+msgstr "Simplificat"
+
+#: gtk/open-type-layout.h:110
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 1"
+msgstr "No s'ha pogut establir el criteri «%1»"
+
+#: gtk/open-type-layout.h:111
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 2"
+msgstr "Defineix el preferit 2 de la llista de reproducció"
+
+#: gtk/open-type-layout.h:112
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 3"
+msgstr "Defineix l'amplada del camí en 3:"
+
+#: gtk/open-type-layout.h:113
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 4"
+msgstr "Defineix el preferit 4 de la llista de reproducció"
+
+#: gtk/open-type-layout.h:114
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 5"
+msgstr "Defineix l'amplada del camí en 5:"
+
+#: gtk/open-type-layout.h:115
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 6"
+msgstr "Defineix el preferit 6 de la llista de reproducció"
+
+#: gtk/open-type-layout.h:116
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 7"
+msgstr "Defineix l'amplada del camí en 7:"
+
+#: gtk/open-type-layout.h:117
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 8"
+msgstr "Defineix el preferit 8 de la llista de reproducció"
+
+#: gtk/open-type-layout.h:118
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 9"
+msgstr "Defineix l'amplada del camí en 9:"
+
+#: gtk/open-type-layout.h:119
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 10"
+msgstr "Defineix el preferit 10 de la llista de reproducció"
+
+#: gtk/open-type-layout.h:120
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 11"
+msgstr "Espai de treball 11"
+
+#: gtk/open-type-layout.h:121
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 12"
+msgstr "12"
+
+#: gtk/open-type-layout.h:122
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 13"
+msgstr "openSUSE 13"
+
+#: gtk/open-type-layout.h:123
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 14"
+msgstr "14 ->"
+
+#: gtk/open-type-layout.h:124
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 15"
+msgstr "INT(15) és igual a 15"
+
+#: gtk/open-type-layout.h:125
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 16"
+msgstr "16 ms"
+
+#: gtk/open-type-layout.h:126
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 17"
+msgstr "Edat de 17"
+
+#: gtk/open-type-layout.h:127
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 18"
+msgstr "Auxiliar 18"
+
+#: gtk/open-type-layout.h:128
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stylistic Set 19"
+msgstr "Edat de 19"
+
+#: gtk/open-type-layout.h:129
+#, fuzzy
+#| msgid "Artistic License 2.0"
+msgctxt "OpenType layout"
+msgid "Stylistic Set 20"
+msgstr "20"
+
+#: gtk/open-type-layout.h:130
+msgctxt "OpenType layout"
+msgid "Math script style alternates"
+msgstr ""
+
+#: gtk/open-type-layout.h:131
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Stretching Glyph Decomposition"
+msgstr "Estirament"
+
+#: gtk/open-type-layout.h:132
+#, fuzzy
+#| msgid "Postscript"
+msgctxt "OpenType layout"
+msgid "Subscript"
+msgstr "Subíndex"
+
+#: gtk/open-type-layout.h:133
+#, fuzzy
+#| msgctxt "keyboard label"
+#| msgid "Super"
+msgctxt "OpenType layout"
+msgid "Superscript"
+msgstr "Superíndex"
+
+#: gtk/open-type-layout.h:134
+msgctxt "OpenType layout"
+msgid "Swash"
+msgstr ""
+
+#: gtk/open-type-layout.h:135
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Titling"
+msgstr "Titulació"
+
+#: gtk/open-type-layout.h:136
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Trailing Jamo Forms"
+msgstr "Hangul Jamo"
+
+#: gtk/open-type-layout.h:137
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Traditional Name Forms"
+msgstr "Formularis"
+
+#: gtk/open-type-layout.h:138
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Tabular Figures"
+msgstr "Taula*"
+
+#: gtk/open-type-layout.h:139
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Traditional Forms"
+msgstr "Formularis"
+
+#: gtk/open-type-layout.h:140
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Third Widths"
+msgstr "Amplades"
+
+#: gtk/open-type-layout.h:141
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Unicase"
+msgstr "Caixa única"
+
+#: gtk/open-type-layout.h:142
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Alternate Vertical Metrics"
+msgstr "Mètrica"
+
+#: gtk/open-type-layout.h:143
+#, fuzzy
+#| msgid "Dark Variant"
+msgctxt "OpenType layout"
+msgid "Vattu Variants"
+msgstr "_Variants:"
+
+#: gtk/open-type-layout.h:144
+#, fuzzy
+#| msgctxt "sizegroup mode"
+#| msgid "Vertical"
+msgctxt "OpenType layout"
+msgid "Vertical Writing"
+msgstr "Vertical cap endins"
+
+#: gtk/open-type-layout.h:145
+msgctxt "OpenType layout"
+msgid "Alternate Vertical Half Metrics"
+msgstr ""
+
+#: gtk/open-type-layout.h:146
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Vowel Jamo Forms"
+msgstr "És una vocal?"
+
+#: gtk/open-type-layout.h:147
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Vertical Kana Alternates"
+msgstr "Kana (suplement)"
+
+#: gtk/open-type-layout.h:148
+#, fuzzy
+#| msgctxt "sizegroup mode"
+#| msgid "Vertical"
+msgctxt "OpenType layout"
+msgid "Vertical Kerning"
+msgstr "_Interlletratge"
+
+#: gtk/open-type-layout.h:149
+msgctxt "OpenType layout"
+msgid "Proportional Alternate Vertical Metrics"
+msgstr ""
+
+#: gtk/open-type-layout.h:150
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Vertical Alternates and Rotation"
+msgstr "Gir"
+
+#: gtk/open-type-layout.h:151
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Vertical Alternates for Rotation"
+msgstr "Gir"
+
+#: gtk/open-type-layout.h:152
+#, fuzzy
+msgctxt "OpenType layout"
+msgid "Slashed Zero"
+msgstr "Zero barrat"
+
#: gtk/paper_names_offsets.c:4
msgctxt "paper size"
msgid "asme_f"
@@ -5528,6 +6372,707 @@ msgctxt "paper size"
msgid "ROC 8k"
msgstr "ROC 8k"
+#: gtk/script-names.c:16
+msgctxt "Script"
+msgid "Arabic"
+msgstr "Àrab"
+
+#: gtk/script-names.c:17
+msgctxt "Script"
+msgid "Armenian"
+msgstr "Armeni"
+
+#: gtk/script-names.c:18
+msgctxt "Script"
+msgid "Bengali"
+msgstr "Bengalí"
+
+#: gtk/script-names.c:19
+msgctxt "Script"
+msgid "Bopomofo"
+msgstr "Bopomofo"
+
+#: gtk/script-names.c:20
+msgctxt "Script"
+msgid "Cherokee"
+msgstr "Cherokee"
+
+#: gtk/script-names.c:21
+msgctxt "Script"
+msgid "Coptic"
+msgstr "Copte"
+
+#: gtk/script-names.c:22
+msgctxt "Script"
+msgid "Cyrillic"
+msgstr "Ciríl·lic"
+
+#: gtk/script-names.c:23
+msgctxt "Script"
+msgid "Deseret"
+msgstr "Deseret"
+
+#: gtk/script-names.c:24
+msgctxt "Script"
+msgid "Devanagari"
+msgstr "Devanagari"
+
+#: gtk/script-names.c:25
+msgctxt "Script"
+msgid "Ethiopic"
+msgstr "Etiòpic"
+
+#: gtk/script-names.c:26
+msgctxt "Script"
+msgid "Georgian"
+msgstr "Georgià"
+
+#: gtk/script-names.c:27
+msgctxt "Script"
+msgid "Gothic"
+msgstr "Gòtic"
+
+#: gtk/script-names.c:28
+msgctxt "Script"
+msgid "Greek"
+msgstr "Grec"
+
+#: gtk/script-names.c:29
+msgctxt "Script"
+msgid "Gujarati"
+msgstr "Gujarati"
+
+#: gtk/script-names.c:30
+msgctxt "Script"
+msgid "Gurmukhi"
+msgstr "Gurmukhi"
+
+#: gtk/script-names.c:31
+msgctxt "Script"
+msgid "Han"
+msgstr "Han"
+
+#: gtk/script-names.c:32
+msgctxt "Script"
+msgid "Hangul"
+msgstr "Hangul"
+
+#: gtk/script-names.c:33
+msgctxt "Script"
+msgid "Hebrew"
+msgstr "Hebreu"
+
+#: gtk/script-names.c:34
+msgctxt "Script"
+msgid "Hiragana"
+msgstr "Hiragana"
+
+#: gtk/script-names.c:35
+msgctxt "Script"
+msgid "Kannada"
+msgstr "Kanarès"
+
+#: gtk/script-names.c:36
+msgctxt "Script"
+msgid "Katakana"
+msgstr "Katakana"
+
+#: gtk/script-names.c:37
+msgctxt "Script"
+msgid "Khmer"
+msgstr "Khmer"
+
+#: gtk/script-names.c:38
+msgctxt "Script"
+msgid "Lao"
+msgstr "Laosià"
+
+#: gtk/script-names.c:39
+msgctxt "Script"
+msgid "Latin"
+msgstr "Llatí"
+
+#: gtk/script-names.c:40
+msgctxt "Script"
+msgid "Malayalam"
+msgstr "Malaiàlam"
+
+#: gtk/script-names.c:41
+msgctxt "Script"
+msgid "Mongolian"
+msgstr "Mongol"
+
+#: gtk/script-names.c:42
+msgctxt "Script"
+msgid "Myanmar"
+msgstr "Myanmar"
+
+#: gtk/script-names.c:43
+msgctxt "Script"
+msgid "Ogham"
+msgstr "Ogham"
+
+#: gtk/script-names.c:44
+msgctxt "Script"
+msgid "Old Italic"
+msgstr "Cursiva antiga"
+
+#: gtk/script-names.c:45
+msgctxt "Script"
+msgid "Oriya"
+msgstr "Oriya"
+
+#: gtk/script-names.c:46
+msgctxt "Script"
+msgid "Runic"
+msgstr "Rúnic"
+
+#: gtk/script-names.c:47
+msgctxt "Script"
+msgid "Sinhala"
+msgstr "Singalès"
+
+#: gtk/script-names.c:48
+msgctxt "Script"
+msgid "Syriac"
+msgstr "Siríac"
+
+#: gtk/script-names.c:49
+msgctxt "Script"
+msgid "Tamil"
+msgstr "Tàmil"
+
+#: gtk/script-names.c:50
+msgctxt "Script"
+msgid "Telugu"
+msgstr "Telugu"
+
+#: gtk/script-names.c:51
+msgctxt "Script"
+msgid "Thaana"
+msgstr "Thaana"
+
+#: gtk/script-names.c:52
+msgctxt "Script"
+msgid "Thai"
+msgstr "Tailandès"
+
+#: gtk/script-names.c:53
+msgctxt "Script"
+msgid "Tibetan"
+msgstr "Tibetà"
+
+#: gtk/script-names.c:54
+msgctxt "Script"
+msgid "Canadian Aboriginal"
+msgstr "Aborigen canadenc"
+
+#: gtk/script-names.c:55
+msgctxt "Script"
+msgid "Yi"
+msgstr "Yi"
+
+#: gtk/script-names.c:56
+msgctxt "Script"
+msgid "Tagalog"
+msgstr "Tagàlog"
+
+#: gtk/script-names.c:57
+msgctxt "Script"
+msgid "Hanunoo"
+msgstr "Hanunoo"
+
+#: gtk/script-names.c:58
+msgctxt "Script"
+msgid "Buhid"
+msgstr "Bugui"
+
+#: gtk/script-names.c:59
+msgctxt "Script"
+msgid "Tagbanwa"
+msgstr "Tagbanwa"
+
+#: gtk/script-names.c:60
+msgctxt "Script"
+msgid "Braille"
+msgstr "Braille"
+
+#: gtk/script-names.c:61
+msgctxt "Script"
+msgid "Cypriot"
+msgstr "Xipriota"
+
+#: gtk/script-names.c:62
+msgctxt "Script"
+msgid "Limbu"
+msgstr "Limbu"
+
+#: gtk/script-names.c:63
+msgctxt "Script"
+msgid "Osmanya"
+msgstr "Osmanli"
+
+#: gtk/script-names.c:64
+msgctxt "Script"
+msgid "Shavian"
+msgstr "Alfabet Shawn"
+
+#: gtk/script-names.c:65
+msgctxt "Script"
+msgid "Linear B"
+msgstr "Lineal B"
+
+#: gtk/script-names.c:66
+msgctxt "Script"
+msgid "Tai Le"
+msgstr "Tai Le"
+
+#: gtk/script-names.c:67
+msgctxt "Script"
+msgid "Ugaritic"
+msgstr "Ugarític"
+
+#: gtk/script-names.c:68
+msgctxt "Script"
+msgid "New Tai Lue"
+msgstr "Tai Lue nou"
+
+#: gtk/script-names.c:69
+msgctxt "Script"
+msgid "Buginese"
+msgstr "Bugui"
+
+#: gtk/script-names.c:70
+msgctxt "Script"
+msgid "Glagolitic"
+msgstr "Glagolític"
+
+#: gtk/script-names.c:71
+msgctxt "Script"
+msgid "Tifinagh"
+msgstr "Tifinagh"
+
+#: gtk/script-names.c:72
+msgctxt "Script"
+msgid "Syloti Nagri"
+msgstr "Syloti Nagri"
+
+#: gtk/script-names.c:73
+msgctxt "Script"
+msgid "Old Persian"
+msgstr "Persa antic"
+
+#: gtk/script-names.c:74
+msgctxt "Script"
+msgid "Kharoshthi"
+msgstr "Kharosthi"
+
+#: gtk/script-names.c:75
+msgctxt "Script"
+msgid "Unknown"
+msgstr "Desconegut"
+
+#: gtk/script-names.c:76
+msgctxt "Script"
+msgid "Balinese"
+msgstr "Balinès"
+
+#: gtk/script-names.c:77
+msgctxt "Script"
+msgid "Cuneiform"
+msgstr "Cuneïforme"
+
+#: gtk/script-names.c:78
+msgctxt "Script"
+msgid "Phoenician"
+msgstr "Fenici"
+
+#: gtk/script-names.c:79
+msgctxt "Script"
+msgid "Phags-pa"
+msgstr "Phags-pa"
+
+#: gtk/script-names.c:80
+msgctxt "Script"
+msgid "N'Ko"
+msgstr "Nko"
+
+#: gtk/script-names.c:81
+msgctxt "Script"
+msgid "Kayah Li"
+msgstr "Kayah Li"
+
+#: gtk/script-names.c:82
+msgctxt "Script"
+msgid "Lepcha"
+msgstr "Lepcha"
+
+#: gtk/script-names.c:83
+msgctxt "Script"
+msgid "Rejang"
+msgstr "Rejang"
+
+#: gtk/script-names.c:84
+msgctxt "Script"
+msgid "Sundanese"
+msgstr "Sundanès"
+
+#: gtk/script-names.c:85
+msgctxt "Script"
+msgid "Saurashtra"
+msgstr "Saurashtra"
+
+#: gtk/script-names.c:86
+msgctxt "Script"
+msgid "Cham"
+msgstr "Cham"
+
+#: gtk/script-names.c:87
+msgctxt "Script"
+msgid "Ol Chiki"
+msgstr "Ol Chiki"
+
+#: gtk/script-names.c:88
+msgctxt "Script"
+msgid "Vai"
+msgstr "Vai"
+
+#: gtk/script-names.c:89
+msgctxt "Script"
+msgid "Carian"
+msgstr "Caria"
+
+#: gtk/script-names.c:90
+msgctxt "Script"
+msgid "Lycian"
+msgstr "Lici"
+
+#: gtk/script-names.c:91
+msgctxt "Script"
+msgid "Lydian"
+msgstr "Lidi"
+
+#: gtk/script-names.c:92
+msgctxt "Script"
+msgid "Avestan"
+msgstr "avèstic"
+
+#: gtk/script-names.c:93
+msgctxt "Script"
+msgid "Bamum"
+msgstr "Bamum"
+
+#: gtk/script-names.c:94
+msgctxt "Script"
+msgid "Egyptian Hieroglpyhs"
+msgstr "Jeroglífics egipcis"
+
+#: gtk/script-names.c:95
+msgctxt "Script"
+msgid "Imperial Aramaic"
+msgstr "Arameu imperial"
+
+#: gtk/script-names.c:96
+msgctxt "Script"
+msgid "Inscriptional Pahlavi"
+msgstr "Pahlavi d'inscripció"
+
+#: gtk/script-names.c:97
+msgctxt "Script"
+msgid "Inscriptional Parthian"
+msgstr "Part d'inscripció"
+
+#: gtk/script-names.c:98
+msgctxt "Script"
+msgid "Javanese"
+msgstr "Javanès"
+
+#: gtk/script-names.c:99
+msgctxt "Script"
+msgid "Kaithi"
+msgstr "kaithi"
+
+#: gtk/script-names.c:100
+msgctxt "Script"
+msgid "Lisu"
+msgstr "Lisu"
+
+#: gtk/script-names.c:101
+msgctxt "Script"
+msgid "Meetei Mayek"
+msgstr "Meetei mayek"
+
+#: gtk/script-names.c:102
+msgctxt "Script"
+msgid "Old South Arabian"
+msgstr "Àrab del sud antic"
+
+#: gtk/script-names.c:103
+msgctxt "Script"
+msgid "Old Turkic"
+msgstr "Turc antic"
+
+#: gtk/script-names.c:104
+msgctxt "Script"
+msgid "Samaritan"
+msgstr "Samarità"
+
+#: gtk/script-names.c:105
+msgctxt "Script"
+msgid "Tai Tham"
+msgstr "Tai Tham"
+
+#: gtk/script-names.c:106
+msgctxt "Script"
+msgid "Tai Viet"
+msgstr "Tai Viet"
+
+#: gtk/script-names.c:107
+msgctxt "Script"
+msgid "Batak"
+msgstr "Batak"
+
+#: gtk/script-names.c:108
+msgctxt "Script"
+msgid "Brahmi"
+msgstr "Brahmi"
+
+#: gtk/script-names.c:109
+msgctxt "Script"
+msgid "Mandaic"
+msgstr "Mandaic"
+
+#: gtk/script-names.c:110
+msgctxt "Script"
+msgid "Chakma"
+msgstr "Chakma"
+
+#: gtk/script-names.c:111
+msgctxt "Script"
+msgid "Meroitic Cursive"
+msgstr "Meroític cursiva"
+
+#: gtk/script-names.c:112
+msgctxt "Script"
+msgid "Meroitic Hieroglyphs"
+msgstr "Jeroglífics meroítics"
+
+#: gtk/script-names.c:113
+msgctxt "Script"
+msgid "Miao"
+msgstr "Miao"
+
+#: gtk/script-names.c:114
+msgctxt "Script"
+msgid "Sharada"
+msgstr "Sharada"
+
+#: gtk/script-names.c:115
+msgctxt "Script"
+msgid "Sora Sompeng"
+msgstr "Sora Sompeng"
+
+#: gtk/script-names.c:116
+msgctxt "Script"
+msgid "Takri"
+msgstr "Takri"
+
+#: gtk/script-names.c:117
+msgctxt "Script"
+msgid "Bassa"
+msgstr "Bassa"
+
+#: gtk/script-names.c:118
+msgctxt "Script"
+msgid "Caucasian Albanian"
+msgstr "Albanès caucàsic"
+
+#: gtk/script-names.c:119
+msgctxt "Script"
+msgid "Duployan"
+msgstr "Duployan"
+
+#: gtk/script-names.c:120
+msgctxt "Script"
+msgid "Elbasan"
+msgstr "Elbasan"
+
+#: gtk/script-names.c:121
+msgctxt "Script"
+msgid "Grantha"
+msgstr "Grantha"
+
+#: gtk/script-names.c:122
+msgctxt "Script"
+msgid "Khojki"
+msgstr "Khojki"
+
+#: gtk/script-names.c:123
+msgctxt "Script"
+msgid "Khudawadi, Sindhi"
+msgstr "Khudawadi, Sindhi"
+
+#: gtk/script-names.c:124
+msgctxt "Script"
+msgid "Linear A"
+msgstr "Lineal A"
+
+#: gtk/script-names.c:125
+msgctxt "Script"
+msgid "Mahajani"
+msgstr "Mahajani"
+
+#: gtk/script-names.c:126
+#, fuzzy
+msgctxt "Script"
+msgid "Manichaean"
+msgstr "Maniquees"
+
+#: gtk/script-names.c:127
+msgctxt "Script"
+msgid "Mende Kikakui"
+msgstr "Mende Kikakui"
+
+#: gtk/script-names.c:128
+msgctxt "Script"
+msgid "Modi"
+msgstr "Modi"
+
+#: gtk/script-names.c:129
+msgctxt "Script"
+msgid "Mro"
+msgstr "Mro"
+
+#: gtk/script-names.c:130
+msgctxt "Script"
+msgid "Nabataean"
+msgstr "Nabateu"
+
+#: gtk/script-names.c:131
+msgctxt "Script"
+msgid "Old North Arabian"
+msgstr "Àrab del nord antic"
+
+#: gtk/script-names.c:132
+msgctxt "Script"
+msgid "Old Permic"
+msgstr "Pèrmic antic"
+
+#: gtk/script-names.c:133
+msgctxt "Script"
+msgid "Pahawh Hmong"
+msgstr "Pahawh Hmong"
+
+#: gtk/script-names.c:134
+msgctxt "Script"
+msgid "Palmyrene"
+msgstr "Palmyrene"
+
+#: gtk/script-names.c:135
+msgctxt "Script"
+msgid "Pau Cin Hau"
+msgstr "Pau Cin Hau"
+
+#: gtk/script-names.c:136
+msgctxt "Script"
+msgid "Psalter Pahlavi"
+msgstr "Inscripcions Pahlavi"
+
+#: gtk/script-names.c:137
+msgctxt "Script"
+msgid "Siddham"
+msgstr "Siddham"
+
+#: gtk/script-names.c:138
+msgctxt "Script"
+msgid "Tirhuta"
+msgstr "Tirhuta"
+
+#: gtk/script-names.c:139
+msgctxt "Script"
+msgid "Warang Citi"
+msgstr "Warang Citi"
+
+#: gtk/script-names.c:140
+msgctxt "Script"
+msgid "Ahom"
+msgstr ""
+
+#: gtk/script-names.c:141
+msgctxt "Script"
+msgid "Anatolian Hieroglyphs"
+msgstr "Jeroglífics antòlics"
+
+#: gtk/script-names.c:142
+msgctxt "Script"
+msgid "Hatran"
+msgstr "Hatran"
+
+#: gtk/script-names.c:143
+msgctxt "Script"
+msgid "Multani"
+msgstr "Multani"
+
+#: gtk/script-names.c:144
+msgctxt "Script"
+msgid "Old Hungarian"
+msgstr "Hongarès antic"
+
+#: gtk/script-names.c:145
+msgctxt "Script"
+msgid "Signwriting"
+msgstr "Lengua de signes"
+
+#: gtk/script-names.c:146
+msgctxt "Script"
+msgid "Adlam"
+msgstr ""
+
+#: gtk/script-names.c:147
+msgctxt "Script"
+msgid "Bhaiksuki"
+msgstr "Bhaiksuki"
+
+#: gtk/script-names.c:148
+msgctxt "Script"
+msgid "Marchen"
+msgstr "Marchen"
+
+#: gtk/script-names.c:149
+msgctxt "Script"
+msgid "Newa"
+msgstr "Newa"
+
+#: gtk/script-names.c:150
+msgctxt "Script"
+msgid "Osage"
+msgstr "Osage"
+
+#: gtk/script-names.c:151
+msgctxt "Script"
+msgid "Tangut"
+msgstr "Tangut"
+
+#: gtk/script-names.c:152
+msgctxt "Script"
+msgid "Masaram Gondi"
+msgstr "Masaram Gondi"
+
+#: gtk/script-names.c:153
+msgctxt "Script"
+msgid "Nushu"
+msgstr "Nushu"
+
+#: gtk/script-names.c:154
+msgctxt "Script"
+msgid "Soyombo"
+msgstr "Soyombo"
+
+#: gtk/script-names.c:155
+msgctxt "Script"
+msgid "Zanabazar Square"
+msgstr "Quadrat de Zanabazar"
+
#: gtk/ui/gtkaboutdialog.ui:133
msgid "About"
msgstr "Quant a"
@@ -5693,19 +7238,19 @@ msgstr "_Crea"
msgid "Select Font"
msgstr "Seleccioneu el tipus de lletra"
-#: gtk/ui/gtkfontchooserwidget.ui:50
+#: gtk/ui/gtkfontchooserwidget.ui:53
msgid "Search font name"
msgstr "Cerca el nom de la lletra"
-#: gtk/ui/gtkfontchooserwidget.ui:98
+#: gtk/ui/gtkfontchooserwidget.ui:101
msgid "Font Family"
msgstr "_Família del tipus de lletra"
-#: gtk/ui/gtkfontchooserwidget.ui:120
+#: gtk/ui/gtkfontchooserwidget.ui:123 gtk/ui/gtkfontchooserwidget.ui:242
msgid "Preview text"
msgstr "Text previsualitzat"
-#: gtk/ui/gtkfontchooserwidget.ui:187
+#: gtk/ui/gtkfontchooserwidget.ui:192
msgid "No Fonts Found"
msgstr "No s'ha trobat cap tipus de lletra"
@@ -6231,7 +7776,7 @@ msgstr "Tailandès-Lao"
#: modules/input/imti-er.c:451
msgctxt "input method menu"
msgid "Tigrigna-Eritrean (EZ+)"
-msgstr "Tigrinya-Eritreà (EZ+)"
+msgstr "Tigrinya-Eritrea (EZ+)"
#. ID
#: modules/input/imti-et.c:451
@@ -6246,10 +7791,10 @@ msgid "Vietnamese (VIQR)"
msgstr "Vietnamita (VIQR)"
#. ID
-#: modules/input/imwayland.c:81
+#: modules/input/imwayland.c:82
msgctxt "input method menu"
msgid "Wayland"
-msgstr ""
+msgstr "Wayland"
#. ID
#: modules/input/imxim.c:26
@@ -6282,107 +7827,107 @@ msgstr "Latent"
msgid "Pages per _sheet:"
msgstr "Pàgines per _full:"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1106
-#: modules/printbackends/cups/gtkprintbackendcups.c:1415
+#: modules/printbackends/cups/gtkprintbackendcups.c:1113
+#: modules/printbackends/cups/gtkprintbackendcups.c:1422
msgid "Username:"
msgstr "Nom d'usuari:"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1107
-#: modules/printbackends/cups/gtkprintbackendcups.c:1424
+#: modules/printbackends/cups/gtkprintbackendcups.c:1114
+#: modules/printbackends/cups/gtkprintbackendcups.c:1431
msgid "Password:"
msgstr "Contrasenya:"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1146
-#: modules/printbackends/cups/gtkprintbackendcups.c:1437
+#: modules/printbackends/cups/gtkprintbackendcups.c:1153
+#: modules/printbackends/cups/gtkprintbackendcups.c:1444
#, c-format
msgid "Authentication is required to print document “%s” on printer %s"
msgstr "Cal autenticació per imprimir el document «%s» a la impressora %s"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1148
+#: modules/printbackends/cups/gtkprintbackendcups.c:1155
#, c-format
msgid "Authentication is required to print a document on %s"
msgstr "Cal autenticació per imprimir un document a %s"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1152
+#: modules/printbackends/cups/gtkprintbackendcups.c:1159
#, c-format
msgid "Authentication is required to get attributes of job “%s”"
msgstr "Cal autenticació per obtenir els atributs de la tasca «%s»"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1154
+#: modules/printbackends/cups/gtkprintbackendcups.c:1161
msgid "Authentication is required to get attributes of a job"
msgstr "Cal autenticació per obtenir els atributs d'una tasca"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1158
+#: modules/printbackends/cups/gtkprintbackendcups.c:1165
#, c-format
msgid "Authentication is required to get attributes of printer %s"
msgstr "Cal autenticació per obtenir els atributs de la impressora %s"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1160
+#: modules/printbackends/cups/gtkprintbackendcups.c:1167
msgid "Authentication is required to get attributes of a printer"
msgstr "Cal autenticació per obtenir els atributs d'una impressora"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1163
+#: modules/printbackends/cups/gtkprintbackendcups.c:1170
#, c-format
msgid "Authentication is required to get default printer of %s"
msgstr "Cal autenticació per obtenir la impressora per defecte de %s"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1166
+#: modules/printbackends/cups/gtkprintbackendcups.c:1173
#, c-format
msgid "Authentication is required to get printers from %s"
msgstr "Cal autenticació per obtenir les impressores de %s"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1171
+#: modules/printbackends/cups/gtkprintbackendcups.c:1178
#, c-format
msgid "Authentication is required to get a file from %s"
msgstr "Cal autenticació per obtenir un fitxer de %s"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1173
+#: modules/printbackends/cups/gtkprintbackendcups.c:1180
#, c-format
msgid "Authentication is required on %s"
msgstr "Cal autenticació a %s"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1409
+#: modules/printbackends/cups/gtkprintbackendcups.c:1416
msgid "Domain:"
msgstr "Domini:"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1439
+#: modules/printbackends/cups/gtkprintbackendcups.c:1446
#, c-format
msgid "Authentication is required to print document “%s”"
msgstr "Cal autenticar-se per imprimir un document a «%s»"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1444
+#: modules/printbackends/cups/gtkprintbackendcups.c:1451
#, c-format
msgid "Authentication is required to print this document on printer %s"
msgstr "Cal autenticar-se per imprimir aquest document a la impressora «%s»"
-#: modules/printbackends/cups/gtkprintbackendcups.c:1446
+#: modules/printbackends/cups/gtkprintbackendcups.c:1453
msgid "Authentication is required to print this document"
msgstr "Cal autenticar-se per imprimir aquest document"
-#: modules/printbackends/cups/gtkprintbackendcups.c:2525
+#: modules/printbackends/cups/gtkprintbackendcups.c:2532
#, c-format
msgid "Printer “%s” is low on toner."
msgstr "El nivell del tòner de la impressora «%s» és baix."
-#: modules/printbackends/cups/gtkprintbackendcups.c:2529
+#: modules/printbackends/cups/gtkprintbackendcups.c:2536
#, c-format
msgid "Printer “%s” has no toner left."
msgstr "La impressora «%s» s'ha quedat sense tòner."
#. Translators: "Developer" like on photo development context
-#: modules/printbackends/cups/gtkprintbackendcups.c:2534
+#: modules/printbackends/cups/gtkprintbackendcups.c:2541
#, c-format
msgid "Printer “%s” is low on developer."
msgstr "El nivell del revelador de la impressora «%s» és baix."
#. Translators: "Developer" like on photo development context
-#: modules/printbackends/cups/gtkprintbackendcups.c:2539
+#: modules/printbackends/cups/gtkprintbackendcups.c:2546
#, c-format
msgid "Printer “%s” is out of developer."
msgstr "La impressora «%s» s'ha quedat sense revelador."
#. Translators: "marker" is one color bin of the printer
-#: modules/printbackends/cups/gtkprintbackendcups.c:2544
+#: modules/printbackends/cups/gtkprintbackendcups.c:2551
#, c-format
msgid "Printer “%s” is low on at least one marker supply."
msgstr ""
@@ -6390,334 +7935,334 @@ msgstr ""
"baix."
#. Translators: "marker" is one color bin of the printer
-#: modules/printbackends/cups/gtkprintbackendcups.c:2549
+#: modules/printbackends/cups/gtkprintbackendcups.c:2556
#, c-format
msgid "Printer “%s” is out of at least one marker supply."
msgstr ""
"La impressora «%s» s'ha quedat sense tinta en almenys un dels contenidors de "
"color."
-#: modules/printbackends/cups/gtkprintbackendcups.c:2553
+#: modules/printbackends/cups/gtkprintbackendcups.c:2560
#, c-format
msgid "The cover is open on printer “%s”."
msgstr "La tapa de la impressora «%s» és oberta."
-#: modules/printbackends/cups/gtkprintbackendcups.c:2557
+#: modules/printbackends/cups/gtkprintbackendcups.c:2564
#, c-format
msgid "The door is open on printer “%s”."
msgstr "La porta de la impressora «%s» és oberta."
-#: modules/printbackends/cups/gtkprintbackendcups.c:2561
+#: modules/printbackends/cups/gtkprintbackendcups.c:2568
#, c-format
msgid "Printer “%s” is low on paper."
msgstr "El nivell del paper de la impressora «%s» és baix."
-#: modules/printbackends/cups/gtkprintbackendcups.c:2565
+#: modules/printbackends/cups/gtkprintbackendcups.c:2572
#, c-format
msgid "Printer “%s” is out of paper."
msgstr "La impressora «%s» s'ha quedat sense paper."
-#: modules/printbackends/cups/gtkprintbackendcups.c:2569
+#: modules/printbackends/cups/gtkprintbackendcups.c:2576
#, c-format
msgid "Printer “%s” is currently offline."
msgstr "La impressora «%s» no està en línia."
-#: modules/printbackends/cups/gtkprintbackendcups.c:2573
+#: modules/printbackends/cups/gtkprintbackendcups.c:2580
#, c-format
msgid "There is a problem on printer “%s”."
msgstr "Hi ha un problema a la impressora «%s»."
#. Translators: this is a printer status.
-#: modules/printbackends/cups/gtkprintbackendcups.c:2593
+#: modules/printbackends/cups/gtkprintbackendcups.c:2600
msgid "Paused; Rejecting Jobs"
msgstr "En pausa; es refusen les tasques"
#. Translators: this is a printer status.
-#: modules/printbackends/cups/gtkprintbackendcups.c:2599
+#: modules/printbackends/cups/gtkprintbackendcups.c:2606
msgid "Rejecting Jobs"
msgstr "Es refusen les tasques"
#. Translators: this string connects multiple printer states together.
-#: modules/printbackends/cups/gtkprintbackendcups.c:2640
+#: modules/printbackends/cups/gtkprintbackendcups.c:2647
msgid "; "
msgstr ", "
-#: modules/printbackends/cups/gtkprintbackendcups.c:4380
-#: modules/printbackends/cups/gtkprintbackendcups.c:4447
+#: modules/printbackends/cups/gtkprintbackendcups.c:4387
+#: modules/printbackends/cups/gtkprintbackendcups.c:4454
msgctxt "printing option"
msgid "Two Sided"
msgstr "Doble cara"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4381
+#: modules/printbackends/cups/gtkprintbackendcups.c:4388
msgctxt "printing option"
msgid "Paper Type"
msgstr "Tipus de paper"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4382
+#: modules/printbackends/cups/gtkprintbackendcups.c:4389
msgctxt "printing option"
msgid "Paper Source"
msgstr "Font del paper"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4383
-#: modules/printbackends/cups/gtkprintbackendcups.c:4448
+#: modules/printbackends/cups/gtkprintbackendcups.c:4390
+#: modules/printbackends/cups/gtkprintbackendcups.c:4455
msgctxt "printing option"
msgid "Output Tray"
msgstr "Safata de sortida"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4384
+#: modules/printbackends/cups/gtkprintbackendcups.c:4391
msgctxt "printing option"
msgid "Resolution"
msgstr "Resolució"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4385
+#: modules/printbackends/cups/gtkprintbackendcups.c:4392
msgctxt "printing option"
msgid "GhostScript pre-filtering"
msgstr "Filtrat previ del GhostScript"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4394
+#: modules/printbackends/cups/gtkprintbackendcups.c:4401
msgctxt "printing option value"
msgid "One Sided"
msgstr "Una cara"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4396
+#: modules/printbackends/cups/gtkprintbackendcups.c:4403
msgctxt "printing option value"
msgid "Long Edge (Standard)"
msgstr "Cantó llarg (estàndard)"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4398
+#: modules/printbackends/cups/gtkprintbackendcups.c:4405
msgctxt "printing option value"
msgid "Short Edge (Flip)"
msgstr "Cantó curt (capgirat)"
#. Translators: this is an option of "Paper Source"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4400
-#: modules/printbackends/cups/gtkprintbackendcups.c:4402
-#: modules/printbackends/cups/gtkprintbackendcups.c:4410
+#: modules/printbackends/cups/gtkprintbackendcups.c:4407
+#: modules/printbackends/cups/gtkprintbackendcups.c:4409
+#: modules/printbackends/cups/gtkprintbackendcups.c:4417
msgctxt "printing option value"
msgid "Auto Select"
msgstr "Selecció automàtica"
#. Translators: this is an option of "Paper Source"
#. Translators: this is an option of "Resolution"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4404
-#: modules/printbackends/cups/gtkprintbackendcups.c:4406
-#: modules/printbackends/cups/gtkprintbackendcups.c:4408
-#: modules/printbackends/cups/gtkprintbackendcups.c:4412
+#: modules/printbackends/cups/gtkprintbackendcups.c:4411
+#: modules/printbackends/cups/gtkprintbackendcups.c:4413
+#: modules/printbackends/cups/gtkprintbackendcups.c:4415
+#: modules/printbackends/cups/gtkprintbackendcups.c:4419
msgctxt "printing option value"
msgid "Printer Default"
msgstr "Per defecte de la impressora"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4414
+#: modules/printbackends/cups/gtkprintbackendcups.c:4421
msgctxt "printing option value"
msgid "Embed GhostScript fonts only"
msgstr "Incrusta només els tipus de lletra GhostScript"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4416
+#: modules/printbackends/cups/gtkprintbackendcups.c:4423
msgctxt "printing option value"
msgid "Convert to PS level 1"
msgstr "Converteix a PS nivell 1"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4418
+#: modules/printbackends/cups/gtkprintbackendcups.c:4425
msgctxt "printing option value"
msgid "Convert to PS level 2"
msgstr "Converteix a PS nivell 2"
#. Translators: this is an option of "GhostScript"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4420
+#: modules/printbackends/cups/gtkprintbackendcups.c:4427
msgctxt "printing option value"
msgid "No pre-filtering"
msgstr "Sense filtratge previ"
#. Translators: "Miscellaneous" is the label for a button, that opens
#. up an extra panel of settings in a print dialog.
-#: modules/printbackends/cups/gtkprintbackendcups.c:4429
+#: modules/printbackends/cups/gtkprintbackendcups.c:4436
msgctxt "printing option group"
msgid "Miscellaneous"
msgstr "Miscel·lània"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4456
+#: modules/printbackends/cups/gtkprintbackendcups.c:4463
msgctxt "sides"
msgid "One Sided"
msgstr "Una cara"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4458
+#: modules/printbackends/cups/gtkprintbackendcups.c:4465
msgctxt "sides"
msgid "Long Edge (Standard)"
msgstr "Cantó llarg (estàndard)"
#. Translators: this is an option of "Two Sided"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4460
+#: modules/printbackends/cups/gtkprintbackendcups.c:4467
msgctxt "sides"
msgid "Short Edge (Flip)"
msgstr "Cantó curt (capgirat)"
#. Translators: Top output bin
-#: modules/printbackends/cups/gtkprintbackendcups.c:4463
+#: modules/printbackends/cups/gtkprintbackendcups.c:4470
msgctxt "output-bin"
msgid "Top Bin"
msgstr "Safata superior"
#. Translators: Middle output bin
-#: modules/printbackends/cups/gtkprintbackendcups.c:4465
+#: modules/printbackends/cups/gtkprintbackendcups.c:4472
msgctxt "output-bin"
msgid "Middle Bin"
msgstr "Safata del mig"
#. Translators: Bottom output bin
-#: modules/printbackends/cups/gtkprintbackendcups.c:4467
+#: modules/printbackends/cups/gtkprintbackendcups.c:4474
msgctxt "output-bin"
msgid "Bottom Bin"
msgstr "Safata inferior"
#. Translators: Side output bin
-#: modules/printbackends/cups/gtkprintbackendcups.c:4469
+#: modules/printbackends/cups/gtkprintbackendcups.c:4476
msgctxt "output-bin"
msgid "Side Bin"
msgstr "Safata lateral"
#. Translators: Left output bin
-#: modules/printbackends/cups/gtkprintbackendcups.c:4471
+#: modules/printbackends/cups/gtkprintbackendcups.c:4478
msgctxt "output-bin"
msgid "Left Bin"
msgstr "Safata esquerra"
#. Translators: Right output bin
-#: modules/printbackends/cups/gtkprintbackendcups.c:4473
+#: modules/printbackends/cups/gtkprintbackendcups.c:4480
msgctxt "output-bin"
msgid "Right Bin"
msgstr "Safata dreta"
#. Translators: Center output bin
-#: modules/printbackends/cups/gtkprintbackendcups.c:4475
+#: modules/printbackends/cups/gtkprintbackendcups.c:4482
msgctxt "output-bin"
msgid "Center Bin"
msgstr "Safata central"
#. Translators: Rear output bin
-#: modules/printbackends/cups/gtkprintbackendcups.c:4477
+#: modules/printbackends/cups/gtkprintbackendcups.c:4484
msgctxt "output-bin"
msgid "Rear Bin"
msgstr "Safata posterior"
#. Translators: Output bin where one sided output is oriented in the face-up position
-#: modules/printbackends/cups/gtkprintbackendcups.c:4479
+#: modules/printbackends/cups/gtkprintbackendcups.c:4486
msgctxt "output-bin"
msgid "Face Up Bin"
msgstr "Safata cara amunt"
#. Translators: Output bin where one sided output is oriented in the face-down position
-#: modules/printbackends/cups/gtkprintbackendcups.c:4481
+#: modules/printbackends/cups/gtkprintbackendcups.c:4488
msgctxt "output-bin"
msgid "Face Down Bin"
msgstr "Safata cara avall"
#. Translators: Large capacity output bin
-#: modules/printbackends/cups/gtkprintbackendcups.c:4483
+#: modules/printbackends/cups/gtkprintbackendcups.c:4490
msgctxt "output-bin"
msgid "Large Capacity Bin"
msgstr "Safata de gran capacitat"
#. Translators: Output stacker number %d
-#: modules/printbackends/cups/gtkprintbackendcups.c:4505
+#: modules/printbackends/cups/gtkprintbackendcups.c:4512
#, c-format
msgctxt "output-bin"
msgid "Stacker %d"
msgstr "Apilador %d"
#. Translators: Output mailbox number %d
-#: modules/printbackends/cups/gtkprintbackendcups.c:4509
+#: modules/printbackends/cups/gtkprintbackendcups.c:4516
#, c-format
msgctxt "output-bin"
msgid "Mailbox %d"
msgstr "Bústia %d"
#. Translators: Private mailbox
-#: modules/printbackends/cups/gtkprintbackendcups.c:4513
+#: modules/printbackends/cups/gtkprintbackendcups.c:4520
msgctxt "output-bin"
msgid "My Mailbox"
msgstr "La meva bústia"
#. Translators: Output tray number %d
-#: modules/printbackends/cups/gtkprintbackendcups.c:4517
+#: modules/printbackends/cups/gtkprintbackendcups.c:4524
#, c-format
msgctxt "output-bin"
msgid "Tray %d"
msgstr "Safata %d"
-#: modules/printbackends/cups/gtkprintbackendcups.c:4988
+#: modules/printbackends/cups/gtkprintbackendcups.c:4995
msgid "Printer Default"
msgstr "Per defecte de la impressora"
#. Translators: These strings name the possible values of the
#. * job priority option in the print dialog
#.
-#: modules/printbackends/cups/gtkprintbackendcups.c:5429
+#: modules/printbackends/cups/gtkprintbackendcups.c:5436
msgid "Urgent"
msgstr "Urgent"
-#: modules/printbackends/cups/gtkprintbackendcups.c:5429
+#: modules/printbackends/cups/gtkprintbackendcups.c:5436
msgid "High"
msgstr "Alta"
-#: modules/printbackends/cups/gtkprintbackendcups.c:5429
+#: modules/printbackends/cups/gtkprintbackendcups.c:5436
msgid "Medium"
msgstr "Mitjana"
-#: modules/printbackends/cups/gtkprintbackendcups.c:5429
+#: modules/printbackends/cups/gtkprintbackendcups.c:5436
msgid "Low"
msgstr "Baixa"
#. Translators, this string is used to label the job priority option
#. * in the print dialog
#.
-#: modules/printbackends/cups/gtkprintbackendcups.c:5459
+#: modules/printbackends/cups/gtkprintbackendcups.c:5466
msgid "Job Priority"
msgstr "Prioritat de la tasca"
#. Translators, this string is used to label the billing info entry
#. * in the print dialog
#.
-#: modules/printbackends/cups/gtkprintbackendcups.c:5470
+#: modules/printbackends/cups/gtkprintbackendcups.c:5477
msgid "Billing Info"
msgstr "Informació de facturació"
-#: modules/printbackends/cups/gtkprintbackendcups.c:5494
+#: modules/printbackends/cups/gtkprintbackendcups.c:5501
msgctxt "cover page"
msgid "None"
msgstr "Cap"
-#: modules/printbackends/cups/gtkprintbackendcups.c:5495
+#: modules/printbackends/cups/gtkprintbackendcups.c:5502
msgctxt "cover page"
msgid "Classified"
msgstr "Classificat"
-#: modules/printbackends/cups/gtkprintbackendcups.c:5496
+#: modules/printbackends/cups/gtkprintbackendcups.c:5503
msgctxt "cover page"
msgid "Confidential"
msgstr "Confidencial"
-#: modules/printbackends/cups/gtkprintbackendcups.c:5497
+#: modules/printbackends/cups/gtkprintbackendcups.c:5504
msgctxt "cover page"
msgid "Secret"
msgstr "Secret"
-#: modules/printbackends/cups/gtkprintbackendcups.c:5498
+#: modules/printbackends/cups/gtkprintbackendcups.c:5505
msgctxt "cover page"
msgid "Standard"
msgstr "Estàndard"
-#: modules/printbackends/cups/gtkprintbackendcups.c:5499
+#: modules/printbackends/cups/gtkprintbackendcups.c:5506
msgctxt "cover page"
msgid "Top Secret"
msgstr "Alt secret"
-#: modules/printbackends/cups/gtkprintbackendcups.c:5500
+#: modules/printbackends/cups/gtkprintbackendcups.c:5507
msgctxt "cover page"
msgid "Unclassified"
msgstr "No classificat"
@@ -6725,7 +8270,7 @@ msgstr "No classificat"
#. Translators, this string is used to label the pages-per-sheet option
#. * in the print dialog
#.
-#: modules/printbackends/cups/gtkprintbackendcups.c:5512
+#: modules/printbackends/cups/gtkprintbackendcups.c:5519
msgctxt "printer option"
msgid "Pages per Sheet"
msgstr "Pàgines per full"
@@ -6733,7 +8278,7 @@ msgstr "Pàgines per full"
#. Translators, this string is used to label the option in the print
#. * dialog that controls in what order multiple pages are arranged
#.
-#: modules/printbackends/cups/gtkprintbackendcups.c:5529
+#: modules/printbackends/cups/gtkprintbackendcups.c:5536
msgctxt "printer option"
msgid "Page Ordering"
msgstr "Ordenació de les pàgines"
@@ -6742,7 +8287,7 @@ msgstr "Ordenació de les pàgines"
#. Translators, this is the label used for the option in the print
#. * dialog that controls the front cover page.
#.
-#: modules/printbackends/cups/gtkprintbackendcups.c:5571
+#: modules/printbackends/cups/gtkprintbackendcups.c:5578
msgctxt "printer option"
msgid "Before"
msgstr "Abans"
@@ -6751,7 +8296,7 @@ msgstr "Abans"
#. Translators, this is the label used for the option in the print
#. * dialog that controls the back cover page.
#.
-#: modules/printbackends/cups/gtkprintbackendcups.c:5586
+#: modules/printbackends/cups/gtkprintbackendcups.c:5593
msgctxt "printer option"
msgid "After"
msgstr "Després"
@@ -6760,7 +8305,7 @@ msgstr "Després"
#. * a print job is printed. Possible values are 'now', a specified time,
#. * or 'on hold'
#.
-#: modules/printbackends/cups/gtkprintbackendcups.c:5606
+#: modules/printbackends/cups/gtkprintbackendcups.c:5613
msgctxt "printer option"
msgid "Print at"
msgstr "Imprimeix a"
@@ -6769,7 +8314,7 @@ msgstr "Imprimeix a"
#. 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/cups/gtkprintbackendcups.c:5617
+#: modules/printbackends/cups/gtkprintbackendcups.c:5624
msgctxt "printer option"
msgid "Print at time"
msgstr "Imprimeix a una hora determinada"
@@ -6779,19 +8324,19 @@ msgstr "Imprimeix a una hora determinada"
#. * the width and height in points. E.g: "Custom
#. * 230.4x142.9"
#.
-#: modules/printbackends/cups/gtkprintbackendcups.c:5659
+#: modules/printbackends/cups/gtkprintbackendcups.c:5666
#, c-format
msgid "Custom %s×%s"
msgstr "Personalitzat %sx%s"
# Connectada? (josep)
-#: modules/printbackends/cups/gtkprintbackendcups.c:5768
+#: modules/printbackends/cups/gtkprintbackendcups.c:5775
msgctxt "printer option"
msgid "Printer Profile"
msgstr "Perfil de la impressora"
#. TRANSLATORS: this is when color profile information is unavailable
-#: modules/printbackends/cups/gtkprintbackendcups.c:5775
+#: modules/printbackends/cups/gtkprintbackendcups.c:5782
msgctxt "printer option value"
msgid "Unavailable"
msgstr "No està disponible"