Merge branch 'for-45' into 'gnome-45'

Backports for 45.8

See merge request GNOME/gnome-shell!3395
This commit is contained in:
Florian Müllner 2024-06-28 13:13:28 +00:00
commit 8854ea4c93
17 changed files with 152 additions and 145 deletions

View file

@ -1,7 +1,7 @@
include:
- remote: 'https://gitlab.gnome.org/GNOME/citemplates/raw/HEAD/flatpak/flatpak_ci_initiative.yml'
- remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/057b052e682d8e5a20c1eb2dd60d5b87d2b56856/templates/fedora.yml'
- remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/34f4ade99434043f88e164933f570301fd18b125/templates/ci-fairy.yml'
- remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/bc70242ffb8402243e934659ecc1a2d1c89eca2b/templates/ci-fairy.yml'
- project: 'Infrastructure/openshift-images/gnome-release-service'
file: '/ci-templates/release-module.yml'
@ -42,7 +42,7 @@ workflow:
- if: '$CI_COMMIT_TAG'
- if: '$CI_COMMIT_BRANCH'
.pipeline_guard: &pipeline_guard
.pipeline-guard:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- if: '$CI_COMMIT_TAG'
@ -95,7 +95,8 @@ check_commit_log:
else
echo "Not a merge request" ;
fi
<<: *pipeline_guard
rules:
- !reference [.pipeline-guard, rules]
artifacts:
expire_in: 1 week
paths:
@ -114,7 +115,8 @@ check-merge-request:
else
echo "Not a merge request" ;
fi
<<: *pipeline_guard
rules:
- !reference [.pipeline-guard, rules]
artifacts:
expire_in: 1 week
paths:
@ -174,8 +176,6 @@ potfile_js_check:
build:
stage: build
needs: ["check_commit_log"]
variables:
GIT_SUBMODULE_STRATEGY: normal
before_script:
- .gitlab-ci/checkout-mutter.sh
- meson mutter mutter/build --prefix=/usr
@ -189,12 +189,12 @@ build:
paths:
- mutter
- build
- subprojects/gvc
test:
stage: test
needs: ["build"]
variables:
GIT_SUBMODULE_STRATEGY: normal
XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
NO_AT_BRIDGE: "1"
before_script:
@ -218,8 +218,6 @@ test-coverity:
needs: ["build"]
stage: analyze
allow_failure: true
variables:
GIT_SUBMODULE_STRATEGY: normal
before_script:
- sudo meson install -C mutter/build
script:
@ -261,9 +259,6 @@ distinfo:
reports:
dotenv: dist.env
paths:
- build
- mutter
- subprojects/jasmine-gjs
- dist.env
rules:
- if: '$CI_COMMIT_TAG'
@ -272,7 +267,6 @@ dist:
variables:
XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
NO_AT_BRIDGE: "1"
GIT_SUBMODULE_STRATEGY: normal
stage: deploy
needs: ["build"]
before_script:
@ -289,6 +283,7 @@ dist:
dist-tarball:
extends: dist
needs:
- build
- distinfo
artifacts:
expose_as: 'Get tarball here'

3
.gitmodules vendored
View file

@ -1,3 +0,0 @@
[submodule "subprojects/gvc"]
path = subprojects/gvc
url = ../../GNOME/libgnome-volume-control.git

View file

