Merge branch 'gtk-4-14-backports' into 'gtk-4-14'

[GTK 4.14] Various backports

See merge request GNOME/gtk!7707
This commit is contained in:
Matthias Clasen 2024-09-14 21:44:19 +00:00
commit 7778609305
12 changed files with 100 additions and 40 deletions

View File

@ -649,7 +649,7 @@ void
gdk_monitor_set_scale (GdkMonitor *monitor,
double scale)
{
g_return_if_fail (scale >= 1.);
g_return_if_fail (scale > 0.);
monitor->scale_set = TRUE;

View File

@ -250,8 +250,7 @@ typedef NSString *CALayerContentsGravity;
-(BOOL)canBecomeKeyWindow
{
return GDK_IS_TOPLEVEL (gdk_surface) ||
(GDK_IS_POPUP (gdk_surface) && GDK_SURFACE (gdk_surface)->input_region != NULL);
return GDK_IS_TOPLEVEL (gdk_surface);
}
-(void)showAndMakeKey:(BOOL)makeKey
@ -692,24 +691,9 @@ typedef NSString *CALayerContentsGravity;
-(void)setStyleMask:(NSWindowStyleMask)styleMask
{
gboolean was_opaque;
gboolean is_opaque;
was_opaque = (([self styleMask] & NSWindowStyleMaskTitled) != 0);
[super setStyleMask:styleMask];
is_opaque = (([self styleMask] & NSWindowStyleMaskTitled) != 0);
_gdk_macos_surface_update_fullscreen_state (gdk_surface);
if (was_opaque != is_opaque)
{
[self setOpaque:is_opaque];
if (!is_opaque)
[self setBackgroundColor:[NSColor clearColor]];
}
}
-(NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen
@ -785,13 +769,20 @@ typedef NSString *CALayerContentsGravity;
if (decorated)
{
style_mask |= NSWindowStyleMaskTitled;
style_mask &= ~NSWindowStyleMaskFullSizeContentView;
[self setTitleVisibility:NSWindowTitleVisible];
}
else
{
style_mask &= ~NSWindowStyleMaskTitled;
style_mask |= NSWindowStyleMaskFullSizeContentView;
[self setTitleVisibility:NSWindowTitleHidden];
}
[self setTitlebarAppearsTransparent:!decorated];
[[self standardWindowButton:NSWindowCloseButton] setHidden:!decorated];
[[self standardWindowButton:NSWindowMiniaturizeButton] setHidden:!decorated];
[[self standardWindowButton:NSWindowZoomButton] setHidden:!decorated];
[self setStyleMask:style_mask];
}

View File

@ -617,6 +617,14 @@ _gdk_macos_toplevel_surface_constructed (GObject *object)
_gdk_macos_surface_set_native (GDK_MACOS_SURFACE (self), window);
[window setOpaque:NO];
/* Workaround: if we use full transparency, window rendering becomes slow,
* because macOS tries to dynamically calculate the shadow.
* Instead provide a tiny bit of alpha, so shadows are drawn around the window.
*/
[window setBackgroundColor:[[NSColor blackColor] colorWithAlphaComponent:0.00001]];
/* Allow NSWindow to go fullscreen */
[window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];

View File

@ -134,8 +134,8 @@ get_wl_buffer (GdkWaylandSubsurface *self,
while (!cd.done)
gdk_wayland_display_dispatch_queue (GDK_DISPLAY (display), event_queue);
wl_event_queue_destroy (event_queue);
zwp_linux_buffer_params_v1_destroy (params);
wl_event_queue_destroy (event_queue);
buffer = cd.buffer;

View File

@ -1472,7 +1472,7 @@ gdk_x11_display_open (const char *display_name)
}
#endif
/* initialize the display's screens */
/* initialize the display's screens */
display_x11->screen = _gdk_x11_screen_new (display, DefaultScreen (display_x11->xdisplay));
/* If GL is available we want to pick better default/rgba visuals,
@ -1484,8 +1484,11 @@ gdk_x11_display_open (const char *display_name)
*/
if (!gdk_display_prepare_gl (display, NULL))
{
gdk_x11_display_query_default_visual (display_x11, &display_x11->window_visual, &display_x11->window_depth);
gdk_x11_display_init_leader_surface (display_x11);
if (!display_x11->leader_gdk_surface)
{
gdk_x11_display_query_default_visual (display_x11, &display_x11->window_visual, &display_x11->window_depth);
gdk_x11_display_init_leader_surface (display_x11);
}
}
#ifdef HAVE_XFIXES
@ -3021,7 +3024,7 @@ gdk_x11_display_init_gl (GdkDisplay *display,
GdkX11Display *self = GDK_X11_DISPLAY (display);
if (!gdk_x11_display_init_gl_backend (self, &self->window_visual, &self->window_depth, error))
return FALSE;
return NULL;
gdk_x11_display_init_leader_surface (self);

View File

@ -83,5 +83,6 @@ GDK_AVAILABLE_IN_4_14
void gsk_stroke_to_cairo (const GskStroke *self,
cairo_t *cr);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GskStroke, gsk_stroke_free)
G_END_DECLS

View File

@ -439,7 +439,8 @@ emoji_activated (GtkFlowBox *box,
item = (GVariant*) g_object_get_data (G_OBJECT (child), "emoji-data");
modifier = (gunichar) GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (child), "modifier"));
add_recent_item (chooser, item, modifier);
if ((GtkWidget *) box != chooser->recent.box)
add_recent_item (chooser, item, modifier);
g_signal_emit (data, signals[EMOJI_PICKED], 0, text);
g_free (text);

