mirror of
https://github.com/esjeon/krohnkite.git
synced 2024-10-04 07:18:09 +03:00
code cleanup
- remove expired TODOs - sorting and grouping parts - simplify geometry value assignment
This commit is contained in:
parent
9a987e1447
commit
6b40e423f1
@ -46,7 +46,6 @@ class KWinDriver {
|
||||
*/
|
||||
|
||||
public getWorkingArea(screenId: number): Rect {
|
||||
// TODO: verify: can each desktops have a different placement area?
|
||||
return Rect.from(
|
||||
workspace.clientArea(KWin.PlacementArea, screenId, workspace.currentDesktop),
|
||||
);
|
||||
@ -65,7 +64,6 @@ class KWinDriver {
|
||||
}
|
||||
|
||||
public isClientVisible(client: KWin.Client, screenId: number): boolean {
|
||||
// TODO: test KWin::Toplevel properties...?
|
||||
return (
|
||||
(!client.minimized) &&
|
||||
(client.desktop === workspace.currentDesktop
|
||||
@ -100,24 +98,6 @@ class KWinDriver {
|
||||
return str.split(",").map((part) => part.trim());
|
||||
}
|
||||
|
||||
Config.enableMonocleLayout = !!KWin.readConfig("enableMonocleLayout", true);
|
||||
debug(() => "enableMonocleLayout: " + Config.enableMonocleLayout);
|
||||
Config.enableSpreadLayout = !!KWin.readConfig("enableSpreadLayout", true);
|
||||
debug(() => "enableSpreadLayout: " + Config.enableSpreadLayout);
|
||||
Config.enableStairLayout = !!KWin.readConfig("enableStairLayout", true);
|
||||
debug(() => "enableStairLayout: " + Config.enableStairLayout);
|
||||
Config.enableTileLayout = !!KWin.readConfig("enableTileLayout", true);
|
||||
debug(() => "enableTileLayout: " + Config.enableTileLayout);
|
||||
Config.floatingClass = commanSeparate(KWin.readConfig("floatingClass", ""));
|
||||
debug(() => "floatingClass: " + Config.floatingClass);
|
||||
Config.floatUtility = KWin.readConfig("floatUtility", true);
|
||||
debug(() => "floatUtility: " + Config.floatUtility);
|
||||
Config.ignoreClass = commanSeparate(KWin.readConfig("ignoreClass",
|
||||
"krunner,yakuake,spectacle,kded5"));
|
||||
debug(() => "ignoreClass: " + Config.ignoreClass);
|
||||
Config.noTileBorder = !!KWin.readConfig("noTileBorder", false);
|
||||
debug(() => "noTileBorder: " + Config.noTileBorder);
|
||||
|
||||
Config.screenGapLeft = KWin.readConfig("screenGapLeft", 0);
|
||||
Config.screenGapRight = KWin.readConfig("screenGapRight", 0);
|
||||
Config.screenGapTop = KWin.readConfig("screenGapTop", 0);
|
||||
@ -127,8 +107,28 @@ class KWinDriver {
|
||||
debug(() => "screenGapTop : " + Config.screenGapTop);
|
||||
debug(() => "screenGapBottom: " + Config.screenGapBottom);
|
||||
|
||||
Config.enableMonocleLayout = !!KWin.readConfig("enableMonocleLayout", true);
|
||||
Config.enableSpreadLayout = !!KWin.readConfig("enableSpreadLayout", true);
|
||||
Config.enableStairLayout = !!KWin.readConfig("enableStairLayout", true);
|
||||
Config.enableTileLayout = !!KWin.readConfig("enableTileLayout", true);
|
||||
debug(() => "enableMonocleLayout: " + Config.enableMonocleLayout);
|
||||
debug(() => "enableSpreadLayout: " + Config.enableSpreadLayout);
|
||||
debug(() => "enableStairLayout: " + Config.enableStairLayout);
|
||||
debug(() => "enableTileLayout: " + Config.enableTileLayout);
|
||||
|
||||
Config.tileLayoutGap = KWin.readConfig("tileLayoutGap", 0);
|
||||
debug(() => "tileLayoutGap: " + Config.tileLayoutGap);
|
||||
|
||||
Config.floatingClass = commanSeparate(KWin.readConfig("floatingClass", ""));
|
||||
Config.floatUtility = !!KWin.readConfig("floatUtility", true);
|
||||
Config.ignoreClass = commanSeparate(KWin.readConfig("ignoreClass",
|
||||
"krunner,yakuake,spectacle,kded5"));
|
||||
debug(() => "floatingClass: " + Config.floatingClass);
|
||||
debug(() => "floatUtility: " + Config.floatUtility);
|
||||
debug(() => "ignoreClass: " + Config.ignoreClass);
|
||||
|
||||
Config.noTileBorder = !!KWin.readConfig("noTileBorder", false);
|
||||
debug(() => "noTileBorder: " + Config.noTileBorder);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -181,41 +181,48 @@ class KWinDriver {
|
||||
|
||||
private bindEvents() {
|
||||
workspace.clientAdded.connect(this.onClientAdded);
|
||||
workspace.clientRemoved.connect(this.onClientRemoved);
|
||||
workspace.numberScreensChanged.connect(this.onNumberScreensChanged);
|
||||
|
||||
workspace.clientFullScreenSet.connect(this.engine.arrange);
|
||||
workspace.clientMinimized.connect(this.engine.arrange);
|
||||
workspace.clientRemoved.connect(this.onClientRemoved);
|
||||
workspace.clientUnminimized.connect(this.engine.arrange);
|
||||
workspace.currentDesktopChanged.connect(this.engine.arrange);
|
||||
workspace.numberScreensChanged.connect(this.onNumberScreensChanged);
|
||||
workspace.screenResized.connect(this.engine.arrange);
|
||||
workspace.currentActivityChanged.connect(this.engine.arrange);
|
||||
workspace.currentDesktopChanged.connect(this.engine.arrange);
|
||||
workspace.screenResized.connect(this.engine.arrange);
|
||||
|
||||
// TODO: options.configChanged.connect(this.onConfigChanged);
|
||||
/* NOTE: How disappointing. This doesn't work at all. Even an official kwin script tries this.
|
||||
* https://github.com/KDE/kwin/blob/master/scripts/minimizeall/contents/code/main.js */
|
||||
}
|
||||
|
||||
private bindClientEvents(client: KWin.Client) {
|
||||
client.activitiesChanged.connect(() => {
|
||||
this.engine.arrange();
|
||||
});
|
||||
|
||||
client.desktopChanged.connect(this.engine.arrange);
|
||||
|
||||
client.geometryChanged.connect(() => {
|
||||
if (client.move || client.resize) return;
|
||||
this.engine.arrangeClient(client);
|
||||
});
|
||||
|
||||
client.moveResizedChanged.connect(() => {
|
||||
if (client.move || client.resize) return;
|
||||
this.engine.setClientFloat(client, true, client.geometry);
|
||||
this.engine.arrange();
|
||||
});
|
||||
}
|
||||
|
||||
private onClientAdded = (client: KWin.Client) => {
|
||||
if (client.specialWindow) return;
|
||||
if (String(client.resourceClass) === "plasmashell") return;
|
||||
|
||||
debug(() => "onClientAdded: '" + client.caption + "' class=" + client.resourceClass);
|
||||
|
||||
if (this.engine.manageClient(client)) {
|
||||
client.desktopChanged.connect(this.engine.arrange);
|
||||
client.geometryChanged.connect(() => {
|
||||
if (client.move || client.resize) return;
|
||||
this.engine.arrangeClient(client);
|
||||
});
|
||||
client.moveResizedChanged.connect(() => {
|
||||
if (client.move || client.resize) return;
|
||||
this.engine.setClientFloat(client, true, client.geometry);
|
||||
this.engine.arrange();
|
||||
});
|
||||
client.activitiesChanged.connect(() => {
|
||||
this.engine.arrange();
|
||||
});
|
||||
}
|
||||
if (this.engine.manageClient(client))
|
||||
this.bindClientEvents(client);
|
||||
}
|
||||
|
||||
private onClientRemoved = (client: KWin.Client) => {
|
||||
|
@ -38,30 +38,32 @@ class Screen {
|
||||
class Tile {
|
||||
public arrangeCount: number;
|
||||
public client: KWin.Client;
|
||||
public floatGeometry: Rect;
|
||||
public floating: boolean;
|
||||
public geometry: Rect;
|
||||
public isError: boolean;
|
||||
public floatGeometry: Rect;
|
||||
|
||||
constructor(client: KWin.Client, geometry: Rect) {
|
||||
this.arrangeCount = 0;
|
||||
this.client = client;
|
||||
this.floatGeometry = Rect.from(geometry);
|
||||
this.floating = false;
|
||||
this.geometry = Rect.from(geometry);
|
||||
this.isError = false;
|
||||
this.floatGeometry = Rect.from(geometry);
|
||||
}
|
||||
}
|
||||
|
||||
class TilingEngine {
|
||||
public screens: Screen[];
|
||||
|
||||
private driver: KWinDriver;
|
||||
private tiles: Tile[];
|
||||
|
||||
constructor(driver: KWinDriver) {
|
||||
this.screens = Array();
|
||||
|
||||
this.driver = driver;
|
||||
this.tiles = Array();
|
||||
this.screens = Array();
|
||||
}
|
||||
|
||||
public arrange = () => {
|
||||
@ -98,13 +100,12 @@ class TilingEngine {
|
||||
|
||||
if (Config.noTileBorder) {
|
||||
visibles.forEach((tile) => {
|
||||
if (this.driver.isClientFullScreen(tile.client)) {
|
||||
if (this.driver.isClientFullScreen(tile.client))
|
||||
tile.client.noBorder = false;
|
||||
} else if (tile.floating) {
|
||||
else if (tile.floating)
|
||||
tile.client.noBorder = false;
|
||||
} else /* tileable */ {
|
||||
else /* tileable */
|
||||
tile.client.noBorder = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -139,7 +140,6 @@ class TilingEngine {
|
||||
if (floating)
|
||||
this.setFloat(tile, true);
|
||||
|
||||
/* TODO: apply logical layer separation */
|
||||
if (client.modal)
|
||||
this.setFloat(tile, true);
|
||||
|
||||
@ -346,7 +346,6 @@ class TilingEngine {
|
||||
}
|
||||
|
||||
private isTileVisible = (tile: Tile, screen: Screen): boolean => {
|
||||
// TODO: `engine` should define what "visible" means, not `driver`.
|
||||
try {
|
||||
return this.driver.isClientVisible(tile.client, screen.id);
|
||||
} catch (e) {
|
||||
|
47
src/kwin.d.ts
vendored
47
src/kwin.d.ts
vendored
@ -50,29 +50,29 @@ declare namespace KWin {
|
||||
|
||||
interface WorkspaceWrapper {
|
||||
/* read-only */
|
||||
readonly numScreens: number;
|
||||
readonly currentActivity: string;
|
||||
readonly numScreens: number;
|
||||
|
||||
/* read-write */
|
||||
currentDesktop: number;
|
||||
activeClient: KWin.Client;
|
||||
currentDesktop: number;
|
||||
/* NOTE: if no window is present, this points to desktop. */
|
||||
|
||||
/* signals */
|
||||
clientAdded: QSignal;
|
||||
clientRemoved: QSignal;
|
||||
numberScreensChanged: QSignal;
|
||||
clientMinimized: QSignal;
|
||||
clientUnminimized: QSignal;
|
||||
currentDesktopChanged: QSignal;
|
||||
screenResized: QSignal;
|
||||
clientMaximizeSet: QSignal;
|
||||
clientFullScreenSet: QSignal;
|
||||
currentActivityChanged: QSignal;
|
||||
activitiesChanged: QSignal;
|
||||
activityAdded: QSignal;
|
||||
activityRemoved: QSignal;
|
||||
clientAdded: QSignal;
|
||||
clientFullScreenSet: QSignal;
|
||||
clientMaximizeSet: QSignal;
|
||||
clientMinimized: QSignal;
|
||||
clientRemoved: QSignal;
|
||||
clientUnminimized: QSignal;
|
||||
currentActivityChanged: QSignal;
|
||||
currentDesktopChanged: QSignal;
|
||||
numberDesktopsChanged: QSignal;
|
||||
numberScreensChanged: QSignal;
|
||||
screenResized: QSignal;
|
||||
|
||||
/* functions */
|
||||
clientList(): Client[];
|
||||
@ -86,41 +86,40 @@ declare namespace KWin {
|
||||
|
||||
interface Toplevel {
|
||||
/* read-only */
|
||||
readonly screen: number;
|
||||
readonly resourceName: string;
|
||||
readonly resourceClass: string;
|
||||
readonly windowRole: string;
|
||||
readonly activities: string[];
|
||||
/* Not exactly an `Array`, but still quite compatible. */
|
||||
readonly activities: string[]; /* Not exactly `Array` */
|
||||
readonly dialog: boolean;
|
||||
readonly resourceClass: string;
|
||||
readonly resourceName: string;
|
||||
readonly screen: number;
|
||||
readonly splash: boolean;
|
||||
readonly utility: boolean;
|
||||
readonly windowRole: string;
|
||||
|
||||
/* signal */
|
||||
geometryChanged: QSignal;
|
||||
activitiesChanged: QSignal;
|
||||
geometryChanged: QSignal;
|
||||
}
|
||||
|
||||
interface Client extends Toplevel {
|
||||
/* read-only */
|
||||
readonly caption: string;
|
||||
readonly maxSize: QSize;
|
||||
readonly minSize: QSize;
|
||||
readonly modal: boolean;
|
||||
readonly move: boolean;
|
||||
readonly resize: boolean;
|
||||
readonly specialWindow: boolean;
|
||||
readonly modal: boolean;
|
||||
readonly resizeable: boolean;
|
||||
readonly minSize: QSize;
|
||||
readonly maxSize: QSize;
|
||||
readonly specialWindow: boolean;
|
||||
|
||||
/* read-write */
|
||||
desktop: number;
|
||||
onAllDesktops: boolean;
|
||||
fullScreen: boolean;
|
||||
geometry: QRect;
|
||||
keepAbove: boolean;
|
||||
keepBelow: boolean;
|
||||
minimized: boolean;
|
||||
noBorder: boolean;
|
||||
onAllDesktops: boolean;
|
||||
|
||||
/* signals */
|
||||
desktopChanged: QSignal;
|
||||
|
@ -59,20 +59,21 @@ class TileLayout implements ILayout {
|
||||
|
||||
const stackX = (masterWidth > 0) ? masterWidth + 1 + halfgap : 0;
|
||||
|
||||
for (let i = 0; i < masterCount; i++) {
|
||||
tiles[i].geometry.x = area.x;
|
||||
tiles[i].geometry.y = area.y + (masterHeight + gap) * i;
|
||||
tiles[i].geometry.width = masterWidth;
|
||||
tiles[i].geometry.height = masterHeight;
|
||||
}
|
||||
for (let i = 0; i < masterCount; i++)
|
||||
tiles[i].geometry.set(
|
||||
area.x,
|
||||
area.y + (masterHeight + gap) * i,
|
||||
masterWidth,
|
||||
masterHeight,
|
||||
);
|
||||
|
||||
for (let i = 0; i < stackCount; i++) {
|
||||
const j = masterCount + i;
|
||||
tiles[j].geometry.x = area.x + stackX;
|
||||
tiles[j].geometry.y = area.y + (stackHeight + gap) * i;
|
||||
tiles[j].geometry.width = stackWidth;
|
||||
tiles[j].geometry.height = stackHeight;
|
||||
}
|
||||
for (let i = 0; i < stackCount; i++)
|
||||
tiles[masterCount + i].geometry.set(
|
||||
area.x + stackX,
|
||||
area.y + (stackHeight + gap) * i,
|
||||
stackWidth,
|
||||
stackHeight,
|
||||
);
|
||||
}
|
||||
|
||||
public handleUserInput(input: UserInput) {
|
||||
@ -120,7 +121,6 @@ class MonocleLayout implements ILayout {
|
||||
return Config.enableMonocleLayout;
|
||||
}
|
||||
}
|
||||
// TODO: ColumnLayout
|
||||
|
||||
class SpreadLayout implements ILayout {
|
||||
private space: number; /* in ratio */
|
||||
|
Loading…
Reference in New Issue
Block a user