Blame js/ui/windowMenu.js

Packit d345d1
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*
Packit d345d1
Packit d345d1
const { Meta, St } = imports.gi;
Packit d345d1
Packit d345d1
const BoxPointer = imports.ui.boxpointer;
Packit d345d1
const Main = imports.ui.main;
Packit d345d1
const PopupMenu = imports.ui.popupMenu;
Packit d345d1
Packit d345d1
var WindowMenu = class extends PopupMenu.PopupMenu {
Packit d345d1
    constructor(window, sourceActor) {
Packit d345d1
        super(sourceActor, 0, St.Side.TOP);
Packit d345d1
Packit d345d1
        this.actor.add_style_class_name('window-menu');
Packit d345d1
Packit d345d1
        Main.layoutManager.uiGroup.add_actor(this.actor);
Packit d345d1
        this.actor.hide();
Packit d345d1
Packit d345d1
        this._buildMenu(window);
Packit d345d1
    }
Packit d345d1
Packit d345d1
    _buildMenu(window) {
Packit d345d1
        let type = window.get_window_type();
Packit d345d1
Packit d345d1
        let item;
Packit d345d1
Packit d345d1
        item = this.addAction(_("Minimize"), () => {
Packit d345d1
            window.minimize();
Packit d345d1
        });
Packit d345d1
        if (!window.can_minimize())
Packit d345d1
            item.setSensitive(false);
Packit d345d1
Packit d345d1
        if (window.get_maximized()) {
Packit d345d1
            item = this.addAction(_("Unmaximize"), () => {
Packit d345d1
                window.unmaximize(Meta.MaximizeFlags.BOTH);
Packit d345d1
            });
Packit d345d1
        } else {
Packit d345d1
            item = this.addAction(_("Maximize"), () => {
Packit d345d1
                window.maximize(Meta.MaximizeFlags.BOTH);
Packit d345d1
            });
Packit d345d1
        }
Packit d345d1
        if (!window.can_maximize())
Packit d345d1
            item.setSensitive(false);
Packit d345d1
Packit d345d1
        item = this.addAction(_("Move"), event => {
Packit d345d1
            window.begin_grab_op(Meta.GrabOp.KEYBOARD_MOVING, true, event.get_time());
Packit d345d1
        });
Packit d345d1
        if (!window.allows_move())
Packit d345d1
            item.setSensitive(false);
Packit d345d1
Packit d345d1
        item = this.addAction(_("Resize"), event => {
Packit d345d1
            window.begin_grab_op(Meta.GrabOp.KEYBOARD_RESIZING_UNKNOWN, true, event.get_time());
Packit d345d1
        });
Packit d345d1
        if (!window.allows_resize())
Packit d345d1
            item.setSensitive(false);
Packit d345d1
Packit d345d1
        if (!window.titlebar_is_onscreen() && type != Meta.WindowType.DOCK && type != Meta.WindowType.DESKTOP) {
Packit d345d1
            this.addAction(_("Move Titlebar Onscreen"), () => {
Packit d345d1
                window.shove_titlebar_onscreen();
Packit d345d1
            });
Packit d345d1
        }
Packit d345d1
Packit d345d1
        item = this.addAction(_("Always on Top"), () => {
Packit d345d1
            if (window.is_above())
Packit d345d1
                window.unmake_above();
Packit d345d1
            else
Packit d345d1
                window.make_above();
Packit d345d1
        });
Packit d345d1
        if (window.is_above())
Packit d345d1
            item.setOrnament(PopupMenu.Ornament.CHECK);
Packit d345d1
        if (window.get_maximized() == Meta.MaximizeFlags.BOTH ||
Packit d345d1
            type == Meta.WindowType.DOCK ||
Packit d345d1
            type == Meta.WindowType.DESKTOP ||
Packit d345d1
            type == Meta.WindowType.SPLASHSCREEN)
Packit d345d1
            item.setSensitive(false);
Packit d345d1
Packit d345d1
        if (Main.sessionMode.hasWorkspaces &&
Packit d345d1
            (!Meta.prefs_get_workspaces_only_on_primary() ||
Packit d345d1
             window.is_on_primary_monitor())) {
Packit d345d1
            let isSticky = window.is_on_all_workspaces();
Packit d345d1
Packit d345d1
            item = this.addAction(_("Always on Visible Workspace"), () => {
Packit d345d1
                if (isSticky)
Packit d345d1
                    window.unstick();
Packit d345d1
                else
Packit d345d1
                    window.stick();
Packit d345d1
            });
Packit d345d1
            if (isSticky)
Packit d345d1
                item.setOrnament(PopupMenu.Ornament.CHECK);
Packit d345d1
            if (window.is_always_on_all_workspaces())
Packit d345d1
                item.setSensitive(false);
Packit d345d1
Packit d345d1
            if (!isSticky) {
Packit d345d1
                let workspace = window.get_workspace();
Packit d345d1
                if (workspace != workspace.get_neighbor(Meta.MotionDirection.LEFT)) {
Packit d345d1
                    this.addAction(_("Move to Workspace Left"), () => {
Packit d345d1
                        let dir = Meta.MotionDirection.LEFT;
Packit d345d1
                        window.change_workspace(workspace.get_neighbor(dir));
Packit d345d1
                    });
Packit d345d1
                }
Packit d345d1
                if (workspace != workspace.get_neighbor(Meta.MotionDirection.RIGHT)) {
Packit d345d1
                    this.addAction(_("Move to Workspace Right"), () => {
Packit d345d1
                        let dir = Meta.MotionDirection.RIGHT;
Packit d345d1
                        window.change_workspace(workspace.get_neighbor(dir));
Packit d345d1
                    });
Packit d345d1
                }
Packit d345d1
                if (workspace != workspace.get_neighbor(Meta.MotionDirection.UP)) {
Packit d345d1
                    this.addAction(_("Move to Workspace Up"), () => {
Packit d345d1
                        let dir = Meta.MotionDirection.UP;
Packit d345d1
                        window.change_workspace(workspace.get_neighbor(dir));
Packit d345d1
                    });
Packit d345d1
                }
Packit d345d1
                if (workspace != workspace.get_neighbor(Meta.MotionDirection.DOWN)) {
Packit d345d1
                    this.addAction(_("Move to Workspace Down"), () => {
Packit d345d1
                        let dir = Meta.MotionDirection.DOWN;
Packit d345d1
                        window.change_workspace(workspace.get_neighbor(dir));
Packit d345d1
                    });
Packit d345d1
                }
Packit d345d1
            }
Packit d345d1
        }
Packit d345d1
Packit d345d1
        let display = global.display;
Packit d345d1
        let nMonitors = display.get_n_monitors();
Packit d345d1
        let monitorIndex = window.get_monitor();
Packit d345d1
        if (nMonitors > 1 && monitorIndex >= 0) {
Packit d345d1
            this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
Packit d345d1
Packit d345d1
            let dir = Meta.DisplayDirection.UP;
Packit d345d1
            let upMonitorIndex =
Packit d345d1
                display.get_monitor_neighbor_index(monitorIndex, dir);
Packit d345d1
            if (upMonitorIndex != -1) {
Packit d345d1
                this.addAction(_("Move to Monitor Up"), () => {
Packit d345d1
                    window.move_to_monitor(upMonitorIndex);
Packit d345d1
                });
Packit d345d1
            }
Packit d345d1
Packit d345d1
            dir = Meta.DisplayDirection.DOWN;
Packit d345d1
            let downMonitorIndex =
Packit d345d1
                display.get_monitor_neighbor_index(monitorIndex, dir);
Packit d345d1
            if (downMonitorIndex != -1) {
Packit d345d1
                this.addAction(_("Move to Monitor Down"), () => {
Packit d345d1
                    window.move_to_monitor(downMonitorIndex);
Packit d345d1
                });
Packit d345d1
            }
Packit d345d1
Packit d345d1
            dir = Meta.DisplayDirection.LEFT;
Packit d345d1
            let leftMonitorIndex =
Packit d345d1
                display.get_monitor_neighbor_index(monitorIndex, dir);
Packit d345d1
            if (leftMonitorIndex != -1) {
Packit d345d1
                this.addAction(_("Move to Monitor Left"), () => {
Packit d345d1
                    window.move_to_monitor(leftMonitorIndex);
Packit d345d1
                });
Packit d345d1
            }
Packit d345d1
Packit d345d1
            dir = Meta.DisplayDirection.RIGHT;
Packit d345d1
            let rightMonitorIndex =
Packit d345d1
                display.get_monitor_neighbor_index(monitorIndex, dir);
Packit d345d1
            if (rightMonitorIndex != -1) {
Packit d345d1
                this.addAction(_("Move to Monitor Right"), () => {
Packit d345d1
                    window.move_to_monitor(rightMonitorIndex);
Packit d345d1
                });
Packit d345d1
            }
Packit d345d1
        }
Packit d345d1
Packit d345d1
        this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
Packit d345d1
Packit d345d1
        item = this.addAction(_("Close"), event => {
Packit d345d1
            window.delete(event.get_time());
Packit d345d1
        });
Packit d345d1
        if (!window.can_close())
Packit d345d1
            item.setSensitive(false);
Packit d345d1
    }
Packit d345d1
};
Packit d345d1
Packit d345d1
var WindowMenuManager = class {
Packit d345d1
    constructor() {
Packit d345d1
        this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor });
