%PDF- %PDF-
Direktori : /usr/share/gnome-shell/extensions/tiling-assistant@ubuntu.com/src/ |
Current File : //usr/share/gnome-shell/extensions/tiling-assistant@ubuntu.com/src/common.js |
/** * Helper classes / enums for the settings.xml used in the extension files * *and* prefs files */ /** * A Singleton providing access to the settings. */ export class Settings { static _settings; static ENABLE_TILING_POPUP = 'enable-tiling-popup'; static POPUP_ALL_WORKSPACES = 'tiling-popup-all-workspace'; static RAISE_TILE_GROUPS = 'enable-raise-tile-group'; static TILEGROUPS_IN_APP_SWITCHER = 'tilegroups-in-app-switcher'; static WINDOW_GAP = 'window-gap'; static SINGLE_SCREEN_GAP = 'single-screen-gap'; static SCREEN_TOP_GAP = 'screen-top-gap'; static SCREEN_LEFT_GAP = 'screen-left-gap'; static SCREEN_RIGHT_GAP = 'screen-right-gap'; static SCREEN_BOTTOM_GAP = 'screen-bottom-gap'; static MAXIMIZE_WITH_GAPS = 'maximize-with-gap'; static DYNAMIC_KEYBINDINGS = 'dynamic-keybinding-behavior'; static ACTIVE_WINDOW_HINT = 'active-window-hint'; static ACTIVE_WINDOW_HINT_COLOR = 'active-window-hint-color'; static ACTIVE_WINDOW_HINT_BORDER_SIZE = 'active-window-hint-border-size'; static ACTIVE_WINDOW_HINT_INNER_BORDER_SIZE = 'active-window-hint-inner-border-size'; static SHOW_LAYOUT_INDICATOR = 'show-layout-panel-indicator'; static ENABLE_ADV_EXP_SETTINGS = 'enable-advanced-experimental-features'; static DISABLE_TILE_GROUPS = 'disable-tile-groups'; static ENABLE_TILE_ANIMATIONS = 'enable-tile-animations'; static ENABLE_UNTILE_ANIMATIONS = 'enable-untile-animations'; static FAVORITE_LAYOUTS = 'favorite-layouts'; static DEFAULT_MOVE_MODE = 'default-move-mode'; static LOW_PERFORMANCE_MOVE_MODE = 'low-performance-move-mode'; static MONITOR_SWITCH_GRACE_PERIOD = 'monitor-switch-grace-period'; static ADAPT_EDGE_TILING_TO_FAVORITE_LAYOUT = 'adapt-edge-tiling-to-favorite-layout'; static ADAPTIVE_TILING_MOD = 'move-adaptive-tiling-mod'; static FAVORITE_LAYOUT_MOD = 'move-favorite-layout-mod'; static IGNORE_TA_MOD = 'ignore-ta-mod'; static VERTICAL_PREVIEW_AREA = 'vertical-preview-area'; static HORIZONTAL_PREVIEW_AREA = 'horizontal-preview-area'; static INVERSE_TOP_MAXIMIZE_TIMER = 'toggle-maximize-tophalf-timer'; static ENABLE_HOLD_INVERSE_LANDSCAPE = 'enable-hold-maximize-inverse-landscape'; static ENABLE_HOLD_INVERSE_PORTRAIT = 'enable-hold-maximize-inverse-portrait'; static RESTORE_SIZE_ON = 'restore-window-size-on'; static initialize(gioSettings) { this._settings = gioSettings; } static destroy() { this._settings = null; } /** * @returns {Gio.Settings} the Gio.Settings object. */ static getGioObject() { return this._settings; } /** * Listens for the change of a setting. * * @param {string} key a settings key. * @param {*} func function to call when the setting changed. */ static changed(key, func) { return this._settings.connect(`changed::${key}`, func); } static disconnect(id) { this._settings.disconnect(id); } /** * @returns {string[]} the settings keys except the ones for shortcuts. */ static getAllKeys() { return [ this.ENABLE_TILING_POPUP, this.POPUP_ALL_WORKSPACES, this.RAISE_TILE_GROUPS, this.TILEGROUPS_IN_APP_SWITCHER, this.WINDOW_GAP, this.SINGLE_SCREEN_GAP, this.SCREEN_TOP_GAP, this.SCREEN_LEFT_GAP, this.SCREEN_RIGHT_GAP, this.SCREEN_BOTTOM_GAP, this.MAXIMIZE_WITH_GAPS, this.DYNAMIC_KEYBINDINGS, this.ACTIVE_WINDOW_HINT, this.ACTIVE_WINDOW_HINT_COLOR, this.ACTIVE_WINDOW_HINT_BORDER_SIZE, this.ACTIVE_WINDOW_HINT_INNER_BORDER_SIZE, this.SHOW_LAYOUT_INDICATOR, this.ENABLE_ADV_EXP_SETTINGS, this.DISABLE_TILE_GROUPS, this.ENABLE_TILE_ANIMATIONS, this.ENABLE_UNTILE_ANIMATIONS, this.FAVORITE_LAYOUTS, this.DEFAULT_MOVE_MODE, this.LOW_PERFORMANCE_MOVE_MODE, this.MONITOR_SWITCH_GRACE_PERIOD, this.ADAPT_EDGE_TILING_TO_FAVORITE_LAYOUT, this.ADAPTIVE_TILING_MOD, this.FAVORITE_LAYOUT_MOD, this.IGNORE_TA_MOD, this.VERTICAL_PREVIEW_AREA, this.HORIZONTAL_PREVIEW_AREA, this.INVERSE_TOP_MAXIMIZE_TIMER, this.ENABLE_HOLD_INVERSE_LANDSCAPE, this.ENABLE_HOLD_INVERSE_PORTRAIT, this.RESTORE_SIZE_ON ]; } /** * Getters */ static getEnum(key) { return this._settings.get_enum(key); } static getString(key) { return this._settings.get_string(key); } static getStrv(key) { return this._settings.get_strv(key); } static getInt(key) { return this._settings.get_int(key); } static getBoolean(key) { return this._settings.get_boolean(key); } static getValue(key) { return this._settings.get_value(key); } static getUserValue(key) { return this._settings.get_user_value(key); } /** * Setters */ static setEnum(key, value) { this._settings.set_enum(key, value); } static setString(key, value) { this._settings.set_string(key, value); } static setStrv(key, value) { this._settings.set_strv(key, value); } static setInt(key, value) { this._settings.set_int(key, value); } static setBoolean(key, value) { this._settings.set_boolean(key, value); } static setValue(key, value) { return this._settings.set_value(key, value); } static reset(key) { this._settings.reset(key); } } /** * A Singleton providing access to the shortcut keys except the * ones related to the Layouts. */ export class Shortcuts { static TOGGLE_POPUP = 'toggle-tiling-popup'; static EDIT_MODE = 'tile-edit-mode'; static AUTO_FILL = 'auto-tile'; static ALWAYS_ON_TOP = 'toggle-always-on-top'; static MAXIMIZE = 'tile-maximize'; static MAXIMIZE_V = 'tile-maximize-vertically'; static MAXIMIZE_H = 'tile-maximize-horizontally'; static RESTORE_WINDOW = 'restore-window'; static CENTER_WINDOW = 'center-window'; static TOP = 'tile-top-half'; static BOTTOM = 'tile-bottom-half'; static LEFT = 'tile-left-half'; static RIGHT = 'tile-right-half'; static TOP_LEFT = 'tile-topleft-quarter'; static TOP_RIGHT = 'tile-topright-quarter'; static BOTTOM_LEFT = 'tile-bottomleft-quarter'; static BOTTOM_RIGHT = 'tile-bottomright-quarter'; static TOP_IGNORE_TA = 'tile-top-half-ignore-ta'; static BOTTOM_IGNORE_TA = 'tile-bottom-half-ignore-ta'; static LEFT_IGNORE_TA = 'tile-left-half-ignore-ta'; static RIGHT_IGNORE_TA = 'tile-right-half-ignore-ta'; static TOP_LEFT_IGNORE_TA = 'tile-topleft-quarter-ignore-ta'; static TOP_RIGHT_IGNORE_TA = 'tile-topright-quarter-ignore-ta'; static BOTTOM_LEFT_IGNORE_TA = 'tile-bottomleft-quarter-ignore-ta'; static BOTTOM_RIGHT_IGNORE_TA = 'tile-bottomright-quarter-ignore-ta'; static DEBUGGING = 'debugging-show-tiled-rects'; static DEBUGGING_FREE_RECTS = 'debugging-free-rects'; /** * @returns {string[]} the settings keys for the shortcuts in the same * order as they appear in the preference window. */ static getAllKeys() { return [ this.TOGGLE_POPUP, this.EDIT_MODE, this.AUTO_FILL, this.ALWAYS_ON_TOP, this.MAXIMIZE, this.MAXIMIZE_V, this.MAXIMIZE_H, this.RESTORE_WINDOW, this.CENTER_WINDOW, this.TOP, this.BOTTOM, this.LEFT, this.RIGHT, this.TOP_LEFT, this.TOP_RIGHT, this.BOTTOM_LEFT, this.BOTTOM_RIGHT, this.TOP_IGNORE_TA, this.BOTTOM_IGNORE_TA, this.LEFT_IGNORE_TA, this.RIGHT_IGNORE_TA, this.TOP_LEFT_IGNORE_TA, this.TOP_RIGHT_IGNORE_TA, this.BOTTOM_LEFT_IGNORE_TA, this.BOTTOM_RIGHT_IGNORE_TA, this.DEBUGGING, this.DEBUGGING_FREE_RECTS ]; } } // Enums: export class RestoreOn { static ON_GRAB_START = 0; // Grab Start static ON_GRAB_END = 1; // 'Grab End' } export class DynamicKeybindings { // Order comes from prefs static DISABLED = 0; static FOCUS = 1; static TILING_STATE = 2; static TILING_STATE_WINDOWS = 3; static FAVORITE_LAYOUT = 4; } export class MoveModes { // Order comes from prefs static EDGE_TILING = 0; static ADAPTIVE_TILING = 1; static FAVORITE_LAYOUT = 2; static IGNORE_TA = 3; } export class Orientation { static H = 1; static V = 2; } export class Direction { static N = 1; static E = 2; static S = 4; static W = 8; static opposite(dir) { let opposite = 0; if (dir & this.N) opposite |= this.S; if (dir & this.S) opposite |= this.N; if (dir & this.W) opposite |= this.E; if (dir & this.E) opposite |= this.W; return opposite; } } // Classes for the layouts: // See src/prefs/layoutsPrefs.js for details on layouts. export class Layout { /** * @param {object} layout is the parsed object from the layouts file. */ constructor(layout = null) { this._name = layout?._name ?? ''; this._items = layout?._items ?? []; } /** * @returns {string} */ getName() { return this._name; } /** * @param {string} name */ setName(name) { this._name = name; } /** * @param {number} index * @returns {LayoutItem} */ getItem(index) { return this._items[index]; } /** * @param {LayoutItem|null} item * @returns {LayoutItem} the added item. */ addItem(item = null) { item = item ?? new LayoutItem(); this._items.push(item); return item; } /** * @param {number} index * @returns {LayoutItem|null} the removed item. */ removeItem(index) { return this._items.splice(index, 1)[0]; } /** * @param {boolean} filterOutEmptyRects * @returns {LayoutItem[]} */ getItems(filterOutEmptyRects = true) { return filterOutEmptyRects ? this._items.filter(i => Object.keys(i.rect).length === 4) : this._items; } /** * @param {LayoutItem[]} items */ setItems(items) { this._items = items; } /** * @param {boolean} filterOutEmptyRects * @returns {number} */ getItemCount(filterOutEmptyRects = false) { return filterOutEmptyRects ? this.getItems().length : this._items.length; } /** * @returns {[boolean, string]} whether the layout has valid rects and * a potential error message. */ validate() { const rects = this.getItems().map(i => i.rect); if (!rects.length) return [false, 'No valid rectangles defined.', -1]; const getOverlapArea = (r1, r2) => { return Math.max(0, Math.min(r1.x + r1.width, r2.x + r2.width) - Math.max(r1.x, r2.x)) * Math.max(0, Math.min(r1.y + r1.height, r2.y + r2.height) - Math.max(r1.y, r2.y)); }; for (let i = 0; i < rects.length; i++) { const rect = rects[i]; if (rect.width <= 0 || rect.width > 1) return [false, `Rectangle ${i} has an invalid width.`, i]; if (rect.height <= 0 || rect.height > 1) return [false, `Rectangle ${i} has an invalid height.`, i]; if (rect.x < 0 || rect.y < 0 || rect.x + rect.width > 1 || rect.y + rect.height > 1) return [false, `Rectangle ${i} extends beyond the screen.`, i]; for (let j = i + 1; j < rects.length; j++) { if (getOverlapArea(rect, rects[j]) !== 0) return [false, `Rectangles ${i} and ${j} overlap.`, j]; } } return [true, '', -1]; } } var LayoutItem = class LayoutItem { constructor() { this.rect = {}; this.appId = null; this.loopType = null; } };