diff options
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, - ®ion, - is_offscreen); + load_vertex_data_with_region (ops_draw (builder, NULL), + node, builder, + ®ion, + 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, ®ion, - 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); |