Packit d345d1
Packit d345d1
        this._sourceActor = new St.Widget({ reactive: true, visible: false });
Packit d345d1
        this._sourceActor.connect('button-press-event', () => {
Packit d345d1
            this._manager.activeMenu.toggle();
Packit d345d1
        });
Packit d345d1
        Main.uiGroup.add_actor(this._sourceActor);
Packit d345d1
    }
Packit d345d1
Packit d345d1
    showWindowMenuForWindow(window, type, rect) {
Packit d345d1
        if (type != Meta.WindowMenuType.WM)
Packit d345d1
            throw new Error('Unsupported window menu type');
Packit d345d1
        let menu = new WindowMenu(window, this._sourceActor);
Packit d345d1
Packit d345d1
        this._manager.addMenu(menu);
Packit d345d1
Packit d345d1
        menu.connect('activate', () => {
Packit d345d1
            window.check_alive(global.get_current_time());
Packit d345d1
        });
Packit d345d1
        let destroyId = window.connect('unmanaged', () => {
Packit d345d1
            menu.close();
Packit d345d1
        });
Packit d345d1
Packit d345d1
        this._sourceActor.set_size(Math.max(1, rect.width), Math.max(1, rect.height));
Packit d345d1
        this._sourceActor.set_position(rect.x, rect.y);
Packit d345d1
        this._sourceActor.show();
Packit d345d1
Packit d345d1
        menu.open(BoxPointer.PopupAnimation.NONE);
Packit d345d1
        menu.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false);
Packit d345d1
        menu.connect('open-state-changed', (menu_, isOpen) => {
Packit d345d1
            if (isOpen)
Packit d345d1
                return;
Packit d345d1
Packit d345d1
            this._sourceActor.hide();
Packit d345d1
            menu.destroy();
Packit d345d1
            window.disconnect(destroyId);
Packit d345d1
        });
Packit d345d1
    }
Packit d345d1
};