.gitlab
.gitlab-ci
.settings
data
docs
js
dbusServices
extensions
gdm
misc
portalHelper
ui
components
status
accessDialog.js
altTab.js
animation.js
appDisplay.js
appFavorites.js
appMenu.js
audioDeviceSelection.js
background.js
backgroundMenu.js
barLevel.js
boxpointer.js
calendar.js
checkBox.js
closeDialog.js
components.js
ctrlAltTab.js
dash.js
dateMenu.js
dialog.js
dnd.js
edgeDragAction.js
endSessionDialog.js
environment.js
extensionDownloader.js
extensionSystem.js
focusCaretTracker.js
grabHelper.js
ibusCandidatePopup.js
iconGrid.js
inhibitShortcutsDialog.js
init.js
kbdA11yDialog.js
keyboard.js
layout.js
lightbox.js
listModes.js
locatePointer.js
lookingGlass.js
magnifier.js
main.js
messageList.js
messageTray.js
modalDialog.js
mpris.js
notificationDaemon.js
osdMonitorLabeler.js
osdWindow.js
overview.js
overviewControls.js
padOsd.js
pageIndicators.js
panel.js
panelMenu.js
pointerA11yTimeout.js
pointerWatcher.js
popupMenu.js
quickSettings.js
remoteSearch.js
ripples.js
runDialog.js
screenShield.js
screenshot.js
scripting.js
search.js
searchController.js
sessionMode.js
shellDBus.js
shellEntry.js
shellMountOperation.js
slider.js
swipeTracker.js
switchMonitor.js
switcherPopup.js
unlockDialog.js
userWidget.js
welcomeDialog.js
windowAttentionHandler.js
windowManager.js
windowMenu.js
windowPreview.js
workspace.js
workspaceAnimation.js
workspaceSwitcherPopup.js
workspaceThumbnail.js
workspacesView.js
xdndHandler.js
js-resources.gresource.xml
meson.build
portal-resources.gresource.xml
lint
man
meson
po
src
subprojects
tests
tools
.editorconfig
.eslintrc.yml
.gitignore
.gitlab-ci.yml
.gitmodules
.jscheckignore
COPYING
NEWS
README.md
config.h.meson
gnome-shell.doap
meson.build
meson_options.txt

These have been long deprecated over in clutter, and (via several vtables) simply forward the call to the equivalent ClutterActor methods Save ourselves the hassle and just use ClutterActor methods directly Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3010>
70 lines
2.3 KiB
JavaScript
70 lines
2.3 KiB
JavaScript
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
|
|
import Clutter from 'gi://Clutter';
|
|
import St from 'gi://St';
|
|
|
|
import * as BoxPointer from './boxpointer.js';
|
|
import * as PopupMenu from './popupMenu.js';
|
|
|
|
import * as Main from './main.js';
|
|
|
|
export class BackgroundMenu extends PopupMenu.PopupMenu {
|
|
constructor(layoutManager) {
|
|
super(layoutManager.dummyCursor, 0, St.Side.TOP);
|
|
|
|
this.addSettingsAction(_('Change Background…'), 'gnome-background-panel.desktop');
|
|
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
|
this.addSettingsAction(_('Display Settings'), 'gnome-display-panel.desktop');
|
|
this.addSettingsAction(_('Settings'), 'org.gnome.Settings.desktop');
|
|
|
|
this.actor.add_style_class_name('background-menu');
|
|
|
|
layoutManager.uiGroup.add_child(this.actor);
|
|
this.actor.hide();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {Meta.BackgroundActor} actor
|
|
* @param {import('./layout.js').LayoutManager} layoutManager
|
|
*/
|
|
export function addBackgroundMenu(actor, layoutManager) {
|
|
actor.reactive = true;
|
|
actor._backgroundMenu = new BackgroundMenu(layoutManager);
|
|
actor._backgroundManager = new PopupMenu.PopupMenuManager(actor);
|
|
actor._backgroundManager.addMenu(actor._backgroundMenu);
|
|
|
|
function openMenu(x, y) {
|
|
Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0);
|
|
actor._backgroundMenu.open(BoxPointer.PopupAnimation.FULL);
|
|
}
|
|
|
|
let clickAction = new Clutter.ClickAction();
|
|
clickAction.connect('long-press', (action, theActor, state) => {
|
|
if (state === Clutter.LongPressState.QUERY) {
|
|
return (action.get_button() === 0 ||
|
|
action.get_button() === 1) &&
|
|
!actor._backgroundMenu.isOpen;
|
|
}
|
|
if (state === Clutter.LongPressState.ACTIVATE) {
|
|
let [x, y] = action.get_coords();
|
|
openMenu(x, y);
|
|
actor._backgroundManager.ignoreRelease();
|
|
}
|
|
return true;
|
|
});
|
|
clickAction.connect('clicked', action => {
|
|
if (action.get_button() === 3) {
|
|
let [x, y] = action.get_coords();
|
|
openMenu(x, y);
|
|
}
|
|
});
|
|
actor.add_action(clickAction);
|
|
|
|
actor.connect('destroy', () => {
|
|
actor._backgroundMenu.destroy();
|
|
actor._backgroundMenu = null;
|
|
actor._backgroundManager = null;
|
|
});
|
|
}
|