Compare commits
1
Commits
v0.2.5
..
609d4c1dae
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
609d4c1dae |
No files matched your search
@@ -1,3 +0,0 @@
|
||||
[tools]
|
||||
node = "26"
|
||||
pnpm = "12.3.4"
|
||||
@@ -0,0 +1 @@
|
||||
25
|
||||
@@ -28,65 +28,3 @@ MacOS tiling WMs, mainly [Aerospace](https://github.com/nikitabobko/AeroSpace) (
|
||||
- complicated window dragging features and uis
|
||||
- Aerospace supports control + drag to combine windows while moving with the mouse, and normal window dragging.
|
||||
|
||||
## Installation
|
||||
|
||||
Aerospike isn't on the GNOME extension store yet, so install it from source.
|
||||
This builds the extension locally and drops it into your user's extension dir.
|
||||
Requires [just](https://github.com/casey/just) as the command runner, plus the
|
||||
same build toolchain used for development (see [Development](#development)):
|
||||
[mise](https://mise.jdx.dev/) for managing tool versions (`node` and `pnpm`),
|
||||
and `glib2` for `glib-compile-schemas`.
|
||||
|
||||
Arch Linux:
|
||||
|
||||
```bash
|
||||
sudo pacman -S git just mise glib2 # mise needs its shell hook: https://mise.jdx.dev/getting-started.html#shells
|
||||
```
|
||||
|
||||
Clone and install:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/lucasoskorep/aerospike-gnome
|
||||
cd aerospike-gnome
|
||||
mise install
|
||||
just install
|
||||
```
|
||||
|
||||
After installing from source, enable it (toggle in the Extensions app, or):
|
||||
|
||||
```bash
|
||||
gnome-extensions enable aerospike@lucaso.io
|
||||
```
|
||||
|
||||
Re-login or restart the shell (`Alt+F2` → `r` on X11) to pick it up.
|
||||
|
||||
## Development
|
||||
|
||||
Building and debugging locally needs a few extra tools:
|
||||
|
||||
- `just` — the command runner
|
||||
- `mise` — runtime & tool manager (pins `node` and `pnpm` in `.mise.toml`)
|
||||
- `glib2` — provides `glib-compile-schemas` for compiling the settings schema
|
||||
|
||||
Arch Linux:
|
||||
|
||||
```bash
|
||||
sudo pacman -S just mise glib2
|
||||
```
|
||||
|
||||
Install the pinned tools with mise (defined in `.mise.toml`):
|
||||
|
||||
```bash
|
||||
mise install
|
||||
```
|
||||
|
||||
Then:
|
||||
|
||||
```bash
|
||||
just install # install deps + build + drop into the extension dir
|
||||
just lint # lint
|
||||
just test # run the test suite
|
||||
just test-watch # run tests in watch mode
|
||||
just live-debug # tail gnome-shell logs while you poke at it
|
||||
```
|
||||
|
||||
Vendored
+10
-12
@@ -1,13 +1,11 @@
|
||||
import "@girs/gjs/ambient";
|
||||
import "@girs/gjs";
|
||||
import "@girs/gjs/dom";
|
||||
import "@girs/glib-2.0/ambient";
|
||||
import "@girs/gio-2.0/ambient";
|
||||
import "@girs/gobject-2.0/ambient";
|
||||
import "@girs/gtk-4.0/ambient";
|
||||
import "@girs/gdk-4.0/ambient";
|
||||
import "@girs/adw-1/ambient";
|
||||
import "@girs/pango-1.0/ambient";
|
||||
import "@girs/clutter-51/ambient";
|
||||
import "@girs/st-51/ambient";
|
||||
import "@girs/meta-51/ambient";
|
||||
import "@girs/shell-51/ambient";
|
||||
import "@girs/gnome-shell/ambient";
|
||||
import "@girs/gnome-shell/extensions/global";
|
||||
|
||||
// Extend Meta.Window with our custom property
|
||||
declare namespace Meta {
|
||||
interface Window {
|
||||
_aerospikeData?: any;
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
import eslint from "@eslint/js";
|
||||
import tseslint from "typescript-eslint";
|
||||
import jsdoc from "eslint-plugin-jsdoc";
|
||||
|
||||
export default tseslint.config(
|
||||
eslint.configs.recommended,
|
||||
...tseslint.configs.recommended,
|
||||
jsdoc.configs["flat/recommended-typescript"],
|
||||
{
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
projectService: true,
|
||||
tsconfigRootDir: import.meta.dirname,
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
"jsdoc/require-jsdoc": "off",
|
||||
"jsdoc/require-param-description": "off",
|
||||
"jsdoc/require-returns-description": "off",
|
||||
"jsdoc/require-returns": "off",
|
||||
"@typescript-eslint/no-unused-vars": [
|
||||
"warn",
|
||||
{ argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
ignores: ["dist/", "node_modules/", "*.js"],
|
||||
},
|
||||
);
|
||||
+3
-4
@@ -1,14 +1,13 @@
|
||||
{
|
||||
"name": "Aerospike WM",
|
||||
"name": "aerospike",
|
||||
"description": "I3 Like Tiling Window Manager for Gnome",
|
||||
"uuid": "aerospike@lucaso.io",
|
||||
"settings-schema": "org.gnome.shell.extensions.aerospike",
|
||||
"shell-version": [
|
||||
"48",
|
||||
"49",
|
||||
"50",
|
||||
"51"
|
||||
"50"
|
||||
],
|
||||
"gettext-domain": "aerospike@lucaso.io",
|
||||
"url": "https://github.com/lucasoskorep/aerospike-gnome"
|
||||
"url": "https://gitea.chaosdev.gay/lucasoskorep/aerospike@lucaso.io"
|
||||
}
|
||||
+12
-22
@@ -1,8 +1,7 @@
|
||||
{
|
||||
"name": "aerospike",
|
||||
"version": "0.2.5",
|
||||
"version": "0.2.4",
|
||||
"description": "Simple, Opinionated Tiling Window Manager for Gnome written in Typescript",
|
||||
"packageManager": "pnpm@12.3.4",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"repository": {
|
||||
@@ -25,26 +24,17 @@
|
||||
"test:coverage": "jest --coverage"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^10.0.1",
|
||||
"@girs/adw-1": "^5.5.0",
|
||||
"@girs/clutter-51": "^5.5.0",
|
||||
"@girs/gio-2.0": "^5.5.0",
|
||||
"@girs/gjs": "^5.5.0",
|
||||
"@girs/glib-2.0": "^5.5.0",
|
||||
"@girs/gobject-2.0": "^5.5.0",
|
||||
"@girs/gdk-4.0": "^5.5.0",
|
||||
"@girs/gtk-4.0": "^5.5.0",
|
||||
"@girs/meta-51": "^5.5.0",
|
||||
"@girs/pango-1.0": "^5.5.0",
|
||||
"@girs/shell-51": "^5.5.0",
|
||||
"@girs/st-51": "^5.5.0",
|
||||
"@jest/globals": "^30.5.2",
|
||||
"@girs/gjs": "4.0.4",
|
||||
"@girs/gnome-shell": "50.0.0",
|
||||
"@jest/globals": "^30.4.1",
|
||||
"@types/jest": "^30.0.0",
|
||||
"eslint": "^10.12.0",
|
||||
"eslint-plugin-jsdoc": "^65.3.4",
|
||||
"jest": "^30.5.2",
|
||||
"ts-jest": "^29.4.14",
|
||||
"typescript": "^6.0.3",
|
||||
"typescript-eslint": "^8.71.2"
|
||||
"eslint": "^10.5.0",
|
||||
"eslint-plugin-jsdoc": "^63.0.2",
|
||||
"jest": "^30.4.2",
|
||||
"ts-jest": "^29.4.11",
|
||||
"typescript": "^6.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@girs/mtk-17": "17.0.0-4.0.4"
|
||||
}
|
||||
}
|
||||
Generated
+1279
-1652
File diff suppressed because it is too large.
Load diff
@@ -1,5 +1,2 @@
|
||||
allowBuilds:
|
||||
'@parcel/watcher': true
|
||||
unrs-resolver: true
|
||||
minimumReleaseAgeExclude:
|
||||
- eslint-plugin-jsdoc@65.3.4
|
||||
+1
-3
@@ -21,9 +21,7 @@ export class TabBar {
|
||||
this._onTabClicked = onTabClicked;
|
||||
this._bar = new St.BoxLayout({
|
||||
style_class: 'aerospike-tab-bar',
|
||||
// `vertical` was removed from St widgets in GNOME Shell 51 (deprecated
|
||||
// in 48); `orientation` is its replacement and exists in 48 and later.
|
||||
orientation: Clutter.Orientation.HORIZONTAL,
|
||||
vertical: false,
|
||||
reactive: true,
|
||||
can_focus: false,
|
||||
track_hover: false,
|
||||
|
||||
+2
-3
@@ -10,15 +10,14 @@
|
||||
"target": "ES2022",
|
||||
"lib": [
|
||||
"ES2022"
|
||||
]
|
||||
],
|
||||
},
|
||||
"include": [
|
||||
"ambient.d.ts",
|
||||
"types/**/*.d.ts",
|
||||
"prefs.ts",
|
||||
"src/**/*"
|
||||
],
|
||||
"files": [
|
||||
"extension.ts"
|
||||
]
|
||||
],
|
||||
}
|
||||
Vendored
-20
@@ -1,20 +0,0 @@
|
||||
/**
|
||||
* GNOME Shell runtime globals.
|
||||
*
|
||||
* The `global` object is created by the shell before an extension is loaded and
|
||||
* has no `.gir`, so it is not covered by the generated `@girs/*-51` packages.
|
||||
* Upstream ships these in `@girs/gnome-shell`, but its GNOME 51 build
|
||||
* (51.0.0-alpha.1) is unpublished, and v50 pulls St-18/Meta-18 types that
|
||||
* collide with the -51 packages. Declaring the few symbols we use keeps the
|
||||
* project on GNOME 51 types and installable from the registry.
|
||||
*
|
||||
* @see https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/environment.js
|
||||
*/
|
||||
import type Shell from "@girs/shell-51";
|
||||
|
||||
declare global {
|
||||
/** Global shell object created by GNOME Shell on startup. */
|
||||
const global: Shell.Global;
|
||||
}
|
||||
|
||||
export {};
|
||||
Vendored
-131
@@ -1,131 +0,0 @@
|
||||
/**
|
||||
* Ambient declarations for the GNOME Shell JavaScript modules this extension
|
||||
* imports.
|
||||
*
|
||||
* Shell's JavaScript API has no `.gir`, so generated `@girs/*` types do not
|
||||
* cover it. Upstream maintains those types in `@girs/gnome-shell`, but its
|
||||
* GNOME 51 support (51.0.0-alpha.1) is unpublished on npm, and v50 depends on
|
||||
* St-18/Meta-18 types that conflict with the -51 packages this project uses.
|
||||
* Only the symbols actually imported here are declared; extend as needed.
|
||||
*
|
||||
* @see https://gitlab.gnome.org/GNOME/gnome-shell/-/tree/main/js/ui
|
||||
*/
|
||||
|
||||
declare module "resource:///org/gnome/shell/extensions/extension.js" {
|
||||
import type Gio from "@girs/gio-2.0";
|
||||
|
||||
/** Parsed contents of the extension's `metadata.json`. */
|
||||
export interface ExtensionMetadata {
|
||||
uuid: string;
|
||||
name: string;
|
||||
description: string;
|
||||
"shell-version"?: string[];
|
||||
"settings-schema"?: string;
|
||||
"gettext-domain"?: string;
|
||||
url?: string;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* Base class for an extension's `extension.js` default export.
|
||||
*
|
||||
* GNOME Shell 51 requires `disable()` to stay synchronous; returning a
|
||||
* promise now throws.
|
||||
*/
|
||||
export class Extension {
|
||||
constructor(metadata: ExtensionMetadata);
|
||||
|
||||
readonly metadata: ExtensionMetadata;
|
||||
readonly uuid: string;
|
||||
readonly path: string;
|
||||
|
||||
/** Returns a {@link Gio.Settings} for the extension's schema. */
|
||||
getSettings(schema?: string | null, subdir?: string | null): Gio.Settings;
|
||||
|
||||
/** Marks the extension's settings as translatable. */
|
||||
translateConfig(): void;
|
||||
|
||||
/** Opens the extension's preferences dialog, if it has one. */
|
||||
openPreferences(): void;
|
||||
|
||||
enable(): void;
|
||||
disable(): void;
|
||||
}
|
||||
}
|
||||
|
||||
declare module "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" {
|
||||
import type Gio from "@girs/gio-2.0";
|
||||
import type Adw from "@girs/adw-1";
|
||||
|
||||
/** Marks a string for translation and returns the translation. */
|
||||
export function gettext(str: string): string;
|
||||
|
||||
/** Pluralised form of {@link gettext}. */
|
||||
export function ngettext(fid: string, fidPlural: string, n: number): string;
|
||||
|
||||
/** Context-sensitive form of {@link gettext}. */
|
||||
export function pgettext(context: string, str: string): string;
|
||||
|
||||
/** Base class for an extension's `prefs.js` default export. */
|
||||
export class ExtensionPreferences {
|
||||
readonly metadata: Record<string, unknown>;
|
||||
readonly uuid: string;
|
||||
readonly path: string;
|
||||
|
||||
/** Returns a {@link Gio.Settings} for the extension's schema. */
|
||||
getSettings(schema?: string | null, subdir?: string | null): Gio.Settings;
|
||||
|
||||
/** Marks the extension's settings as translatable. */
|
||||
translateConfig(): void;
|
||||
|
||||
/** Called by the shell to populate the preferences window. */
|
||||
fillPreferencesWindow(window: Adw.PreferencesWindow): Promise<void> | void;
|
||||
}
|
||||
}
|
||||
|
||||
declare module "resource:///org/gnome/shell/ui/main.js" {
|
||||
import type Gio from "@girs/gio-2.0";
|
||||
import type Meta from "@girs/meta-51";
|
||||
import type Shell from "@girs/shell-51";
|
||||
import type St from "@girs/st-51";
|
||||
|
||||
/** Window management helpers exposed to extensions. */
|
||||
export interface ShellWM {
|
||||
/**
|
||||
* Registers a keybinding from an extension's schema and returns its id.
|
||||
*/
|
||||
addKeybinding(
|
||||
name: string,
|
||||
settings: Gio.Settings,
|
||||
flags: Meta.KeyBindingFlags,
|
||||
mode: Shell.ActionMode,
|
||||
handler: () => void,
|
||||
): number;
|
||||
|
||||
/** Removes a keybinding previously added by this extension. */
|
||||
removeKeybinding(name: string): boolean;
|
||||
}
|
||||
|
||||
/** The shell's layout manager. */
|
||||
export interface LayoutManager {
|
||||
/** Actor holding all non-window UI. */
|
||||
readonly uiGroup: St.Widget;
|
||||
/** Actor holding the window group. */
|
||||
readonly windowGroup: St.Widget;
|
||||
readonly panelBox: St.BoxLayout;
|
||||
readonly monitorManager: Meta.MonitorManager;
|
||||
readonly nMonitors: number;
|
||||
}
|
||||
|
||||
/** The overview (window overview + search). */
|
||||
export interface Overview extends St.Widget {
|
||||
connect(signal: "showing" | "hiding" | "show-overview", callback: () => void): number;
|
||||
}
|
||||
|
||||
export const wm: ShellWM;
|
||||
export const layoutManager: LayoutManager;
|
||||
export const overview: Overview;
|
||||
|
||||
/** Shows a notification in the message tray. */
|
||||
export function notify(message: string): void;
|
||||
}
|
||||
Reference in new issue
Block a user