update
This commit is contained in:
74
desktop@marha.de/app.js
Normal file
74
desktop@marha.de/app.js
Normal file
@@ -0,0 +1,74 @@
|
||||
import Meta from 'gi://Meta';
|
||||
import St from 'gi://St';
|
||||
|
||||
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||
|
||||
import {CalendarPanel} from './calendar.js';
|
||||
import {NotesPanel} from './notes.js';
|
||||
import {Store} from './store.js';
|
||||
import {Sync} from './sync.js';
|
||||
import {TodoPanel} from './todos.js';
|
||||
|
||||
// Die eigentliche Extension. extension.js lädt dieses Modul bei jedem Einschalten frisch,
|
||||
// der Zustand liegt auf dem Extension-Objekt (ext), damit Tests und D-Bus ihn dort finden.
|
||||
|
||||
const MARGIN = 24;
|
||||
|
||||
export function enable(ext) {
|
||||
ext._store = new Store();
|
||||
|
||||
// Nur die Panels sind reaktiv. Der Rest lässt Klicks zum Desktop durch.
|
||||
ext._root = new St.BoxLayout({style_class: 'desktop-root', reactive: false});
|
||||
ext._notes = new NotesPanel(ext._store);
|
||||
ext._root.add_child(ext._notes);
|
||||
// Rechte Spalte füllt den Rest, der Abstand dazwischen entspricht dem Außenrand.
|
||||
const right = new St.BoxLayout({vertical: true, style_class: 'desktop-right', reactive: false, x_expand: true});
|
||||
right.add_child(new CalendarPanel(ext._store));
|
||||
right.add_child(new TodoPanel(ext._store));
|
||||
ext._root.add_child(right);
|
||||
|
||||
global.window_group.add_child(ext._root);
|
||||
ext._restackId = global.display.connect('restacked', () => restack(ext));
|
||||
ext._mapId = global.window_manager.connect('map', () => restack(ext));
|
||||
ext._workareaId = global.display.connect('workareas-changed', () => layout(ext));
|
||||
layout(ext);
|
||||
restack(ext);
|
||||
|
||||
ext._sync = new Sync(ext._store);
|
||||
ext._sync.start();
|
||||
}
|
||||
|
||||
export function disable(ext) {
|
||||
ext._sync.stop();
|
||||
ext._sync = null;
|
||||
global.display.disconnect(ext._restackId);
|
||||
global.window_manager.disconnect(ext._mapId);
|
||||
global.display.disconnect(ext._workareaId);
|
||||
ext._root.destroy();
|
||||
ext._root = null;
|
||||
ext._notes = null;
|
||||
ext._store = null;
|
||||
}
|
||||
|
||||
// Füllt den Arbeitsbereich des Hauptmonitors (ohne Topbar und Dock). Notizen nehmen die halbe Bildschirmbreite.
|
||||
function layout(ext) {
|
||||
const area = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex);
|
||||
ext._root.set_position(area.x + MARGIN, area.y + MARGIN);
|
||||
ext._root.set_size(area.width - 2 * MARGIN, area.height - 2 * MARGIN);
|
||||
ext._notes.set_width(Math.round(Main.layoutManager.primaryMonitor.width / 2));
|
||||
}
|
||||
|
||||
// Liegt direkt über Desktop-Fenstern (z.B. Desktop Icons), sonst direkt über dem Wallpaper.
|
||||
// Mutter sortiert die Fensterebene bei jedem Restack neu, daher hier nachziehen.
|
||||
function restack(ext) {
|
||||
let below = Main.layoutManager._backgroundGroup;
|
||||
for (const actor of global.window_group.get_children()) {
|
||||
if (!(actor instanceof Meta.WindowActor))
|
||||
continue;
|
||||
const window = actor.meta_window;
|
||||
const isDing = window.customJS_ding || window.title?.startsWith('Desktop Icons');
|
||||
if (isDing || window.window_type === Meta.WindowType.DESKTOP)
|
||||
below = actor;
|
||||
}
|
||||
global.window_group.set_child_above_sibling(ext._root, below);
|
||||
}
|
||||
Reference in New Issue
Block a user