diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7f7fda382..d6f5e962e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -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' diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index bb57dfc6c..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "subprojects/gvc"] - path = subprojects/gvc - url = ../../GNOME/libgnome-volume-control.git diff --git a/js/gdm/util.js b/js/gdm/util.js index 89ad54497..20ae4ca18 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -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); diff --git a/js/portalHelper/main.js b/js/portalHelper/main.js index 1716dc979..1a5c644dc 100644 --- a/js/portalHelper/main.js +++ b/js/portalHelper/main.js @@ -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); diff --git a/js/ui/barLevel.js b/js/ui/barLevel.js index aea1cb503..583e7b17b 100644 --- a/js/ui/barLevel.js +++ b/js/ui/barLevel.js @@ -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() { diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js index 73a9ed9f6..22a93df0b 100644 --- a/js/ui/messageTray.js +++ b/js/ui/messageTray.js @@ -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(); } }); diff --git a/js/ui/workspace.js b/js/ui/workspace.js index 4787cdf0e..09fe3abdb 100644 --- a/js/ui/workspace.js +++ b/js/ui/workspace.js @@ -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)) diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js index 5d58542f9..fbf6fc352 100644 --- a/js/ui/workspacesView.js +++ b/js/ui/workspacesView.js @@ -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() { diff --git a/meson.build b/meson.build index bb162d718..9f94e3f25 100644 --- a/meson.build +++ b/meson.build @@ -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) diff --git a/src/meson.build b/src/meson.build index 070312bd0..9160f58c6 100644 --- a/src/meson.build +++ b/src/meson.build @@ -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 diff --git a/src/shell-camera-monitor.c b/src/shell-camera-monitor.c index 1e2e0f145..b2e6e0b2a 100644 --- a/src/shell-camera-monitor.c +++ b/src/shell-camera-monitor.c @@ -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); } diff --git a/src/st/st-scroll-view-fade.c b/src/st/st-scroll-view-fade.c index 77b1d0b12..5f8d4068c 100644 --- a/src/st/st-scroll-view-fade.c +++ b/src/st/st-scroll-view-fade.c @@ -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; /** diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c index 72745ed66..124a34693 100644 --- a/src/st/st-theme-node-drawing.c +++ b/src/st/st-theme-node-drawing.c @@ -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, diff --git a/subprojects/extensions-app/data/metainfo/meson.build b/subprojects/extensions-app/data/metainfo/meson.build index a19bfa80a..f7b0a64ed 100644 --- a/subprojects/extensions-app/data/metainfo/meson.build +++ b/subprojects/extensions-app/data/metainfo/meson.build @@ -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, diff --git a/subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in b/subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in index 1a3f8799c..01970ebad 100644 --- a/subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in +++ b/subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in @@ -1,6 +1,6 @@ - org.gnome.Extensions + @app_id@ Extensions Manage your GNOME Extensions @@ -16,7 +16,7 @@ GNOME The GNOME Project - org.gnome.Extensions.desktop + @app_id@.desktop HiDpiIcon diff --git a/subprojects/gvc b/subprojects/gvc deleted file mode 160000 index 91f3f4149..000000000 --- a/subprojects/gvc +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 91f3f41490666a526ed78af744507d7ee1134323 diff --git a/subprojects/gvc.wrap b/subprojects/gvc.wrap new file mode 100644 index 000000000..0ad1575d2 --- /dev/null +++ b/subprojects/gvc.wrap @@ -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