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: include:
- remote: 'https://gitlab.gnome.org/GNOME/citemplates/raw/HEAD/flatpak/flatpak_ci_initiative.yml' - 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/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' - project: 'Infrastructure/openshift-images/gnome-release-service'
file: '/ci-templates/release-module.yml' file: '/ci-templates/release-module.yml'
@ -42,7 +42,7 @@ workflow:
- if: '$CI_COMMIT_TAG' - if: '$CI_COMMIT_TAG'
- if: '$CI_COMMIT_BRANCH' - if: '$CI_COMMIT_BRANCH'
.pipeline_guard: &pipeline_guard .pipeline-guard:
rules: rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- if: '$CI_COMMIT_TAG' - if: '$CI_COMMIT_TAG'
@ -95,7 +95,8 @@ check_commit_log:
else else
echo "Not a merge request" ; echo "Not a merge request" ;
fi fi
<<: *pipeline_guard rules:
- !reference [.pipeline-guard, rules]
artifacts: artifacts:
expire_in: 1 week expire_in: 1 week
paths: paths:
@ -114,7 +115,8 @@ check-merge-request:
else else
echo "Not a merge request" ; echo "Not a merge request" ;
fi fi
<<: *pipeline_guard rules:
- !reference [.pipeline-guard, rules]
artifacts: artifacts:
expire_in: 1 week expire_in: 1 week
paths: paths:
@ -174,8 +176,6 @@ potfile_js_check:
build: build:
stage: build stage: build
needs: ["check_commit_log"] needs: ["check_commit_log"]
variables:
GIT_SUBMODULE_STRATEGY: normal
before_script: before_script:
- .gitlab-ci/checkout-mutter.sh - .gitlab-ci/checkout-mutter.sh
- meson mutter mutter/build --prefix=/usr - meson mutter mutter/build --prefix=/usr
@ -189,12 +189,12 @@ build:
paths: paths:
- mutter - mutter
- build - build
- subprojects/gvc
test: test:
stage: test stage: test
needs: ["build"] needs: ["build"]
variables: variables:
GIT_SUBMODULE_STRATEGY: normal
XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir" XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
NO_AT_BRIDGE: "1" NO_AT_BRIDGE: "1"
before_script: before_script:
@ -218,8 +218,6 @@ test-coverity:
needs: ["build"] needs: ["build"]
stage: analyze stage: analyze
allow_failure: true allow_failure: true
variables:
GIT_SUBMODULE_STRATEGY: normal
before_script: before_script:
- sudo meson install -C mutter/build - sudo meson install -C mutter/build
script: script:
@ -261,9 +259,6 @@ distinfo:
reports: reports:
dotenv: dist.env dotenv: dist.env
paths: paths:
- build
- mutter
- subprojects/jasmine-gjs
- dist.env - dist.env
rules: rules:
- if: '$CI_COMMIT_TAG' - if: '$CI_COMMIT_TAG'
@ -272,7 +267,6 @@ dist:
variables: variables:
XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir" XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
NO_AT_BRIDGE: "1" NO_AT_BRIDGE: "1"
GIT_SUBMODULE_STRATEGY: normal
stage: deploy stage: deploy
needs: ["build"] needs: ["build"]
before_script: before_script:
@ -289,6 +283,7 @@ dist:
dist-tarball: dist-tarball:
extends: dist extends: dist
needs: needs:
- build
- distinfo - distinfo
artifacts: artifacts:
expose_as: 'Get tarball here' 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'); 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'); this.emit('verification-complete');
} }
@ -740,10 +747,10 @@ export class ShellUserVerifier extends Signals.EventEmitter {
// If the login failed with the preauthenticated oVirt credentials // If the login failed with the preauthenticated oVirt credentials
// then discard the credentials and revert to default authentication // then discard the credentials and revert to default authentication
// mechanism. // mechanism.
let foregroundService = Object.keys(this._credentialManagers).find(service => const isCredentialManager = !!this._credentialManagers[serviceName];
this.serviceIsForeground(service)); const isForeground = this.serviceIsForeground(serviceName);
if (foregroundService) { if (isCredentialManager && isForeground) {
this._credentialManagers[foregroundService].token = null; this._credentialManagers[serviceName].token = null;
this._preemptingService = null; this._preemptingService = null;
this._verificationFailed(serviceName, false); this._verificationFailed(serviceName, false);
return; return;
@ -757,7 +764,7 @@ export class ShellUserVerifier extends Signals.EventEmitter {
// if the password service fails, then cancel everything. // if the password service fails, then cancel everything.
// But if, e.g., fingerprint fails, still give // But if, e.g., fingerprint fails, still give
// password authentication a chance to succeed // password authentication a chance to succeed
if (this.serviceIsForeground(serviceName)) if (isForeground)
this._failCounter++; this._failCounter++;
this._verificationFailed(serviceName, true); this._verificationFailed(serviceName, true);

View file

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

View file

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

View file

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

View file

@ -1089,16 +1089,11 @@ class Workspace extends St.Widget {
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
this._skipTaskbarSignals = new Map(); 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 = []; this._windows = [];
for (let i = 0; i < windows.length; i++) { this._layoutFrozenId = 0;
if (this._isOverviewWindow(windows[i]))
this._addWindowClone(windows[i]); // DND requires this to be set
} this._delegate = this;
// Track window changes, but let the window tracker process them first // Track window changes, but let the window tracker process them first
this.metaWorkspace?.connectObject( this.metaWorkspace?.connectObject(
@ -1109,10 +1104,10 @@ class Workspace extends St.Widget {
'window-entered-monitor', this._windowEnteredMonitor.bind(this), GObject.ConnectFlags.AFTER, 'window-entered-monitor', this._windowEnteredMonitor.bind(this), GObject.ConnectFlags.AFTER,
'window-left-monitor', this._windowLeftMonitor.bind(this), GObject.ConnectFlags.AFTER, 'window-left-monitor', this._windowLeftMonitor.bind(this), GObject.ConnectFlags.AFTER,
this); this);
this._layoutFrozenId = 0;
// DND requires this to be set // Create clones for windows that should be
this._delegate = this; // visible in the Overview
global.get_window_actors().map(a => this._doAddWindow(a.meta_window));
} }
_shouldLeaveOverview() { _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 // We might have the window in our list already if it was on all workspaces and
// now was moved to this workspace // now was moved to this workspace
if (this._lookupIndex(metaWin) !== -1) if (this.containsMetaWindow(metaWin))
return; return;
if (!this._isMyWindow(metaWin)) 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() { _updateWorkspaces() {
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
let newNumWorkspaces = workspaceManager.n_workspaces; let newNumWorkspaces = workspaceManager.n_workspaces;
@ -472,10 +477,12 @@ class WorkspacesView extends WorkspacesViewBase {
this._updateWorkspacesState(); this._updateWorkspacesState();
this._updateVisibility(); this._updateVisibility();
this._raiseActiveWorkspace();
} }
_activeWorkspaceChanged(_wm, _from, _to, _direction) { _activeWorkspaceChanged(_wm, _from, _to, _direction) {
this._scrollToActive(); this._scrollToActive();
this._raiseActiveWorkspace();
} }
_onDestroy() { _onDestroy() {

View file

@ -29,7 +29,6 @@ gtk_req = '>= 4.0'
mutter_req = '>= 45.0' mutter_req = '>= 45.0'
polkit_req = '>= 0.100' polkit_req = '>= 0.100'
schemas_req = '>= 42.beta' schemas_req = '>= 42.beta'
startup_req = '>= 0.11'
systemd_req = '>= 246' systemd_req = '>= 246'
ibus_req = '>= 1.5.19' ibus_req = '>= 1.5.19'
gnome_desktop_req = '>= 40' 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) ecal_dep = dependency('libecal-2.0', version: ecal_req)
eds_dep = dependency('libedataserver-1.2', version: eds_req) eds_dep = dependency('libedataserver-1.2', version: eds_req)
gcr_dep = dependency('gcr-4', version: gcr_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') gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0')
gi_dep = dependency('gobject-introspection-1.0', version: gi_req) gi_dep = dependency('gobject-introspection-1.0', version: gi_req)
gio_dep = dependency('gio-2.0', version: gio_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) cogl_pango_dep = dependency(cogl_pango_pc, version: mutter_req)
mutter_dep = dependency(libmutter_pc, version: mutter_req) mutter_dep = dependency(libmutter_pc, version: mutter_req)
polkit_dep = dependency('polkit-agent-1', version: polkit_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) ibus_dep = dependency('ibus-1.0', version: ibus_req)
x11_dep = dependency('x11') x11_dep = dependency('x11')
schemas_dep = dependency('gsettings-desktop-schemas', version: schemas_req) schemas_dep = dependency('gsettings-desktop-schemas', version: schemas_req)

View file

@ -60,12 +60,12 @@ gnome_shell_deps = [
mtk_dep, mtk_dep,
clutter_dep, clutter_dep,
cogl_pango_dep, cogl_pango_dep,
startup_dep,
gi_dep, gi_dep,
polkit_dep, polkit_dep,
gcr_dep, gcr_dep,
libsystemd_dep, libsystemd_dep,
libpipewire_dep, libpipewire_dep,
x11_dep,
] ]
gnome_shell_deps += nm_deps 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); g_clear_handle_id (&monitor->delayed_disable_id, g_source_remove);
spa_hook_remove (&monitor->registry_listener); 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); spa_hook_remove (&monitor->core_listener);
g_clear_pointer (&monitor->core, pw_core_disconnect); g_clear_pointer (&monitor->core, pw_core_disconnect);
} }

View file

@ -66,24 +66,12 @@ enum {
static GParamSpec *props[N_PROPS] = { NULL, }; 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 * static char *
st_scroll_view_fade_get_static_shader_source (ClutterShaderEffect *effect) st_scroll_view_fade_get_static_shader_source (ClutterShaderEffect *effect)
{ {
return g_strdup (st_scroll_view_fade_glsl); return g_strdup (st_scroll_view_fade_glsl);
} }
static void static void
st_scroll_view_fade_paint_target (ClutterOffscreenEffect *effect, st_scroll_view_fade_paint_target (ClutterOffscreenEffect *effect,
ClutterPaintNode *node, 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; shader_class->get_static_shader_source = st_scroll_view_fade_get_static_shader_source;
offscreen_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass); 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; 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; 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, static void st_theme_node_paint_borders (StThemeNodePaintState *state,
CoglFramebuffer *framebuffer, CoglFramebuffer *framebuffer,
const ClutterActorBox *box, const ClutterActorBox *box,
@ -1487,10 +1573,7 @@ st_theme_node_render_resources (StThemeNodePaintState *state,
float height, float height,
float resource_scale) float resource_scale)
{ {
gboolean has_border;
gboolean has_border_radius;
gboolean has_inset_box_shadow; gboolean has_inset_box_shadow;
gboolean has_large_corners;
StShadow *box_shadow_spec; StShadow *box_shadow_spec;
g_return_if_fail (width > 0 && height > 0); 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); box_shadow_spec = st_theme_node_get_box_shadow (node);
has_inset_box_shadow = box_shadow_spec && box_shadow_spec->inset; has_inset_box_shadow = box_shadow_spec && box_shadow_spec->inset;
if (node->border_width[ST_SIDE_TOP] > 0 || st_theme_node_maybe_prerender_background (state, node, width, height, resource_scale);
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;
if (box_shadow_spec && !has_inset_box_shadow) if (box_shadow_spec && !has_inset_box_shadow)
{ {
@ -1616,14 +1634,12 @@ st_theme_node_update_resources (StThemeNodePaintState *state,
float height, float height,
float resource_scale) float resource_scale)
{ {
gboolean had_prerendered_texture = FALSE;
gboolean had_box_shadow = FALSE; gboolean had_box_shadow = FALSE;
StShadow *box_shadow_spec; StShadow *box_shadow_spec;
g_return_if_fail (width > 0 && height > 0); g_return_if_fail (width > 0 && height > 0);
/* Free handles we can't reuse */ /* Free handles we can't reuse */
had_prerendered_texture = (state->prerendered_texture != NULL);
cogl_clear_object (&state->prerendered_texture); cogl_clear_object (&state->prerendered_texture);
if (state->prerendered_pipeline != NULL) 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); box_shadow_spec = st_theme_node_get_box_shadow (node);
if (had_prerendered_texture) st_theme_node_maybe_prerender_background (state, node, width, height, resource_scale);
{
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);
}
if (had_box_shadow) if (had_box_shadow)
state->box_shadow_pipeline = _st_create_shadow_pipeline (box_shadow_spec, state->box_shadow_pipeline = _st_create_shadow_pipeline (box_shadow_spec,

View file

@ -1,6 +1,10 @@
metainfo = app_id + '.metainfo.xml' metainfo = app_id + '.metainfo.xml'
i18n.merge_file( 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, output: metainfo,
po_dir: po_dir, po_dir: po_dir,
install: true, install: true,

View file

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