View File

@ -273,7 +273,7 @@ quartz_set_client_surface (GtkIMContext *context,
if (widget != NULL)
{
GtkNative *native = gtk_widget_get_native (widget);
GtkNative *native = GTK_NATIVE (gtk_widget_get_root (widget));
if (native != NULL)
qc->client_surface = gtk_native_get_surface (native);
@ -317,7 +317,7 @@ quartz_set_cursor_location (GtkIMContext *context, GdkRectangle *area)
if (!qc->focused)
return;
surface_widget = GTK_WIDGET (gdk_surface_get_widget (qc->client_surface));
surface_widget = GTK_WIDGET (gtk_widget_get_native (qc->client_widget));
if (!surface_widget)
return;

View File

@ -1067,10 +1067,29 @@ switch_menu (GtkModelButton *button)
stack = gtk_widget_get_ancestor (GTK_WIDGET (button), GTK_TYPE_STACK);
if (stack != NULL)
{
if (button->role == GTK_BUTTON_ROLE_NORMAL)
{
GtkWidget *title_button = gtk_widget_get_first_child (gtk_stack_get_child_by_name (GTK_STACK (stack), button->menu_name));
gtk_accessible_update_state (GTK_ACCESSIBLE (button),
GTK_ACCESSIBLE_STATE_EXPANDED, TRUE,
-1);
gtk_accessible_update_state (GTK_ACCESSIBLE (title_button),
GTK_ACCESSIBLE_STATE_EXPANDED, TRUE,
-1);
g_object_set_data (G_OBJECT (title_button), "-gtk-model-button-parent", button);
}
else if (button->role == GTK_BUTTON_ROLE_TITLE)
{
GtkWidget *parent_button = g_object_get_data (G_OBJECT (button), "-gtk-model-button-parent");
gtk_accessible_update_state (GTK_ACCESSIBLE (parent_button),
GTK_ACCESSIBLE_STATE_EXPANDED, FALSE,
-1);
gtk_accessible_update_state (GTK_ACCESSIBLE (button),
GTK_ACCESSIBLE_STATE_EXPANDED, FALSE,
-1);
g_object_set_data (G_OBJECT (button), "-gtk-model-button-parent", NULL);
}
gtk_stack_set_visible_child_name (GTK_STACK (stack), button->menu_name);
gtk_accessible_update_state (GTK_ACCESSIBLE (button),
GTK_ACCESSIBLE_STATE_EXPANDED, TRUE,
-1);
}
}

View File

@ -2290,6 +2290,9 @@ gtk_spin_button_set_numeric (GtkSpinButton *spin_button,
spin_button->numeric = numeric;
gtk_text_set_input_purpose (GTK_TEXT (spin_button->entry),
numeric ? GTK_INPUT_PURPOSE_NUMBER: GTK_INPUT_PURPOSE_FREE_FORM);
gtk_text_set_input_hints (GTK_TEXT (spin_button->entry),
numeric ? GTK_INPUT_HINT_NO_EMOJI : GTK_INPUT_HINT_NONE);
g_object_notify_by_pspec (G_OBJECT (spin_button), spinbutton_props[PROP_NUMERIC]);
}
}

View File

