diff --git a/2871.patch b/2871.patch new file mode 100644 index 0000000..a1b15b9 --- /dev/null +++ b/2871.patch @@ -0,0 +1,79 @@ +From 854191c2444cdc90e92bcb6684893148dd007798 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Tue, 8 Aug 2023 16:08:36 +0200 +Subject: [PATCH 1/2] st: Handle emulated scroll events through the + ClutterEventFlag + +Emulated scroll events no longer get clutter_event_is_pointer_emulated() +set to TRUE, instead this information is propagated through the +ClutterEventFlags of the event. + +Part-of: +--- + src/st/st-scroll-bar.c | 3 ++- + src/st/st-scroll-view.c | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/src/st/st-scroll-bar.c b/src/st/st-scroll-bar.c +index d5d5264943..e2c09203e1 100644 +--- a/src/st/st-scroll-bar.c ++++ b/src/st/st-scroll-bar.c +@@ -469,7 +469,8 @@ st_scroll_bar_scroll_event (ClutterActor *actor, + ClutterTextDirection direction; + ClutterScrollDirection scroll_dir; + +- if (clutter_event_is_pointer_emulated ((ClutterEvent *) event)) ++ if (!!(clutter_event_get_flags ((ClutterEvent *) event) & ++ CLUTTER_EVENT_FLAG_POINTER_EMULATED)) + return TRUE; + + direction = clutter_actor_get_text_direction (actor); +diff --git a/src/st/st-scroll-view.c b/src/st/st-scroll-view.c +index 9f667e5459..764065b606 100644 +--- a/src/st/st-scroll-view.c ++++ b/src/st/st-scroll-view.c +@@ -770,7 +770,8 @@ st_scroll_view_scroll_event (ClutterActor *self, + if (!priv->mouse_scroll) + return FALSE; + +- if (clutter_event_is_pointer_emulated ((ClutterEvent *) event)) ++ if (!!(clutter_event_get_flags ((ClutterEvent *) event) & ++ CLUTTER_EVENT_FLAG_POINTER_EMULATED)) + return TRUE; + + direction = clutter_actor_get_text_direction (self); +-- +GitLab + + +From c9741ae3d5f661b2aee352c50ce21fab16694fbe Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Tue, 8 Aug 2023 16:10:39 +0200 +Subject: [PATCH 2/2] ui/slider: Handle emulated scroll events through the + Clutter.EventFlags + +Emulated scroll events no longer get event.is_pointer_emulated() set to +True, instead this information is propagated through the Clutter.EventFlags +of the event. + +Part-of: +--- + js/ui/slider.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/js/ui/slider.js b/js/ui/slider.js +index 6653898b0c..4f60556aea 100644 +--- a/js/ui/slider.js ++++ b/js/ui/slider.js +@@ -140,7 +140,7 @@ export const Slider = GObject.registerClass({ + let direction = event.get_scroll_direction(); + let delta; + +- if (event.is_pointer_emulated()) ++ if (event.get_flags() & Clutter.EventFlags.POINTER_EMULATED) + return Clutter.EVENT_PROPAGATE; + + if (direction == Clutter.ScrollDirection.DOWN) { +-- +GitLab + diff --git a/2872.patch b/2872.patch new file mode 100644 index 0000000..811aa63 --- /dev/null +++ b/2872.patch @@ -0,0 +1,1339 @@ +From 8423ba44feddcf06404e10806e910dfba22f26d9 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Tue, 8 Aug 2023 18:14:04 +0200 +Subject: [PATCH 1/3] js: Mass move to Clutter.Event getter methods in + Clutter.Actor vfuncs + +These traditionally got the various ClutterEvent subtype structs as their +argument, so it was not allowed to use ClutterEvent generic getter methods +in these vfuncs. These methods used direct access to struct fields instead. + +This got spoiled with the move to make ClutterEvent opaque types, since +these are no longer public structs so GNOME Shell most silently failed to +fetch the expected values from event fields. But since they are not +ClutterEvents either, the getters could not be used on them. + +Mutter is changing so that these vmethods all contain an alias to the +one and only Clutter.Event type, thus lifting those barriers, and making +it possible to use the ClutterEvent methods in these vfuncs. + +Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2950 +Part-of: +--- + js/gdm/authPrompt.js | 6 ++-- + js/ui/appDisplay.js | 23 +++++++------ + js/ui/ibusCandidatePopup.js | 4 +-- + js/ui/layout.js | 4 +-- + js/ui/lookingGlass.js | 14 ++++---- + js/ui/messageList.js | 24 ++++++------- + js/ui/panel.js | 12 +++---- + js/ui/popupMenu.js | 14 ++++---- + js/ui/runDialog.js | 2 +- + js/ui/screenshot.js | 66 ++++++++++++++++++++---------------- + js/ui/shellMountOperation.js | 4 +-- + js/ui/slider.js | 6 ++-- + js/ui/switcherPopup.js | 16 ++++----- + js/ui/unlockDialog.js | 6 ++-- + js/ui/windowPreview.js | 20 +++++------ + 15 files changed, 114 insertions(+), 107 deletions(-) + +diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js +index 71917346d67..dd31fb07a50 100644 +--- a/js/gdm/authPrompt.js ++++ b/js/gdm/authPrompt.js +@@ -133,10 +133,10 @@ export const AuthPrompt = GObject.registerClass({ + this._userVerifier = null; + } + +- vfunc_key_press_event(keyPressEvent) { +- if (keyPressEvent.keyval == Clutter.KEY_Escape) ++ vfunc_key_press_event(event) { ++ if (event.get_key_symbol() === Clutter.KEY_Escape) + this.cancel(); +- return super.vfunc_key_press_event(keyPressEvent); ++ return super.vfunc_key_press_event(event); + } + + _initInputRow() { +diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js +index 88673b0a54e..6a63355a933 100644 +--- a/js/ui/appDisplay.js ++++ b/js/ui/appDisplay.js +@@ -2805,7 +2805,7 @@ export const AppFolderDialog = GObject.registerClass({ + this._zoomAndFadeIn(); + } + +- vfunc_key_press_event(keyEvent) { ++ vfunc_key_press_event(event) { + if (global.stage.get_key_focus() != this) + return Clutter.EVENT_PROPAGATE; + +@@ -2828,7 +2828,7 @@ export const AppFolderDialog = GObject.registerClass({ + // languages + let direction; + let isLtr = Clutter.get_default_text_direction() == Clutter.TextDirection.LTR; +- switch (keyEvent.keyval) { ++ switch (event.get_key_symbol()) { + case Clutter.KEY_Down: + direction = St.DirectionType.TAB_FORWARD; + break; +@@ -3078,28 +3078,29 @@ export const AppIcon = GObject.registerClass({ + GLib.Source.set_name_by_id(this._menuTimeoutId, '[gnome-shell] this.popupMenu'); + } + +- vfunc_leave_event(crossingEvent) { +- const ret = super.vfunc_leave_event(crossingEvent); ++ vfunc_leave_event(event) { ++ const ret = super.vfunc_leave_event(event); + + this.fake_release(); + this._removeMenuTimeout(); + return ret; + } + +- vfunc_button_press_event(buttonEvent) { +- const ret = super.vfunc_button_press_event(buttonEvent); +- if (buttonEvent.button == 1) { ++ vfunc_button_press_event(event) { ++ const ret = super.vfunc_button_press_event(event); ++ const button = event.get_button(); ++ if (button === 1) { + this._setPopupTimeout(); +- } else if (buttonEvent.button == 3) { ++ } else if (button === 3) { + this.popupMenu(); + return Clutter.EVENT_STOP; + } + return ret; + } + +- vfunc_touch_event(touchEvent) { +- const ret = super.vfunc_touch_event(touchEvent); +- if (touchEvent.type == Clutter.EventType.TOUCH_BEGIN) ++ vfunc_touch_event(event) { ++ const ret = super.vfunc_touch_event(event); ++ if (event.type() === Clutter.EventType.TOUCH_BEGIN) + this._setPopupTimeout(); + + return ret; +diff --git a/js/ui/ibusCandidatePopup.js b/js/ui/ibusCandidatePopup.js +index 785e1d1521c..0b853a894e0 100644 +--- a/js/ui/ibusCandidatePopup.js ++++ b/js/ui/ibusCandidatePopup.js +@@ -82,8 +82,8 @@ const CandidateArea = GObject.registerClass({ + this._cursorPosition = 0; + } + +- vfunc_scroll_event(scrollEvent) { +- switch (scrollEvent.direction) { ++ vfunc_scroll_event(event) { ++ switch (event.get_scroll_direction()) { + case Clutter.ScrollDirection.UP: + this.emit('cursor-up'); + break; +diff --git a/js/ui/layout.js b/js/ui/layout.js +index f7aa47d7c1e..6150e40648c 100644 +--- a/js/ui/layout.js ++++ b/js/ui/layout.js +@@ -1291,8 +1291,8 @@ class HotCorner extends Clutter.Actor { + return Clutter.EVENT_STOP; + } + +- vfunc_leave_event(crossingEvent) { +- if (crossingEvent.related != this._corner) ++ vfunc_leave_event(event) { ++ if (event.get_related() !== this._corner) + this._entered = false; + return Clutter.EVENT_PROPAGATE; + } +diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js +index 8c1696c79a6..2b1cc072156 100644 +--- a/js/ui/lookingGlass.js ++++ b/js/ui/lookingGlass.js +@@ -502,13 +502,13 @@ class ObjInspector extends St.ScrollView { + this._obj = null; + } + +- vfunc_key_press_event(keyPressEvent) { +- const symbol = keyPressEvent.keyval; ++ vfunc_key_press_event(event) { ++ const symbol = event.get_key_symbol(); + if (symbol === Clutter.KEY_Escape) { + this.close(); + return Clutter.EVENT_STOP; + } +- return super.vfunc_key_press_event(keyPressEvent); ++ return super.vfunc_key_press_event(event); + } + + _onInsert() { +@@ -1604,20 +1604,20 @@ class LookingGlass extends St.BoxLayout { + } + + // Handle key events which are relevant for all tabs of the LookingGlass +- vfunc_key_press_event(keyPressEvent) { +- let symbol = keyPressEvent.keyval; ++ vfunc_key_press_event(event) { ++ let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_Escape) { + this.close(); + return Clutter.EVENT_STOP; + } + // Ctrl+PgUp and Ctrl+PgDown switches tabs in the notebook view +- if (keyPressEvent.modifier_state & Clutter.ModifierType.CONTROL_MASK) { ++ if (event.get_state() & Clutter.ModifierType.CONTROL_MASK) { + if (symbol == Clutter.KEY_Page_Up) + this._notebook.prevTab(); + else if (symbol == Clutter.KEY_Page_Down) + this._notebook.nextTab(); + } +- return super.vfunc_key_press_event(keyPressEvent); ++ return super.vfunc_key_press_event(event); + } + + open() { +diff --git a/js/ui/messageList.js b/js/ui/messageList.js +index 1570676160f..cb6e185c71e 100644 +--- a/js/ui/messageList.js ++++ b/js/ui/messageList.js +@@ -69,7 +69,7 @@ class URLHighlighter extends St.Label { + this.setMarkup(text, allowMarkup); + } + +- vfunc_button_press_event(buttonEvent) { ++ vfunc_button_press_event(event) { + // Don't try to URL highlight when invisible. + // The MessageTray doesn't actually hide us, so + // we need to check for paint opacities as well. +@@ -79,14 +79,14 @@ class URLHighlighter extends St.Label { + // Keep Notification from seeing this and taking + // a pointer grab, which would block our button-release-event + // handler, if an URL is clicked +- return this._findUrlAtPos(buttonEvent) != -1; ++ return this._findUrlAtPos(event) !== -1; + } + +- vfunc_button_release_event(buttonEvent) { ++ vfunc_button_release_event(event) { + if (!this.visible || this.get_paint_opacity() == 0) + return Clutter.EVENT_PROPAGATE; + +- let urlId = this._findUrlAtPos(buttonEvent); ++ const urlId = this._findUrlAtPos(event); + if (urlId != -1) { + let url = this._urls[urlId].url; + if (!url.includes(':')) +@@ -99,11 +99,11 @@ class URLHighlighter extends St.Label { + return Clutter.EVENT_PROPAGATE; + } + +- vfunc_motion_event(motionEvent) { ++ vfunc_motion_event(event) { + if (!this.visible || this.get_paint_opacity() == 0) + return Clutter.EVENT_PROPAGATE; + +- let urlId = this._findUrlAtPos(motionEvent); ++ const urlId = this._findUrlAtPos(event); + if (urlId != -1 && !this._cursorChanged) { + global.display.set_cursor(Meta.Cursor.POINTING_HAND); + this._cursorChanged = true; +@@ -114,7 +114,7 @@ class URLHighlighter extends St.Label { + return Clutter.EVENT_PROPAGATE; + } + +- vfunc_leave_event(crossingEvent) { ++ vfunc_leave_event(event) { + if (!this.visible || this.get_paint_opacity() == 0) + return Clutter.EVENT_PROPAGATE; + +@@ -122,7 +122,7 @@ class URLHighlighter extends St.Label { + this._cursorChanged = false; + global.display.set_cursor(Meta.Cursor.DEFAULT); + } +- return super.vfunc_leave_event(crossingEvent); ++ return super.vfunc_leave_event(event); + } + + setMarkup(text, allowMarkup) { +@@ -151,7 +151,7 @@ class URLHighlighter extends St.Label { + } + + _findUrlAtPos(event) { +- let { x, y } = event; ++ let [x, y] = event.get_coords(); + [, x, y] = this.transform_stage_point(x, y); + let findPos = -1; + for (let i = 0; i < this.clutter_text.text.length; i++) { +@@ -541,8 +541,8 @@ export const Message = GObject.registerClass({ + _onDestroy() { + } + +- vfunc_key_press_event(keyEvent) { +- let keysym = keyEvent.keyval; ++ vfunc_key_press_event(event) { ++ let keysym = event.get_key_symbol(); + + if (keysym == Clutter.KEY_Delete || + keysym == Clutter.KEY_KP_Delete) { +@@ -551,7 +551,7 @@ export const Message = GObject.registerClass({ + return Clutter.EVENT_STOP; + } + } +- return super.vfunc_key_press_event(keyEvent); ++ return super.vfunc_key_press_event(event); + } + }); + +diff --git a/js/ui/panel.js b/js/ui/panel.js +index f65657e7bfb..6b1b63eb15e 100644 +--- a/js/ui/panel.js ++++ b/js/ui/panel.js +@@ -310,8 +310,8 @@ class ActivitiesButton extends PanelMenu.Button { + return Clutter.EVENT_PROPAGATE; + } + +- vfunc_key_release_event(keyEvent) { +- let symbol = keyEvent.keyval; ++ vfunc_key_release_event(event) { ++ let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_Return || symbol == Clutter.KEY_space) { + if (Main.overview.shouldToggleByCornerOrButton()) { + Main.overview.toggle(); +@@ -609,14 +609,14 @@ class Panel extends St.Widget { + return this._tryDragWindow(event); + } + +- vfunc_key_press_event(keyEvent) { +- let symbol = keyEvent.keyval; ++ vfunc_key_press_event(event) { ++ let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_Escape) { +- global.display.focus_default_window(keyEvent.time); ++ global.display.focus_default_window(event.get_time()); + return Clutter.EVENT_STOP; + } + +- return super.vfunc_key_press_event(keyEvent); ++ return super.vfunc_key_press_event(event); + } + + _toggleMenu(indicator) { +diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js +index fe547f416f2..f22e04c21cf 100644 +--- a/js/ui/popupMenu.js ++++ b/js/ui/popupMenu.js +@@ -142,14 +142,14 @@ export const PopupBaseMenuItem = GObject.registerClass({ + this._parent = parent; + } + +- vfunc_key_press_event(keyEvent) { ++ vfunc_key_press_event(event) { + if (global.focus_manager.navigate_from_event(Clutter.get_current_event())) + return Clutter.EVENT_STOP; + + if (!this._activatable) +- return super.vfunc_key_press_event(keyEvent); ++ return super.vfunc_key_press_event(event); + +- let state = keyEvent.modifier_state; ++ let state = event.get_state(); + + // if user has a modifier down (except capslock and numlock) + // then don't handle the key press here +@@ -160,7 +160,7 @@ export const PopupBaseMenuItem = GObject.registerClass({ + if (state) + return Clutter.EVENT_PROPAGATE; + +- let symbol = keyEvent.keyval; ++ let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { + this.activate(Clutter.get_current_event()); + return Clutter.EVENT_STOP; +@@ -1244,8 +1244,8 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem { + return this.menu.isOpen; + } + +- vfunc_key_press_event(keyPressEvent) { +- let symbol = keyPressEvent.keyval; ++ vfunc_key_press_event(event) { ++ let symbol = event.get_key_symbol(); + + if (symbol == Clutter.KEY_Right) { + this._setOpenState(true); +@@ -1256,7 +1256,7 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem { + return Clutter.EVENT_STOP; + } + +- return super.vfunc_key_press_event(keyPressEvent); ++ return super.vfunc_key_press_event(event); + } + + activate(_event) { +diff --git a/js/ui/runDialog.js b/js/ui/runDialog.js +index 2b4ea3d3357..5e242b6554d 100644 +--- a/js/ui/runDialog.js ++++ b/js/ui/runDialog.js +@@ -123,7 +123,7 @@ class RunDialog extends ModalDialog.ModalDialog { + } + + vfunc_key_release_event(event) { +- if (event.keyval === Clutter.KEY_Escape) { ++ if (event.get_key_symbol() === Clutter.KEY_Escape) { + this.close(); + return Clutter.EVENT_STOP; + } +diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js +index 42e356846e3..829c28ee57d 100644 +--- a/js/ui/screenshot.js ++++ b/js/ui/screenshot.js +@@ -430,19 +430,20 @@ const UIAreaSelector = GObject.registerClass({ + if (this._dragButton) + return Clutter.EVENT_PROPAGATE; + +- const cursor = this._computeCursorType(event.x, event.y); ++ const [x, y] = event.get_coords(); ++ const cursor = this._computeCursorType(x, y); + + // Clicking outside of the selection, or using the right mouse button, + // or with Ctrl results in dragging a new selection from scratch. + if (cursor === Meta.Cursor.CROSSHAIR || + button === Clutter.BUTTON_SECONDARY || +- (event.modifier_state & Clutter.ModifierType.CONTROL_MASK)) { ++ (event.get_state() & Clutter.ModifierType.CONTROL_MASK)) { + this._dragButton = button; + + this._dragCursor = Meta.Cursor.CROSSHAIR; + global.display.set_cursor(Meta.Cursor.CROSSHAIR); + +- [this._startX, this._startY] = [event.x, event.y]; ++ [this._startX, this._startY] = event.get_coords(); + this._lastX = this._startX = Math.floor(this._startX); + this._lastY = this._startY = Math.floor(this._startY); + +@@ -452,8 +453,7 @@ const UIAreaSelector = GObject.registerClass({ + this._dragButton = button; + + this._dragCursor = cursor; +- this._dragStartX = event.x; +- this._dragStartY = event.y; ++ [this._dragStartX, this._dragStartY] = event.get_coords(); + + const [leftX, topY, width, height] = this.getGeometry(); + const rightX = leftX + width - 1; +@@ -517,14 +517,16 @@ const UIAreaSelector = GObject.registerClass({ + + // We might have finished creating a new selection, so we need to + // update the cursor. +- this._updateCursor(event.x, event.y); ++ const [x, y] = event.get_coords(); ++ this._updateCursor(x, y); + + return Clutter.EVENT_STOP; + } + + _onMotion(event, sequence) { + if (!this._dragButton) { +- this._updateCursor(event.x, event.y); ++ const [x, y] = event.get_coords(); ++ this._updateCursor(x, y); + return Clutter.EVENT_PROPAGATE; + } + +@@ -532,12 +534,13 @@ const UIAreaSelector = GObject.registerClass({ + return Clutter.EVENT_PROPAGATE; + + if (this._dragCursor === Meta.Cursor.CROSSHAIR) { +- [this._lastX, this._lastY] = [event.x, event.y]; ++ [this._lastX, this._lastY] = event.get_coords(); + this._lastX = Math.floor(this._lastX); + this._lastY = Math.floor(this._lastY); + } else { +- let dx = Math.round(event.x - this._dragStartX); +- let dy = Math.round(event.y - this._dragStartY); ++ const [x, y] = event.get_coords(); ++ let dx = Math.round(x - this._dragStartX); ++ let dy = Math.round(y - this._dragStartY); + + if (this._dragCursor === Meta.Cursor.MOVE_OR_RESIZE_WINDOW) { + const [,, selectionWidth, selectionHeight] = this.getGeometry(); +@@ -658,17 +661,19 @@ const UIAreaSelector = GObject.registerClass({ + } + + vfunc_button_press_event(event) { +- if (event.button === Clutter.BUTTON_PRIMARY || +- event.button === Clutter.BUTTON_SECONDARY) +- return this._onPress(event, event.button, null); ++ const button = event.get_button(); ++ if (button === Clutter.BUTTON_PRIMARY || ++ button === Clutter.BUTTON_SECONDARY) ++ return this._onPress(event, button, null); + + return Clutter.EVENT_PROPAGATE; + } + + vfunc_button_release_event(event) { +- if (event.button === Clutter.BUTTON_PRIMARY || +- event.button === Clutter.BUTTON_SECONDARY) +- return this._onRelease(event, event.button, null); ++ const button = event.get_button(); ++ if (button === Clutter.BUTTON_PRIMARY || ++ button === Clutter.BUTTON_SECONDARY) ++ return this._onRelease(event, button, null); + + return Clutter.EVENT_PROPAGATE; + } +@@ -678,12 +683,13 @@ const UIAreaSelector = GObject.registerClass({ + } + + vfunc_touch_event(event) { +- if (event.type === Clutter.EventType.TOUCH_BEGIN) +- return this._onPress(event, 'touch', event.sequence); +- else if (event.type === Clutter.EventType.TOUCH_END) +- return this._onRelease(event, 'touch', event.sequence); +- else if (event.type === Clutter.EventType.TOUCH_UPDATE) +- return this._onMotion(event, event.sequence); ++ const eventType = event.type(); ++ if (eventType === Clutter.EventType.TOUCH_BEGIN) ++ return this._onPress(event, 'touch', event.get_event_sequence()); ++ else if (eventType === Clutter.EventType.TOUCH_END) ++ return this._onRelease(event, 'touch', event.get_event_sequence()); ++ else if (eventType === Clutter.EventType.TOUCH_UPDATE) ++ return this._onMotion(event, event.get_event_sequence()); + + return Clutter.EVENT_PROPAGATE; + } +@@ -1999,9 +2005,9 @@ export const ScreenshotUI = GObject.registerClass({ + } + + vfunc_key_press_event(event) { +- const symbol = event.keyval; ++ const symbol = event.get_key_symbol(); + if (symbol === Clutter.KEY_Return || symbol === Clutter.KEY_space || +- ((event.modifier_state & Clutter.ModifierType.CONTROL_MASK) && ++ ((event.get_state() & Clutter.ModifierType.CONTROL_MASK) && + (symbol === Clutter.KEY_c || symbol === Clutter.KEY_C))) { + this._onCaptureButtonClicked(); + return Clutter.EVENT_STOP; +@@ -2656,11 +2662,11 @@ class SelectArea extends St.Widget { + }); + } + +- vfunc_motion_event(motionEvent) { ++ vfunc_motion_event(event) { + if (this._startX == -1 || this._startY == -1 || this._result) + return Clutter.EVENT_PROPAGATE; + +- [this._lastX, this._lastY] = [motionEvent.x, motionEvent.y]; ++ [this._lastX, this._lastY] = event.get_coords(); + this._lastX = Math.floor(this._lastX); + this._lastY = Math.floor(this._lastY); + let geometry = this._getGeometry(); +@@ -2672,11 +2678,11 @@ class SelectArea extends St.Widget { + return Clutter.EVENT_PROPAGATE; + } + +- vfunc_button_press_event(buttonEvent) { ++ vfunc_button_press_event(event) { + if (this._result) + return Clutter.EVENT_PROPAGATE; + +- [this._startX, this._startY] = [buttonEvent.x, buttonEvent.y]; ++ [this._startX, this._startY] = event.get_coords(); + this._startX = Math.floor(this._startX); + this._startY = Math.floor(this._startY); + this._rubberband.set_position(this._startX, this._startY); +@@ -2913,8 +2919,8 @@ class PickPixel extends St.Widget { + this._previewCursor.show(); + } + +- vfunc_motion_event(motionEvent) { +- const { x, y } = motionEvent; ++ vfunc_motion_event(event) { ++ const [x, y] = event.get_coords(); + this._pickColor(x, y); + return Clutter.EVENT_PROPAGATE; + } +diff --git a/js/ui/shellMountOperation.js b/js/ui/shellMountOperation.js +index 035fd971df5..d8371dfa823 100644 +--- a/js/ui/shellMountOperation.js ++++ b/js/ui/shellMountOperation.js +@@ -238,7 +238,7 @@ const ShellMountQuestionDialog = GObject.registerClass({ + } + + vfunc_key_release_event(event) { +- if (event.keyval === Clutter.KEY_Escape) { ++ if (event.get_key_symbol() === Clutter.KEY_Escape) { + this.emit('response', -1); + return Clutter.EVENT_STOP; + } +@@ -491,7 +491,7 @@ const ShellProcessesDialog = GObject.registerClass({ + } + + vfunc_key_release_event(event) { +- if (event.keyval === Clutter.KEY_Escape) { ++ if (event.get_key_symbol() === Clutter.KEY_Escape) { + this.emit('response', -1); + return Clutter.EVENT_STOP; + } +diff --git a/js/ui/slider.js b/js/ui/slider.js +index 4f60556aeac..7ca0e3fef70 100644 +--- a/js/ui/slider.js ++++ b/js/ui/slider.js +@@ -177,14 +177,14 @@ export const Slider = GObject.registerClass({ + return Clutter.EVENT_STOP; + } + +- vfunc_key_press_event(keyPressEvent) { +- let key = keyPressEvent.keyval; ++ vfunc_key_press_event(event) { ++ let key = event.get_key_symbol(); + if (key == Clutter.KEY_Right || key == Clutter.KEY_Left) { + let delta = key == Clutter.KEY_Right ? 0.1 : -0.1; + this.value = Math.max(0, Math.min(this._value + delta, this._maxValue)); + return Clutter.EVENT_STOP; + } +- return super.vfunc_key_press_event(keyPressEvent); ++ return super.vfunc_key_press_event(event); + } + + _moveHandle(absX, _absY) { +diff --git a/js/ui/switcherPopup.js b/js/ui/switcherPopup.js +index a5eeee2ae52..e390fa44bb9 100644 +--- a/js/ui/switcherPopup.js ++++ b/js/ui/switcherPopup.js +@@ -183,10 +183,10 @@ export const SwitcherPopup = GObject.registerClass({ + throw new GObject.NotImplementedError(`_keyPressHandler in ${this.constructor.name}`); + } + +- vfunc_key_press_event(keyEvent) { +- let keysym = keyEvent.keyval; ++ vfunc_key_press_event(event) { ++ let keysym = event.get_key_symbol(); + let action = global.display.get_keybinding_action( +- keyEvent.hardware_keycode, keyEvent.modifier_state); ++ event.get_key_code(), event.get_state()); + + this._disableHover(); + +@@ -206,18 +206,18 @@ export const SwitcherPopup = GObject.registerClass({ + keysym === Clutter.KEY_Return || + keysym === Clutter.KEY_KP_Enter || + keysym === Clutter.KEY_ISO_Enter) +- this._finish(keyEvent.time); ++ this._finish(event.get_time()); + + return Clutter.EVENT_STOP; + } + +- vfunc_key_release_event(keyEvent) { ++ vfunc_key_release_event(event) { + if (this._modifierMask) { + let [x_, y_, mods] = global.get_pointer(); + let state = mods & this._modifierMask; + + if (state == 0) +- this._finish(keyEvent.time); ++ this._finish(event.get_time()); + } else { + this._resetNoModsTimeout(); + } +@@ -238,10 +238,10 @@ export const SwitcherPopup = GObject.registerClass({ + this._select(this._next()); + } + +- vfunc_scroll_event(scrollEvent) { ++ vfunc_scroll_event(event) { + this._disableHover(); + +- this._scrollHandler(scrollEvent.direction); ++ this._scrollHandler(event.get_scroll_direction()); + return Clutter.EVENT_PROPAGATE; + } + +diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js +index 8859b3c3a7a..541e833ea9a 100644 +--- a/js/ui/unlockDialog.js ++++ b/js/ui/unlockDialog.js +@@ -607,19 +607,19 @@ export const UnlockDialog = GObject.registerClass({ + this.connect('destroy', this._onDestroy.bind(this)); + } + +- vfunc_key_press_event(keyEvent) { ++ vfunc_key_press_event(event) { + if (this._activePage === this._promptBox || + (this._promptBox && this._promptBox.visible)) + return Clutter.EVENT_PROPAGATE; + +- const { keyval } = keyEvent; ++ const keyval = event.get_key_symbol(); + if (keyval === Clutter.KEY_Shift_L || + keyval === Clutter.KEY_Shift_R || + keyval === Clutter.KEY_Shift_Lock || + keyval === Clutter.KEY_Caps_Lock) + return Clutter.EVENT_PROPAGATE; + +- let unichar = keyEvent.unicode_value; ++ let unichar = event.get_key_unicode(); + + this._showPrompt(); + +diff --git a/js/ui/windowPreview.js b/js/ui/windowPreview.js +index bc1d792e123..12f1e883e56 100644 +--- a/js/ui/windowPreview.js ++++ b/js/ui/windowPreview.js +@@ -557,18 +557,18 @@ export const WindowPreview = GObject.registerClass({ + this.emit('selected', global.get_current_time()); + } + +- vfunc_enter_event(crossingEvent) { ++ vfunc_enter_event(event) { + this.showOverlay(true); +- return super.vfunc_enter_event(crossingEvent); ++ return super.vfunc_enter_event(event); + } + +- vfunc_leave_event(crossingEvent) { ++ vfunc_leave_event(event) { + if (this._destroyed) +- return super.vfunc_leave_event(crossingEvent); ++ return super.vfunc_leave_event(event); + +- if ((crossingEvent.flags & Clutter.EventFlags.FLAG_GRAB_NOTIFY) !== 0 && ++ if ((event.get_flags() & Clutter.EventFlags.FLAG_GRAB_NOTIFY) !== 0 && + global.stage.get_grab_actor() === this._closeButton) +- return super.vfunc_leave_event(crossingEvent); ++ return super.vfunc_leave_event(event); + + if (this._idleHideOverlayId > 0) + GLib.source_remove(this._idleHideOverlayId); +@@ -589,7 +589,7 @@ export const WindowPreview = GObject.registerClass({ + + GLib.Source.set_name_by_id(this._idleHideOverlayId, '[gnome-shell] this._idleHideOverlayId'); + +- return super.vfunc_leave_event(crossingEvent); ++ return super.vfunc_leave_event(event); + } + + vfunc_key_focus_in() { +@@ -604,15 +604,15 @@ export const WindowPreview = GObject.registerClass({ + this.hideOverlay(true); + } + +- vfunc_key_press_event(keyEvent) { +- let symbol = keyEvent.keyval; ++ vfunc_key_press_event(event) { ++ let symbol = event.get_key_symbol(); + let isEnter = symbol == Clutter.KEY_Return || symbol == Clutter.KEY_KP_Enter; + if (isEnter) { + this._activate(); + return true; + } + +- return super.vfunc_key_press_event(keyEvent); ++ return super.vfunc_key_press_event(event); + } + + _restack() { +-- +GitLab + + +From d56b05b5c3b9dffa44a513b67a15beb69e7c2190 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Tue, 8 Aug 2023 18:22:11 +0200 +Subject: [PATCH 2/3] js: Avoid Clutter.get_current_event() in Clutter.Actor + event vfuncs + +We sometimes obtained the current event through the general machinery +just so we could pass it along as a ClutterEvent instead of a specialized +subtype. + +We now get that out of the box, so may avoid getting the current event +which is just a cast of the same current event we already have. + +Part-of: +--- + js/ui/modalDialog.js | 4 ++-- + js/ui/popupMenu.js | 4 ++-- + js/ui/slider.js | 15 +++++++-------- + 3 files changed, 11 insertions(+), 12 deletions(-) + +diff --git a/js/ui/modalDialog.js b/js/ui/modalDialog.js +index 18e1f34e7ca..df32fcca564 100644 +--- a/js/ui/modalDialog.js ++++ b/js/ui/modalDialog.js +@@ -111,8 +111,8 @@ export const ModalDialog = GObject.registerClass({ + this.notify('state'); + } + +- vfunc_key_press_event() { +- if (global.focus_manager.navigate_from_event(Clutter.get_current_event())) ++ vfunc_key_press_event(event) { ++ if (global.focus_manager.navigate_from_event(event)) + return Clutter.EVENT_STOP; + + return Clutter.EVENT_PROPAGATE; +diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js +index f22e04c21cf..c15b74c3dbd 100644 +--- a/js/ui/popupMenu.js ++++ b/js/ui/popupMenu.js +@@ -143,7 +143,7 @@ export const PopupBaseMenuItem = GObject.registerClass({ + } + + vfunc_key_press_event(event) { +- if (global.focus_manager.navigate_from_event(Clutter.get_current_event())) ++ if (global.focus_manager.navigate_from_event(event)) + return Clutter.EVENT_STOP; + + if (!this._activatable) +@@ -162,7 +162,7 @@ export const PopupBaseMenuItem = GObject.registerClass({ + + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { +- this.activate(Clutter.get_current_event()); ++ this.activate(event); + return Clutter.EVENT_STOP; + } + return Clutter.EVENT_PROPAGATE; +diff --git a/js/ui/slider.js b/js/ui/slider.js +index 7ca0e3fef70..cde2ebce345 100644 +--- a/js/ui/slider.js ++++ b/js/ui/slider.js +@@ -61,8 +61,8 @@ export const Slider = GObject.registerClass({ + cr.$dispose(); + } + +- vfunc_button_press_event() { +- return this.startDragging(Clutter.get_current_event()); ++ vfunc_button_press_event(event) { ++ return this.startDragging(event); + } + + startDragging(event) { +@@ -117,8 +117,7 @@ export const Slider = GObject.registerClass({ + return Clutter.EVENT_PROPAGATE; + } + +- vfunc_touch_event() { +- let event = Clutter.get_current_event(); ++ vfunc_touch_event(event) { + let sequence = event.get_event_sequence(); + + if (!this._dragging && +@@ -159,13 +158,13 @@ export const Slider = GObject.registerClass({ + return Clutter.EVENT_STOP; + } + +- vfunc_scroll_event() { +- return this.scroll(Clutter.get_current_event()); ++ vfunc_scroll_event(event) { ++ return this.scroll(event); + } + +- vfunc_motion_event() { ++ vfunc_motion_event(event) { + if (this._dragging && !this._grabbedSequence) +- return this._motionEvent(this, Clutter.get_current_event()); ++ return this._motionEvent(this, event); + + return Clutter.EVENT_PROPAGATE; + } +-- +GitLab + + +From 111a0a7fa1450070992adf0399e7322ed8ddcf72 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Wed, 9 Aug 2023 00:26:52 +0200 +Subject: [PATCH 3/3] st: Mass update to ClutterActorClass event vmethod + changes + +These are now forwarded as ClutterEvent in order to remain accessible +on the Javascript side. This also means all ClutterActor implementations +in ST need to update to this change. + +Part-of: +--- + src/st/st-button.c | 48 +++++++++++++++---------------- + src/st/st-entry.c | 28 +++++++++---------- + src/st/st-scroll-bar.c | 62 ++++++++++++++++++++--------------------- + src/st/st-scroll-view.c | 10 +++---- + src/st/st-widget.c | 20 ++++++------- + 5 files changed, 84 insertions(+), 84 deletions(-) + +diff --git a/src/st/st-button.c b/src/st/st-button.c +index f1499cf43ea..687a54d2366 100644 +--- a/src/st/st-button.c ++++ b/src/st/st-button.c +@@ -181,14 +181,14 @@ st_button_release (StButton *button, + } + + static gboolean +-st_button_button_press (ClutterActor *actor, +- ClutterButtonEvent *event) ++st_button_button_press (ClutterActor *actor, ++ ClutterEvent *event) + { + StButton *button = ST_BUTTON (actor); + StButtonPrivate *priv = st_button_get_instance_private (button); +- int button_nr = clutter_event_get_button ((ClutterEvent *) event); ++ int button_nr = clutter_event_get_button (event); + StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (button_nr); +- ClutterInputDevice *device = clutter_event_get_device ((ClutterEvent*) event); ++ ClutterInputDevice *device = clutter_event_get_device (event); + + if (priv->press_sequence) + return CLUTTER_EVENT_PROPAGATE; +@@ -212,14 +212,14 @@ st_button_button_press (ClutterActor *actor, + } + + static gboolean +-st_button_button_release (ClutterActor *actor, +- ClutterButtonEvent *event) ++st_button_button_release (ClutterActor *actor, ++ ClutterEvent *event) + { + StButton *button = ST_BUTTON (actor); + StButtonPrivate *priv = st_button_get_instance_private (button); +- int button_nr = clutter_event_get_button ((ClutterEvent *) event); ++ int button_nr = clutter_event_get_button (event); + StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (button_nr); +- ClutterInputDevice *device = clutter_event_get_device ((ClutterEvent*) event); ++ ClutterInputDevice *device = clutter_event_get_device (event); + + if (priv->button_mask & mask) + { +@@ -228,7 +228,7 @@ st_button_button_release (ClutterActor *actor, + gboolean is_click; + + stage = CLUTTER_STAGE (clutter_actor_get_stage (actor)); +- target = clutter_stage_get_event_actor (stage, (ClutterEvent *) event); ++ target = clutter_stage_get_event_actor (stage, event); + + is_click = priv->grabbed && clutter_actor_contains (actor, target); + st_button_release (button, device, mask, is_click ? button_nr : 0, NULL); +@@ -247,8 +247,8 @@ st_button_button_release (ClutterActor *actor, + } + + static gboolean +-st_button_touch_event (ClutterActor *actor, +- ClutterTouchEvent *event) ++st_button_touch_event (ClutterActor *actor, ++ ClutterEvent *event) + { + StButton *button = ST_BUTTON (actor); + StButtonPrivate *priv = st_button_get_instance_private (button); +@@ -262,9 +262,9 @@ st_button_touch_event (ClutterActor *actor, + if ((priv->button_mask & mask) == 0) + return CLUTTER_EVENT_PROPAGATE; + +- device = clutter_event_get_device ((ClutterEvent*) event); +- sequence = clutter_event_get_event_sequence ((ClutterEvent*) event); +- event_type = clutter_event_type ((ClutterEvent *) event); ++ device = clutter_event_get_device (event); ++ sequence = clutter_event_get_event_sequence (event); ++ event_type = clutter_event_type (event); + + if (event_type == CLUTTER_TOUCH_BEGIN && !priv->grab && !priv->press_sequence) + { +@@ -287,8 +287,8 @@ st_button_touch_event (ClutterActor *actor, + } + + static gboolean +-st_button_key_press (ClutterActor *actor, +- ClutterKeyEvent *event) ++st_button_key_press (ClutterActor *actor, ++ ClutterEvent *event) + { + StButton *button = ST_BUTTON (actor); + StButtonPrivate *priv = st_button_get_instance_private (button); +@@ -296,7 +296,7 @@ st_button_key_press (ClutterActor *actor, + + if (priv->button_mask & ST_BUTTON_ONE) + { +- keyval = clutter_event_get_key_symbol ((ClutterEvent *) event); ++ keyval = clutter_event_get_key_symbol (event); + + if (keyval == CLUTTER_KEY_space || + keyval == CLUTTER_KEY_Return || +@@ -312,8 +312,8 @@ st_button_key_press (ClutterActor *actor, + } + + static gboolean +-st_button_key_release (ClutterActor *actor, +- ClutterKeyEvent *event) ++st_button_key_release (ClutterActor *actor, ++ ClutterEvent *event) + { + StButton *button = ST_BUTTON (actor); + StButtonPrivate *priv = st_button_get_instance_private (button); +@@ -321,7 +321,7 @@ st_button_key_release (ClutterActor *actor, + + if (priv->button_mask & ST_BUTTON_ONE) + { +- keyval = clutter_event_get_key_symbol ((ClutterEvent *) event); ++ keyval = clutter_event_get_key_symbol (event); + + if (keyval == CLUTTER_KEY_space || + keyval == CLUTTER_KEY_Return || +@@ -354,8 +354,8 @@ st_button_key_focus_out (ClutterActor *actor) + } + + static gboolean +-st_button_enter (ClutterActor *actor, +- ClutterCrossingEvent *event) ++st_button_enter (ClutterActor *actor, ++ ClutterEvent *event) + { + StButton *button = ST_BUTTON (actor); + StButtonPrivate *priv = st_button_get_instance_private (button); +@@ -377,8 +377,8 @@ st_button_enter (ClutterActor *actor, + } + + static gboolean +-st_button_leave (ClutterActor *actor, +- ClutterCrossingEvent *event) ++st_button_leave (ClutterActor *actor, ++ ClutterEvent *event) + { + StButton *button = ST_BUTTON (actor); + StButtonPrivate *priv = st_button_get_instance_private (button); +diff --git a/src/st/st-entry.c b/src/st/st-entry.c +index debc96dc9a0..0de195ebcf7 100644 +--- a/src/st/st-entry.c ++++ b/src/st/st-entry.c +@@ -605,13 +605,13 @@ st_entry_clipboard_callback (StClipboard *clipboard, + } + + static gboolean +-clutter_text_button_press_event (ClutterActor *actor, +- ClutterButtonEvent *event, +- gpointer user_data) ++clutter_text_button_press_event (ClutterActor *actor, ++ ClutterEvent *event, ++ gpointer user_data) + { + StEntryPrivate *priv = ST_ENTRY_PRIV (user_data); + +- if (clutter_event_get_button ((ClutterEvent *) event) == 2 && ++ if (clutter_event_get_button (event) == 2 && + clutter_text_get_editable (CLUTTER_TEXT (priv->entry))) + { + StSettings *settings; +@@ -642,8 +642,8 @@ clutter_text_button_press_event (ClutterActor *actor, + } + + static gboolean +-st_entry_key_press_event (ClutterActor *actor, +- ClutterKeyEvent *event) ++st_entry_key_press_event (ClutterActor *actor, ++ ClutterEvent *event) + { + StEntryPrivate *priv = ST_ENTRY_PRIV (actor); + ClutterModifierType state; +@@ -654,8 +654,8 @@ st_entry_key_press_event (ClutterActor *actor, + didn't handle them */ + + /* paste */ +- state = clutter_event_get_state ((ClutterEvent *) event); +- keyval = clutter_event_get_key_symbol ((ClutterEvent *) event); ++ state = clutter_event_get_state (event); ++ keyval = clutter_event_get_key_symbol (event); + + if (((state & CLUTTER_CONTROL_MASK) + && keyval == CLUTTER_KEY_v) || +@@ -790,26 +790,26 @@ st_entry_set_cursor (StEntry *entry, + } + + static gboolean +-st_entry_enter_event (ClutterActor *actor, +- ClutterCrossingEvent *event) ++st_entry_enter_event (ClutterActor *actor, ++ ClutterEvent *event) + { + StEntryPrivate *priv = ST_ENTRY_PRIV (actor); + ClutterStage *stage; + ClutterActor *target; + + stage = CLUTTER_STAGE (clutter_actor_get_stage (actor)); +- target = clutter_stage_get_event_actor (stage, (ClutterEvent *) event); ++ target = clutter_stage_get_event_actor (stage, event); + + if (target == priv->entry && +- clutter_event_get_related ((ClutterEvent *) event) != NULL) ++ clutter_event_get_related (event) != NULL) + st_entry_set_cursor (ST_ENTRY (actor), TRUE); + + return CLUTTER_ACTOR_CLASS (st_entry_parent_class)->enter_event (actor, event); + } + + static gboolean +-st_entry_leave_event (ClutterActor *actor, +- ClutterCrossingEvent *event) ++st_entry_leave_event (ClutterActor *actor, ++ ClutterEvent *event) + { + st_entry_set_cursor (ST_ENTRY (actor), FALSE); + +diff --git a/src/st/st-scroll-bar.c b/src/st/st-scroll-bar.c +index e2c09203e1b..270f3f2db6b 100644 +--- a/src/st/st-scroll-bar.c ++++ b/src/st/st-scroll-bar.c +@@ -97,9 +97,9 @@ enum + static guint signals[LAST_SIGNAL] = { 0, }; + + static gboolean +-handle_button_press_event_cb (ClutterActor *actor, +- ClutterButtonEvent *event, +- StScrollBar *bar); ++handle_button_press_event_cb (ClutterActor *actor, ++ ClutterEvent *event, ++ StScrollBar *bar); + + static void stop_scrolling (StScrollBar *bar); + +@@ -462,26 +462,26 @@ adjust_with_direction (StAdjustment *adj, + } + + static gboolean +-st_scroll_bar_scroll_event (ClutterActor *actor, +- ClutterScrollEvent *event) ++st_scroll_bar_scroll_event (ClutterActor *actor, ++ ClutterEvent *event) + { + StScrollBarPrivate *priv = ST_SCROLL_BAR_PRIVATE (actor); + ClutterTextDirection direction; + ClutterScrollDirection scroll_dir; + +- if (!!(clutter_event_get_flags ((ClutterEvent *) event) & ++ if (!!(clutter_event_get_flags (event) & + CLUTTER_EVENT_FLAG_POINTER_EMULATED)) + return TRUE; + + direction = clutter_actor_get_text_direction (actor); +- scroll_dir = clutter_event_get_scroll_direction ((ClutterEvent *) event); ++ scroll_dir = clutter_event_get_scroll_direction (event); + + switch (scroll_dir) + { + case CLUTTER_SCROLL_SMOOTH: + { + gdouble delta_x, delta_y; +- clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y); ++ clutter_event_get_scroll_delta (event, &delta_x, &delta_y); + + if (direction == CLUTTER_TEXT_DIRECTION_RTL) + delta_x *= -1; +@@ -652,9 +652,9 @@ stop_scrolling (StScrollBar *bar) + } + + static gboolean +-handle_motion_event_cb (ClutterActor *trough, +- ClutterMotionEvent *event, +- StScrollBar *bar) ++handle_motion_event_cb (ClutterActor *trough, ++ ClutterEvent *event, ++ StScrollBar *bar) + { + StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar); + graphene_point_t coords; +@@ -662,17 +662,17 @@ handle_motion_event_cb (ClutterActor *trough, + if (!priv->grab_device) + return FALSE; + +- clutter_event_get_position ((ClutterEvent *) event, &coords); ++ clutter_event_get_position (event, &coords); + move_slider (bar, coords.x, coords.y); + return TRUE; + } + + static gboolean +-handle_button_release_event_cb (ClutterActor *trough, +- ClutterButtonEvent *event, +- StScrollBar *bar) ++handle_button_release_event_cb (ClutterActor *trough, ++ ClutterEvent *event, ++ StScrollBar *bar) + { +- if (clutter_event_get_button ((ClutterEvent *) event) != 1) ++ if (clutter_event_get_button (event) != 1) + return FALSE; + + stop_scrolling (bar); +@@ -680,19 +680,19 @@ handle_button_release_event_cb (ClutterActor *trough, + } + + static gboolean +-handle_button_press_event_cb (ClutterActor *actor, +- ClutterButtonEvent *event, +- StScrollBar *bar) ++handle_button_press_event_cb (ClutterActor *actor, ++ ClutterEvent *event, ++ StScrollBar *bar) + { + StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar); +- ClutterInputDevice *device = clutter_event_get_device ((ClutterEvent*) event); ++ ClutterInputDevice *device = clutter_event_get_device (event); + graphene_point_t coords; + ClutterActor *stage; + +- if (clutter_event_get_button ((ClutterEvent *) event) != 1) ++ if (clutter_event_get_button (event) != 1) + return FALSE; + +- clutter_event_get_position ((ClutterEvent *) event, &coords); ++ clutter_event_get_position (event, &coords); + + if (!clutter_actor_transform_stage_point (priv->handle, + coords.x, +@@ -838,23 +838,23 @@ trough_paging_cb (StScrollBar *self) + } + + static gboolean +-trough_button_press_event_cb (ClutterActor *actor, +- ClutterButtonEvent *event, +- StScrollBar *self) ++trough_button_press_event_cb (ClutterActor *actor, ++ ClutterEvent *event, ++ StScrollBar *self) + { + StScrollBarPrivate *priv; + graphene_point_t coords; + + g_return_val_if_fail (self, FALSE); + +- if (clutter_event_get_button ((ClutterEvent *) event) != 1) ++ if (clutter_event_get_button (event) != 1) + return FALSE; + + priv = st_scroll_bar_get_instance_private (self); + if (priv->adjustment == NULL) + return FALSE; + +- clutter_event_get_position ((ClutterEvent *) event, &coords); ++ clutter_event_get_position (event, &coords); + + priv->move_x = coords.x; + priv->move_y = coords.y; +@@ -866,13 +866,13 @@ trough_button_press_event_cb (ClutterActor *actor, + } + + static gboolean +-trough_button_release_event_cb (ClutterActor *actor, +- ClutterButtonEvent *event, +- StScrollBar *self) ++trough_button_release_event_cb (ClutterActor *actor, ++ ClutterEvent *event, ++ StScrollBar *self) + { + StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (self); + +- if (clutter_event_get_button ((ClutterEvent *) event) != 1) ++ if (clutter_event_get_button (event) != 1) + return FALSE; + + g_clear_handle_id (&priv->paging_source_id, g_source_remove); +diff --git a/src/st/st-scroll-view.c b/src/st/st-scroll-view.c +index 764065b606e..edaa0278dad 100644 +--- a/src/st/st-scroll-view.c ++++ b/src/st/st-scroll-view.c +@@ -759,8 +759,8 @@ st_scroll_view_style_changed (StWidget *widget) + } + + static gboolean +-st_scroll_view_scroll_event (ClutterActor *self, +- ClutterScrollEvent *event) ++st_scroll_view_scroll_event (ClutterActor *self, ++ ClutterEvent *event) + { + StScrollViewPrivate *priv = ST_SCROLL_VIEW (self)->priv; + ClutterTextDirection direction; +@@ -770,19 +770,19 @@ st_scroll_view_scroll_event (ClutterActor *self, + if (!priv->mouse_scroll) + return FALSE; + +- if (!!(clutter_event_get_flags ((ClutterEvent *) event) & ++ if (!!(clutter_event_get_flags (event) & + CLUTTER_EVENT_FLAG_POINTER_EMULATED)) + return TRUE; + + direction = clutter_actor_get_text_direction (self); +- scroll_direction = clutter_event_get_scroll_direction ((ClutterEvent *) event); ++ scroll_direction = clutter_event_get_scroll_direction (event); + + switch (scroll_direction) + { + case CLUTTER_SCROLL_SMOOTH: + { + gdouble delta_x, delta_y; +- clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y); ++ clutter_event_get_scroll_delta (event, &delta_x, &delta_y); + + if (direction == CLUTTER_TEXT_DIRECTION_RTL) + delta_x *= -1; +diff --git a/src/st/st-widget.c b/src/st/st-widget.c +index 02077d4417b..15c9d3ea1bd 100644 +--- a/src/st/st-widget.c ++++ b/src/st/st-widget.c +@@ -687,8 +687,8 @@ st_widget_peek_theme_node (StWidget *widget) + } + + static gboolean +-st_widget_enter (ClutterActor *actor, +- ClutterCrossingEvent *event) ++st_widget_enter (ClutterActor *actor, ++ ClutterEvent *event) + { + StWidgetPrivate *priv = st_widget_get_instance_private (ST_WIDGET (actor)); + +@@ -698,7 +698,7 @@ st_widget_enter (ClutterActor *actor, + ClutterActor *target; + + stage = CLUTTER_STAGE (clutter_actor_get_stage (actor)); +- target = clutter_stage_get_event_actor (stage, (ClutterEvent *) event); ++ target = clutter_stage_get_event_actor (stage, event); + + if (clutter_actor_contains (actor, target)) + st_widget_set_hover (ST_WIDGET (actor), TRUE); +@@ -719,8 +719,8 @@ st_widget_enter (ClutterActor *actor, + } + + static gboolean +-st_widget_leave (ClutterActor *actor, +- ClutterCrossingEvent *event) ++st_widget_leave (ClutterActor *actor, ++ ClutterEvent *event) + { + StWidgetPrivate *priv = st_widget_get_instance_private (ST_WIDGET (actor)); + +@@ -728,7 +728,7 @@ st_widget_leave (ClutterActor *actor, + { + ClutterActor *related; + +- related = clutter_event_get_related ((ClutterEvent *) event); ++ related = clutter_event_get_related (event); + + if (!related || !clutter_actor_contains (actor, related)) + st_widget_set_hover (ST_WIDGET (actor), FALSE); +@@ -757,14 +757,14 @@ st_widget_key_focus_out (ClutterActor *actor) + } + + static gboolean +-st_widget_key_press_event (ClutterActor *actor, +- ClutterKeyEvent *event) ++st_widget_key_press_event (ClutterActor *actor, ++ ClutterEvent *event) + { + ClutterModifierType state; + uint32_t keyval; + +- state = clutter_event_get_state ((ClutterEvent *) event); +- keyval = clutter_event_get_key_symbol ((ClutterEvent *) event); ++ state = clutter_event_get_state (event); ++ keyval = clutter_event_get_key_symbol (event); + + if (keyval == CLUTTER_KEY_Menu || + (keyval == CLUTTER_KEY_F10 && +-- +GitLab + diff --git a/gnome-shell.spec b/gnome-shell.spec index 3a6810a..d2a9968 100644 --- a/gnome-shell.spec +++ b/gnome-shell.spec @@ -9,6 +9,14 @@ License: GPLv2+ URL: https://wiki.gnome.org/Projects/GnomeShell Source0: https://download.gnome.org/sources/gnome-shell/45/%{name}-%{tarball_version}.tar.xz +# Needed to fix broken alt-tab (along with gnome-shell patches) +# 2872 is the fix, but only applies clean on top of 2871 +# https://gitlab.gnome.org/GNOME/mutter/-/issues/2950 +# https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2871 +# https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2872 +Patch0: 2871.patch +Patch1: 2872.patch + # Replace Epiphany with Firefox in the default favourite apps list Patch10001: gnome-shell-favourite-apps-firefox.patch