diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-02-18 05:52:44 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-02-18 05:52:44 +0000 |
commit | 32c7ca50eafde6e762c2496b711168379e9f33fb (patch) | |
tree | 7f895a74f7f55ea643c72835a5759cd50338c04d | |
parent | 38da88908d6e4974fc7dfd401f856533b8ba8615 (diff) | |
parent | 19b9967a72508d7eccb1c7048fcedd05c4ea7adf (diff) | |
download | gtk+-32c7ca50eafde6e762c2496b711168379e9f33fb.tar.gz |
Merge branch 'matthiasc/for-master' into 'master'
Matthiasc/for master
Closes #3679 and #3678
See merge request GNOME/gtk!3216
-rw-r--r-- | gtk/gtkimcontextsimple.c | 9 | ||||
-rw-r--r-- | gtk/gtkimcontextwayland.c | 17 | ||||
-rw-r--r-- | gtk/gtkpaned.c | 42 | ||||
-rw-r--r-- | gtk/gtkpanedhandle.c | 114 | ||||
-rw-r--r-- | gtk/gtkpanedhandleprivate.h | 32 | ||||
-rw-r--r-- | gtk/gtkpopovercontent.c | 10 | ||||
-rw-r--r-- | gtk/gtktext.c | 2 | ||||
-rw-r--r-- | gtk/meson.build | 1 |
8 files changed, 179 insertions, 48 deletions
diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c index 701e433c19..b8fec2f384 100644 --- a/gtk/gtkimcontextsimple.c +++ b/gtk/gtkimcontextsimple.c @@ -945,7 +945,14 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext *context, if (s->len) { - PangoAttribute *attr = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE); + PangoAttribute *attr; + + attr = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE); + attr->start_index = 0; + attr->end_index = s->len; + pango_attr_list_insert (*attrs, attr); + + attr = pango_attr_fallback_new (TRUE); attr->start_index = 0; attr->end_index = s->len; pango_attr_list_insert (*attrs, attr); diff --git a/gtk/gtkimcontextwayland.c b/gtk/gtkimcontextwayland.c index 77264087eb..915ad9e854 100644 --- a/gtk/gtkimcontextwayland.c +++ b/gtk/gtkimcontextwayland.c @@ -606,10 +606,23 @@ gtk_im_context_wayland_get_preedit_string (GtkIMContext *context, if (attrs) { + PangoAttribute *attr; + guint len = strlen (preedit_str); + if (!*attrs) *attrs = pango_attr_list_new (); - pango_attr_list_insert (*attrs, - pango_attr_underline_new (PANGO_UNDERLINE_SINGLE)); + + attr = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE); + attr->start_index = 0; + attr->end_index = len; + pango_attr_list_insert (*attrs, attr); + + /* enable fallback, since IBus will send us things like ⎄ */ + attr = pango_attr_fallback_new (TRUE); + attr->start_index = 0; + attr->end_index = len; + pango_attr_list_insert (*attrs, attr); + if (context_wayland->current_preedit.cursor_begin != context_wayland->current_preedit.cursor_end) { diff --git a/gtk/gtkpaned.c b/gtk/gtkpaned.c index c15dab86d9..b263caba62 100644 --- a/gtk/gtkpaned.c +++ b/gtk/gtkpaned.c @@ -30,16 +30,13 @@ #include "gtkeventcontrollermotion.h" #include "gtkgesturepan.h" #include "gtkgesturesingle.h" -#include "gtkgizmoprivate.h" +#include "gtkpanedhandleprivate.h" #include "gtkintl.h" #include "gtkmarshalers.h" #include "gtkorientable.h" #include "gtkprivate.h" -#include "gtkrendericonprivate.h" -#include "gtkcssnodeprivate.h" #include "gtktypebuiltins.h" #include "gtkwidgetprivate.h" -#include "gtkcssboxesprivate.h" #include "gtkbuildable.h" #include <math.h> @@ -300,26 +297,6 @@ get_handle_area (GtkPaned *paned, graphene_rect_inset (area, - extra, - extra); } -static gboolean -gtk_paned_handle_contains (GtkGizmo *handle, - double x, - double y) -{ - GtkWidget *paned; - GtkCssBoxes boxes; - graphene_rect_t area; - - gtk_css_boxes_init (&boxes, GTK_WIDGET (handle)); - - graphene_rect_init_from_rect (&area, gtk_css_boxes_get_border_rect (&boxes)); - - paned = gtk_widget_get_parent (GTK_WIDGET (handle)); - if (!gtk_paned_get_wide_handle (GTK_PANED (paned))) - graphene_rect_inset (&area, - HANDLE_EXTRA_SIZE, - HANDLE_EXTRA_SIZE); - - return graphene_rect_contains_point (&area, &GRAPHENE_POINT_INIT (x, y)); -} - static void gtk_paned_compute_expand (GtkWidget *widget, gboolean *hexpand, @@ -1408,21 +1385,6 @@ gtk_paned_unrealize (GtkWidget *widget) } static void -gtk_paned_render_handle (GtkGizmo *gizmo, - GtkSnapshot *snapshot) -{ - GtkWidget *widget = GTK_WIDGET (gizmo); - GtkCssStyle *style = gtk_css_node_get_style (gtk_widget_get_css_node (widget)); - int width, height; - - width = gtk_widget_get_width (widget); - height = gtk_widget_get_height (widget); - - if (width > 0 && height > 0) - gtk_css_style_snapshot_icon (style, snapshot, width, height); -} - -static void connect_drag_gesture_signals (GtkPaned *paned, GtkGesture *gesture) { @@ -1479,7 +1441,7 @@ gtk_paned_init (GtkPaned *paned) gtk_widget_add_controller (GTK_WIDGET (paned), GTK_EVENT_CONTROLLER (gesture)); paned->drag_gesture = gesture; - paned->handle_widget = gtk_gizmo_new ("separator", NULL, NULL, gtk_paned_render_handle, gtk_paned_handle_contains, NULL, NULL); + paned->handle_widget = gtk_paned_handle_new (); gtk_widget_set_parent (paned->handle_widget, GTK_WIDGET (paned)); gtk_widget_set_cursor_from_name (paned->handle_widget, "col-resize"); } diff --git a/gtk/gtkpanedhandle.c b/gtk/gtkpanedhandle.c new file mode 100644 index 0000000000..2738f0241d --- /dev/null +++ b/gtk/gtkpanedhandle.c @@ -0,0 +1,114 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 2021 Red Hat, Inc. + * + * Authors: + * - Matthias Clasen <mclasen@redhat.com> + * + * 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 "gtkpanedhandleprivate.h" +#include "gtkwidgetprivate.h" +#include "gtkcssnodeprivate.h" +#include "gtkcssstyleprivate.h" +#include "gtkrendericonprivate.h" +#include "gtkcssboxesprivate.h" +#include "gtkintl.h" + +#include "gtkpaned.h" + + +G_DEFINE_TYPE (GtkPanedHandle, gtk_paned_handle, GTK_TYPE_WIDGET); + +static void +gtk_paned_handle_snapshot (GtkWidget *widget, + GtkSnapshot *snapshot) +{ + GtkCssStyle *style = gtk_css_node_get_style (gtk_widget_get_css_node (widget)); + int width, height; + + width = gtk_widget_get_width (widget); + height = gtk_widget_get_height (widget); + + if (width > 0 && height > 0) + gtk_css_style_snapshot_icon (style, snapshot, width, height); +} + +#define HANDLE_EXTRA_SIZE 6 + +static gboolean +gtk_paned_handle_contains (GtkWidget *widget, + double x, + double y) +{ + GtkWidget *paned; + GtkCssBoxes boxes; + graphene_rect_t area; + + gtk_css_boxes_init (&boxes, widget); + + graphene_rect_init_from_rect (&area, gtk_css_boxes_get_border_rect (&boxes)); + + paned = gtk_widget_get_parent (widget); + if (!gtk_paned_get_wide_handle (GTK_PANED (paned))) + graphene_rect_inset (&area, - HANDLE_EXTRA_SIZE, - HANDLE_EXTRA_SIZE); + + return graphene_rect_contains_point (&area, &GRAPHENE_POINT_INIT (x, y)); +} + +static void +gtk_paned_handle_finalize (GObject *object) +{ + GtkPanedHandle *self = GTK_PANED_HANDLE (object); + GtkWidget *widget; + + widget = _gtk_widget_get_first_child (GTK_WIDGET (self)); + while (widget != NULL) + { + GtkWidget *next = _gtk_widget_get_next_sibling (widget); + + gtk_widget_unparent (widget); + + widget = next; + } + + G_OBJECT_CLASS (gtk_paned_handle_parent_class)->finalize (object); +} + +static void +gtk_paned_handle_class_init (GtkPanedHandleClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = gtk_paned_handle_finalize; + + widget_class->snapshot = gtk_paned_handle_snapshot; + widget_class->contains = gtk_paned_handle_contains; + + gtk_widget_class_set_css_name (widget_class, I_("separator")); +} + +static void +gtk_paned_handle_init (GtkPanedHandle *self) +{ +} + +GtkWidget * +gtk_paned_handle_new (void) +{ + return g_object_new (GTK_TYPE_PANED_HANDLE, NULL); +} diff --git a/gtk/gtkpanedhandleprivate.h b/gtk/gtkpanedhandleprivate.h new file mode 100644 index 0000000000..34b188de64 --- /dev/null +++ b/gtk/gtkpanedhandleprivate.h @@ -0,0 +1,32 @@ + +#ifndef __GTK_PANED_HANDLE_H__ +#define __GTK_PANED_HANDLE_H__ + +#include "gtkwidget.h" +#include "gtkenums.h" + +#define GTK_TYPE_PANED_HANDLE (gtk_paned_handle_get_type ()) +#define GTK_PANED_HANDLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_PANED_HANDLE, GtkPanedHandle)) +#define GTK_PANED_HANDLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PANED_HANDLE, GtkPanedHandleClass)) +#define GTK_IS_PANED_HANDLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_PANED_HANDLE)) +#define GTK_IS_PANED_HANDLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PANED_HANDLE)) +#define GTK_PANED_HANDLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PANED_HANDLE, GtkPanedHandleClass)) + +typedef struct _GtkPanedHandle GtkPanedHandle; +typedef struct _GtkPanedHandleClass GtkPanedHandleClass; + +struct _GtkPanedHandle +{ + GtkWidget parent_instance; +}; + +struct _GtkPanedHandleClass +{ + GtkWidgetClass parent_class; +}; + +GType gtk_paned_handle_get_type (void) G_GNUC_CONST; + +GtkWidget *gtk_paned_handle_new (void); + +#endif diff --git a/gtk/gtkpopovercontent.c b/gtk/gtkpopovercontent.c index 92a299d571..d4969de987 100644 --- a/gtk/gtkpopovercontent.c +++ b/gtk/gtkpopovercontent.c @@ -18,10 +18,13 @@ * License along with this library. If not, see <http://www.gnu.org/licenses/>. */ +#include "config.h" + #include "gtkpopovercontentprivate.h" #include "gtkstylecontextprivate.h" #include "gtkwidgetprivate.h" +#include "gtkintl.h" /* A private class used as the child of GtkPopover. The only thing * special here is that we need to queue a resize on the popover when @@ -71,6 +74,8 @@ gtk_popover_content_class_init (GtkPopoverContentClass *klass) widget_class->focus = gtk_widget_focus_child; widget_class->grab_focus = gtk_widget_grab_focus_child; widget_class->css_changed = gtk_popover_content_css_changed; + + gtk_widget_class_set_css_name (widget_class, I_("contents")); } static void @@ -81,8 +86,5 @@ gtk_popover_content_init (GtkPopoverContent *self) GtkWidget * gtk_popover_content_new (void) { - return g_object_new (GTK_TYPE_POPOVER_CONTENT, - "css-name", "contents", - "accessible-role", GTK_ACCESSIBLE_ROLE_WIDGET, - NULL); + return g_object_new (GTK_TYPE_POPOVER_CONTENT, NULL); } diff --git a/gtk/gtktext.c b/gtk/gtktext.c index 6d10722e6b..3984750034 100644 --- a/gtk/gtktext.c +++ b/gtk/gtktext.c @@ -4365,9 +4365,9 @@ gtk_text_create_layout (GtkText *self, pango_layout_set_single_paragraph_mode (layout, TRUE); tmp_attrs = gtk_css_style_get_pango_attributes (gtk_css_node_get_style (gtk_widget_get_css_node (widget))); - tmp_attrs = _gtk_pango_attr_list_merge (tmp_attrs, priv->attrs); if (!tmp_attrs) tmp_attrs = pango_attr_list_new (); + tmp_attrs = _gtk_pango_attr_list_merge (tmp_attrs, priv->attrs); display_text = gtk_text_get_display_text (self, 0, -1); diff --git a/gtk/meson.build b/gtk/meson.build index 5526cd7c5e..026e531b32 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -119,6 +119,7 @@ gtk_private_sources = files([ 'gtkmenusectionbox.c', 'gtkmenutracker.c', 'gtkmenutrackeritem.c', + 'gtkpanedhandle.c', 'gtkpango.c', 'gskpango.c', 'gtkpasswordentrybuffer.c', |