@ -660,7 +660,14 @@ export class ShellUserVerifier extends Signals.EventEmitter {
this.emit('reset');
}
_onVerificationComplete() {
_onVerificationComplete(_client, serviceName) {
const isCredentialManager = !!this._credentialManagers[serviceName];
const isForeground = this.serviceIsForeground(serviceName);
if (isCredentialManager && isForeground) {
this._credentialManagers[serviceName].token = null;
this._preemptingService = null;
}
this.emit('verification-complete');
}
@ -740,10 +747,10 @@ export class ShellUserVerifier extends Signals.EventEmitter {
// If the login failed with the preauthenticated oVirt credentials
// then discard the credentials and revert to default authentication
// mechanism.
let foregroundService = Object.keys(this._credentialManagers).find(service =>
this.serviceIsForeground(service));
if (foregroundService) {
this._credentialManagers[foregroundService].token = null;
const isCredentialManager = !!this._credentialManagers[serviceName];
const isForeground = this.serviceIsForeground(serviceName);
if (isCredentialManager && isForeground) {
this._credentialManagers[serviceName].token = null;
this._preemptingService = null;
this._verificationFailed(serviceName, false);
return;
@ -757,7 +764,7 @@ export class ShellUserVerifier extends Signals.EventEmitter {
// if the password service fails, then cancel everything.
// But if, e.g., fingerprint fails, still give
// password authentication a chance to succeed
if (this.serviceIsForeground(serviceName))
if (isForeground)
this._failCounter++;
this._verificationFailed(serviceName, true);

View file

@ -113,6 +113,8 @@ class PortalWindow extends Gtk.ApplicationWindow {
super._init({
application,
title: _('Hotspot Login'),
default_width: 600,
default_height: 450,
});
const headerbar = new Gtk.HeaderBar();
@ -153,7 +155,6 @@ class PortalWindow extends Gtk.ApplicationWindow {
this._syncUri();
this.set_child(this._webView);
this.set_size_request(600, 450);
this.maximize();
this.present_with_time(timestamp);

View file

@ -108,8 +108,6 @@ export const BarLevel = GObject.registerClass({
}
vfunc_style_changed() {
super.vfunc_style_changed();
const themeNode = this.get_theme_node();
this._barLevelHeight = themeNode.get_length('-barlevel-height');
this._barLevelBorderWidth =
@ -135,6 +133,8 @@ export const BarLevel = GObject.registerClass({
themeNode.lookup_color('-barlevel-overdrive-border-color', false);
this._barLevelOverdriveBorderColor = hasOverdriveBorderColor
? barLevelOverdriveBorderColor : this._barLevelOverdriveColor;
super.vfunc_style_changed();
}
vfunc_repaint() {

View file

@ -498,6 +498,11 @@ export const Notification = GObject.registerClass({
destroy(reason = NotificationDestroyedReason.DISMISSED) {
this.emit('destroy', reason);
if (this._updateDatetimeId)
GLib.source_remove(this._updateDatetimeId);
delete this._updateDatetimeId;
this.run_dispose();
}
});

View file

@ -1089,16 +1089,11 @@ class Workspace extends St.Widget {
this.connect('destroy', this._onDestroy.bind(this));
this._skipTaskbarSignals = new Map();
const windows = global.get_window_actors().map(a => a.meta_window)
.filter(this._isMyWindow, this);
// Create clones for windows that should be
// visible in the Overview
this._windows = [];
for (let i = 0; i < windows.length; i++) {
if (this._isOverviewWindow(windows[i]))
this._addWindowClone(windows[i]);
}
this._layoutFrozenId = 0;
// DND requires this to be set
this._delegate = this;
// Track window changes, but let the window tracker process them first
this.metaWorkspace?.connectObject(
@ -1109,10 +1104,10 @@ class Workspace extends St.Widget {
'window-entered-monitor', this._windowEnteredMonitor.bind(this), GObject.ConnectFlags.AFTER,
'window-left-monitor', this._windowLeftMonitor.bind(this), GObject.ConnectFlags.AFTER,
this);
this._layoutFrozenId = 0;
// DND requires this to be set
this._delegate = this;
// Create clones for windows that should be
// visible in the Overview
global.get_window_actors().map(a => this._doAddWindow(a.meta_window));
}
_shouldLeaveOverview() {
@ -1207,7 +1202,7 @@ class Workspace extends St.Widget {
// We might have the window in our list already if it was on all workspaces and
// now was moved to this workspace
if (this._lookupIndex(metaWin) !== -1)
if (this.containsMetaWindow(metaWin))
return;
if (!this._isMyWindow(metaWin))

View file

@ -440,6 +440,11 @@ class WorkspacesView extends WorkspacesViewBase {
}
}
_raiseActiveWorkspace() {
const activeWorkspace = this.getActiveWorkspace();
this.set_child_above_sibling(activeWorkspace, null);
}
_updateWorkspaces() {
let workspaceManager = global.workspace_manager;
let newNumWorkspaces = workspaceManager.n_workspaces;
@ -472,10 +477,12 @@ class WorkspacesView extends WorkspacesViewBase {
this._updateWorkspacesState();
this._updateVisibility();
this._raiseActiveWorkspace();
}
_activeWorkspaceChanged(_wm, _from, _to, _direction) {
this._scrollToActive();
this._raiseActiveWorkspace();
}
_onDestroy() {

View file

@ -29,7 +29,6 @@ gtk_req = '>= 4.0'
mutter_req = '>= 45.0'
polkit_req = '>= 0.100'
schemas_req = '>= 42.beta'
startup_req = '>= 0.11'
systemd_req = '>= 246'
ibus_req = '>= 1.5.19'
gnome_desktop_req = '>= 40'
@ -75,7 +74,6 @@ atk_bridge_dep = dependency('atk-bridge-2.0')
ecal_dep = dependency('libecal-2.0', version: ecal_req)
eds_dep = dependency('libedataserver-1.2', version: eds_req)
gcr_dep = dependency('gcr-4', version: gcr_req)
gdk_x11_dep = dependency('gdk-x11-3.0')
gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0')
gi_dep = dependency('gobject-introspection-1.0', version: gi_req)
gio_dep = dependency('gio-2.0', version: gio_req)
@ -89,7 +87,6 @@ cogl_dep = dependency(cogl_pc, version: mutter_req)
cogl_pango_dep = dependency(cogl_pango_pc, version: mutter_req)
mutter_dep = dependency(libmutter_pc, version: mutter_req)
polkit_dep = dependency('polkit-agent-1', version: polkit_req)
startup_dep = dependency('libstartup-notification-1.0', version: startup_req)
ibus_dep = dependency('ibus-1.0', version: ibus_req)
x11_dep = dependency('x11')
schemas_dep = dependency('gsettings-desktop-schemas', version: schemas_req)

View file

@ -60,12 +60,12 @@ gnome_shell_deps = [
mtk_dep,
clutter_dep,
cogl_pango_dep,
startup_dep,
gi_dep,
polkit_dep,
gcr_dep,
libsystemd_dep,
libpipewire_dep,
x11_dep,
]
gnome_shell_deps += nm_deps

View file

@ -298,7 +298,11 @@ shell_camera_monitor_disconnect_core (ShellCameraMonitor *monitor)
g_clear_handle_id (&monitor->delayed_disable_id, g_source_remove);
spa_hook_remove (&monitor->registry_listener);
g_clear_pointer ((struct pw_proxy**) &monitor->registry, pw_proxy_destroy);
if (monitor->registry != NULL)
{
pw_proxy_destroy ((struct pw_proxy *) monitor->registry);
monitor->registry = NULL;
}
spa_hook_remove (&monitor->core_listener);
g_clear_pointer (&monitor->core, pw_core_disconnect);
}

View file

@ -66,24 +66,12 @@ enum {
static GParamSpec *props[N_PROPS] = { NULL, };
static CoglTexture *
st_scroll_view_fade_create_texture (ClutterOffscreenEffect *effect,
gfloat min_width,
gfloat min_height)
{
CoglContext *ctx =
clutter_backend_get_cogl_context (clutter_get_default_backend ());
return COGL_TEXTURE (cogl_texture_2d_new_with_size (ctx, min_width, min_height));
}
static char *
st_scroll_view_fade_get_static_shader_source (ClutterShaderEffect *effect)
{
return g_strdup (st_scroll_view_fade_glsl);
}
static void
st_scroll_view_fade_paint_target (ClutterOffscreenEffect *effect,
ClutterPaintNode *node,
@ -394,7 +382,6 @@ st_scroll_view_fade_class_init (StScrollViewFadeClass *klass)
shader_class->get_static_shader_source = st_scroll_view_fade_get_static_shader_source;
offscreen_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass);
offscreen_class->create_texture = st_scroll_view_fade_create_texture;
offscreen_class->paint_target = st_scroll_view_fade_paint_target;
/**

View file

@ -1362,6 +1362,92 @@ st_theme_node_prerender_background (StThemeNode *node,
return texture;
}
static void
st_theme_node_maybe_prerender_background (StThemeNodePaintState *state,
StThemeNode *node,
float width,
float height,
float resource_scale)
{
gboolean has_border;
gboolean has_border_radius;
gboolean has_inset_box_shadow;
gboolean has_large_corners;
StShadow *box_shadow_spec;
box_shadow_spec = st_theme_node_get_box_shadow (node);
has_inset_box_shadow = box_shadow_spec && box_shadow_spec->inset;
if (node->border_width[ST_SIDE_TOP] > 0 ||
node->border_width[ST_SIDE_LEFT] > 0 ||
node->border_width[ST_SIDE_RIGHT] > 0 ||
node->border_width[ST_SIDE_BOTTOM] > 0)
has_border = TRUE;
else
has_border = FALSE;
if (node->border_radius[ST_CORNER_TOPLEFT] > 0 ||
node->border_radius[ST_CORNER_TOPRIGHT] > 0 ||
node->border_radius[ST_CORNER_BOTTOMLEFT] > 0 ||
node->border_radius[ST_CORNER_BOTTOMRIGHT] > 0)
has_border_radius = TRUE;
else
has_border_radius = FALSE;
/* The cogl code pads each corner to the maximum border radius,
* which results in overlapping corner areas if the radius
* exceeds the actor's halfsize, causing rendering errors.
* Fall back to cairo in these cases. */
has_large_corners = FALSE;
if (has_border_radius) {
guint border_radius[4];
int corner;
st_theme_node_reduce_border_radius (node, width, height, border_radius);
for (corner = 0; corner < 4; corner ++) {
if (border_radius[corner] * 2 > height ||
border_radius[corner] * 2 > width) {
has_large_corners = TRUE;
break;
}
}
}
state->corner_material[ST_CORNER_TOPLEFT] =
st_theme_node_lookup_corner (node, width, height, resource_scale, ST_CORNER_TOPLEFT);
state->corner_material[ST_CORNER_TOPRIGHT] =
st_theme_node_lookup_corner (node, width, height, resource_scale, ST_CORNER_TOPRIGHT);
state->corner_material[ST_CORNER_BOTTOMRIGHT] =
st_theme_node_lookup_corner (node, width, height, resource_scale, ST_CORNER_BOTTOMRIGHT);
state->corner_material[ST_CORNER_BOTTOMLEFT] =
st_theme_node_lookup_corner (node, width, height, resource_scale, ST_CORNER_BOTTOMLEFT);
/* Use cairo to prerender the node if there is a gradient, or
* background image with borders and/or rounded corners,
* or large corners, since we can't do those things
* easily with cogl.
*
* FIXME: if we could figure out ahead of time that a
* background image won't overlap with the node borders,
* then we could use cogl for that case.
*/
if ((node->background_gradient_type != ST_GRADIENT_NONE)
|| (has_inset_box_shadow && (has_border || node->background_color.alpha > 0))
|| (st_theme_node_get_background_image (node) && (has_border || has_border_radius))
|| has_large_corners)
{
state->prerendered_texture = st_theme_node_prerender_background (node, width, height, resource_scale);
if (state->prerendered_texture)
state->prerendered_pipeline = _st_create_texture_pipeline (state->prerendered_texture);
else
state->prerendered_pipeline = NULL;
}
}
static void st_theme_node_paint_borders (StThemeNodePaintState *state,
CoglFramebuffer *framebuffer,
const ClutterActorBox *box,
@ -1487,10 +1573,7 @@ st_theme_node_render_resources (StThemeNodePaintState *state,
float height,
float resource_scale)
{
gboolean has_border;
gboolean has_border_radius;
gboolean has_inset_box_shadow;
gboolean has_large_corners;
StShadow *box_shadow_spec;
g_return_if_fail (width > 0 && height > 0);
@ -1512,72 +1595,7 @@ st_theme_node_render_resources (StThemeNodePaintState *state,
box_shadow_spec = st_theme_node_get_box_shadow (node);
has_inset_box_shadow = box_shadow_spec && box_shadow_spec->inset;
if (node->border_width[ST_SIDE_TOP] > 0 ||
node->border_width[ST_SIDE_LEFT] > 0 ||
node->border_width[ST_SIDE_RIGHT] > 0 ||
node->border_width[ST_SIDE_BOTTOM] > 0)
has_border = TRUE;
else
has_border = FALSE;
if (node->border_radius[ST_CORNER_TOPLEFT] > 0 ||
node->border_radius[ST_CORNER_TOPRIGHT] > 0 ||
node->border_radius[ST_CORNER_BOTTOMLEFT] > 0 ||
node->border_radius[ST_CORNER_BOTTOMRIGHT] > 0)
has_border_radius = TRUE;
else
has_border_radius = FALSE;
/* The cogl code pads each corner to the maximum border radius,
* which results in overlapping corner areas if the radius
* exceeds the actor's halfsize, causing rendering errors.
* Fall back to cairo in these cases. */
has_large_corners = FALSE;
if (has_border_radius) {
guint border_radius[4];
int corner;
st_theme_node_reduce_border_radius (node, width, height, border_radius);
for (corner = 0; corner < 4; corner ++) {
if (border_radius[corner] * 2 > height ||
border_radius[corner] * 2 > width) {
has_large_corners = TRUE;
break;
}
}
}
state->corner_material[ST_CORNER_TOPLEFT] =
st_theme_node_lookup_corner (node, width, height, resource_scale, ST_CORNER_TOPLEFT);
state->corner_material[ST_CORNER_TOPRIGHT] =
st_theme_node_lookup_corner (node, width, height, resource_scale, ST_CORNER_TOPRIGHT);
state->corner_material[ST_CORNER_BOTTOMRIGHT] =
st_theme_node_lookup_corner (node, width, height, resource_scale, ST_CORNER_BOTTOMRIGHT);
state->corner_material[ST_CORNER_BOTTOMLEFT] =
st_theme_node_lookup_corner (node, width, height, resource_scale, ST_CORNER_BOTTOMLEFT);
/* Use cairo to prerender the node if there is a gradient, or
* background image with borders and/or rounded corners,
* or large corners, since we can't do those things
* easily with cogl.
*
* FIXME: if we could figure out ahead of time that a
* background image won't overlap with the node borders,
* then we could use cogl for that case.
*/
if ((node->background_gradient_type != ST_GRADIENT_NONE)
|| (has_inset_box_shadow && (has_border || node->background_color.alpha > 0))
|| (st_theme_node_get_background_image (node) && (has_border || has_border_radius))
|| has_large_corners)
state->prerendered_texture = st_theme_node_prerender_background (node, width, height,
resource_scale);
if (state->prerendered_texture)
state->prerendered_pipeline = _st_create_texture_pipeline (state->prerendered_texture);
else
state->prerendered_pipeline = NULL;
st_theme_node_maybe_prerender_background (state, node, width, height, resource_scale);
if (box_shadow_spec && !has_inset_box_shadow)
{
@ -1616,14 +1634,12 @@ st_theme_node_update_resources (StThemeNodePaintState *state,
float height,
float resource_scale)
{
gboolean had_prerendered_texture = FALSE;
gboolean had_box_shadow = FALSE;
StShadow *box_shadow_spec;
g_return_if_fail (width > 0 && height > 0);
/* Free handles we can't reuse */
had_prerendered_texture = (state->prerendered_texture != NULL);
cogl_clear_object (&state->prerendered_texture);
if (state->prerendered_pipeline != NULL)
@ -1645,20 +1661,7 @@ st_theme_node_update_resources (StThemeNodePaintState *state,
box_shadow_spec = st_theme_node_get_box_shadow (node);
if (had_prerendered_texture)
{
state->prerendered_texture = st_theme_node_prerender_background (node, width, height, resource_scale);
state->prerendered_pipeline = _st_create_texture_pipeline (state->prerendered_texture);
}
else
{
int corner_id;
for (corner_id = 0; corner_id < 4; corner_id++)
if (state->corner_material[corner_id] == NULL)
state->corner_material[corner_id] =
st_theme_node_lookup_corner (node, width, height, resource_scale, corner_id);
}
st_theme_node_maybe_prerender_background (state, node, width, height, resource_scale);
if (had_box_shadow)
state->box_shadow_pipeline = _st_create_shadow_pipeline (box_shadow_spec,

View file

@ -1,6 +1,10 @@
metainfo = app_id + '.metainfo.xml'
i18n.merge_file(
input: base_id + '.metainfo.xml.in',
input: configure_file(
input: base_id + '.metainfo.xml.in',
output: app_id + '.metainfo.xml.in',
configuration: {'app_id': app_id},
),
output: metainfo,
po_dir: po_dir,
install: true,

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>org.gnome.Extensions</id>
<id>@app_id@</id>
<name>Extensions</name>
<summary>Manage your GNOME Extensions</summary>
@ -16,7 +16,7 @@
<project_group>GNOME</project_group>
<developer_name>The GNOME Project</developer_name>
<launchable type="desktop-id">org.gnome.Extensions.desktop</launchable>
<launchable type="desktop-id">@app_id@.desktop</launchable>
<kudos>
<kudo>HiDpiIcon</kudo>

@ -1 +0,0 @@
Subproject commit 91f3f41490666a526ed78af744507d7ee1134323

6
subprojects/gvc.wrap Normal file
View file

@ -0,0 +1,6 @@
[wrap-git]
directory=gvc
url=https://gitlab.gnome.org/GNOME/libgnome-volume-control.git
push-url=ssh://git@gitlab.gnome.org:GNOME/libgnome-volume-control.git
revision=5f9768a2eac29c1ed56f1fbb449a77a3523683b6
depth=1