summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demos/gtk-demo/builder.c1
-rw-r--r--demos/gtk-demo/demoimage.c40
-rw-r--r--demos/gtk-demo/glarea.c1
-rw-r--r--demos/gtk-demo/shortcuts.ui2
-rw-r--r--docs/reference/gtk/gtk4-sections.txt2
-rw-r--r--gdk/gdkgl.c19
-rw-r--r--gdk/macos/GdkMacosWindow.c4
-rw-r--r--gdk/macos/gdkmacosdisplay-translate.c57
-rw-r--r--gdk/macos/gdkmacosdisplay.c8
-rw-r--r--gdk/macos/gdkmacospopupsurface.c19
-rw-r--r--gdk/macos/gdkmacossurface.c18
-rw-r--r--gdk/wayland/gdksurface-wayland.c2
-rw-r--r--gsk/gl/gskglrenderer.c305
-rw-r--r--gsk/gl/gskglrendererprivate.h6
-rw-r--r--gsk/gl/gskglshaderbuilder.c6
-rw-r--r--gsk/gskglshader.c4
-rw-r--r--gsk/resources/glsl/blur.glsl3
-rw-r--r--gsk/resources/glsl/inset_shadow.glsl4
-rw-r--r--gsk/resources/glsl/preamble.glsl2
-rw-r--r--gsk/resources/glsl/unblurred_outset_shadow.glsl4
-rw-r--r--gsk/vulkan/gskvulkanrenderpass.c1
-rw-r--r--gtk/gtkappchooserdialog.c1
-rw-r--r--gtk/gtkassistant.c1
-rw-r--r--gtk/gtkbuilder.c93
-rw-r--r--gtk/gtkbuilderprivate.h3
-rw-r--r--gtk/gtkbutton.c1
-rw-r--r--gtk/gtkcolorchooserwidget.c1
-rw-r--r--gtk/gtkcolorplane.c79
-rw-r--r--gtk/gtkcolorscale.c34
-rw-r--r--gtk/gtkcolorutils.c140
-rw-r--r--gtk/gtkcolumnviewcolumn.c1
-rw-r--r--gtk/gtkdialog.c1
-rw-r--r--gtk/gtkdragsource.c1
-rw-r--r--gtk/gtkdrawingarea.c1
-rw-r--r--gtk/gtkdropdown.c1
-rw-r--r--gtk/gtkemojichooser.c1
-rw-r--r--gtk/gtkentrycompletion.c1
-rw-r--r--gtk/gtkfilechooserdialog.c1
-rw-r--r--gtk/gtkfilechoosernative.c1
-rw-r--r--gtk/gtkfilechoosernativeportal.c1
-rw-r--r--gtk/gtkfilechoosernativequartz.c7
-rw-r--r--gtk/gtkfilechoosernativewin32.c1
-rw-r--r--gtk/gtkfilechooserwidget.c5
-rw-r--r--gtk/gtkframe.c10
-rw-r--r--gtk/gtkglarea.c1
-rw-r--r--gtk/gtkinfobar.c2
-rw-r--r--gtk/gtklinkbutton.c1
-rw-r--r--gtk/gtklistview.c1
-rw-r--r--gtk/gtklockbutton.c1
-rw-r--r--gtk/gtkmain.c7
-rw-r--r--gtk/gtkmenubutton.c1
-rw-r--r--gtk/gtkmenusectionbox.c1
-rw-r--r--gtk/gtkmessagedialog.c1
-rw-r--r--gtk/gtkmodelbutton.c24
-rw-r--r--gtk/gtknativedialog.c1
-rw-r--r--gtk/gtkorientable.c1
-rw-r--r--gtk/gtkoverlay.c1
-rw-r--r--gtk/gtkoverlaylayout.c10
-rw-r--r--gtk/gtkpasswordentry.c1
-rw-r--r--gtk/gtkplacessidebar.c1
-rw-r--r--gtk/gtkpopover.c97
-rw-r--r--gtk/gtkpopover.h5
-rw-r--r--gtk/gtkpopovermenu.c1
-rw-r--r--gtk/gtkpopovermenubar.c1
-rw-r--r--gtk/gtksearchbar.c1
-rw-r--r--gtk/gtkshortcutssection.c1
-rw-r--r--gtk/gtkshortcutsshortcut.c1
-rw-r--r--gtk/gtkshortcutswindow.c1
-rw-r--r--gtk/gtksidebarrow.c1
-rw-r--r--gtk/gtkspinner.c1
-rw-r--r--gtk/gtkstacksidebar.c43
-rw-r--r--gtk/gtkstackswitcher.c1
-rw-r--r--gtk/gtkstylecontext.c112
-rw-r--r--gtk/gtkstylecontext.h10
-rw-r--r--gtk/gtkstylecontextprivate.h2
-rw-r--r--gtk/gtktextviewchild.c1
-rw-r--r--gtk/gtktogglebutton.c1
-rw-r--r--gtk/gtktooltip.c1
-rw-r--r--gtk/gtkviewport.c1
-rw-r--r--gtk/gtkwidget.c9
-rw-r--r--gtk/gtkwidgetprivate.h3
-rw-r--r--gtk/gtkwindow.c11
-rw-r--r--gtk/gtkwindowcontrols.c40
-rw-r--r--gtk/inspector/actions.c1
-rw-r--r--gtk/inspector/controllers.c1
-rw-r--r--gtk/inspector/object-tree.c1
-rw-r--r--gtk/inspector/prop-list.c1
-rw-r--r--gtk/inspector/size-groups.c1
-rw-r--r--gtk/inspector/strv-editor.c1
-rw-r--r--gtk/theme/Adwaita/_common.scss5
-rw-r--r--gtk/tools/gdkpixbufutils.c2
-rw-r--r--meson.build23
-rw-r--r--tests/showrendernode.c3
-rw-r--r--tests/testfilechooser.c22
94 files changed, 612 insertions, 743 deletions
diff --git a/demos/gtk-demo/builder.c b/demos/gtk-demo/builder.c
index db44bc17f9..22c06dfa72 100644
--- a/demos/gtk-demo/builder.c
+++ b/demos/gtk-demo/builder.c
@@ -158,7 +158,6 @@ do_builder (GtkWidget *do_widget)
about = GTK_WIDGET (gtk_builder_get_object (builder, "aboutdialog1"));
gtk_window_set_transient_for (GTK_WINDOW (about), GTK_WINDOW (window));
gtk_window_set_hide_on_close (GTK_WINDOW (about), TRUE);
- g_signal_connect (about, "response", G_CALLBACK (gtk_widget_hide), NULL);
g_object_set_data_full (G_OBJECT (window), "about",
about, (GDestroyNotify)gtk_window_destroy);
diff --git a/demos/gtk-demo/demoimage.c b/demos/gtk-demo/demoimage.c
index 40acbd2dce..a7ecb6e213 100644
--- a/demos/gtk-demo/demoimage.c
+++ b/demos/gtk-demo/demoimage.c
@@ -48,20 +48,46 @@ get_image_paintable (GtkImage *image)
}
static void
+update_drag_icon (DemoImage *demo,
+ GtkDragIcon *icon)
+{
+ const char *icon_name;
+ GdkPaintable *paintable;
+ GtkWidget *image;
+
+ switch (gtk_image_get_storage_type (GTK_IMAGE (demo->image)))
+ {
+ case GTK_IMAGE_PAINTABLE:
+ paintable = gtk_image_get_paintable (GTK_IMAGE (demo->image));
+ image = gtk_image_new_from_paintable (paintable);
+ break;
+ case GTK_IMAGE_ICON_NAME:
+ icon_name = gtk_image_get_icon_name (GTK_IMAGE (demo->image));
+ image = gtk_image_new_from_icon_name (icon_name);
+ break;
+ case GTK_IMAGE_EMPTY:
+ case GTK_IMAGE_GICON:
+ default:
+ g_warning ("Image storage type %d not handled",
+ gtk_image_get_storage_type (GTK_IMAGE (demo->image)));
+ return;
+ }
+
+ gtk_image_set_pixel_size (GTK_IMAGE (image),
+ gtk_image_get_pixel_size (GTK_IMAGE (demo->image)));
+
+ gtk_drag_icon_set_child (icon, image);
+}
+
+static void
drag_begin (GtkDragSource *source,
GdkDrag *drag,
gpointer data)
{
GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
DemoImage *demo = DEMO_IMAGE (widget);
- GdkPaintable *paintable;
- paintable = get_image_paintable (GTK_IMAGE (demo->image));
- if (paintable)
- {
- gtk_drag_icon_set_from_paintable (drag, paintable, -2, -2);
- g_object_unref (paintable);
- }
+ update_drag_icon (demo, GTK_DRAG_ICON (gtk_drag_icon_get_for_drag (drag)));
}
static GdkContentProvider *
diff --git a/demos/gtk-demo/glarea.c b/demos/gtk-demo/glarea.c
index 5c2fb898c3..428d9fdaae 100644
--- a/demos/gtk-demo/glarea.c
+++ b/demos/gtk-demo/glarea.c
@@ -406,6 +406,7 @@ create_glarea_window (GtkWidget *do_widget)
gl_area = gtk_gl_area_new ();
gtk_widget_set_hexpand (gl_area, TRUE);
gtk_widget_set_vexpand (gl_area, TRUE);
+ gtk_widget_set_size_request (gl_area, 100, 200);
gtk_box_append (GTK_BOX (box), gl_area);
/* We need to initialize and free GL resources, so we use
diff --git a/demos/gtk-demo/shortcuts.ui b/demos/gtk-demo/shortcuts.ui
index 36eda142bd..1de5855966 100644
--- a/demos/gtk-demo/shortcuts.ui
+++ b/demos/gtk-demo/shortcuts.ui
@@ -8,7 +8,7 @@
<property name="margin-start">50</property>
<property name="margin-end">50</property>
<property name="margin-top">50</property>
- <property name="margin-end">50</property>
+ <property name="margin-bottom">50</property>
<property name="spacing">10</property>
<child>
<object class="GtkButton">
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index 71ffac0806..bf33adde32 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -6150,6 +6150,8 @@ gtk_popover_get_has_arrow
gtk_popover_set_offset
gtk_popover_get_offset
gtk_popover_set_default_widget
+gtk_popover_set_cascade_popdown
+gtk_popover_get_cascade_popdown
<SUBSECTION Standard>
GTK_TYPE_POPOVER
GTK_IS_POPOVER
diff --git a/gdk/gdkgl.c b/gdk/gdkgl.c
index 7ae8decfed..56dce18333 100644
--- a/gdk/gdkgl.c
+++ b/gdk/gdkgl.c
@@ -27,7 +27,7 @@
#include <string.h>
static const char *
-get_vertex_type_name (int type)
+get_shader_type_name (int type)
{
switch (type)
{
@@ -64,7 +64,7 @@ create_shader (int type,
buffer = g_malloc (log_len + 1);
glGetShaderInfoLog (shader, log_len, NULL, buffer);
- g_warning ("Compile failure in %s shader:\n%s", get_vertex_type_name (type), buffer);
+ g_warning ("Compile failure in %s shader:\n%s", get_shader_type_name (type), buffer);
g_free (buffer);
glDeleteShader (shader);
@@ -328,10 +328,8 @@ gdk_cairo_draw_from_gl (cairo_t *cr,
{
GdkGLContext *paint_context;
cairo_surface_t *image;
- cairo_matrix_t matrix;
guint framebuffer;
int alpha_size = 0;
- cairo_region_t *clip_region;
GdkGLContextPaintData *paint_data;
int major, minor, version;
gboolean es_use_bgra = FALSE;
@@ -343,7 +341,6 @@ gdk_cairo_draw_from_gl (cairo_t *cr,
return;
}
- clip_region = gdk_cairo_region_from_clip (cr);
es_use_bgra = gdk_gl_context_use_es_bgra (paint_context);
gdk_gl_context_make_current (paint_context);
@@ -372,8 +369,6 @@ gdk_cairo_draw_from_gl (cairo_t *cr,
return;
}
- cairo_get_matrix (cr, &matrix);
-
gdk_gl_context_get_version (paint_context, &major, &minor);
version = major * 100 + minor;
@@ -382,7 +377,7 @@ gdk_cairo_draw_from_gl (cairo_t *cr,
*/
if (gdk_gl_context_get_use_es (paint_context) &&
!(version >= 300 || gdk_gl_context_has_unpack_subimage (paint_context)))
- goto out;
+ return;
/* TODO: avoid reading back non-required data due to dest clip */
image = cairo_surface_create_similar_image (cairo_get_target (cr),
@@ -424,17 +419,9 @@ gdk_cairo_draw_from_gl (cairo_t *cr,
cairo_surface_mark_dirty (image);
- /* Invert due to opengl having different origin */
- cairo_scale (cr, 1, -1);
- cairo_translate (cr, 0, -height / buffer_scale);
-
cairo_set_source_surface (cr, image, 0, 0);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
cairo_paint (cr);
cairo_surface_destroy (image);
-
-out:
- if (clip_region)
- cairo_region_destroy (clip_region);
}
diff --git a/gdk/macos/GdkMacosWindow.c b/gdk/macos/GdkMacosWindow.c
index 3c4671aa46..c4a133afcc 100644
--- a/gdk/macos/GdkMacosWindow.c
+++ b/gdk/macos/GdkMacosWindow.c
@@ -126,8 +126,6 @@
GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (gdk_surface));
double time = ((double)[event timestamp]) * 1000.0;
- _gdk_macos_display_break_all_grabs (GDK_MACOS_DISPLAY (display), time);
-
inManualMove = NO;
inManualResize = NO;
inMove = NO;
@@ -140,6 +138,8 @@
*/
_gdk_macos_display_send_button_event ([self gdkDisplay], event);
+ _gdk_macos_display_break_all_grabs (GDK_MACOS_DISPLAY (display), time);
+
break;
}
diff --git a/gdk/macos/gdkmacosdisplay-translate.c b/gdk/macos/gdkmacosdisplay-translate.c
index 329f20b0dd..a828f127d9 100644
--- a/gdk/macos/gdkmacosdisplay-translate.c
+++ b/gdk/macos/gdkmacosdisplay-translate.c
@@ -209,11 +209,6 @@ fill_button_event (GdkMacosDisplay *display,
g_assert (GDK_IS_MACOS_DISPLAY (display));
g_assert (GDK_IS_MACOS_SURFACE (surface));
- /* Ignore button events outside the window coords */
- if (x < 0 || x > GDK_SURFACE (surface)->width ||
- y < 0 || y > GDK_SURFACE (surface)->height)
- return NULL;
-
seat = gdk_display_get_default_seat (GDK_DISPLAY (display));
state = get_keyboard_modifiers_from_ns_event (nsevent) |
_gdk_macos_display_get_current_mouse_modifiers (display);
@@ -238,6 +233,14 @@ fill_button_event (GdkMacosDisplay *display,
g_assert_not_reached ();
}
+ /* Ignore button press events outside the window coords but
+ * allow for button release which can happen during grabs.
+ */
+ if (type == GDK_BUTTON_PRESS &&
+ (x < 0 || x > GDK_SURFACE (surface)->width ||
+ y < 0 || y > GDK_SURFACE (surface)->height))
+ return NULL;
+
return gdk_button_event_new (type,
GDK_SURFACE (surface),
gdk_seat_get_pointer (seat),
@@ -710,29 +713,23 @@ find_surface_under_pointer (GdkMacosDisplay *self,
int *y)
{
GdkPointerSurfaceInfo *info;
- GdkSurface *surface;
+ GdkMacosSurface *found;
+ GdkSurface *surface = NULL;
GdkSeat *seat;
int x_tmp, y_tmp;
seat = gdk_display_get_default_seat (GDK_DISPLAY (self));
info = _gdk_display_get_pointer_info (GDK_DISPLAY (self),
gdk_seat_get_pointer (seat));
- surface = info->surface_under_pointer;
- if (surface == NULL)
+ if ((found = _gdk_macos_display_get_surface_at_display_coords (self,
+ screen_point.x,
+ screen_point.y,
+ &x_tmp,
+ &y_tmp)))
{
- GdkMacosSurface *found;
-
- found = _gdk_macos_display_get_surface_at_display_coords (self,
- screen_point.x,
- screen_point.y,
- &x_tmp, &y_tmp);
-
- if (found)
- {
- surface = GDK_SURFACE (found);
- info->surface_under_pointer = g_object_ref (surface);
- }
+ g_set_object (&info->surface_under_pointer, surface);
+ surface = GDK_SURFACE (found);
}
if (surface)
@@ -1120,10 +1117,21 @@ _gdk_macos_display_translate (GdkMacosDisplay *self,
break;
case NSEventTypeMouseExited:
- [[NSCursor arrowCursor] set];
- /* fallthrough */
case NSEventTypeMouseEntered:
- ret = synthesize_crossing_event (self, surface, nsevent, x, y);
+ {
+ GdkSeat *seat = gdk_display_get_default_seat (GDK_DISPLAY (self));
+ GdkDevice *pointer = gdk_seat_get_pointer (seat);
+ GdkDeviceGrabInfo *grab = _gdk_display_get_last_device_grab (GDK_DISPLAY (self), pointer);
+
+ if (grab == NULL)
+ {
+ if (event_type == NSEventTypeMouseExited)
+ [[NSCursor arrowCursor] set];
+
+ ret = synthesize_crossing_event (self, surface, nsevent, x, y);
+ }
+ }
+
break;
case NSEventTypeKeyDown:
@@ -1179,7 +1187,8 @@ _gdk_macos_display_synthesize_motion (GdkMacosDisplay *self,
y,
NULL);
node = _gdk_event_queue_append (GDK_DISPLAY (self), event);
- _gdk_windowing_got_event (GDK_DISPLAY (self), node, event, 0);
+ _gdk_windowing_got_event (GDK_DISPLAY (self), node, event,
+ _gdk_display_get_next_serial (GDK_DISPLAY (self)));
}
void
diff --git a/gdk/macos/gdkmacosdisplay.c b/gdk/macos/gdkmacosdisplay.c
index 78af1cefce..6a89def8c1 100644
--- a/gdk/macos/gdkmacosdisplay.c
+++ b/gdk/macos/gdkmacosdisplay.c
@@ -380,7 +380,8 @@ gdk_macos_display_sync (GdkDisplay *display)
static gulong
gdk_macos_display_get_next_serial (GdkDisplay *display)
{
- return 0;
+ static gulong serial = 0;
+ return ++serial;
}
static gboolean
@@ -437,7 +438,7 @@ gdk_macos_display_queue_events (GdkDisplay *display)
_gdk_windowing_got_event (GDK_DISPLAY (self),
_gdk_event_queue_append (GDK_DISPLAY (self), event),
event,
- 0);
+ _gdk_display_get_next_serial (GDK_DISPLAY (self)));
}
else
{
@@ -900,7 +901,8 @@ _gdk_macos_display_break_all_grabs (GdkMacosDisplay *self,
grab->surface,
TRUE);
node = _gdk_event_queue_append (GDK_DISPLAY (self), event);
- _gdk_windowing_got_event (GDK_DISPLAY (self), node, event, 0);
+ _gdk_windowing_got_event (GDK_DISPLAY (self), node, event,
+ _gdk_display_get_next_serial (GDK_DISPLAY (self)));
}
}
}
diff --git a/gdk/macos/gdkmacospopupsurface.c b/gdk/macos/gdkmacospopupsurface.c
index a3ae3f4fda..48c2ca02b8 100644
--- a/gdk/macos/gdkmacospopupsurface.c
+++ b/gdk/macos/gdkmacospopupsurface.c
@@ -55,14 +55,15 @@ gdk_macos_popup_surface_layout (GdkMacosPopupSurface *self,
g_assert (layout != NULL);
g_assert (GDK_SURFACE (self)->parent);
- if (layout != self->layout)
- {
- g_clear_pointer (&self->layout, gdk_popup_layout_unref);
- self->layout = gdk_popup_layout_ref (layout);
- }
+ gdk_popup_layout_ref (layout);
+ g_clear_pointer (&self->layout, gdk_popup_layout_unref);
+ self->layout = layout;
- monitor = gdk_surface_get_layout_monitor (GDK_SURFACE (self), layout,
+ monitor = gdk_surface_get_layout_monitor (GDK_SURFACE (self),
+ self->layout,
gdk_macos_monitor_get_workarea);
+ if (monitor == NULL)
+ monitor = _gdk_macos_surface_get_best_monitor (GDK_MACOS_SURFACE (self));
gdk_macos_monitor_get_workarea (monitor, &bounds);
gdk_surface_layout_popup_helper (GDK_SURFACE (self),
@@ -70,7 +71,7 @@ gdk_macos_popup_surface_layout (GdkMacosPopupSurface *self,
height,
monitor,
&bounds,
- layout,
+ self->layout,
&final_rect);
gdk_surface_get_origin (GDK_SURFACE (self)->parent, &x, &y);
@@ -120,8 +121,6 @@ gdk_macos_popup_surface_present (GdkPopup *popup,
gdk_macos_popup_surface_layout (self, width, height, layout);
- GDK_MACOS_SURFACE (self)->did_initial_present = TRUE;
-
if (GDK_SURFACE_IS_MAPPED (GDK_SURFACE (self)))
return TRUE;
@@ -143,6 +142,8 @@ gdk_macos_popup_surface_present (GdkPopup *popup,
show_popup (GDK_MACOS_POPUP_SURFACE (self));
}
+ GDK_MACOS_SURFACE (self)->did_initial_present = TRUE;
+
return GDK_SURFACE_IS_MAPPED (GDK_SURFACE (self));
}
diff --git a/gdk/macos/gdkmacossurface.c b/gdk/macos/gdkmacossurface.c
index 8139d2c84d..ec0fb41560 100644
--- a/gdk/macos/gdkmacossurface.c
+++ b/gdk/macos/gdkmacossurface.c
@@ -84,7 +84,7 @@ _gdk_macos_surface_reposition_children (GdkMacosSurface *self)
_gdk_macos_popup_surface_reposition (GDK_MACOS_POPUP_SURFACE (child));
}
- if (GDK_IS_POPUP (self))
+ if (GDK_IS_POPUP (self) && self->did_initial_present)
g_signal_emit_by_name (self, "popup-layout-changed");
}
@@ -238,8 +238,6 @@ gdk_macos_surface_get_device_state (GdkSurface *surface,
GdkDisplay *display;
NSWindow *nswindow;
NSPoint point;
- int x_tmp;
- int y_tmp;
g_assert (GDK_IS_MACOS_SURFACE (surface));
g_assert (GDK_IS_MACOS_DEVICE (device));
@@ -247,18 +245,20 @@ gdk_macos_surface_get_device_state (GdkSurface *surface,
g_assert (y != NULL);
g_assert (mask != NULL);
+ if (GDK_SURFACE_DESTROYED (surface))
+ return FALSE;
+
display = gdk_surface_get_display (surface);
nswindow = _gdk_macos_surface_get_native (GDK_MACOS_SURFACE (surface));
point = [nswindow mouseLocationOutsideOfEventStream];
- _gdk_macos_display_from_display_coords (GDK_MACOS_DISPLAY (display),
- point.x, point.y,
- &x_tmp, &y_tmp);
+ *mask = _gdk_macos_display_get_current_keyboard_modifiers (GDK_MACOS_DISPLAY (display))
+ | _gdk_macos_display_get_current_mouse_modifiers (GDK_MACOS_DISPLAY (display));
- *x = x_tmp;
- *y = x_tmp;
+ *x = point.x;
+ *y = point.y - surface->height;
- return TRUE;
+ return *x >= 0 && *y >= 0 && *x < surface->width && *y < surface->height;
}
static void
diff --git a/gdk/wayland/gdksurface-wayland.c b/gdk/wayland/gdksurface-wayland.c
index 0d8fe2fe74..cabb82379c 100644
--- a/gdk/wayland/gdksurface-wayland.c
+++ b/gdk/wayland/gdksurface-wayland.c
@@ -2799,6 +2799,8 @@ gdk_wayland_surface_hide_surface (GdkSurface *surface)
g_clear_pointer (&impl->popup.layout, gdk_popup_layout_unref);
}
+ impl->has_uncommitted_ack_configure = FALSE;
+
unset_transient_for_exported (surface);
_gdk_wayland_surface_clear_saved_size (surface);
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index edf6f402ce..fb742a18a9 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -274,6 +274,20 @@ sort_border_sides (const GdkRGBA *colors,
}
}
+static inline void
+init_projection_matrix (graphene_matrix_t *out_proj,
+ const graphene_rect_t *viewport)
+{
+ graphene_matrix_init_ortho (out_proj,
+ viewport->origin.x,
+ viewport->origin.x + viewport->size.width,
+ viewport->origin.y,
+ viewport->origin.y + viewport->size.height,
+ ORTHO_NEAR_PLANE,
+ ORTHO_FAR_PLANE);
+ graphene_matrix_scale (out_proj, 1, -1, 1);
+}
+
static inline gboolean G_GNUC_PURE
color_matrix_modifies_alpha (GskRenderNode *node)
{
@@ -416,15 +430,12 @@ load_vertex_data (GskQuadVertex vertex_data[GL_N_VERTICES],
}
static void
-load_offscreen_vertex_data (GskQuadVertex vertex_data[GL_N_VERTICES],
- GskRenderNode *node,
- RenderOpBuilder *builder)
+fill_vertex_data (GskQuadVertex vertex_data[GL_N_VERTICES],
+ const float min_x,
+ const float min_y,
+ const float max_x,
+ const float max_y)
{
- const float min_x = builder->dx + node->bounds.origin.x;
- const float min_y = builder->dy + node->bounds.origin.y;
- const float max_x = min_x + node->bounds.size.width;
- const float max_y = min_y + node->bounds.size.height;
-
vertex_data[0].position[0] = min_x;
vertex_data[0].position[1] = min_y;
vertex_data[0].uv[0] = 0;
@@ -456,6 +467,21 @@ load_offscreen_vertex_data (GskQuadVertex vertex_data[GL_N_VERTICES],
vertex_data[5].uv[1] = 1;
}
+static void
+load_offscreen_vertex_data (GskQuadVertex vertex_data[GL_N_VERTICES],
+ GskRenderNode *node,
+ RenderOpBuilder *builder)
+{
+ const float min_x = builder->dx + node->bounds.origin.x;
+ const float min_y = builder->dy + node->bounds.origin.y;
+ const float max_x = min_x + node->bounds.size.width;
+ const float max_y = min_y + node->bounds.size.height;
+
+ fill_vertex_data (vertex_data,
+ min_x, min_y,
+ max_x, max_y);
+}
+
static void gsk_gl_renderer_setup_render_mode (GskGLRenderer *self);
static gboolean add_offscreen_ops (GskGLRenderer *self,
RenderOpBuilder *builder,
@@ -1141,9 +1167,9 @@ compile_glshader (GskGLRenderer *self,
}
gboolean
-gsk_gl_render_try_compile_gl_shader (GskGLRenderer *self,
- GskGLShader *shader,
- GError **error)
+gsk_gl_renderer_try_compile_gl_shader (GskGLRenderer *self,
+ GskGLShader *shader,
+ GError **error)
{
Program *program;
@@ -1375,20 +1401,24 @@ render_opacity_node (GskGLRenderer *self,
prev_opacity = ops_set_opacity (builder,
builder->current_opacity * opacity);
- ops_set_program (builder, &self->programs->blit_program);
- ops_set_texture (builder, region.texture_id);
+ if (builder->current_opacity >= ((float) 0x00ff / (float) 0xffff))
+ {
+ ops_set_program (builder, &self->programs->blit_program);
+ ops_set_texture (builder, region.texture_id);
- load_vertex_data_with_region (ops_draw (builder, NULL),
- node, builder,
- &region,
- is_offscreen);
+ load_vertex_data_with_region (ops_draw (builder, NULL),
+ node, builder,
+ &region,
+ is_offscreen);
+ }
}
else
{
prev_opacity = ops_set_opacity (builder,
builder->current_opacity * opacity);
- gsk_gl_renderer_add_render_ops (self, child, builder);
+ if (builder->current_opacity >= ((float) 0x00ff / (float) 0xffff))
+ gsk_gl_renderer_add_render_ops (self, child, builder);
}
ops_set_opacity (builder, prev_opacity);
@@ -1755,7 +1785,8 @@ blur_texture (GskGLRenderer *self,
const TextureRegion *region,
const int texture_to_blur_width,
const int texture_to_blur_height,
- float blur_radius)
+ float blur_radius_x,
+ float blur_radius_y)
{
int pass1_texture_id, pass1_render_target;
int pass2_texture_id, pass2_render_target;
@@ -1765,22 +1796,26 @@ blur_texture (GskGLRenderer *self,
graphene_matrix_t item_proj;
OpBlur *op;
- g_assert (blur_radius > 0);
+ g_assert (blur_radius_x > 0);
+ g_assert (blur_radius_y > 0);
gsk_gl_driver_create_render_target (self->gl_driver,
- texture_to_blur_width, texture_to_blur_height,
+ MAX (texture_to_blur_width, 1), MAX (texture_to_blur_height, 1),
GL_NEAREST, GL_NEAREST,
&pass1_texture_id, &pass1_render_target);
+ if (texture_to_blur_width <= 0 || texture_to_blur_height <= 0)
+ {
+ return pass1_texture_id;
+ }
+
gsk_gl_driver_create_render_target (self->gl_driver,
texture_to_blur_width, texture_to_blur_height,
GL_NEAREST, GL_NEAREST,
&pass2_texture_id, &pass2_render_target);
- graphene_matrix_init_ortho (&item_proj,
- 0, texture_to_blur_width, 0, texture_to_blur_height,
- ORTHO_NEAR_PLANE, ORTHO_FAR_PLANE);
- graphene_matrix_scale (&item_proj, 1, -1, 1);
+ init_projection_matrix (&item_proj,
+ &GRAPHENE_RECT_INIT (0, 0, texture_to_blur_width, texture_to_blur_height));
prev_projection = ops_set_projection (builder, &item_proj);
ops_set_modelview (builder, NULL);
@@ -1794,7 +1829,7 @@ blur_texture (GskGLRenderer *self,
op = ops_begin (builder, OP_CHANGE_BLUR);
op->size.width = texture_to_blur_width;
op->size.height = texture_to_blur_height;
- op->radius = blur_radius;
+ op->radius = blur_radius_x;
op->dir[0] = 1;
op->dir[1] = 0;
ops_set_texture (builder, region->texture_id);
@@ -1821,7 +1856,7 @@ blur_texture (GskGLRenderer *self,
op = ops_begin (builder, OP_CHANGE_BLUR);
op->size.width = texture_to_blur_width;
op->size.height = texture_to_blur_height;
- op->radius = blur_radius;
+ op->radius = blur_radius_y;
op->dir[0] = 0;
op->dir[1] = 1;
ops_set_texture (builder, pass1_texture_id);
@@ -1865,7 +1900,8 @@ blur_node (GskGLRenderer *self,
TextureRegion *out_region,
float *out_vertex_data[4]) /* min, max, min, max */
{
- const float scale = ops_get_scale (builder);
+ const float scale_x = builder->scale_x;
+ const float scale_y = builder->scale_y;
const float blur_extra = blur_radius * 2.0; /* 2.0 = shader radius_multiplier */
float texture_width, texture_height;
gboolean is_offscreen;
@@ -1889,8 +1925,9 @@ blur_node (GskGLRenderer *self,
blurred_texture_id = blur_texture (self, builder,
&region,
- texture_width * scale, texture_height * scale,
- blur_radius * scale);
+ texture_width * scale_x, texture_height * scale_y,
+ blur_radius * scale_x,
+ blur_radius * scale_y);
init_full_texture_region (out_region, blurred_texture_id);
@@ -1967,7 +2004,8 @@ render_inset_shadow_node (GskGLRenderer *self,
GskRenderNode *node,
RenderOpBuilder *builder)
{
- const float scale = ops_get_scale (builder);
+ const float scale_x = builder->scale_x;
+ const float scale_y = builder->scale_y;
const float blur_radius = gsk_inset_shadow_node_get_blur_radius (node);
const float blur_extra = blur_radius * 2.0; /* 2.0 = shader radius_multiplier */
const float dx = gsk_inset_shadow_node_get_dx (node);
@@ -1980,12 +2018,12 @@ render_inset_shadow_node (GskGLRenderer *self,
g_assert (blur_radius > 0);
- texture_width = ceilf ((node_outline->bounds.size.width + blur_extra) * scale);
- texture_height = ceilf ((node_outline->bounds.size.height + blur_extra) * scale);
+ texture_width = ceilf ((node_outline->bounds.size.width + blur_extra) * scale_x);
+ texture_height = ceilf ((node_outline->bounds.size.height + blur_extra) * scale_y);
key.pointer = node;
key.pointer_is_child = FALSE;
- key.scale = scale;
+ key.scale = MAX (scale_x, scale_y); /* TODO: Use scale_x/scale_y here? */
key.filter = GL_NEAREST;
blurred_texture_id = gsk_gl_driver_get_texture_for_key (self->gl_driver, &key);
if (blurred_texture_id == 0)
@@ -2015,13 +2053,13 @@ render_inset_shadow_node (GskGLRenderer *self,
/* Fit to our texture */
outline_to_blur.bounds.origin.x = 0;
outline_to_blur.bounds.origin.y = 0;
- outline_to_blur.bounds.size.width *= scale;
- outline_to_blur.bounds.size.height *= scale;
+ outline_to_blur.bounds.size.width *= scale_x;
+ outline_to_blur.bounds.size.height *= scale_y;
for (i = 0; i < 4; i ++)
{
- outline_to_blur.corner[i].width *= scale;
- outline_to_blur.corner[i].height *= scale;
+ outline_to_blur.corner[i].width *= scale_x;
+ outline_to_blur.corner[i].height *= scale_y;
}
gsk_gl_driver_create_render_target (self->gl_driver,
@@ -2029,10 +2067,8 @@ render_inset_shadow_node (GskGLRenderer *self,
GL_NEAREST, GL_NEAREST,
&texture_id, &render_target);
- graphene_matrix_init_ortho (&item_proj,
- 0, texture_width, 0, texture_height,
- ORTHO_NEAR_PLANE, ORTHO_FAR_PLANE);
- graphene_matrix_scale (&item_proj, 1, -1, 1);
+ init_projection_matrix (&item_proj,
+ &GRAPHENE_RECT_INIT (0, 0, texture_width, texture_height));
prev_projection = ops_set_projection (builder, &item_proj);
ops_set_modelview (builder, NULL);
@@ -2045,9 +2081,9 @@ render_inset_shadow_node (GskGLRenderer *self,
/* Actual inset shadow outline drawing */
ops_set_program (builder, &self->programs->inset_shadow_program);
ops_set_inset_shadow (builder, transform_rect (self, builder, &outline_to_blur),
- spread * scale,
+ spread * MAX (scale_x, scale_y),
gsk_inset_shadow_node_peek_color (node),
- dx * scale, dy * scale);
+ dx * scale_x, dy * scale_y);
ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
{ { 0, 0 }, { 0, 1 }, },
@@ -2069,7 +2105,8 @@ render_inset_shadow_node (GskGLRenderer *self,
&(TextureRegion) { texture_id, 0, 0, 1, 1 },
texture_width,
texture_height,
- blur_radius * scale);
+ blur_radius * scale_x,
+ blur_radius * scale_y);
}
g_assert (blurred_texture_id != 0);
@@ -2078,9 +2115,9 @@ render_inset_shadow_node (GskGLRenderer *self,
/* Use a clip to cut away the unwanted parts outside of the original outline */
{
const gboolean needs_clip = !gsk_rounded_rect_is_rectilinear (node_outline);
- const float tx1 = blur_extra / 2.0 * scale / texture_width;
+ const float tx1 = blur_extra / 2.0 * scale_x / texture_width;
const float tx2 = 1.0 - tx1;
- const float ty1 = blur_extra / 2.0 * scale / texture_height;
+ const float ty1 = blur_extra / 2.0 * scale_y / texture_height;
const float ty2 = 1.0 - ty1;
gsk_gl_driver_set_texture_for_key (self->gl_driver, &key, blurred_texture_id);
@@ -2133,6 +2170,8 @@ render_outset_shadow_node (GskGLRenderer *self,
RenderOpBuilder *builder)
{
const float scale = ops_get_scale (builder);
+ const float scale_x = builder->scale_x;
+ const float scale_y = builder->scale_y;
const GskRoundedRect *outline = gsk_outset_shadow_node_peek_outline (node);
const GdkRGBA *color = gsk_outset_shadow_node_peek_color (node);
const float blur_radius = gsk_outset_shadow_node_get_blur_radius (node);
@@ -2173,8 +2212,8 @@ render_outset_shadow_node (GskGLRenderer *self,
do_slicing = true;
}
- texture_width = (int)ceil ((scaled_outline.bounds.size.width + blur_extra) * scale);
- texture_height = (int)ceil ((scaled_outline.bounds.size.height + blur_extra) * scale);
+ texture_width = (int)ceil ((scaled_outline.bounds.size.width + blur_extra) * scale_x);
+ texture_height = (int)ceil ((scaled_outline.bounds.size.height + blur_extra) * scale_y);
scaled_outline.bounds.origin.x = extra_blur_pixels;
scaled_outline.bounds.origin.y = extra_blur_pixels;
@@ -2183,8 +2222,8 @@ render_outset_shadow_node (GskGLRenderer *self,
for (int i = 0; i < 4; i ++)
{
- scaled_outline.corner[i].width *= scale;
- scaled_outline.corner[i].height *= scale;
+ scaled_outline.corner[i].width *= scale_x;
+ scaled_outline.corner[i].height *= scale_y;
}
cached_tid = gsk_gl_shadow_cache_get_texture_id (&self->shadow_cache,
@@ -2213,10 +2252,8 @@ render_outset_shadow_node (GskGLRenderer *self,
}
ops_set_program (builder, &self->programs->color_program);
- graphene_matrix_init_ortho (&item_proj,
- 0, texture_width, 0, texture_height,
- ORTHO_NEAR_PLANE, ORTHO_FAR_PLANE);
- graphene_matrix_scale (&item_proj, 1, -1, 1);
+ init_projection_matrix (&item_proj,
+ &GRAPHENE_RECT_INIT (0, 0, texture_width, texture_height));
prev_render_target = ops_set_render_target (builder, render_target);
ops_begin (builder, OP_CLEAR);
@@ -2248,7 +2285,8 @@ render_outset_shadow_node (GskGLRenderer *self,
&(TextureRegion) { texture_id, 0, 0, 1, 1 },
texture_width,
texture_height,
- blur_radius * scale);
+ blur_radius * scale_x,
+ blur_radius * scale_y);
gsk_gl_driver_mark_texture_permanent (self->gl_driver, blurred_texture_id);
gsk_gl_shadow_cache_commit (&self->shadow_cache,
@@ -2280,9 +2318,9 @@ render_outset_shadow_node (GskGLRenderer *self,
ty1 = 0; ty2 = 1;
x1 = min_x;
- x2 = min_x + texture_width / scale;
+ x2 = min_x + texture_width / scale_x;
y1 = min_y;
- y2 = min_y + texture_height / scale;
+ y2 = min_y + texture_height / scale_y;
ops_draw (builder, (GskQuadVertex[GL_N_VERTICES]) {
{ { x1, y1 }, { tx1, ty2 }, },
@@ -2328,9 +2366,9 @@ render_outset_shadow_node (GskGLRenderer *self,
if (slice_is_visible (&slices[NINE_SLICE_TOP_LEFT]))
{
x1 = min_x;
- x2 = min_x + (slices[NINE_SLICE_TOP_LEFT].width / scale);
+ x2 = min_x + (slices[NINE_SLICE_TOP_LEFT].width / scale_x);
y1 = min_y;
- y2 = min_y + (slices[NINE_SLICE_TOP_LEFT].height / scale);
+ y2 = min_y + (slices[NINE_SLICE_TOP_LEFT].height / scale_y);
tx1 = tregs[NINE_SLICE_TOP_LEFT].x;
tx2 = tregs[NINE_SLICE_TOP_LEFT].x2;
@@ -2351,10 +2389,10 @@ render_outset_shadow_node (GskGLRenderer *self,
/* Top center */
if (slice_is_visible (&slices[NINE_SLICE_TOP_CENTER]))
{
- x1 = min_x + (slices[NINE_SLICE_TOP_LEFT].width / scale);
- x2 = max_x - (slices[NINE_SLICE_TOP_RIGHT].width / scale);
+ x1 = min_x + (slices[NINE_SLICE_TOP_LEFT].width / scale_x);
+ x2 = max_x - (slices[NINE_SLICE_TOP_RIGHT].width / scale_y);
y1 = min_y;
- y2 = min_y + (slices[NINE_SLICE_TOP_CENTER].height / scale);
+ y2 = min_y + (slices[NINE_SLICE_TOP_CENTER].height / scale_y);
tx1 = tregs[NINE_SLICE_TOP_CENTER].x;
tx2 = tregs[NINE_SLICE_TOP_CENTER].x2;
@@ -2375,10 +2413,10 @@ render_outset_shadow_node (GskGLRenderer *self,
/* Top right */
if (slice_is_visible (&slices[NINE_SLICE_TOP_RIGHT]))
{
- x1 = max_x - (slices[NINE_SLICE_TOP_RIGHT].width / scale);
+ x1 = max_x - (slices[NINE_SLICE_TOP_RIGHT].width / scale_x);
x2 = max_x;
y1 = min_y;
- y2 = min_y + (slices[NINE_SLICE_TOP_RIGHT].height / scale);
+ y2 = min_y + (slices[NINE_SLICE_TOP_RIGHT].height / scale_y);
tx1 = tregs[NINE_SLICE_TOP_RIGHT].x;
tx2 = tregs[NINE_SLICE_TOP_RIGHT].x2;
@@ -2400,9 +2438,9 @@ render_outset_shadow_node (GskGLRenderer *self,
/* Bottom right */
if (slice_is_visible (&slices[NINE_SLICE_BOTTOM_RIGHT]))
{
- x1 = max_x - (slices[NINE_SLICE_BOTTOM_RIGHT].width / scale);
+ x1 = max_x - (slices[NINE_SLICE_BOTTOM_RIGHT].width / scale_x);
x2 = max_x;
- y1 = max_y - (slices[NINE_SLICE_BOTTOM_RIGHT].height / scale);
+ y1 = max_y - (slices[NINE_SLICE_BOTTOM_RIGHT].height / scale_y);
y2 = max_y;
tx1 = tregs[NINE_SLICE_BOTTOM_RIGHT].x;
tx2 = tregs[NINE_SLICE_BOTTOM_RIGHT].x2;
@@ -2424,8 +2462,8 @@ render_outset_shadow_node (GskGLRenderer *self,
if (slice_is_visible (&slices[NINE_SLICE_BOTTOM_LEFT]))
{
x1 = min_x;
- x2 = min_x + (slices[NINE_SLICE_BOTTOM_LEFT].width / scale);
- y1 = max_y - (slices[NINE_SLICE_BOTTOM_LEFT].height / scale);
+ x2 = min_x + (slices[NINE_SLICE_BOTTOM_LEFT].width / scale_x);
+ y1 = max_y - (slices[NINE_SLICE_BOTTOM_LEFT].height / scale_y);
y2 = max_y;
tx1 = tregs[NINE_SLICE_BOTTOM_LEFT].x;
@@ -2448,9 +2486,9 @@ render_outset_shadow_node (GskGLRenderer *self,
if (slice_is_visible (&slices[NINE_SLICE_LEFT_CENTER]))
{
x1 = min_x;
- x2 = min_x + (slices[NINE_SLICE_LEFT_CENTER].width / scale);
- y1 = min_y + (slices[NINE_SLICE_TOP_LEFT].height / scale);
- y2 = max_y - (slices[NINE_SLICE_BOTTOM_LEFT].height / scale);
+ x2 = min_x + (slices[NINE_SLICE_LEFT_CENTER].width / scale_x);
+ y1 = min_y + (slices[NINE_SLICE_TOP_LEFT].height / scale_x);
+ y2 = max_y - (slices[NINE_SLICE_BOTTOM_LEFT].height / scale_y);
tx1 = tregs[NINE_SLICE_LEFT_CENTER].x;
tx2 = tregs[NINE_SLICE_LEFT_CENTER].x2;
ty1 = tregs[NINE_SLICE_LEFT_CENTER].y;
@@ -2470,10 +2508,10 @@ render_outset_shadow_node (GskGLRenderer *self,
/* Right side */
if (slice_is_visible (&slices[NINE_SLICE_RIGHT_CENTER]))
{
- x1 = max_x - (slices[NINE_SLICE_RIGHT_CENTER].width / scale);
+ x1 = max_x - (slices[NINE_SLICE_RIGHT_CENTER].width / scale_x);
x2 = max_x;
- y1 = min_y + (slices[NINE_SLICE_TOP_RIGHT].height / scale);
- y2 = max_y - (slices[NINE_SLICE_BOTTOM_RIGHT].height / scale);
+ y1 = min_y + (slices[NINE_SLICE_TOP_RIGHT].height / scale_y);
+ y2 = max_y - (slices[NINE_SLICE_BOTTOM_RIGHT].height / scale_y);
tx1 = tregs[NINE_SLICE_RIGHT_CENTER].x;
tx2 = tregs[NINE_SLICE_RIGHT_CENTER].x2;
@@ -2495,9 +2533,9 @@ render_outset_shadow_node (GskGLRenderer *self,
/* Bottom side */
if (slice_is_visible (&slices[NINE_SLICE_BOTTOM_CENTER]))
{
- x1 = min_x + (slices[NINE_SLICE_BOTTOM_LEFT].width / scale);
- x2 = max_x - (slices[NINE_SLICE_BOTTOM_RIGHT].width / scale);
- y1 = max_y - (slices[NINE_SLICE_BOTTOM_CENTER].height / scale);
+ x1 = min_x + (slices[NINE_SLICE_BOTTOM_LEFT].width / scale_x);
+ x2 = max_x - (slices[NINE_SLICE_BOTTOM_RIGHT].width / scale_x);
+ y1 = max_y - (slices[NINE_SLICE_BOTTOM_CENTER].height / scale_y);
y2 = max_y;
tx1 = tregs[NINE_SLICE_BOTTOM_CENTER].x;
@@ -2521,10 +2559,10 @@ render_outset_shadow_node (GskGLRenderer *self,
/* Middle */
if (slice_is_visible (&slices[NINE_SLICE_CENTER]))
{
- x1 = min_x + (slices[NINE_SLICE_LEFT_CENTER].width / scale);
- x2 = max_x - (slices[NINE_SLICE_RIGHT_CENTER].width / scale);
- y1 = min_y + (slices[NINE_SLICE_TOP_CENTER].height / scale);
- y2 = max_y - (slices[NINE_SLICE_BOTTOM_CENTER].height / scale);
+ x1 = min_x + (slices[NINE_SLICE_LEFT_CENTER].width / scale_x);
+ x2 = max_x - (slices[NINE_SLICE_RIGHT_CENTER].width / scale_x);
+ y1 = min_y + (slices[NINE_SLICE_TOP_CENTER].height / scale_y);
+ y2 = max_y - (slices[NINE_SLICE_BOTTOM_CENTER].height / scale_y);
tx1 = tregs[NINE_SLICE_CENTER].x;
tx2 = tregs[NINE_SLICE_CENTER].x2;
@@ -2873,7 +2911,6 @@ apply_program_op (const Program *program,
static inline void
apply_render_target_op (GskGLRenderer *self,
- const Program *program,
const OpRenderTarget *op)
{
OP_PRINT (" -> Render Target: %d", op->render_target_id);
@@ -3875,13 +3912,12 @@ add_offscreen_ops (GskGLRenderer *self,
render_target);
}
- graphene_matrix_init_ortho (&item_proj,
- bounds->origin.x * scale,
- (bounds->origin.x + bounds->size.width) * scale,
- bounds->origin.y * scale,
- (bounds->origin.y + bounds->size.height) * scale,
- ORTHO_NEAR_PLANE, ORTHO_FAR_PLANE);
- graphene_matrix_scale (&item_proj, 1, -1, 1);
+ init_projection_matrix (&item_proj,
+ &GRAPHENE_RECT_INIT (
+ bounds->origin.x * scale,
+ bounds->origin.y * scale,
+ width, height
+ ));
prev_render_target = ops_set_render_target (builder, render_target);
/* Clear since we use this rendertarget for the first time */
@@ -4011,7 +4047,7 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self)
}
case OP_CHANGE_RENDER_TARGET:
- apply_render_target_op (self, program, ptr);
+ apply_render_target_op (self, ptr);
break;
case OP_CLEAR:
@@ -4175,16 +4211,6 @@ gsk_gl_renderer_do_render (GskRenderer *renderer,
g_assert (gsk_gl_driver_in_frame (self->gl_driver));
- /* Set up the modelview and projection matrices to fit our viewport */
- graphene_matrix_init_ortho (&projection,
- viewport->origin.x,
- viewport->origin.x + viewport->size.width,
- viewport->origin.y,
- viewport->origin.y + viewport->size.height,
- ORTHO_NEAR_PLANE,
- ORTHO_FAR_PLANE);
- graphene_matrix_scale (&projection, 1, -1, 1);
-
removed = g_ptr_array_new ();
gsk_gl_texture_atlases_begin_frame (self->atlases, removed);
gsk_gl_glyph_cache_begin_frame (self->glyph_cache, self->gl_driver, removed);
@@ -4192,6 +4218,8 @@ gsk_gl_renderer_do_render (GskRenderer *renderer,
gsk_gl_shadow_cache_begin_frame (&self->shadow_cache, self->gl_driver);
g_ptr_array_unref (removed);
+ /* Set up the modelview and projection matrices to fit our viewport */
+ init_projection_matrix (&projection, viewport);
ops_set_projection (&self->op_builder, &projection);
ops_set_viewport (&self->op_builder, viewport);
ops_set_modelview (&self->op_builder, gsk_transform_scale (NULL, scale_factor, scale_factor));
@@ -4311,6 +4339,11 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer,
glGenTextures (1, &texture_id);
glBindTexture (GL_TEXTURE_2D, texture_id);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
if (gdk_gl_context_has_debug (self->gl_context))
gdk_gl_context_label_object_printf (self->gl_context, GL_TEXTURE, texture_id,
"Texture %s<%p> %d",
@@ -4332,18 +4365,73 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer,
g_type_name_from_instance ((GTypeInstance *) root),
root,
fbo_id);
- glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0);
- g_assert_cmphex (glCheckFramebufferStatus (GL_FRAMEBUFFER), ==, GL_FRAMEBUFFER_COMPLETE);
+ glFramebufferTexture (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture_id, 0);
/* Render the actual scene */
gsk_gl_renderer_do_render (renderer, root, viewport, fbo_id, 1);
+ glDeleteFramebuffers (1, &fbo_id);
+
+
+ /* Render the now drawn framebuffer y-flipped so it's as GdkGLTexture expects it to be */
+ {
+ guint final_texture_id, final_fbo_id;
+ graphene_matrix_t m;
+
+ ops_reset (&self->op_builder);
+
+ glGenFramebuffers (1, &final_fbo_id);
+ glBindFramebuffer (GL_FRAMEBUFFER, final_fbo_id);
+ glGenTextures (1, &final_texture_id);
+ glBindTexture (GL_TEXTURE_2D, final_texture_id);
+
+ if (gdk_gl_context_get_use_es (self->gl_context))
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ else
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ glFramebufferTexture (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, final_texture_id, 0);
+ g_assert_cmphex (glCheckFramebufferStatus (GL_FRAMEBUFFER), ==, GL_FRAMEBUFFER_COMPLETE);
+
+ ops_set_render_target (&self->op_builder, final_fbo_id);
+ ops_push_clip (&self->op_builder, &GSK_ROUNDED_RECT_INIT (0, 0, width, height));
+ ops_set_program (&self->op_builder, &self->programs->blit_program);
+
+ ops_begin (&self->op_builder, OP_CLEAR);
+ ops_set_texture (&self->op_builder, texture_id);
+ ops_set_modelview (&self->op_builder, NULL);
+ ops_set_viewport (&self->op_builder, &GRAPHENE_RECT_INIT (0, 0, width, height));
+ init_projection_matrix (&m, &GRAPHENE_RECT_INIT (0, 0, width, height));
+ graphene_matrix_scale (&m, 1, -1, 1); /* Undo the scale init_projection_matrix() does again */
+ ops_set_projection (&self->op_builder, &m);
+
+ ops_draw (&self->op_builder, (GskQuadVertex[GL_N_VERTICES]) {
+ { { 0, 0 }, { 0, 1 }, },
+ { { 0, height }, { 0, 0 }, },
+ { { width, 0 }, { 1, 1 }, },
+
+ { { width, height }, { 1, 0 }, },
+ { { 0, height }, { 0, 0 }, },
+ { { width, 0 }, { 1, 1 }, },
+ });
+
+ ops_pop_clip (&self->op_builder);
+ gsk_gl_renderer_render_ops (self);
+
+ ops_finish (&self->op_builder);
+ texture_id = final_texture_id;
+ }
+
texture = gdk_gl_texture_new (self->gl_context,
texture_id,
width, height,
NULL, NULL);
- glDeleteFramebuffers (1, &fbo_id);
gsk_gl_driver_end_frame (self->gl_driver);
gdk_gl_context_pop_debug_group (self->gl_context);
@@ -4366,11 +4454,13 @@ gsk_gl_renderer_render (GskRenderer *renderer,
if (self->gl_context == NULL)
return;
+ surface = gsk_renderer_get_surface (renderer);
+ self->scale_factor = gdk_surface_get_scale_factor (surface);
+
gdk_gl_context_make_current (self->gl_context);
gdk_gl_context_push_debug_group_printf (self->gl_context,
"Render root node %p", root);
- surface = gsk_renderer_get_surface (renderer);
whole_surface = (GdkRectangle) {
0, 0,
gdk_surface_get_width (surface) * self->scale_factor,
@@ -4398,13 +4488,12 @@ gsk_gl_renderer_render (GskRenderer *renderer,
self->render_region = cairo_region_create_rectangle (&extents);
}
- self->scale_factor = gdk_surface_get_scale_factor (surface);
gdk_gl_context_make_current (self->gl_context);
viewport.origin.x = 0;
viewport.origin.y = 0;
- viewport.size.width = gdk_surface_get_width (surface) * self->scale_factor;
- viewport.size.height = gdk_surface_get_height (surface) * self->scale_factor;
+ viewport.size.width = whole_surface.width;
+ viewport.size.height = whole_surface.height;
gsk_gl_driver_begin_frame (self->gl_driver);
gsk_gl_renderer_do_render (renderer, root, &viewport, 0, self->scale_factor);
diff --git a/gsk/gl/gskglrendererprivate.h b/gsk/gl/gskglrendererprivate.h
index 917aecb2e8..924ee18ca3 100644
--- a/gsk/gl/gskglrendererprivate.h
+++ b/gsk/gl/gskglrendererprivate.h
@@ -5,9 +5,9 @@
G_BEGIN_DECLS
-gboolean gsk_gl_render_try_compile_gl_shader (GskGLRenderer *self,
- GskGLShader *shader,
- GError **error);
+gboolean gsk_gl_renderer_try_compile_gl_shader (GskGLRenderer *self,
+ GskGLShader *shader,
+ GError **error);
G_END_DECLS
diff --git a/gsk/gl/gskglshaderbuilder.c b/gsk/gl/gskglshaderbuilder.c
index f860a68d95..d3b2a8351c 100644
--- a/gsk/gl/gskglshaderbuilder.c
+++ b/gsk/gl/gskglshaderbuilder.c
@@ -91,9 +91,9 @@ check_shader_error (int shader_id,
prepend_line_numbers (code, s);
g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_COMPILATION_FAILED,
- "Compilation failure in shader.\nError message: %s\n\nSource code:\n%s\n\n",
- buffer,
- s->str);
+ "Compilation failure in shader.\nSource Code: %s\n\nError Message:\n%s\n\n",
+ s->str,
+ buffer);
g_string_free (s, TRUE);
g_free (buffer);
diff --git a/gsk/gskglshader.c b/gsk/gskglshader.c
index b0482514fb..f8450c9870 100644
--- a/gsk/gskglshader.c
+++ b/gsk/gskglshader.c
@@ -542,8 +542,8 @@ gsk_gl_shader_compile (GskGLShader *shader,
g_return_val_if_fail (GSK_IS_GL_SHADER (shader), FALSE);
if (GSK_IS_GL_RENDERER (renderer))
- return gsk_gl_render_try_compile_gl_shader (GSK_GL_RENDERER (renderer),
- shader, error);
+ return gsk_gl_renderer_try_compile_gl_shader (GSK_GL_RENDERER (renderer),
+ shader, error);
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
"The renderer does not support gl shaders");
diff --git a/gsk/resources/glsl/blur.glsl b/gsk/resources/glsl/blur.glsl
index 7cccad2af1..f782ab48cc 100644
--- a/gsk/resources/glsl/blur.glsl
+++ b/gsk/resources/glsl/blur.glsl
@@ -25,9 +25,6 @@ void main() {
}
// FRAGMENT_SHADER:
-uniform float u_blur_radius;
-uniform vec2 u_blur_size;
-
_IN_ vec2 pixel_step;
_IN_ float pixels_per_side;
_IN_ vec3 initial_gaussian;
diff --git a/gsk/resources/glsl/inset_shadow.glsl b/gsk/resources/glsl/inset_shadow.glsl
index 6047946784..9a21cdef09 100644
--- a/gsk/resources/glsl/inset_shadow.glsl
+++ b/gsk/resources/glsl/inset_shadow.glsl
@@ -11,9 +11,7 @@ _OUT_ _GSK_ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
void main() {
gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
- final_color = u_color;
- final_color.rgb *= final_color.a;
- final_color *= u_alpha;
+ final_color = gsk_premultiply(u_color) * u_alpha;
GskRoundedRect outside = gsk_create_rect(u_outline_rect);
GskRoundedRect inside = gsk_rounded_rect_shrink(outside, vec4(u_spread));
diff --git a/gsk/resources/glsl/preamble.glsl b/gsk/resources/glsl/preamble.glsl
index 091438b3b4..47cc21b004 100644
--- a/gsk/resources/glsl/preamble.glsl
+++ b/gsk/resources/glsl/preamble.glsl
@@ -15,7 +15,7 @@ precision highp float;
struct GskRoundedRect
{
- vec4 bounds;
+ vec4 bounds; // Top left and bottom right
// Look, arrays can't be in structs if you want to return the struct
// from a function in gles or whatever. Just kill me.
vec4 corner_points1; // xy = top left, zw = top right
diff --git a/gsk/resources/glsl/unblurred_outset_shadow.glsl b/gsk/resources/glsl/unblurred_outset_shadow.glsl
index fe7ad742d3..f110370412 100644
--- a/gsk/resources/glsl/unblurred_outset_shadow.glsl
+++ b/gsk/resources/glsl/unblurred_outset_shadow.glsl
@@ -11,9 +11,7 @@ _OUT_ _GSK_ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
void main() {
gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
- final_color = u_color;
- final_color.rgb *= final_color.a;
- final_color *= u_alpha;
+ final_color = gsk_premultiply(u_color) * u_alpha;
GskRoundedRect inside = gsk_create_rect(u_outline_rect);
GskRoundedRect outside = gsk_rounded_rect_shrink(inside, vec4(- u_spread));
diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c
index be8dd2795a..d7489c42d5 100644
--- a/gsk/vulkan/gskvulkanrenderpass.c
+++ b/gsk/vulkan/gskvulkanrenderpass.c
@@ -246,7 +246,6 @@ gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self,
GskRenderNode *node)
{
GskVulkanOp op = {
- .type = GSK_VULKAN_OP_FALLBACK,
.render.node = node
};
GskVulkanPipelineType pipeline_type;
diff --git a/gtk/gtkappchooserdialog.c b/gtk/gtkappchooserdialog.c
index 50f12bc4ba..8c6a3f90db 100644
--- a/gtk/gtkappchooserdialog.c
+++ b/gtk/gtkappchooserdialog.c
@@ -56,7 +56,6 @@
#include "gtkdialogprivate.h"
#include "gtksearchbar.h"
#include "gtksizegroup.h"
-#include "gtkstylecontext.h"
#include <string.h>
#include <glib/gi18n-lib.h>
diff --git a/gtk/gtkassistant.c b/gtk/gtkassistant.c
index f311f848dc..fdc02fae73 100644
--- a/gtk/gtkassistant.c
+++ b/gtk/gtkassistant.c
@@ -81,7 +81,6 @@
#include "gtksizegroup.h"
#include "gtksizerequest.h"
#include "gtkstack.h"
-#include "gtkstylecontext.h"
#include "gtktypebuiltins.h"
typedef struct _GtkAssistantPageClass GtkAssistantPageClass;
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c
index cb2bcf0236..182ccad5f1 100644
--- a/gtk/gtkbuilder.c
+++ b/gtk/gtkbuilder.c
@@ -1997,6 +1997,53 @@ gtk_builder_value_from_string (GtkBuilder *builder,
string, value, error);
}
+static gboolean
+_gtk_builder_boolean_from_string (const char *string,
+ gboolean *value,
+ GError **error)
+{
+ if (string[0] == '\0')
+ goto error;
+ else if (string[1] == '\0')
+ {
+ char c;
+
+ c = string[0];
+ if (c == '1' ||
+ c == 'y' || c == 't' ||
+ c == 'Y' || c == 'T')
+ *value = TRUE;
+ else if (c == '0' ||
+ c == 'n' || c == 'f' ||
+ c == 'N' || c == 'F')
+ *value = FALSE;
+ else
+ goto error;
+ }
+ else
+ {
+ if (g_ascii_strcasecmp (string, "true") == 0 ||
+ g_ascii_strcasecmp (string, "yes") == 0)
+ *value = TRUE;
+ else if (g_ascii_strcasecmp (string, "false") == 0 ||
+ g_ascii_strcasecmp (string, "no") == 0)
+ *value = FALSE;
+ else
+ goto error;
+ }
+
+ return TRUE;
+
+error:
+ g_set_error (error,
+ GTK_BUILDER_ERROR,
+ GTK_BUILDER_ERROR_INVALID_VALUE,
+ "Could not parse boolean '%s'",
+ string);
+ return FALSE;
+}
+
+
/**
* gtk_builder_value_from_string_type:
* @builder: a #GtkBuilder
@@ -2568,52 +2615,6 @@ _gtk_builder_flags_from_string (GType type,
return ret;
}
-gboolean
-_gtk_builder_boolean_from_string (const char *string,
- gboolean *value,
- GError **error)
-{
- if (string[0] == '\0')
- goto error;
- else if (string[1] == '\0')
- {
- char c;
-
- c = string[0];
- if (c == '1' ||
- c == 'y' || c == 't' ||
- c == 'Y' || c == 'T')
- *value = TRUE;
- else if (c == '0' ||
- c == 'n' || c == 'f' ||
- c == 'N' || c == 'F')
- *value = FALSE;
- else
- goto error;
- }
- else
- {
- if (g_ascii_strcasecmp (string, "true") == 0 ||
- g_ascii_strcasecmp (string, "yes") == 0)
- *value = TRUE;
- else if (g_ascii_strcasecmp (string, "false") == 0 ||
- g_ascii_strcasecmp (string, "no") == 0)
- *value = FALSE;
- else
- goto error;
- }
-
- return TRUE;
-
-error:
- g_set_error (error,
- GTK_BUILDER_ERROR,
- GTK_BUILDER_ERROR_INVALID_VALUE,
- "Could not parse boolean '%s'",
- string);
- return FALSE;
-}
-
/**
* gtk_builder_get_type_from_name:
* @builder: a #GtkBuilder
diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h
index 87287d4e78..5fe910486b 100644
--- a/gtk/gtkbuilderprivate.h
+++ b/gtk/gtkbuilderprivate.h
@@ -233,9 +233,6 @@ GtkExpression * expression_info_construct (GtkBuilder *builder,
GError **error);
/* Internal API which might be made public at some point */
-gboolean _gtk_builder_boolean_from_string (const char *string,
- gboolean *value,
- GError **error);
gboolean _gtk_builder_enum_from_string (GType type,
const char *string,
int *enum_value,
diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c
index 8ef124da83..91023ce39e 100644
--- a/gtk/gtkbutton.c
+++ b/gtk/gtkbutton.c
@@ -71,7 +71,6 @@
#include "gtkmain.h"
#include "gtkmarshalers.h"
#include "gtkprivate.h"
-#include "gtkstylecontext.h"
#include "gtktypebuiltins.h"
#include "gtkwidgetprivate.h"
#include "gtkshortcuttrigger.h"
diff --git a/gtk/gtkcolorchooserwidget.c b/gtk/gtkcolorchooserwidget.c
index 1de0e1c55c..2d896f07ac 100644
--- a/gtk/gtkcolorchooserwidget.c
+++ b/gtk/gtkcolorchooserwidget.c
@@ -28,7 +28,6 @@
#include "gtkprivate.h"
#include "gtkintl.h"
#include "gtksizegroup.h"
-#include "gtkstylecontext.h"
#include "gtkboxlayout.h"
#include "gtkwidgetprivate.h"
#include "gdkrgbaprivate.h"
diff --git a/gtk/gtkcolorplane.c b/gtk/gtkcolorplane.c
index b75d2761a6..a6fa75c795 100644
--- a/gtk/gtkcolorplane.c
+++ b/gtk/gtkcolorplane.c
@@ -121,50 +121,43 @@ plane_snapshot (GtkWidget *widget,
}
static void
-create_texture (GtkColorPlane *plane)
+create_texture (GtkWidget *widget)
{
- GtkWidget *widget = GTK_WIDGET (plane);
+ const int width = gtk_widget_get_width (widget);
+ const int height = gtk_widget_get_height (widget);
+ const int stride = width * 3;
+ GtkColorPlane *plane = GTK_COLOR_PLANE (widget);
GBytes *bytes;
- int width, height, stride;
- guint red, green, blue;
- guint32 *data, *p;
- float h, s, v;
- float r, g, b;
- double sf, vf;
- int x, y;
+ guint8 *data;
- if (!gtk_widget_get_realized (widget))
+ if (!gtk_widget_get_mapped (widget))
return;
- width = gtk_widget_get_width (widget);
- height = gtk_widget_get_height (widget);
-
if (width == 0 || height == 0)
return;
g_clear_object (&plane->texture);
- stride = width * 4;
-
data = g_malloc (height * stride);
-
if (width > 1 && height > 1)
{
- h = gtk_adjustment_get_value (plane->h_adj);
- sf = 1.0 / (height - 1);
- vf = 1.0 / (width - 1);
+ const float h = gtk_adjustment_get_value (plane->h_adj);
+ int x, y;
+
for (y = 0; y < height; y++)
{
- s = CLAMP (1.0 - y * sf, 0.0, 1.0);
- p = data + y * (stride / 4);
+ const float s = 1.0 - (float)y / (height - 1);
+
for (x = 0; x < width; x++)
{
- v = x * vf;
+ const float v = (float)x / (width - 1);
+ float r, g, b;
+
gtk_hsv_to_rgb (h, s, v, &r, &g, &b);
- red = CLAMP (r * 255, 0, 255);
- green = CLAMP (g * 255, 0, 255);
- blue = CLAMP (b * 255, 0, 255);
- p[x] = (0xff << 24) | (red << 16) | (green << 8) | blue;
+
+ data[(y * stride) + (x * 3) + 0] = r * 255;
+ data[(y * stride) + (x * 3) + 1] = g * 255;
+ data[(y * stride) + (x * 3) + 2] = b * 255;
}
}
}
@@ -175,9 +168,9 @@ create_texture (GtkColorPlane *plane)
bytes = g_bytes_new_take (data, height * stride);
plane->texture = gdk_memory_texture_new (width, height,
- GDK_MEMORY_DEFAULT,
- bytes,
- stride);
+ GDK_MEMORY_R8G8B8,
+ bytes,
+ stride);
g_bytes_unref (bytes);
}
@@ -187,27 +180,7 @@ plane_size_allocate (GtkWidget *widget,
int height,
int baseline)
{
- GtkColorPlane *plane = GTK_COLOR_PLANE (widget);
-
- create_texture (plane);
-}
-
-static void
-plane_realize (GtkWidget *widget)
-{
- GTK_WIDGET_CLASS (gtk_color_plane_parent_class)->realize (widget);
-
- create_texture (GTK_COLOR_PLANE (widget));
-}
-
-static void
-plane_unrealize (GtkWidget *widget)
-{
- GtkColorPlane *plane = GTK_COLOR_PLANE (widget);
-
- g_clear_object (&plane->texture);
-
- GTK_WIDGET_CLASS (gtk_color_plane_parent_class)->unrealize (widget);
+ create_texture (widget);
}
static void
@@ -221,10 +194,10 @@ set_cross_cursor (GtkWidget *widget,
}
static void
-h_changed (GtkColorPlane *plane)
+h_changed (GtkWidget *plane)
{
create_texture (plane);
- gtk_widget_queue_draw (GTK_WIDGET (plane));
+ gtk_widget_queue_draw (plane);
}
static void
@@ -511,8 +484,6 @@ gtk_color_plane_class_init (GtkColorPlaneClass *class)
widget_class->snapshot = plane_snapshot;
widget_class->size_allocate = plane_size_allocate;
- widget_class->realize = plane_realize;
- widget_class->unrealize = plane_unrealize;
g_object_class_install_property (object_class,
PROP_H_ADJUSTMENT,
diff --git a/gtk/gtkcolorscale.c b/gtk/gtkcolorscale.c
index 6900900618..3341742744 100644
--- a/gtk/gtkcolorscale.c
+++ b/gtk/gtkcolorscale.c
@@ -88,39 +88,35 @@ gtk_color_scale_snapshot_trough (GtkColorScale *scale,
{
if (!scale->hue_texture)
{
- GdkTexture *texture;
- int stride;
+ const int stride = width * 3;
GBytes *bytes;
guchar *data, *p;
- double h;
- float r, g, b;
- double f;
int hue_x, hue_y;
- stride = width * 3;
- data = g_malloc (width * height * 3);
+ data = g_malloc (height * stride);
- f = 1.0 / (height - 1);
for (hue_y = 0; hue_y < height; hue_y++)
{
- h = CLAMP (hue_y * f, 0.0, 1.0);
+ const float h = CLAMP ((float)hue_y / (height - 1), 0.0, 1.0);
+ float r, g, b;
+
+ gtk_hsv_to_rgb (h, 1, 1, &r, &g, &b);
+
p = data + hue_y * stride;
for (hue_x = 0; hue_x < stride; hue_x += 3)
{
- gtk_hsv_to_rgb (h, 1, 1, &r, &g, &b);
- p[hue_x + 0] = CLAMP (r * 255, 0, 255);
- p[hue_x + 1] = CLAMP (g * 255, 0, 255);
- p[hue_x + 2] = CLAMP (b * 255, 0, 255);
+ p[hue_x + 0] = r * 255;
+ p[hue_x + 1] = g * 255;
+ p[hue_x + 2] = b * 255;
}
}
- bytes = g_bytes_new_take (data, width * height * 3);
- texture = gdk_memory_texture_new (width, height,
- GDK_MEMORY_R8G8B8,
- bytes,
- stride);
+ bytes = g_bytes_new_take (data, height * stride);
+ scale->hue_texture = gdk_memory_texture_new (width, height,
+ GDK_MEMORY_R8G8B8,
+ bytes,
+ stride);
g_bytes_unref (bytes);
- scale->hue_texture = texture;
}
gtk_snapshot_append_texture (snapshot,
diff --git a/gtk/gtkcolorutils.c b/gtk/gtkcolorutils.c
index 1740485cb9..9b15eea997 100644
--- a/gtk/gtkcolorutils.c
+++ b/gtk/gtkcolorutils.c
@@ -34,82 +34,6 @@
#include "gtkcolorutils.h"
-
-#define INTENSITY(r, g, b) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11)
-
-/* Converts from HSV to RGB */
-static void
-hsv_to_rgb (float *h,
- float *s,
- float *v)
-{
- float hue, saturation, value;
- float f, p, q, t;
-
- if (*s == 0.0)
- {
- *h = *v;
- *s = *v;
- *v = *v; /* heh */
- }
- else
- {
- hue = *h * 6.0;
- saturation = *s;
- value = *v;
-
- if (hue == 6.0)
- hue = 0.0;
-
- f = hue - (int) hue;
- p = value * (1.0 - saturation);
- q = value * (1.0 - saturation * f);
- t = value * (1.0 - saturation * (1.0 - f));
-
- switch ((int) hue)
- {
- case 0:
- *h = value;
- *s = t;
- *v = p;
- break;
-
- case 1:
- *h = q;
- *s = value;
- *v = p;
- break;
-
- case 2:
- *h = p;
- *s = value;
- *v = t;
- break;
-
- case 3:
- *h = p;
- *s = q;
- *v = value;
- break;
-
- case 4:
- *h = t;
- *s = p;
- *v = value;
- break;
-
- case 5:
- *h = value;
- *s = p;
- *v = q;
- break;
-
- default:
- g_assert_not_reached ();
- }
- }
-}
-
/* Converts from RGB to HSV */
static void
rgb_to_hsv (float *r,
@@ -203,20 +127,70 @@ void
gtk_hsv_to_rgb (float h, float s, float v,
float *r, float *g, float *b)
{
+ float hue;
+ float f, p;
+ int ihue;
+
g_return_if_fail (h >= 0.0 && h <= 1.0);
g_return_if_fail (s >= 0.0 && s <= 1.0);
g_return_if_fail (v >= 0.0 && v <= 1.0);
+ g_return_if_fail (r);
+ g_return_if_fail (g);
+ g_return_if_fail (b);
- hsv_to_rgb (&h, &s, &v);
+ if (s == 0.0)
+ {
+ *r = v;
+ *g = v;
+ *b = v;
+ return;
+ }
+
+ hue = h * 6.0;
- if (r)
- *r = h;
+ if (hue == 6.0)
+ hue = 0.0;
- if (g)
- *g = s;
+ ihue = (int)hue;
+ f = hue - ihue;
+ p = v * (1.0 - s);
- if (b)
- *b = v;
+ if (ihue == 0)
+ {
+ *r = v;
+ *g = v * (1.0 - s * (1.0 - f));
+ *b = p;
+ }
+ else if (ihue == 1)
+ {
+ *r = v * (1.0 - s * f);
+ *g = v;
+ *b = p;
+ }
+ else if (ihue == 2)
+ {
+ *r = p;
+ *g = v;
+ *b = v * (1.0 - s * (1.0 - f));
+ }
+ else if (ihue == 3)
+ {
+ *r = p;
+ *g = v * (1.0 - s * f);
+ *b = v;
+ }
+ else if (ihue == 4)
+ {
+ *r = v * (1.0 - s * (1.0 - f));
+ *g = p;
+ *b = v;
+ }
+ else if (ihue == 5)
+ {
+ *r = v;
+ *g = p;
+ *b = v * (1.0 - s * f);
+ }
}
/**
diff --git a/gtk/gtkcolumnviewcolumn.c b/gtk/gtkcolumnviewcolumn.c
index 478cc5fe3f..d0fc252582 100644
--- a/gtk/gtkcolumnviewcolumn.c
+++ b/gtk/gtkcolumnviewcolumn.c
@@ -31,7 +31,6 @@
#include "gtkprivate.h"
#include "gtkrbtreeprivate.h"
#include "gtksizegroup.h"
-#include "gtkstylecontext.h"
#include "gtkwidgetprivate.h"
#include "gtksorter.h"
diff --git a/gtk/gtkdialog.c b/gtk/gtkdialog.c
index b719186198..9be63d4a7a 100644
--- a/gtk/gtkdialog.c
+++ b/gtk/gtkdialog.c
@@ -43,7 +43,6 @@
#include "gtksettings.h"
#include "gtktypebuiltins.h"
#include "gtksizegroup.h"
-#include "gtkstylecontext.h"
/**
* SECTION:gtkdialog
diff --git a/gtk/gtkdragsource.c b/gtk/gtkdragsource.c
index d9675262a4..166d108b32 100644
--- a/gtk/gtkdragsource.c
+++ b/gtk/gtkdragsource.c
@@ -32,7 +32,6 @@
#include "gtknative.h"
#include "gtkwidgetprivate.h"
#include "gtkintl.h"
-#include "gtkstylecontext.h"
#include "gtkimageprivate.h"
#include "gtkdragicon.h"
#include "gtkprivate.h"
diff --git a/gtk/gtkdrawingarea.c b/gtk/gtkdrawingarea.c
index 80753fa27c..662e1ae988 100644
--- a/gtk/gtkdrawingarea.c
+++ b/gtk/gtkdrawingarea.c
@@ -28,7 +28,6 @@
#include "gtkmarshalers.h"
#include "gtkprivate.h"
#include "gtksnapshot.h"
-#include "gtkstylecontext.h"
#include "gtkwidgetprivate.h"
typedef struct _GtkDrawingAreaPrivate GtkDrawingAreaPrivate;
diff --git a/gtk/gtkdropdown.c b/gtk/gtkdropdown.c
index 8a6969e856..80dc7a1ae6 100644
--- a/gtk/gtkdropdown.c
+++ b/gtk/gtkdropdown.c
@@ -33,7 +33,6 @@
#include "gtkfilterlistmodel.h"
#include "gtkstringfilter.h"
#include "gtkmultifilter.h"
-#include "gtkstylecontext.h"
#include "gtkwidgetprivate.h"
#include "gtknative.h"
#include "gtktogglebutton.h"
diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c
index ba86a40ce5..d5ec763936 100644
--- a/gtk/gtkemojichooser.c
+++ b/gtk/gtkemojichooser.c
@@ -33,7 +33,6 @@
#include "gtkintl.h"
#include "gtkprivate.h"
#include "gtksearchentryprivate.h"
-#include "gtkstylecontext.h"
#include "gtktext.h"
#include "gtknative.h"
#include "gtkwidgetprivate.h"
diff --git a/gtk/gtkentrycompletion.c b/gtk/gtkentrycompletion.c
index 9139109ebf..8f3ee30eda 100644
--- a/gtk/gtkentrycompletion.c
+++ b/gtk/gtkentrycompletion.c
@@ -84,7 +84,6 @@
#include "gtkwindowprivate.h"
#include "gtkwidgetprivate.h"
#include "gtknative.h"
-#include "gtkstylecontext.h"
#include <string.h>
diff --git a/gtk/gtkfilechooserdialog.c b/gtk/gtkfilechooserdialog.c
index 4db5c024a1..6cff44ec93 100644
--- a/gtk/gtkfilechooserdialog.c
+++ b/gtk/gtkfilechooserdialog.c
@@ -30,7 +30,6 @@
#include "gtkintl.h"
#include "gtksettings.h"
#include "gtktogglebutton.h"
-#include "gtkstylecontext.h"
#include "gtkheaderbar.h"
#include "gtkdialogprivate.h"
#include "gtklabel.h"
diff --git a/gtk/gtkfilechoosernative.c b/gtk/gtkfilechoosernative.c
index a8f57ee0f9..597deb5256 100644
--- a/gtk/gtkfilechoosernative.c
+++ b/gtk/gtkfilechoosernative.c
@@ -33,7 +33,6 @@
#include "gtkintl.h"
#include "gtksettings.h"
#include "gtktogglebutton.h"
-#include "gtkstylecontext.h"
#include "gtkheaderbar.h"
#include "gtklabel.h"
#include "gtkfilefilterprivate.h"
diff --git a/gtk/gtkfilechoosernativeportal.c b/gtk/gtkfilechoosernativeportal.c
index 858186428a..d65229f6ef 100644
--- a/gtk/gtkfilechoosernativeportal.c
+++ b/gtk/gtkfilechoosernativeportal.c
@@ -33,7 +33,6 @@
#include "gtkintl.h"
#include "gtksettings.h"
#include "gtktogglebutton.h"
-#include "gtkstylecontext.h"
#include "gtkheaderbar.h"
#include "gtklabel.h"
#include "gtkmain.h"
diff --git a/gtk/gtkfilechoosernativequartz.c b/gtk/gtkfilechoosernativequartz.c
index 671e0acc3d..03437fe10c 100644
--- a/gtk/gtkfilechoosernativequartz.c
+++ b/gtk/gtkfilechoosernativequartz.c
@@ -33,7 +33,6 @@
#include "gtkintl.h"
#include "gtksettings.h"
#include "gtktogglebutton.h"
-#include "gtkstylecontext.h"
#include "gtkheaderbar.h"
#include "gtklabel.h"
#include "gtknative.h"
@@ -517,8 +516,12 @@ gtk_file_chooser_native_quartz_show (GtkFileChooserNative *self)
transient_for = gtk_native_dialog_get_transient_for (GTK_NATIVE_DIALOG (self));
if (transient_for)
{
+ GtkNative *native = GTK_NATIVE (transient_for);
+ GdkSurface *surface = gtk_native_get_surface (native);
+ NSWindow *window = _gdk_macos_surface_get_native (GDK_MACOS_SURFACE (surface));
+
gtk_widget_realize (GTK_WIDGET (transient_for));
- data->parent = _gdk_macos_surface_get_native (gtk_native_get_surface (GTK_NATIVE (transient_for)));
+ data->parent = window;
if (gtk_native_dialog_get_modal (GTK_NATIVE_DIALOG (self)))
data->modal = TRUE;
diff --git a/gtk/gtkfilechoosernativewin32.c b/gtk/gtkfilechoosernativewin32.c
index d4f6c10ef1..505e0b07f0 100644
--- a/gtk/gtkfilechoosernativewin32.c
+++ b/gtk/gtkfilechoosernativewin32.c
@@ -39,7 +39,6 @@
#include "gtkintl.h"
#include "gtksettings.h"
#include "gtktogglebutton.h"
-#include "gtkstylecontext.h"
#include "gtkheaderbar.h"
#include "gtklabel.h"
#include "gtkfilefilterprivate.h"
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c
index ed5b6f8939..50b9f6033e 100644
--- a/gtk/gtkfilechooserwidget.c
+++ b/gtk/gtkfilechooserwidget.c
@@ -8030,9 +8030,10 @@ gtk_file_chooser_widget_get_choice (GtkFileChooser *chooser,
return gtk_string_object_get_string (GTK_STRING_OBJECT (selected));
return NULL;
}
-
else if (GTK_IS_CHECK_BUTTON (widget))
- return gtk_check_button_get_active (GTK_CHECK_BUTTON (widget)) ? "true" : "false";
+ {
+ return gtk_check_button_get_active (GTK_CHECK_BUTTON (widget)) ? "true" : "false";
+ }
return NULL;
}
diff --git a/gtk/gtkframe.c b/gtk/gtkframe.c
index 748a25fad2..b53683a81c 100644
--- a/gtk/gtkframe.c
+++ b/gtk/gtkframe.c
@@ -380,7 +380,6 @@ gtk_frame_set_label_widget (GtkFrame *frame,
GtkWidget *label_widget)
{
GtkFramePrivate *priv = gtk_frame_get_instance_private (frame);
- gboolean need_resize = FALSE;
g_return_if_fail (GTK_IS_FRAME (frame));
g_return_if_fail (label_widget == NULL || GTK_IS_WIDGET (label_widget));
@@ -390,10 +389,7 @@ gtk_frame_set_label_widget (GtkFrame *frame,
return;
if (priv->label_widget)
- {
- need_resize = gtk_widget_get_visible (priv->label_widget);
- gtk_widget_unparent (priv->label_widget);
- }
+ gtk_widget_unparent (priv->label_widget);
priv->label_widget = label_widget;
@@ -401,12 +397,8 @@ gtk_frame_set_label_widget (GtkFrame *frame,
{
priv->label_widget = label_widget;
gtk_widget_set_parent (label_widget, GTK_WIDGET (frame));
- need_resize |= gtk_widget_get_visible (label_widget);
}
- if (gtk_widget_get_visible (GTK_WIDGET (frame)) && need_resize)
- gtk_widget_queue_resize (GTK_WIDGET (frame));
-
g_object_freeze_notify (G_OBJECT (frame));
g_object_notify_by_pspec (G_OBJECT (frame), frame_props[PROP_LABEL_WIDGET]);
g_object_notify_by_pspec (G_OBJECT (frame), frame_props[PROP_LABEL]);
diff --git a/gtk/gtkglarea.c b/gtk/gtkglarea.c
index 3387a36ca2..3129894469 100644
--- a/gtk/gtkglarea.c
+++ b/gtk/gtkglarea.c
@@ -24,7 +24,6 @@
#include "gtkglarea.h"
#include "gtkintl.h"
#include "gtkmarshalers.h"
-#include "gtkstylecontext.h"
#include "gtkmarshalers.h"
#include "gtkprivate.h"
#include "gtkrender.h"
diff --git a/gtk/gtkinfobar.c b/gtk/gtkinfobar.c
index 808e0fa3d4..2a01b33272 100644
--- a/gtk/gtkinfobar.c
+++ b/gtk/gtkinfobar.c
@@ -42,8 +42,6 @@
#include "gtkrevealer.h"
#include "gtkintl.h"
#include "gtkprivate.h"
-#include "gtkorientable.h"
-#include "gtkstylecontext.h"
#include "gtktypebuiltins.h"
#include "gtkwidgetprivate.h"
#include "gtkbinlayout.h"
diff --git a/gtk/gtklinkbutton.c b/gtk/gtklinkbutton.c
index 521c196a04..7cd2476a2c 100644
--- a/gtk/gtklinkbutton.c
+++ b/gtk/gtklinkbutton.c
@@ -68,7 +68,6 @@
#include "gtkprivate.h"
#include "gtkshow.h"
#include "gtksizerequest.h"
-#include "gtkstylecontext.h"
#include "gtktooltip.h"
#include "gtkwidgetprivate.h"
diff --git a/gtk/gtklistview.c b/gtk/gtklistview.c
index 95091e1f13..ad8f8ea16c 100644
--- a/gtk/gtklistview.c
+++ b/gtk/gtklistview.c
@@ -28,7 +28,6 @@
#include "gtkmain.h"
#include "gtkprivate.h"
#include "gtkrbtreeprivate.h"
-#include "gtkstylecontext.h"
#include "gtkwidgetprivate.h"
#include "gtkmultiselection.h"
diff --git a/gtk/gtklockbutton.c b/gtk/gtklockbutton.c
index c831306657..b9754b2e17 100644
--- a/gtk/gtklockbutton.c
+++ b/gtk/gtklockbutton.c
@@ -26,7 +26,6 @@
#include "gtklabel.h"
#include "gtksizegroup.h"
#include "gtkstack.h"
-#include "gtkstylecontext.h"
/**
* SECTION:gtklockbutton
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index bffb4cfa94..cfc74ce43e 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -988,7 +988,7 @@ rewrite_event_for_surface (GdkEvent *event,
gdk_event_get_modifier_state (event),
gdk_button_event_get_button (event),
x, y,
- axes);
+ g_steal_pointer (&axes));
case GDK_MOTION_NOTIFY:
return gdk_motion_event_new (new_surface,
gdk_event_get_device (event),
@@ -996,7 +996,7 @@ rewrite_event_for_surface (GdkEvent *event,
gdk_event_get_time (event),
gdk_event_get_modifier_state (event),
x, y,
- axes);
+ g_steal_pointer (&axes));
case GDK_TOUCH_BEGIN:
case GDK_TOUCH_UPDATE:
case GDK_TOUCH_END:
@@ -1008,7 +1008,7 @@ rewrite_event_for_surface (GdkEvent *event,
gdk_event_get_time (event),
gdk_event_get_modifier_state (event),
x, y,
- axes,
+ g_steal_pointer (&axes),
gdk_touch_event_get_emulating_pointer (event));
case GDK_TOUCHPAD_SWIPE:
gdk_touchpad_event_get_deltas (event, &dx, &dy);
@@ -1036,6 +1036,7 @@ rewrite_event_for_surface (GdkEvent *event,
break;
}
+ g_assert (!axes);
return NULL;
}
diff --git a/gtk/gtkmenubutton.c b/gtk/gtkmenubutton.c
index 54fca43b33..3ed2e7af2e 100644
--- a/gtk/gtkmenubutton.c
+++ b/gtk/gtkmenubutton.c
@@ -119,7 +119,6 @@
#include "gtkpopover.h"
#include "gtkpopovermenu.h"
#include "gtkprivate.h"
-#include "gtkstylecontext.h"
#include "gtktypebuiltins.h"
#include "gtklabel.h"
#include "gtkbox.h"
diff --git a/gtk/gtkmenusectionbox.c b/gtk/gtkmenusectionbox.c
index 86ecfa24df..08f5ca1288 100644
--- a/gtk/gtkmenusectionbox.c
+++ b/gtk/gtkmenusectionbox.c
@@ -29,7 +29,6 @@
#include "gtkseparator.h"
#include "gtksizegroup.h"
#include "gtkstack.h"
-#include "gtkstylecontext.h"
#include "gtkpopovermenuprivate.h"
#include "gtkorientable.h"
#include "gtkbuiltiniconprivate.h"
diff --git a/gtk/gtkmessagedialog.c b/gtk/gtkmessagedialog.c
index e9d5ab6668..c28f275b3a 100644
--- a/gtk/gtkmessagedialog.c
+++ b/gtk/gtkmessagedialog.c
@@ -33,7 +33,6 @@
#include "gtkintl.h"
#include "gtklabel.h"
#include "gtkprivate.h"
-#include "gtkstylecontext.h"
#include "gtktypebuiltins.h"
#include <string.h>
diff --git a/gtk/gtkmodelbutton.c b/gtk/gtkmodelbutton.c
index 54b55260ec..93f9d011fc 100644
--- a/gtk/gtkmodelbutton.c
+++ b/gtk/gtkmodelbutton.c
@@ -29,14 +29,12 @@
#include "gtkimage.h"
#include "gtklabel.h"
#include "gtkbox.h"
-#include "gtkstylecontext.h"
#include "gtktypebuiltins.h"
#include "gtkstack.h"
#include "gtkpopovermenuprivate.h"
#include "gtkintl.h"
#include "gtkcssnodeprivate.h"
#include "gtkcsstypesprivate.h"
-#include "gtkstylecontextprivate.h"
#include "gtkbuiltiniconprivate.h"
#include "gtksizegroup.h"
#include "gtkactionable.h"
@@ -940,22 +938,6 @@ switch_menu (GtkModelButton *button)
}
static void
-close_menu (GtkModelButton *self)
-{
- GtkWidget *popover;
-
- popover = gtk_widget_get_ancestor (GTK_WIDGET (self), GTK_TYPE_POPOVER);
- while (popover != NULL)
- {
- gtk_popover_popdown (GTK_POPOVER (popover));
- if (GTK_IS_POPOVER_MENU (popover))
- popover = gtk_popover_menu_get_parent_menu (GTK_POPOVER_MENU (popover));
- else
- popover = NULL;
- }
-}
-
-static void
gtk_model_button_clicked (GtkModelButton *self)
{
if (self->menu_name != NULL)
@@ -975,7 +957,11 @@ gtk_model_button_clicked (GtkModelButton *self)
}
else if (self->role == GTK_BUTTON_ROLE_NORMAL)
{
- close_menu (self);
+ GtkWidget *popover;
+
+ popover = gtk_widget_get_ancestor (GTK_WIDGET (self), GTK_TYPE_POPOVER);
+ if (popover)
+ gtk_popover_popdown (GTK_POPOVER (popover));
}
if (self->action_helper)
diff --git a/gtk/gtknativedialog.c b/gtk/gtknativedialog.c
index 3fad9880fc..4b28a42041 100644
--- a/gtk/gtknativedialog.c
+++ b/gtk/gtknativedialog.c
@@ -32,7 +32,6 @@
#include "gtkintl.h"
#include "gtksettings.h"
#include "gtktogglebutton.h"
-#include "gtkstylecontext.h"
#include "gtkheaderbar.h"
#include "gtklabel.h"
diff --git a/gtk/gtkorientable.c b/gtk/gtkorientable.c
index d0275fada5..a37e7bd18a 100644
--- a/gtk/gtkorientable.c
+++ b/gtk/gtkorientable.c
@@ -25,7 +25,6 @@
#include "gtkprivate.h"
#include "gtkwidgetprivate.h"
-#include "gtkstylecontext.h"
#include "gtktypebuiltins.h"
#include "gtkintl.h"
diff --git a/gtk/gtkoverlay.c b/gtk/gtkoverlay.c
index 050b8fd7ac..7dc6167b76 100644
--- a/gtk/gtkoverlay.c
+++ b/gtk/gtkoverlay.c
@@ -29,7 +29,6 @@
#include "gtkprivate.h"
#include "gtkscrolledwindow.h"
#include "gtksnapshot.h"
-#include "gtkstylecontext.h"
#include "gtkwidgetprivate.h"
/**
diff --git a/gtk/gtkoverlaylayout.c b/gtk/gtkoverlaylayout.c
index b6f64069d5..8795f96684 100644
--- a/gtk/gtkoverlaylayout.c
+++ b/gtk/gtkoverlaylayout.c
@@ -26,7 +26,6 @@
#include "gtklayoutchild.h"
#include "gtkoverlay.h"
#include "gtkprivate.h"
-#include "gtkstylecontext.h"
#include "gtkwidgetprivate.h"
#include <graphene-gobject.h>
@@ -119,21 +118,12 @@ gtk_overlay_layout_child_get_property (GObject *gobject,
}
static void
-gtk_overlay_layout_child_finalize (GObject *gobject)
-{
- //GtkOverlayLayoutChild *self = GTK_OVERLAY_LAYOUT_CHILD (gobject);
-
- G_OBJECT_CLASS (gtk_overlay_layout_child_parent_class)->finalize (gobject);
-}
-
-static void
gtk_overlay_layout_child_class_init (GtkOverlayLayoutChildClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->set_property = gtk_overlay_layout_child_set_property;
gobject_class->get_property = gtk_overlay_layout_child_get_property;
- gobject_class->finalize = gtk_overlay_layout_child_finalize;
/**
* GtkOverlayLayoutChild:measure:
diff --git a/gtk/gtkpasswordentry.c b/gtk/gtkpasswordentry.c
index e6658ecf2e..8d5de422b2 100644
--- a/gtk/gtkpasswordentry.c
+++ b/gtk/gtkpasswordentry.c
@@ -33,7 +33,6 @@
#include "gtkmarshalers.h"
#include "gtkpasswordentrybufferprivate.h"
#include "gtkprivate.h"
-#include "gtkstylecontext.h"
#include "gtkwidgetprivate.h"
/**
diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c
index 4a936bf5b4..d503bf1e46 100644
--- a/gtk/gtkplacessidebar.c
+++ b/gtk/gtkplacessidebar.c
@@ -61,7 +61,6 @@
#include "gtknative.h"
#include "gtkdragsource.h"
#include "gtkdragicon.h"
-#include "gtkstylecontext.h"
/*< private >
* SECTION:gtkplacessidebar
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index fd3567d8e2..bcaf344f4d 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -149,6 +149,7 @@ typedef struct {
gboolean has_arrow;
gboolean mnemonics_visible;
gboolean disable_auto_mnemonics;
+ gboolean cascade_popdown;
int x_offset;
int y_offset;
@@ -181,6 +182,7 @@ enum {
PROP_HAS_ARROW,
PROP_MNEMONICS_VISIBLE,
PROP_CHILD,
+ PROP_CASCADE_POPDOWN,
NUM_PROPERTIES
};
@@ -594,19 +596,6 @@ gtk_popover_native_check_resize (GtkNative *native)
present_popup (popover);
}
-static void
-close_menu (GtkPopover *popover)
-{
- while (popover)
- {
- gtk_popover_popdown (popover);
- if (GTK_IS_POPOVER_MENU (popover))
- popover = (GtkPopover *)gtk_popover_menu_get_parent_menu (GTK_POPOVER_MENU (popover));
- else
- popover = NULL;
- }
-}
-
static gboolean
gtk_popover_has_mnemonic_modifier_pressed (GtkPopover *popover)
{
@@ -718,7 +707,7 @@ gtk_popover_key_pressed (GtkWidget *widget,
if (keyval == GDK_KEY_Escape)
{
- close_menu (popover);
+ gtk_popover_popdown (popover);
return TRUE;
}
@@ -852,6 +841,7 @@ gtk_popover_init (GtkPopover *popover)
priv->final_position = GTK_POS_BOTTOM;
priv->autohide = TRUE;
priv->has_arrow = TRUE;
+ priv->cascade_popdown = TRUE;
controller = gtk_event_controller_key_new ();
g_signal_connect_swapped (controller, "key-pressed", G_CALLBACK (gtk_popover_key_pressed), popover);
@@ -1479,6 +1469,10 @@ gtk_popover_set_property (GObject *object,
gtk_popover_set_child (popover, g_value_get_object (value));
break;
+ case PROP_CASCADE_POPDOWN:
+ gtk_popover_set_cascade_popdown (popover, g_value_get_boolean (value));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1524,6 +1518,10 @@ gtk_popover_get_property (GObject *object,
g_value_set_object (value, gtk_popover_get_child (popover));
break;
+ case PROP_CASCADE_POPDOWN:
+ g_value_set_boolean (value, priv->cascade_popdown);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1674,6 +1672,13 @@ gtk_popover_class_init (GtkPopoverClass *klass)
GTK_TYPE_WIDGET,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ properties[PROP_CASCADE_POPDOWN] =
+ g_param_spec_boolean ("cascade-popdown",
+ P_("Cascade popdown"),
+ P_("Wether the popover pops down after a child popover"),
+ TRUE,
+ GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+
g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
signals[CLOSED] =
@@ -2047,6 +2052,31 @@ gtk_popover_popup (GtkPopover *popover)
gtk_widget_show (GTK_WIDGET (popover));
}
+static void
+cascade_popdown (GtkPopover *popover)
+{
+ GtkWidget *parent;
+
+ /* Do not trigger cascade close from non-modal popovers */
+ if (!gtk_popover_get_autohide (popover))
+ return;
+
+ parent = gtk_widget_get_parent (GTK_WIDGET (popover));
+
+ while (parent)
+ {
+ if (GTK_IS_POPOVER (parent))
+ {
+ if (gtk_popover_get_cascade_popdown (GTK_POPOVER (parent)))
+ gtk_widget_hide (parent);
+ else
+ break;
+ }
+
+ parent = gtk_widget_get_parent (parent);
+ }
+}
+
/**
* gtk_popover_popdown:
* @popover: a #GtkPopover
@@ -2061,6 +2091,8 @@ gtk_popover_popdown (GtkPopover *popover)
g_return_if_fail (GTK_IS_POPOVER (popover));
gtk_widget_hide (GTK_WIDGET (popover));
+
+ cascade_popdown (popover);
}
GtkWidget *
@@ -2223,3 +2255,40 @@ gtk_popover_get_offset (GtkPopover *popover,
if (y_offset)
*y_offset = priv->y_offset;
}
+
+/**
+ * gtk_popover_set_cascade_popdown:
+ * @popover: A #GtkPopover
+ * @cascade_popdown: #TRUE if the popover should follow a child closing
+ *
+ * If @cascade_popdown is #TRUE, the popover will be closed when a child
+ * modal popover is closed. If #FALSE, @popover will stay visible.
+ **/
+void
+gtk_popover_set_cascade_popdown (GtkPopover *popover,
+ gboolean cascade_popdown)
+{
+ GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
+
+ if (priv->cascade_popdown != !!cascade_popdown)
+ {
+ priv->cascade_popdown = !!cascade_popdown;
+ g_object_notify (G_OBJECT (popover), "cascade-popdown");
+ }
+}
+
+/**
+ * gtk_popover_get_cascade_popdown:
+ * @popover: a #GtkPopover
+ *
+ * Returns whether the popover will close after a modal child is closed.
+ *
+ * Returns: #TRUE if @popover will close after a modal child.
+ **/
+gboolean
+gtk_popover_get_cascade_popdown (GtkPopover *popover)
+{
+ GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
+
+ return priv->cascade_popdown;
+}
diff --git a/gtk/gtkpopover.h b/gtk/gtkpopover.h
index a27fdf431a..9cb1208761 100644
--- a/gtk/gtkpopover.h
+++ b/gtk/gtkpopover.h
@@ -111,6 +111,11 @@ GDK_AVAILABLE_IN_ALL
void gtk_popover_get_offset (GtkPopover *popover,
int *x_offset,
int *y_offset);
+GDK_AVAILABLE_IN_ALL
+void gtk_popover_set_cascade_popdown (GtkPopover *popover,
+ gboolean cascade_popdown);
+GDK_AVAILABLE_IN_ALL
+gboolean gtk_popover_get_cascade_popdown (GtkPopover *popover);
GDK_AVAILABLE_IN_ALL
void gtk_popover_set_default_widget (GtkPopover *popover,
diff --git a/gtk/gtkpopovermenu.c b/gtk/gtkpopovermenu.c
index 707429c730..3e429a1820 100644
--- a/gtk/gtkpopovermenu.c
+++ b/gtk/gtkpopovermenu.c
@@ -20,7 +20,6 @@
#include "gtkpopovermenuprivate.h"
#include "gtkstack.h"
-#include "gtkstylecontext.h"
#include "gtkintl.h"
#include "gtkmenusectionboxprivate.h"
#include "gtkmenubutton.h"
diff --git a/gtk/gtkpopovermenubar.c b/gtk/gtkpopovermenubar.c
index 4922faf55a..1f172e3088 100644
--- a/gtk/gtkpopovermenubar.c
+++ b/gtk/gtkpopovermenubar.c
@@ -60,7 +60,6 @@
#include "gtkintl.h"
#include "gtkprivate.h"
#include "gtkmarshalers.h"
-#include "gtkstylecontext.h"
#include "gtkgestureclick.h"
#include "gtkeventcontrollermotion.h"
#include "gtkactionmuxerprivate.h"
diff --git a/gtk/gtksearchbar.c b/gtk/gtksearchbar.c
index d5da8d2c0b..42fdeb2894 100644
--- a/gtk/gtksearchbar.c
+++ b/gtk/gtksearchbar.c
@@ -40,7 +40,6 @@
#include "gtkrevealer.h"
#include "gtksearchentryprivate.h"
#include "gtksnapshot.h"
-#include "gtkstylecontext.h"
#include "gtkwidgetprivate.h"
/**
diff --git a/gtk/gtkshortcutssection.c b/gtk/gtkshortcutssection.c
index bf82df0823..6d44a42a7e 100644
--- a/gtk/gtkshortcutssection.c
+++ b/gtk/gtkshortcutssection.c
@@ -27,7 +27,6 @@
#include "gtklabel.h"
#include "gtkstack.h"
#include "gtkstackswitcher.h"
-#include "gtkstylecontext.h"
#include "gtkorientable.h"
#include "gtksizegroup.h"
#include "gtkwidget.h"
diff --git a/gtk/gtkshortcutsshortcut.c b/gtk/gtkshortcutsshortcut.c
index be16d3b8de..07b7c04155 100644
--- a/gtk/gtkshortcutsshortcut.c
+++ b/gtk/gtkshortcutsshortcut.c
@@ -29,7 +29,6 @@
#include "gtkshortcutlabel.h"
#include "gtkshortcutswindowprivate.h"
#include "gtksizegroup.h"
-#include "gtkstylecontext.h"
#include "gtktypebuiltins.h"
/**
diff --git a/gtk/gtkshortcutswindow.c b/gtk/gtkshortcutswindow.c
index 2734fb721a..4eaa82a46e 100644
--- a/gtk/gtkshortcutswindow.c
+++ b/gtk/gtkshortcutswindow.c
@@ -39,7 +39,6 @@
#include "gtkshortcutsshortcutprivate.h"
#include "gtksizegroup.h"
#include "gtkstack.h"
-#include "gtkstylecontext.h"
#include "gtktogglebutton.h"
#include "gtktypebuiltins.h"
#include "gtkwidgetprivate.h"
diff --git a/gtk/gtksidebarrow.c b/gtk/gtksidebarrow.c
index 0907ae2823..350a6d629f 100644
--- a/gtk/gtksidebarrow.c
+++ b/gtk/gtksidebarrow.c
@@ -24,7 +24,6 @@
#include "gtkwidget.h"
#include "gtkimage.h"
#include "gtklabel.h"
-#include "gtkstylecontext.h"
#include "gtkrevealer.h"
#include "gtkintl.h"
#include "gtkspinner.h"
diff --git a/gtk/gtkspinner.c b/gtk/gtkspinner.c
index 586a1ba944..3cf970eab1 100644
--- a/gtk/gtkspinner.c
+++ b/gtk/gtkspinner.c
@@ -34,7 +34,6 @@
#include "gtkimage.h"
#include "gtkintl.h"
#include "gtkprivate.h"
-#include "gtkstylecontext.h"
#include "gtkstylecontextprivate.h"
#include "gtkwidgetprivate.h"
#include "gtkcssnumbervalueprivate.h"
diff --git a/gtk/gtkstacksidebar.c b/gtk/gtkstacksidebar.c
index 8daf3e4fdf..ef43761d62 100644
--- a/gtk/gtkstacksidebar.c
+++ b/gtk/gtkstacksidebar.c
@@ -28,7 +28,6 @@
#include "gtklistbox.h"
#include "gtkscrolledwindow.h"
#include "gtkseparator.h"
-#include "gtkstylecontext.h"
#include "gtkselectionmodel.h"
#include "gtkstack.h"
#include "gtkprivate.h"
@@ -124,20 +123,6 @@ gtk_stack_sidebar_get_property (GObject *object,
}
static void
-update_header (GtkListBoxRow *row,
- GtkListBoxRow *before,
- gpointer userdata)
-{
- GtkWidget *ret = NULL;
-
- if (before && !gtk_list_box_row_get_header (row))
- {
- ret = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
- gtk_list_box_row_set_header (row, ret);
- }
-}
-
-static void
gtk_stack_sidebar_row_selected (GtkListBox *box,
GtkListBoxRow *row,
gpointer userdata)
@@ -165,11 +150,10 @@ gtk_stack_sidebar_init (GtkStackSidebar *self)
gtk_widget_set_parent (sw, GTK_WIDGET (self));
self->list = GTK_LIST_BOX (gtk_list_box_new ());
+ gtk_list_box_set_show_separators (GTK_LIST_BOX (self->list), TRUE);
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), GTK_WIDGET (self->list));
- gtk_list_box_set_header_func (self->list, update_header, self, NULL);
-
g_signal_connect (self->list, "row-selected",
G_CALLBACK (gtk_stack_sidebar_row_selected), self);
@@ -254,9 +238,10 @@ add_child (guint position,
static void
populate_sidebar (GtkStackSidebar *self)
{
- guint i;
+ guint i, n;
- for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (self->pages)); i++)
+ n = g_list_model_get_n_items (G_LIST_MODEL (self->pages));
+ for (i = 0; i < n; i++)
add_child (i, self);
}
@@ -312,20 +297,6 @@ selection_changed_cb (GtkSelectionModel *model,
}
static void
-disconnect_stack_signals (GtkStackSidebar *self)
-{
- g_signal_handlers_disconnect_by_func (self->pages, items_changed_cb, self);
- g_signal_handlers_disconnect_by_func (self->pages, selection_changed_cb, self);
-}
-
-static void
-connect_stack_signals (GtkStackSidebar *self)
-{
- g_signal_connect (self->pages, "items-changed", G_CALLBACK (items_changed_cb), self);
- g_signal_connect (self->pages, "selection-changed", G_CALLBACK (selection_changed_cb), self);
-}
-
-static void
set_stack (GtkStackSidebar *self,
GtkStack *stack)
{
@@ -334,7 +305,8 @@ set_stack (GtkStackSidebar *self,
self->stack = g_object_ref (stack);
self->pages = gtk_stack_get_pages (stack);
populate_sidebar (self);
- connect_stack_signals (self);
+ g_signal_connect (self->pages, "items-changed", G_CALLBACK (items_changed_cb), self);
+ g_signal_connect (self->pages, "selection-changed", G_CALLBACK (selection_changed_cb), self);
}
}
@@ -343,7 +315,8 @@ unset_stack (GtkStackSidebar *self)
{
if (self->stack)
{
- disconnect_stack_signals (self);
+ g_signal_handlers_disconnect_by_func (self->pages, items_changed_cb, self);
+ g_signal_handlers_disconnect_by_func (self->pages, selection_changed_cb, self);
clear_sidebar (self);
g_clear_object (&self->stack);
g_clear_object (&self->pages);
diff --git a/gtk/gtkstackswitcher.c b/gtk/gtkstackswitcher.c
index fe6976b762..86fe74d418 100644
--- a/gtk/gtkstackswitcher.c
+++ b/gtk/gtkstackswitcher.c
@@ -28,7 +28,6 @@
#include "gtklabel.h"
#include "gtkprivate.h"
#include "gtkselectionmodel.h"
-#include "gtkstylecontext.h"
#include "gtktogglebutton.h"
#include "gtktypebuiltins.h"
#include "gtkwidgetprivate.h"
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c
index 6bd587c927..708e61f9fb 100644
--- a/gtk/gtkstylecontext.c
+++ b/gtk/gtkstylecontext.c
@@ -1115,103 +1115,6 @@ snapshot_insertion_cursor (GtkSnapshot *snapshot,
}
/**
- * gtk_render_insertion_cursor:
- * @context: a #GtkStyleContext
- * @cr: a #cairo_t
- * @x: X origin
- * @y: Y origin
- * @layout: the #PangoLayout of the text
- * @index: the index in the #PangoLayout
- * @direction: the #PangoDirection of the text
- *
- * Draws a text caret on @cr at the specified index of @layout.
- **/
-void
-gtk_render_insertion_cursor (GtkStyleContext *context,
- cairo_t *cr,
- double x,
- double y,
- PangoLayout *layout,
- int index,
- PangoDirection direction)
-{
- GtkStyleContextPrivate *priv = gtk_style_context_get_instance_private (context);
- gboolean split_cursor;
- float aspect_ratio;
- PangoRectangle strong_pos, weak_pos;
- PangoRectangle *cursor1, *cursor2;
- GdkSeat *seat;
- GdkDevice *keyboard;
- PangoDirection keyboard_direction;
- PangoDirection direction2;
-
- g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
- g_return_if_fail (cr != NULL);
- g_return_if_fail (PANGO_IS_LAYOUT (layout));
- g_return_if_fail (index >= 0);
-
- g_object_get (gtk_settings_get_for_display (priv->display),
- "gtk-split-cursor", &split_cursor,
- "gtk-cursor-aspect-ratio", &aspect_ratio,
- NULL);
-
- seat = gdk_display_get_default_seat (priv->display);
- if (seat)
- keyboard = gdk_seat_get_keyboard (seat);
- else
- keyboard = NULL;
- if (keyboard)
- keyboard_direction = gdk_device_get_direction (keyboard);
- else
- keyboard_direction = PANGO_DIRECTION_LTR;
-
- pango_layout_get_cursor_pos (layout, index, &strong_pos, &weak_pos);
-
- direction2 = PANGO_DIRECTION_NEUTRAL;
-
- if (split_cursor)
- {
- cursor1 = &strong_pos;
-
- if (strong_pos.x != weak_pos.x || strong_pos.y != weak_pos.y)
- {
- direction2 = (direction == PANGO_DIRECTION_LTR) ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR;
- cursor2 = &weak_pos;
- }
- }
- else
- {
- if (keyboard_direction == direction)
- cursor1 = &strong_pos;
- else
- cursor1 = &weak_pos;
- }
-
- draw_insertion_cursor (context,
- cr,
- x + PANGO_PIXELS (cursor1->x),
- y + PANGO_PIXELS (cursor1->y),
- PANGO_PIXELS (cursor1->height),
- aspect_ratio,
- TRUE,
- direction,
- direction2 != PANGO_DIRECTION_NEUTRAL);
-
- if (direction2 != PANGO_DIRECTION_NEUTRAL)
- {
- draw_insertion_cursor (context,
- cr,
- x + PANGO_PIXELS (cursor2->x),
- y + PANGO_PIXELS (cursor2->y),
- PANGO_PIXELS (cursor2->height),
- aspect_ratio,
- FALSE,
- direction2,
- TRUE);
- }
-}
-
-/**
* gtk_snapshot_render_insertion_cursor:
* @snapshot: snapshot to render to
* @context: a #GtkStyleContext
@@ -1238,7 +1141,6 @@ gtk_snapshot_render_insertion_cursor (GtkSnapshot *snapshot,
PangoRectangle strong_pos, weak_pos;
PangoRectangle *cursor1, *cursor2;
GdkSeat *seat;
- GdkDevice *keyboard;
PangoDirection keyboard_direction;
PangoDirection direction2;
@@ -1252,15 +1154,15 @@ gtk_snapshot_render_insertion_cursor (GtkSnapshot *snapshot,
"gtk-cursor-aspect-ratio", &aspect_ratio,
NULL);
+ keyboard_direction = PANGO_DIRECTION_LTR;
seat = gdk_display_get_default_seat (priv->display);
if (seat)
- keyboard = gdk_seat_get_keyboard (seat);
- else
- keyboard = NULL;
- if (keyboard)
- keyboard_direction = gdk_device_get_direction (keyboard);
- else
- keyboard_direction = PANGO_DIRECTION_LTR;
+ {
+ GdkDevice *keyboard = gdk_seat_get_keyboard (seat);
+
+ if (keyboard)
+ keyboard_direction = gdk_device_get_direction (keyboard);
+ }
pango_layout_get_cursor_pos (layout, index, &strong_pos, &weak_pos);
diff --git a/gtk/gtkstylecontext.h b/gtk/gtkstylecontext.h
index 09cce1a0bc..ae3a474f05 100644
--- a/gtk/gtkstylecontext.h
+++ b/gtk/gtkstylecontext.h
@@ -130,16 +130,6 @@ GDK_AVAILABLE_IN_ALL
void gtk_style_context_get_margin (GtkStyleContext *context,
GtkBorder *margin);
-GDK_AVAILABLE_IN_ALL
-void gtk_render_insertion_cursor
- (GtkStyleContext *context,
- cairo_t *cr,
- double x,
- double y,
- PangoLayout *layout,
- int index,
- PangoDirection direction);
-
typedef enum {
GTK_STYLE_CONTEXT_PRINT_NONE = 0,
GTK_STYLE_CONTEXT_PRINT_RECURSE = 1 << 0,
diff --git a/gtk/gtkstylecontextprivate.h b/gtk/gtkstylecontextprivate.h
index 09fde7ce11..4cab724b20 100644
--- a/gtk/gtkstylecontextprivate.h
+++ b/gtk/gtkstylecontextprivate.h
@@ -21,9 +21,7 @@
#include "gtkstylecontext.h"
#include "gtkcssnodeprivate.h"
-#include "gtkicontheme.h"
#include "gtkstyleproviderprivate.h"
-#include "gtkbitmaskprivate.h"
#include "gtkcssvalueprivate.h"
G_BEGIN_DECLS
diff --git a/gtk/gtktextviewchild.c b/gtk/gtktextviewchild.c
index dc7ad283ad..a44a9e786b 100644
--- a/gtk/gtktextviewchild.c
+++ b/gtk/gtktextviewchild.c
@@ -21,7 +21,6 @@
#include "gtkcssnodeprivate.h"
#include "gtkintl.h"
#include "gtkprivate.h"
-#include "gtkstylecontext.h"
#include "gtktextview.h"
#include "gtktextviewchildprivate.h"
#include "gtktypebuiltins.h"
diff --git a/gtk/gtktogglebutton.c b/gtk/gtktogglebutton.c
index 9c1b5af385..88eea5a8cf 100644
--- a/gtk/gtktogglebutton.c
+++ b/gtk/gtktogglebutton.c
@@ -34,7 +34,6 @@
#include "gtkmain.h"
#include "gtkmarshalers.h"
#include "gtkprivate.h"
-#include "gtkstylecontext.h"
/**
* SECTION:gtktogglebutton
diff --git a/gtk/gtktooltip.c b/gtk/gtktooltip.c
index e0ad7772fc..73c54cd6b0 100644
--- a/gtk/gtktooltip.c
+++ b/gtk/gtktooltip.c
@@ -30,7 +30,6 @@
#include "gtkmain.h"
#include "gtksettings.h"
#include "gtksizerequest.h"
-#include "gtkstylecontext.h"
#include "gtktooltipwindowprivate.h"
#include "gtkwindowprivate.h"
#include "gtkwidgetprivate.h"
diff --git a/gtk/gtkviewport.c b/gtk/gtkviewport.c
index 412ba3b378..43df2cddae 100644
--- a/gtk/gtkviewport.c
+++ b/gtk/gtkviewport.c
@@ -31,7 +31,6 @@
#include "gtkmarshalers.h"
#include "gtkprivate.h"
#include "gtkscrollable.h"
-#include "gtkstylecontext.h"
#include "gtktypebuiltins.h"
#include "gtkwidgetprivate.h"
#include "gtkbuildable.h"
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index acaaf9251a..a1c3a069b7 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -809,6 +809,9 @@ _gtk_widget_grab_notify (GtkWidget *widget,
gtk_event_controller_reset (controller);
}
+
+ if (GTK_IS_NATIVE (widget))
+ gtk_widget_hide (widget);
}
static void
@@ -1250,8 +1253,6 @@ gtk_widget_class_init (GtkWidgetClass *klass)
*
* The requested opacity of the widget. See gtk_widget_set_opacity() for
* more details about window opacity.
- *
- * Before 3.8 this was only available in GtkWindow
*/
widget_props[PROP_OPACITY] =
g_param_spec_double ("opacity",
@@ -7455,7 +7456,7 @@ gtk_widget_adjust_baseline_request (GtkWidget *widget,
* with g_free(), the elements are owned by GTK and must
* not be freed.
*/
-GdkDevice **
+static GdkDevice **
_gtk_widget_list_devices (GtkWidget *widget,
guint *out_n_devices)
{
@@ -9670,8 +9671,6 @@ gtk_widget_get_allocated_baseline (GtkWidget *widget)
* running. See gdk_display_is_composited(). On Windows it should work
* always, although setting a window’s opacity after the window has been
* shown causes it to flicker once on Windows.
- *
- * For child widgets it doesn’t work if any affected widget has a native window.
**/
void
gtk_widget_set_opacity (GtkWidget *widget,
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index 9ab7f37f3c..761a190e1d 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -251,9 +251,6 @@ void _gtk_widget_propagate_display_changed (GtkWidget *widget,
void _gtk_widget_set_device_surface (GtkWidget *widget,
GdkDevice *device,
GdkSurface *pointer_window);
-GdkDevice ** _gtk_widget_list_devices (GtkWidget *widget,
- guint *out_n_devices);
-
void _gtk_widget_synthesize_crossing (GtkWidget *from,
GtkWidget *to,
GdkDevice *device,
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index a6f7f37912..3e69abbb3b 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -226,7 +226,6 @@ typedef struct
guint in_emit_close_request : 1;
GtkGesture *click_gesture;
- GtkEventController *key_controller;
GtkEventController *application_shortcut_controller;
GdkSurface *surface;
@@ -1512,13 +1511,13 @@ gtk_window_init (GtkWindow *window)
G_CALLBACK (gtk_window_capture_motion), window);
gtk_widget_add_controller (widget, controller);
- priv->key_controller = gtk_event_controller_key_new ();
- gtk_event_controller_set_propagation_phase (priv->key_controller, GTK_PHASE_CAPTURE);
- g_signal_connect_swapped (priv->key_controller, "key-pressed",
+ controller = gtk_event_controller_key_new ();
+ gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE);
+ g_signal_connect_swapped (controller, "key-pressed",
G_CALLBACK (gtk_window_key_pressed), window);
- g_signal_connect_swapped (priv->key_controller, "key-released",
+ g_signal_connect_swapped (controller, "key-released",
G_CALLBACK (gtk_window_key_released), window);
- gtk_widget_add_controller (widget, priv->key_controller);
+ gtk_widget_add_controller (widget, controller);
controller = gtk_event_controller_legacy_new ();
gtk_event_controller_set_name (controller, "gtk-window-toplevel-focus");
diff --git a/gtk/gtkwindowcontrols.c b/gtk/gtkwindowcontrols.c
index 47978330ef..3411a5d13f 100644
--- a/gtk/gtkwindowcontrols.c
+++ b/gtk/gtkwindowcontrols.c
@@ -28,7 +28,6 @@
#include "gtkimage.h"
#include "gtkintl.h"
#include "gtkprivate.h"
-#include "gtkstylecontext.h"
#include "gtktypebuiltins.h"
#include "gtkwindowprivate.h"
@@ -108,12 +107,12 @@ static char *
get_layout (GtkWindowControls *self)
{
GtkWidget *widget = GTK_WIDGET (self);
- GtkWidget *toplevel;
+ GtkRoot *root;
char *layout_desc, *layout_half;
char **tokens;
- toplevel = GTK_WIDGET (gtk_widget_get_root (widget));
- if (!GTK_IS_WINDOW (toplevel))
+ root = gtk_widget_get_root (widget);
+ if (!root || !GTK_IS_WINDOW (root))
return NULL;
if (self->decoration_layout)
@@ -222,7 +221,6 @@ static void
update_window_buttons (GtkWindowControls *self)
{
GtkWidget *widget = GTK_WIDGET (self);
- GtkWidget *toplevel;
char *layout;
char **tokens;
int i;
@@ -231,10 +229,11 @@ update_window_buttons (GtkWindowControls *self)
gboolean resizable;
gboolean deletable;
gboolean empty = TRUE;
+ GtkRoot *root;
GtkWindow *window = NULL;
- toplevel = GTK_WIDGET (gtk_widget_get_root (widget));
- if (!GTK_IS_WINDOW (toplevel))
+ root = gtk_widget_get_root (widget);
+ if (!root || !GTK_IS_WINDOW (root))
{
set_empty (self, TRUE);
@@ -243,23 +242,12 @@ update_window_buttons (GtkWindowControls *self)
clear_controls (self);
- if (GTK_IS_WINDOW (toplevel))
- {
- window = GTK_WINDOW (toplevel);
-
- is_sovereign_window = !gtk_window_get_modal (window) &&
- gtk_window_get_transient_for (window) == NULL;
- maximized = gtk_window_is_maximized (window);
- resizable = gtk_window_get_resizable (window);
- deletable = gtk_window_get_deletable (window);
- }
- else
- {
- is_sovereign_window = TRUE;
- maximized = FALSE;
- resizable = TRUE;
- deletable = TRUE;
- }
+ window = GTK_WINDOW (root);
+ is_sovereign_window = !gtk_window_get_modal (window) &&
+ gtk_window_get_transient_for (window) == NULL;
+ maximized = gtk_window_is_maximized (window);
+ resizable = gtk_window_get_resizable (window);
+ deletable = gtk_window_get_deletable (window);
layout = get_layout (self);
@@ -625,7 +613,7 @@ gtk_window_controls_set_side (GtkWindowControls *self,
* Gets the decoration layout set with
* gtk_window_controls_set_decoration_layout().
*
- * Returns: the decoration layout
+ * Returns: (nullable): the decoration layout or %NULL if it is unset
*/
const char *
gtk_window_controls_get_decoration_layout (GtkWindowControls *self)
@@ -638,7 +626,7 @@ gtk_window_controls_get_decoration_layout (GtkWindowControls *self)
/**
* gtk_window_controls_set_decoration_layout:
* @self: a #GtkWindowControls
- * @layout: (allow-none): a decoration layout, or %NULL to
+ * @layout: (nullable): a decoration layout, or %NULL to
* unset the layout
*
* Sets the decoration layout for the title buttons, overriding
diff --git a/gtk/inspector/actions.c b/gtk/inspector/actions.c
index 265a86ed69..d3797a0b2d 100644
--- a/gtk/inspector/actions.c
+++ b/gtk/inspector/actions.c
@@ -32,7 +32,6 @@
#include "gtklabel.h"
#include "gtkstack.h"
#include "gtklistbox.h"
-#include "gtkstylecontext.h"
#include "gtksizegroup.h"
#include "gtkboxlayout.h"
diff --git a/gtk/inspector/controllers.c b/gtk/inspector/controllers.c
index fc5b7b7a6e..83b35c6134 100644
--- a/gtk/inspector/controllers.c
+++ b/gtk/inspector/controllers.c
@@ -35,7 +35,6 @@
#include "gtksizegroup.h"
#include "gtksortlistmodel.h"
#include "gtkstack.h"
-#include "gtkstylecontext.h"
#include "gtkwidgetprivate.h"
#include "window.h"
diff --git a/gtk/inspector/object-tree.c b/gtk/inspector/object-tree.c
index 5f8c036380..3fae8f30cb 100644
--- a/gtk/inspector/object-tree.c
+++ b/gtk/inspector/object-tree.c
@@ -57,7 +57,6 @@
#include "gtktreemodelsort.h"
#include "gtktreemodelfilter.h"
#include "gtkwidgetprivate.h"
-#include "gtkstylecontext.h"
#include "gtksearchbar.h"
#include "gtksearchentry.h"
#include "gtkeventcontrollerkey.h"
diff --git a/gtk/inspector/prop-list.c b/gtk/inspector/prop-list.c
index 92e3cd3471..3487a36077 100644
--- a/gtk/inspector/prop-list.c
+++ b/gtk/inspector/prop-list.c
@@ -42,7 +42,6 @@
#include "gtksizegroup.h"
#include "gtkroot.h"
#include "gtkgestureclick.h"
-#include "gtkstylecontext.h"
#include "prop-holder.h"
#include "window.h"
diff --git a/gtk/inspector/size-groups.c b/gtk/inspector/size-groups.c
index 882794c10a..e84668d1dc 100644
--- a/gtk/inspector/size-groups.c
+++ b/gtk/inspector/size-groups.c
@@ -28,7 +28,6 @@
#include "gtklabel.h"
#include "gtklistbox.h"
#include "gtksizegroup.h"
-#include "gtkstylecontext.h"
#include "gtkswitch.h"
#include "gtkwidgetprivate.h"
#include "gtkstack.h"
diff --git a/gtk/inspector/strv-editor.c b/gtk/inspector/strv-editor.c
index 478b62809c..26240f9d69 100644
--- a/gtk/inspector/strv-editor.c
+++ b/gtk/inspector/strv-editor.c
@@ -22,7 +22,6 @@
#include "gtkbutton.h"
#include "gtkentry.h"
#include "gtkbox.h"
-#include "gtkstylecontext.h"
#include "gtkorientable.h"
#include "gtkmarshalers.h"
diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss
index 8f45f24d74..212ee4ae07 100644
--- a/gtk/theme/Adwaita/_common.scss
+++ b/gtk/theme/Adwaita/_common.scss
@@ -3460,10 +3460,11 @@ separator.sidebar {
outline-width: 0;
color: $selected_fg_color;
background-color: $selected_bg_color;
+ &:hover { background-color: darken($selected_bg_color,10%); }
}
&:hover:not(:last-child) { /* FIXME: dirty specificity bump */
- color: $fg_color;
- background-color: $menu_selected_color;
+ color: $selected_fg_color;
+ background-color: darken(desaturate($selected_bg_color,100%),10%);
}
}
diff --git a/gtk/tools/gdkpixbufutils.c b/gtk/tools/gdkpixbufutils.c
index d1a627c37b..1d6eb4feff 100644
--- a/gtk/tools/gdkpixbufutils.c
+++ b/gtk/tools/gdkpixbufutils.c
@@ -147,7 +147,7 @@ size_prepared_cb2 (GdkPixbufLoader *loader,
height = scales[1];
}
- gdk_pixbuf_loader_set_size (loader, width, scales[1]);
+ gdk_pixbuf_loader_set_size (loader, width, height);
}
GdkPixbuf *
diff --git a/meson.build b/meson.build
index 40f31f9f3c..0bed7b02fa 100644
--- a/meson.build
+++ b/meson.build
@@ -250,7 +250,6 @@ elif cc.get_id() == 'gcc' or cc.get_id() == 'clang'
'-Wno-c++11-extensions',
'-Wno-missing-include-dirs',
'-Wno-typedef-redefinition',
- '-Wcast-align',
'-Wduplicated-branches',
'-Wduplicated-cond',
'-Wformat=2',
@@ -294,6 +293,10 @@ elif cc.get_id() == 'gcc' or cc.get_id() == 'clang'
'-Werror=vla',
'-Werror=write-strings',
]
+
+ if cc.get_id() == 'gcc'
+ test_cflags += ['-Wcast-align'] # This warns too much on clang
+ endif
else
test_cflags = []
endif
@@ -610,20 +613,10 @@ if win32_enabled
backend_immodules += ['ime']
# Check whether libepoxy is built with EGL support on Windows
- win32_has_egl = cc.links(
- '''
- #include <epoxy/egl.h>
-
- int main(int argc, char *argv[])
- {
- EGLDisplay disp = EGL_NO_DISPLAY;
-
- return epoxy_egl_version (disp);
- }
- ''',
- dependencies : epoxy_dep,
- name : 'libepoxy supports EGL on Windows'
- )
+ win32_has_egl = epoxy_dep.get_variable(
+ pkgconfig: 'epoxy_has_egl',
+ internal: 'epoxy_has_egl',
+ default_value: '0') == '1'
endif
# Check for bind_textdomain_codeset, including -lintl if GLib brings it in by
diff --git a/tests/showrendernode.c b/tests/showrendernode.c
index 25e9960251..4f41f0c4f9 100644
--- a/tests/showrendernode.c
+++ b/tests/showrendernode.c
@@ -152,6 +152,9 @@ main (int argc, char **argv)
return 1;
}
+ g_option_context_free (option_context);
+ option_context = NULL;
+
g_message ("Compare: %d, write to filename: %s", compare_node, write_to_filename);
gtk_init ();
diff --git a/tests/testfilechooser.c b/tests/testfilechooser.c
index 4d3fb13bd7..c06f636884 100644
--- a/tests/testfilechooser.c
+++ b/tests/testfilechooser.c
@@ -42,26 +42,6 @@ static GtkWidget *preview_image;
static GtkFileChooserAction action;
static void
-print_selected (GtkFileChooser *chooser)
-{
- GListModel *files = gtk_file_chooser_get_files (chooser);
- guint i, n;
-
- g_print ("Selection changed :\n");
- n = g_list_model_get_n_items (files);
- for (i = 0; i < n; i++)
- {
- GFile *file = g_list_model_get_item (files, i);
- char *uri = g_file_get_uri (file);
- g_print (" %s\n", uri ? uri : "(null)");
- g_free (uri);
- g_object_unref (files);
- }
- g_print ("\n");
- g_object_unref (files);
-}
-
-static void
response_cb (GtkDialog *dialog,
int response_id,
gpointer data)
@@ -324,8 +304,6 @@ main (int argc, char **argv)
}
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
- g_signal_connect (dialog, "selection-changed",
- G_CALLBACK (print_selected), NULL);
g_signal_connect (dialog, "response",
G_CALLBACK (response_cb), &done);