@ -6468,7 +6468,7 @@ gtk_text_drag_drop (GtkDropTarget *dest,
gtk_editable_insert_text (GTK_EDITABLE (self), str, length, &drop_position);
gtk_accessible_text_update_contents (GTK_ACCESSIBLE_TEXT (self),
GTK_ACCESSIBLE_TEXT_CONTENT_CHANGE_INSERT,
drop_position, drop_position + length);
drop_position, drop_position + g_utf8_strlen (str, length));
}
else
{
@ -6480,7 +6480,7 @@ gtk_text_drag_drop (GtkDropTarget *dest,
gtk_editable_insert_text (GTK_EDITABLE (self), str, length, &pos);
gtk_accessible_text_update_contents (GTK_ACCESSIBLE_TEXT (self),
GTK_ACCESSIBLE_TEXT_CONTENT_CHANGE_INSERT,
pos, pos + length);
pos, pos + g_utf8_strlen (str, length));
end_change (self);
}
@ -7058,7 +7058,7 @@ emoji_picked (GtkEmojiChooser *chooser,
gtk_editable_insert_text (GTK_EDITABLE (self), text, -1, &pos);
gtk_accessible_text_update_contents (GTK_ACCESSIBLE_TEXT (self),
GTK_ACCESSIBLE_TEXT_CONTENT_CHANGE_INSERT,
pos, pos + 1);
pos, pos + g_utf8_strlen (text, -1));
gtk_text_set_selection_bounds (self, pos, pos);
end_change (self);
}
@ -7388,7 +7388,7 @@ gtk_text_history_insert_cb (gpointer funcs_data,
gtk_editable_insert_text (GTK_EDITABLE (text), str, len, &location);
gtk_accessible_text_update_contents (GTK_ACCESSIBLE_TEXT (text),
GTK_ACCESSIBLE_TEXT_CONTENT_CHANGE_INSERT,
location, location + len);
location, location + g_utf8_strlen (str, len));
}
static void

View File

@ -44,6 +44,7 @@ struct GtkPrinterOptionWidgetPrivate
{
GtkPrinterOption *source;
gulong source_changed_handler;
gulong comboentry_changed_handler_id;
GtkWidget *check;
GtkWidget *combo;
@ -765,9 +766,7 @@ filter_numeric (const char *val,
}
static void
combo_changed_cb (GtkWidget *combo,
GParamSpec *pspec,
GtkPrinterOptionWidget *widget)
handle_combo_entry_change (GtkPrinterOptionWidget *widget)
{
GtkPrinterOptionWidgetPrivate *priv = widget->priv;
char *value;
@ -813,7 +812,21 @@ combo_changed_cb (GtkWidget *combo,
if (changed)
{
GtkWidget *entry = gtk_widget_get_first_child (priv->combo);
gssize buffer_length, filtered_buffer_length;
gint position;
position = gtk_editable_get_position (GTK_EDITABLE (entry));
buffer_length = gtk_entry_buffer_get_length (gtk_entry_get_buffer (GTK_ENTRY (entry)));
g_signal_handler_block (entry, priv->comboentry_changed_handler_id);
gtk_editable_set_text (GTK_EDITABLE (entry), filtered_val);
g_signal_handler_unblock (entry, priv->comboentry_changed_handler_id);
filtered_buffer_length = gtk_entry_buffer_get_length (gtk_entry_get_buffer (GTK_ENTRY (entry)));
/* Maintain position of the cursor with respect to the end of the buffer. */
if (position > 0 && filtered_buffer_length < buffer_length)
gtk_editable_set_position (GTK_EDITABLE (entry), position - (buffer_length - filtered_buffer_length));
}
value = filtered_val;
}
@ -825,6 +838,21 @@ combo_changed_cb (GtkWidget *combo,
emit_changed (widget);
}
static void
combo_changed_cb (GtkWidget *combo,
GParamSpec *pspec,
GtkPrinterOptionWidget *widget)
{
handle_combo_entry_change (widget);
}
static void
comboentry_changed_cb (GtkEditable *editable,
GtkPrinterOptionWidget *widget)
{
handle_combo_entry_change (widget);
}
static void
entry_changed_cb (GtkWidget *entry,
GtkPrinterOptionWidget *widget)
@ -958,9 +986,15 @@ construct_widgets (GtkPrinterOptionWidget *widget)
source->choices[i]);
gtk_box_append (GTK_BOX (widget), priv->combo);
if (GTK_IS_DROP_DOWN (priv->combo))
g_signal_connect (priv->combo, "notify::selected", G_CALLBACK (combo_changed_cb),widget);
{
g_signal_connect (priv->combo, "notify::selected", G_CALLBACK (combo_changed_cb),widget);
}
else
g_signal_connect (gtk_widget_get_last_child (priv->combo), "notify::selected",G_CALLBACK (combo_changed_cb), widget);
{
g_signal_connect (gtk_widget_get_last_child (priv->combo), "notify::selected", G_CALLBACK (combo_changed_cb), widget);
priv->comboentry_changed_handler_id = g_signal_connect (gtk_widget_get_first_child (priv->combo), "changed", G_CALLBACK (comboentry_changed_cb), widget);
}
text = g_strdup_printf ("%s:", source->display_text);
priv->label = gtk_label_new_with_mnemonic (text);