code cleanup

- remove expired TODOs
 - sorting and grouping parts
 - simplify geometry value assignment
This commit is contained in:
Eon S. Jeon 2018-12-08 01:10:55 +09:00
parent 9a987e1447
commit 6b40e423f1
4 changed files with 91 additions and 86 deletions

View File

@ -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) => {

View File

@ -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
View File

@ -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;

View File

@ -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 */