refactor: ♻️ improve logging

This commit is contained in:
Mikhail Zolotukhin 2021-10-12 14:02:49 +03:00 committed by GitHub
parent d989261d82
commit fadcaeac95
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 334 additions and 249 deletions

View File

@ -11,7 +11,7 @@
<group name=""> <group name="">
<entry name="debug" type="Bool"> <entry name="debug" type="Bool">
<label>Print debug messages</label> <label>Enable logging</label>
<default>false</default> <default>false</default>
</entry> </entry>

View File

@ -626,8 +626,7 @@
<string>Use this option to debug the script or submit detailed bug report.</string> <string>Use this option to debug the script or submit detailed bug report.</string>
</property> </property>
<property name="text"> <property name="text">
<string>Print debug messages <string>Enable logging</string>
(must run KWin from terminal)</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -27,7 +27,7 @@ Item {
} }
Component.onCompleted: { Component.onCompleted: {
console.log("Bismuth: Initiating the script"); console.log("[Bismuth] Initiating the script");
const qmlObjects = { const qmlObjects = {
scriptRoot: scriptRoot, scriptRoot: scriptRoot,

View File

@ -8,9 +8,12 @@ import { createMock } from "ts-auto-mock";
import { Engine } from "../engine"; import { Engine } from "../engine";
import { WindowsLayout } from "../engine/layout"; import { WindowsLayout } from "../engine/layout";
import Window from "../engine/window"; import Window from "../engine/window";
import { NullLog } from "../util/log";
import * as Action from "./action"; import * as Action from "./action";
describe("action", () => { describe("action", () => {
const fakeLog = new NullLog();
describe("focus", () => { describe("focus", () => {
let fakeEngine: Engine; let fakeEngine: Engine;
beforeEach(() => { beforeEach(() => {
@ -25,7 +28,7 @@ describe("action", () => {
describe("up", () => { describe("up", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.FocusUpperWindow(fakeEngine); const action = new Action.FocusUpperWindow(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -35,7 +38,7 @@ describe("action", () => {
describe("down", () => { describe("down", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.FocusBottomWindow(fakeEngine); const action = new Action.FocusBottomWindow(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -45,7 +48,7 @@ describe("action", () => {
describe("left", () => { describe("left", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.FocusLeftWindow(fakeEngine); const action = new Action.FocusLeftWindow(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -55,7 +58,7 @@ describe("action", () => {
describe("right", () => { describe("right", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.FocusRightWindow(fakeEngine); const action = new Action.FocusRightWindow(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -65,7 +68,7 @@ describe("action", () => {
describe("next", () => { describe("next", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.FocusNextWindow(fakeEngine); const action = new Action.FocusNextWindow(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -75,7 +78,7 @@ describe("action", () => {
describe("prev", () => { describe("prev", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.FocusPreviousWindow(fakeEngine); const action = new Action.FocusPreviousWindow(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -99,7 +102,7 @@ describe("action", () => {
describe("up", () => { describe("up", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.MoveActiveWindowUp(fakeEngine); const action = new Action.MoveActiveWindowUp(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -109,7 +112,7 @@ describe("action", () => {
describe("down", () => { describe("down", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.MoveActiveWindowDown(fakeEngine); const action = new Action.MoveActiveWindowDown(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -119,7 +122,7 @@ describe("action", () => {
describe("left", () => { describe("left", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.MoveActiveWindowLeft(fakeEngine); const action = new Action.MoveActiveWindowLeft(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -129,7 +132,7 @@ describe("action", () => {
describe("right", () => { describe("right", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.MoveActiveWindowRight(fakeEngine); const action = new Action.MoveActiveWindowRight(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -139,7 +142,10 @@ describe("action", () => {
describe("next", () => { describe("next", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.MoveActiveWindowToNextPosition(fakeEngine); const action = new Action.MoveActiveWindowToNextPosition(
fakeEngine,
fakeLog
);
action.execute(); action.execute();
@ -150,7 +156,8 @@ describe("action", () => {
describe("prev", () => { describe("prev", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.MoveActiveWindowToPreviousPosition( const action = new Action.MoveActiveWindowToPreviousPosition(
fakeEngine fakeEngine,
fakeLog
); );
action.execute(); action.execute();
@ -175,7 +182,10 @@ describe("action", () => {
describe("width increase", () => { describe("width increase", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.IncreaseActiveWindowWidth(fakeEngine); const action = new Action.IncreaseActiveWindowWidth(
fakeEngine,
fakeLog
);
action.execute(); action.execute();
@ -189,7 +199,10 @@ describe("action", () => {
describe("width decrease", () => { describe("width decrease", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.DecreaseActiveWindowWidth(fakeEngine); const action = new Action.DecreaseActiveWindowWidth(
fakeEngine,
fakeLog
);
action.execute(); action.execute();
@ -203,7 +216,10 @@ describe("action", () => {
describe("height increase", () => { describe("height increase", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.IncreaseActiveWindowHeight(fakeEngine); const action = new Action.IncreaseActiveWindowHeight(
fakeEngine,
fakeLog
);
action.execute(); action.execute();
@ -217,7 +233,10 @@ describe("action", () => {
describe("height decrease", () => { describe("height decrease", () => {
it("correctly executes", () => { it("correctly executes", () => {
const action = new Action.DecreaseActiveWindowHeight(fakeEngine); const action = new Action.DecreaseActiveWindowHeight(
fakeEngine,
fakeLog
);
action.execute(); action.execute();
@ -241,7 +260,10 @@ describe("action", () => {
describe("increase windows count", () => { describe("increase windows count", () => {
it("shows a note that there is no master area in general case", () => { it("shows a note that there is no master area in general case", () => {
const action = new Action.IncreaseMasterAreaWindowCount(fakeEngine); const action = new Action.IncreaseMasterAreaWindowCount(
fakeEngine,
fakeLog
);
action.execute(); action.execute();
@ -251,7 +273,10 @@ describe("action", () => {
describe("decrease windows count", () => { describe("decrease windows count", () => {
it("shows a note that there is no master area in general case", () => { it("shows a note that there is no master area in general case", () => {
const action = new Action.DecreaseMasterAreaWindowCount(fakeEngine); const action = new Action.DecreaseMasterAreaWindowCount(
fakeEngine,
fakeLog
);
action.execute(); action.execute();
@ -261,7 +286,10 @@ describe("action", () => {
describe("increase size", () => { describe("increase size", () => {
it("shows a note that there is no master area in general case", () => { it("shows a note that there is no master area in general case", () => {
const action = new Action.IncreaseLayoutMasterAreaSize(fakeEngine); const action = new Action.IncreaseLayoutMasterAreaSize(
fakeEngine,
fakeLog
);
action.execute(); action.execute();
@ -271,7 +299,10 @@ describe("action", () => {
describe("decrease size", () => { describe("decrease size", () => {
it("shows a note that there is no master area in general case", () => { it("shows a note that there is no master area in general case", () => {
const action = new Action.DecreaseLayoutMasterAreaSize(fakeEngine); const action = new Action.DecreaseLayoutMasterAreaSize(
fakeEngine,
fakeLog
);
action.execute(); action.execute();
@ -288,7 +319,7 @@ describe("action", () => {
currentWindow: jest.fn().mockReturnValue(fakeCurrentWindow), currentWindow: jest.fn().mockReturnValue(fakeCurrentWindow),
}); });
const action = new Action.ToggleActiveWindowFloating(fakeEngine); const action = new Action.ToggleActiveWindowFloating(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -304,7 +335,10 @@ describe("action", () => {
currentWindow: jest.fn().mockReturnValue(fakeCurrentWindow), currentWindow: jest.fn().mockReturnValue(fakeCurrentWindow),
}); });
const action = new Action.PushActiveWindowIntoMasterAreaFront(fakeEngine); const action = new Action.PushActiveWindowIntoMasterAreaFront(
fakeEngine,
fakeLog
);
action.execute(); action.execute();
@ -328,7 +362,7 @@ describe("action", () => {
describe("next layout", () => { describe("next layout", () => {
it("executes correctly", () => { it("executes correctly", () => {
const action = new Action.SwitchToNextLayout(fakeEngine); const action = new Action.SwitchToNextLayout(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -338,7 +372,7 @@ describe("action", () => {
describe("prev layout", () => { describe("prev layout", () => {
it("executes correctly", () => { it("executes correctly", () => {
const action = new Action.SwitchToPreviousLayout(fakeEngine); const action = new Action.SwitchToPreviousLayout(fakeEngine, fakeLog);
action.execute(); action.execute();
@ -348,7 +382,7 @@ describe("action", () => {
describe("set layout", () => { describe("set layout", () => {
it("executes correctly when asking to set Monocle Layout", () => { it("executes correctly when asking to set Monocle Layout", () => {
const action = new Action.SetMonocleLayout(fakeEngine); const action = new Action.SetMonocleLayout(fakeEngine, fakeLog);
action.execute(); action.execute();

View File

@ -4,6 +4,7 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
import { Engine } from "../engine"; import { Engine } from "../engine";
import { Log } from "../util/log";
/** /**
* Action that is requested by the user. * Action that is requested by the user.
@ -50,7 +51,8 @@ abstract class ActionImpl implements Action {
protected engine: Engine, protected engine: Engine,
public key: string, public key: string,
public description: string, public description: string,
public defaultKeybinding: string public defaultKeybinding: string,
protected log: Log
) { ) {
this.key = `bismuth_${this.key}`; this.key = `bismuth_${this.key}`;
this.description = `Bismuth: ${this.description}`; this.description = `Bismuth: ${this.description}`;
@ -62,7 +64,7 @@ abstract class ActionImpl implements Action {
* behavior. * behavior.
*/ */
public execute(): void { public execute(): void {
console.log(`Bismuth: Executing action: ${this.key}`); this.log.log(`Executing action: ${this.key}`);
const currentLayout = this.engine.currentLayoutOnCurrentSurface(); const currentLayout = this.engine.currentLayoutOnCurrentSurface();
if (currentLayout.executeAction) { if (currentLayout.executeAction) {
@ -82,8 +84,8 @@ abstract class ActionImpl implements Action {
} }
export class FocusNextWindow extends ActionImpl implements Action { export class FocusNextWindow extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "focus_next_window", "Focus Next Window", ""); super(engine, "focus_next_window", "Focus Next Window", "", log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -92,8 +94,8 @@ export class FocusNextWindow extends ActionImpl implements Action {
} }
export class FocusPreviousWindow extends ActionImpl implements Action { export class FocusPreviousWindow extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "focus_prev_window", "Focus Previous Window", ""); super(engine, "focus_prev_window", "Focus Previous Window", "", log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -102,8 +104,8 @@ export class FocusPreviousWindow extends ActionImpl implements Action {
} }
export class FocusUpperWindow extends ActionImpl implements Action { export class FocusUpperWindow extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "focus_upper_window", "Focus Upper Window", "Meta+K"); super(engine, "focus_upper_window", "Focus Upper Window", "Meta+K", log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -112,8 +114,8 @@ export class FocusUpperWindow extends ActionImpl implements Action {
} }
export class FocusBottomWindow extends ActionImpl implements Action { export class FocusBottomWindow extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "focus_bottom_window", "Focus Bottom Window", "Meta+J"); super(engine, "focus_bottom_window", "Focus Bottom Window", "Meta+J", log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -122,8 +124,8 @@ export class FocusBottomWindow extends ActionImpl implements Action {
} }
export class FocusLeftWindow extends ActionImpl implements Action { export class FocusLeftWindow extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "focus_left_window", "Focus Left Window", "Meta+H"); super(engine, "focus_left_window", "Focus Left Window", "Meta+H", log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -132,8 +134,8 @@ export class FocusLeftWindow extends ActionImpl implements Action {
} }
export class FocusRightWindow extends ActionImpl implements Action { export class FocusRightWindow extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "focus_right_window", "Focus Right Window", "Meta+L"); super(engine, "focus_right_window", "Focus Right Window", "Meta+L", log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -145,12 +147,13 @@ export class MoveActiveWindowToNextPosition
extends ActionImpl extends ActionImpl
implements Action implements Action
{ {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"move_window_to_next_pos", "move_window_to_next_pos",
"Move Window to the Next Position", "Move Window to the Next Position",
"" "",
log
); );
} }
@ -166,12 +169,13 @@ export class MoveActiveWindowToPreviousPosition
extends ActionImpl extends ActionImpl
implements Action implements Action
{ {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"move_window_to_prev_pos", "move_window_to_prev_pos",
"Move Window to the Previous Position", "Move Window to the Previous Position",
"" "",
log
); );
} }
@ -184,8 +188,14 @@ export class MoveActiveWindowToPreviousPosition
} }
export class MoveActiveWindowUp extends ActionImpl implements Action { export class MoveActiveWindowUp extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "move_window_to_upper_pos", "Move Window Up", "Meta+Shift+K"); super(
engine,
"move_window_to_upper_pos",
"Move Window Up",
"Meta+Shift+K",
log
);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -194,12 +204,13 @@ export class MoveActiveWindowUp extends ActionImpl implements Action {
} }
export class MoveActiveWindowDown extends ActionImpl implements Action { export class MoveActiveWindowDown extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"move_window_to_bottom_pos", "move_window_to_bottom_pos",
"Move Window Down", "Move Window Down",
"Meta+Shift+J" "Meta+Shift+J",
log
); );
} }
@ -209,12 +220,13 @@ export class MoveActiveWindowDown extends ActionImpl implements Action {
} }
export class MoveActiveWindowLeft extends ActionImpl implements Action { export class MoveActiveWindowLeft extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"move_window_to_left_pos", "move_window_to_left_pos",
"Move Window Left", "Move Window Left",
"Meta+Shift+H" "Meta+Shift+H",
log
); );
} }
@ -224,12 +236,13 @@ export class MoveActiveWindowLeft extends ActionImpl implements Action {
} }
export class MoveActiveWindowRight extends ActionImpl implements Action { export class MoveActiveWindowRight extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"move_window_to_right_pos", "move_window_to_right_pos",
"Move Window Right", "Move Window Right",
"Meta+Shift+L" "Meta+Shift+L",
log
); );
} }
@ -239,12 +252,13 @@ export class MoveActiveWindowRight extends ActionImpl implements Action {
} }
export class IncreaseActiveWindowWidth extends ActionImpl implements Action { export class IncreaseActiveWindowWidth extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"increase_window_width", "increase_window_width",
"Increase Window Width", "Increase Window Width",
"Meta+Ctrl+L" "Meta+Ctrl+L",
log
); );
} }
@ -257,12 +271,13 @@ export class IncreaseActiveWindowWidth extends ActionImpl implements Action {
} }
export class IncreaseActiveWindowHeight extends ActionImpl implements Action { export class IncreaseActiveWindowHeight extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"increase_window_height", "increase_window_height",
"Increase Window Height", "Increase Window Height",
"Meta+Ctrl+J" "Meta+Ctrl+J",
log
); );
} }
@ -275,12 +290,13 @@ export class IncreaseActiveWindowHeight extends ActionImpl implements Action {
} }
export class DecreaseActiveWindowWidth extends ActionImpl implements Action { export class DecreaseActiveWindowWidth extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"decrease_window_width", "decrease_window_width",
"Decrease Window Width", "Decrease Window Width",
"Meta+Ctrl+H" "Meta+Ctrl+H",
log
); );
} }
@ -293,12 +309,13 @@ export class DecreaseActiveWindowWidth extends ActionImpl implements Action {
} }
export class DecreaseActiveWindowHeight extends ActionImpl implements Action { export class DecreaseActiveWindowHeight extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"decrease_window_height", "decrease_window_height",
"Decrease Window Height", "Decrease Window Height",
"Meta+Ctrl+K" "Meta+Ctrl+K",
log
); );
} }
@ -314,12 +331,13 @@ export class IncreaseMasterAreaWindowCount
extends ActionImpl extends ActionImpl
implements Action implements Action
{ {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"increase_master_win_count", "increase_master_win_count",
"Increase Master Area Window Count", "Increase Master Area Window Count",
"Meta+]" "Meta+]",
log
); );
} }
@ -332,12 +350,13 @@ export class DecreaseMasterAreaWindowCount
extends ActionImpl extends ActionImpl
implements Action implements Action
{ {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"decrease_master_win_count", "decrease_master_win_count",
"Decrease Master Area Window Count", "Decrease Master Area Window Count",
"Meta+[" "Meta+[",
log
); );
} }
@ -347,8 +366,8 @@ export class DecreaseMasterAreaWindowCount
} }
export class IncreaseLayoutMasterAreaSize extends ActionImpl implements Action { export class IncreaseLayoutMasterAreaSize extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "increase_master_size", "Increase Master Area Size", ""); super(engine, "increase_master_size", "Increase Master Area Size", "", log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -357,8 +376,8 @@ export class IncreaseLayoutMasterAreaSize extends ActionImpl implements Action {
} }
export class DecreaseLayoutMasterAreaSize extends ActionImpl implements Action { export class DecreaseLayoutMasterAreaSize extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "decrease_master_size", "Decrease Master Area Size", ""); super(engine, "decrease_master_size", "Decrease Master Area Size", "", log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -367,12 +386,13 @@ export class DecreaseLayoutMasterAreaSize extends ActionImpl implements Action {
} }
export class ToggleActiveWindowFloating extends ActionImpl implements Action { export class ToggleActiveWindowFloating extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"toggle_window_floating", "toggle_window_floating",
"Toggle Active Window Floating", "Toggle Active Window Floating",
"Meta+F" "Meta+F",
log
); );
} }
@ -388,12 +408,13 @@ export class PushActiveWindowIntoMasterAreaFront
extends ActionImpl extends ActionImpl
implements Action implements Action
{ {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"push_window_to_master", "push_window_to_master",
"Push Active Window to Master Area", "Push Active Window to Master Area",
"Meta+Return" "Meta+Return",
log
); );
} }
@ -406,8 +427,8 @@ export class PushActiveWindowIntoMasterAreaFront
} }
export class SwitchToNextLayout extends ActionImpl implements Action { export class SwitchToNextLayout extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "next_layout", "Switch to the Next Layout", "Meta+\\"); super(engine, "next_layout", "Switch to the Next Layout", "Meta+\\", log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -416,8 +437,14 @@ export class SwitchToNextLayout extends ActionImpl implements Action {
} }
export class SwitchToPreviousLayout extends ActionImpl implements Action { export class SwitchToPreviousLayout extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "prev_layout", "Switch to the Previous Layout", "Meta+|"); super(
engine,
"prev_layout",
"Switch to the Previous Layout",
"Meta+|",
log
);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -431,106 +458,112 @@ abstract class SetCurrentLayout extends ActionImpl implements Action {
protected layoutId: string, protected layoutId: string,
key: string, key: string,
description: string, description: string,
defaultShortcut: string defaultShortcut: string,
protected log: Log
) { ) {
super(engine, key, description, defaultShortcut); super(engine, key, description, defaultShortcut, log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
console.log("Set layout called!");
this.engine.setLayout(this.layoutId); this.engine.setLayout(this.layoutId);
} }
} }
export class SetTileLayout extends SetCurrentLayout { export class SetTileLayout extends SetCurrentLayout {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"TileLayout", "TileLayout",
"toggle_tile_layout", "toggle_tile_layout",
"Toggle Tile Layout", "Toggle Tile Layout",
"Meta+T" "Meta+T",
log
); );
} }
} }
export class SetMonocleLayout extends SetCurrentLayout { export class SetMonocleLayout extends SetCurrentLayout {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"MonocleLayout", "MonocleLayout",
"toggle_monocle_layout", "toggle_monocle_layout",
"Toggle Monocle Layout", "Toggle Monocle Layout",
"Meta+M" "Meta+M",
log
); );
} }
} }
export class SetThreeColumnLayout extends SetCurrentLayout { export class SetThreeColumnLayout extends SetCurrentLayout {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"ThreeColumnLayout", "ThreeColumnLayout",
"toggle_three_column_layout", "toggle_three_column_layout",
"Toggle Three Column Layout", "Toggle Three Column Layout",
"" "",
log
); );
} }
} }
export class SetSpreadLayout extends SetCurrentLayout { export class SetSpreadLayout extends SetCurrentLayout {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"SpreadLayout", "SpreadLayout",
"toggle_spread_layout", "toggle_spread_layout",
"Toggle Spread Layout", "Toggle Spread Layout",
"" "",
log
); );
} }
} }
export class SetStairLayout extends SetCurrentLayout { export class SetStairLayout extends SetCurrentLayout {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"StairLayout", "StairLayout",
"toggle_stair_layout", "toggle_stair_layout",
"Toggle Stair Layout", "Toggle Stair Layout",
"" "",
log
); );
} }
} }
export class SetFloatingLayout extends SetCurrentLayout { export class SetFloatingLayout extends SetCurrentLayout {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
// NOTE: space is intentional (Temporary) // NOTE: space is intentional (Temporary)
super( super(
engine, engine,
"FloatingLayout ", "FloatingLayout ",
"toggle_float_layout", "toggle_float_layout",
"Toggle Floating Layout", "Toggle Floating Layout",
"Meta+Shift+F" "Meta+Shift+F",
log
); );
} }
} }
export class SetQuarterLayout extends SetCurrentLayout { export class SetQuarterLayout extends SetCurrentLayout {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super( super(
engine, engine,
"QuarterLayout", "QuarterLayout",
"toggle_quarter_layout", "toggle_quarter_layout",
"Toggle Quarter Layout", "Toggle Quarter Layout",
"" "",
log
); );
} }
} }
export class Rotate extends ActionImpl implements Action { export class Rotate extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "rotate", "Rotate", "Meta+R"); super(engine, "rotate", "Rotate", "Meta+R", log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {
@ -539,8 +572,8 @@ export class Rotate extends ActionImpl implements Action {
} }
export class RotatePart extends ActionImpl implements Action { export class RotatePart extends ActionImpl implements Action {
constructor(protected engine: Engine) { constructor(protected engine: Engine, protected log: Log) {
super(engine, "rotate_part", "Rotate Part", "Meta+Shift+R"); super(engine, "rotate_part", "Rotate Part", "Meta+Shift+R", log);
} }
public executeWithoutLayoutOverride(): void { public executeWithoutLayoutOverride(): void {

View File

@ -9,10 +9,9 @@ import { WindowState } from "../engine/window";
import { DriverContext, KWinDriver } from "../driver"; import { DriverContext, KWinDriver } from "../driver";
import { DriverSurface } from "../driver/surface"; import { DriverSurface } from "../driver/surface";
import MonocleLayout from "../engine/layout/monocle_layout";
import Config from "../config"; import Config from "../config";
import Debug from "../util/debug"; import { Log } from "../util/log";
import * as Action from "./action"; import * as Action from "./action";
@ -148,19 +147,18 @@ export class TilingController implements Controller {
qmlObjects: Bismuth.Qml.Main, qmlObjects: Bismuth.Qml.Main,
kwinApi: KWin.Api, kwinApi: KWin.Api,
private config: Config, private config: Config,
private debug: Debug private log: Log
) { ) {
this.engine = new TilingEngine(this, config, debug); this.engine = new TilingEngine(this, config, log);
this.driver = new KWinDriver(qmlObjects, kwinApi, this, config, debug); this.driver = new KWinDriver(qmlObjects, kwinApi, this, config, log);
} }
/** /**
* Entry point: start tiling window management * Entry point: start tiling window management
*/ */
public start(): void { public start(): void {
console.log("Let's get down to bismuth!"); this.log.log("Let's get down to bismuth!");
this.log.log(`Config: ${this.config}`);
this.debug.debug(() => `Config: ${this.config}`);
this.driver.bindEvents(); this.driver.bindEvents();
this.bindShortcuts(); this.bindShortcuts();
@ -195,15 +193,12 @@ export class TilingController implements Controller {
} }
public onSurfaceUpdate(comment: string): void { public onSurfaceUpdate(comment: string): void {
this.debug.debugObj(() => ["onSurfaceUpdate", { comment }]); this.log.log(["onSurfaceUpdate", { comment }]);
this.engine.arrange(); this.engine.arrange();
} }
public onCurrentSurfaceChanged(): void { public onCurrentSurfaceChanged(): void {
this.debug.debugObj(() => [ this.log.log(["onCurrentSurfaceChanged", { srf: this.currentSurface }]);
"onCurrentSurfaceChanged",
{ srf: this.currentSurface },
]);
this.engine.arrange(); this.engine.arrange();
/* HACK: minimize others and change geometry with Monocle Layout and /* HACK: minimize others and change geometry with Monocle Layout and
* config.monocleMinimizeRest * config.monocleMinimizeRest
@ -214,8 +209,7 @@ export class TilingController implements Controller {
} }
public onWindowAdded(window: Window): void { public onWindowAdded(window: Window): void {
this.debug.debugObj(() => ["onWindowAdded", { window }]); this.log.log(["onWindowAdded", { window }]);
console.log(`New window added: ${window}`);
this.engine.manage(window); this.engine.manage(window);
/* move window to next surface if the current surface is "full" */ /* move window to next surface if the current surface is "full" */
@ -237,8 +231,7 @@ export class TilingController implements Controller {
} }
public onWindowRemoved(window: Window): void { public onWindowRemoved(window: Window): void {
this.debug.debugObj(() => ["onWindowRemoved", { window }]); this.log.log(["onWindowRemoved", { window }]);
console.log(`Window remove: ${window}`);
this.engine.unmanage(window); this.engine.unmanage(window);
this.engine.arrange(); this.engine.arrange();
@ -263,7 +256,7 @@ export class TilingController implements Controller {
} }
public onWindowMoveOver(window: Window): void { public onWindowMoveOver(window: Window): void {
this.debug.debugObj(() => ["onWindowMoveOver", { window }]); this.log.log(["onWindowMoveOver", { window }]);
/* swap window by dragging */ /* swap window by dragging */
if (window.state === WindowState.Tiled) { if (window.state === WindowState.Tiled) {
@ -304,7 +297,7 @@ export class TilingController implements Controller {
} }
public onWindowResize(window: Window): void { public onWindowResize(window: Window): void {
this.debug.debugObj(() => ["onWindowResize", { window }]); this.log.log(["onWindowResize", { window }]);
if (this.config.adjustLayout && this.config.adjustLayoutLive) { if (this.config.adjustLayout && this.config.adjustLayoutLive) {
if (window.state === WindowState.Tiled) { if (window.state === WindowState.Tiled) {
this.engine.adjustLayout(window); this.engine.adjustLayout(window);
@ -314,8 +307,7 @@ export class TilingController implements Controller {
} }
public onWindowResizeOver(window: Window): void { public onWindowResizeOver(window: Window): void {
this.debug.debugObj(() => ["onWindowResizeOver", { window }]); this.log.log(["onWindowResizeOver", { window }]);
console.log(`Window resize is over: ${window}`);
if (this.config.adjustLayout && window.tiled) { if (this.config.adjustLayout && window.tiled) {
this.engine.adjustLayout(window); this.engine.adjustLayout(window);
this.engine.arrange(); this.engine.arrange();
@ -329,7 +321,7 @@ export class TilingController implements Controller {
} }
public onWindowGeometryChanged(window: Window): void { public onWindowGeometryChanged(window: Window): void {
this.debug.debugObj(() => ["onWindowGeometryChanged", { window }]); this.log.log(["onWindowGeometryChanged", { window }]);
this.engine.enforceSize(window); this.engine.enforceSize(window);
} }
@ -337,7 +329,7 @@ export class TilingController implements Controller {
// by itself anyway. // by itself anyway.
public onWindowChanged(window: Window | null, comment?: string): void { public onWindowChanged(window: Window | null, comment?: string): void {
if (window) { if (window) {
this.debug.debugObj(() => ["onWindowChanged", { window, comment }]); this.log.log(["onWindowChanged", { window, comment }]);
if (comment === "unminimized") { if (comment === "unminimized") {
this.currentWindow = window; this.currentWindow = window;
@ -350,12 +342,12 @@ export class TilingController implements Controller {
public onWindowFocused(window: Window): void { public onWindowFocused(window: Window): void {
window.timestamp = new Date().getTime(); window.timestamp = new Date().getTime();
this.currentWindow = window; this.currentWindow = window;
// Minimize other windows if Moncole and config.monocleMinimizeRest // Minimize other windows if Monocle and config.monocleMinimizeRest
if ( if (
this.engine.isLayoutMonocleAndMinimizeRest() && this.engine.isLayoutMonocleAndMinimizeRest() &&
this.engine.windows.getVisibleTiles(window.surface).includes(window) this.engine.windows.getVisibleTiles(window.surface).includes(window)
) { ) {
/* If a window hasn't been foucsed in this layout yet, ensure its geometry /* If a window hasn't been focused in this layout yet, ensure its geometry
* gets maximized. * gets maximized.
*/ */
this.engine this.engine
@ -376,45 +368,45 @@ export class TilingController implements Controller {
private bindShortcuts(): void { private bindShortcuts(): void {
const allPossibleActions = [ const allPossibleActions = [
new Action.FocusNextWindow(this.engine), new Action.FocusNextWindow(this.engine, this.log),
new Action.FocusPreviousWindow(this.engine), new Action.FocusPreviousWindow(this.engine, this.log),
new Action.FocusUpperWindow(this.engine), new Action.FocusUpperWindow(this.engine, this.log),
new Action.FocusBottomWindow(this.engine), new Action.FocusBottomWindow(this.engine, this.log),
new Action.FocusLeftWindow(this.engine), new Action.FocusLeftWindow(this.engine, this.log),
new Action.FocusRightWindow(this.engine), new Action.FocusRightWindow(this.engine, this.log),
new Action.MoveActiveWindowToNextPosition(this.engine), new Action.MoveActiveWindowToNextPosition(this.engine, this.log),
new Action.MoveActiveWindowToPreviousPosition(this.engine), new Action.MoveActiveWindowToPreviousPosition(this.engine, this.log),
new Action.MoveActiveWindowUp(this.engine), new Action.MoveActiveWindowUp(this.engine, this.log),
new Action.MoveActiveWindowDown(this.engine), new Action.MoveActiveWindowDown(this.engine, this.log),
new Action.MoveActiveWindowLeft(this.engine), new Action.MoveActiveWindowLeft(this.engine, this.log),
new Action.MoveActiveWindowRight(this.engine), new Action.MoveActiveWindowRight(this.engine, this.log),
new Action.IncreaseActiveWindowWidth(this.engine), new Action.IncreaseActiveWindowWidth(this.engine, this.log),
new Action.IncreaseActiveWindowHeight(this.engine), new Action.IncreaseActiveWindowHeight(this.engine, this.log),
new Action.DecreaseActiveWindowWidth(this.engine), new Action.DecreaseActiveWindowWidth(this.engine, this.log),
new Action.DecreaseActiveWindowHeight(this.engine), new Action.DecreaseActiveWindowHeight(this.engine, this.log),
new Action.IncreaseMasterAreaWindowCount(this.engine), new Action.IncreaseMasterAreaWindowCount(this.engine, this.log),
new Action.DecreaseMasterAreaWindowCount(this.engine), new Action.DecreaseMasterAreaWindowCount(this.engine, this.log),
new Action.IncreaseLayoutMasterAreaSize(this.engine), new Action.IncreaseLayoutMasterAreaSize(this.engine, this.log),
new Action.DecreaseLayoutMasterAreaSize(this.engine), new Action.DecreaseLayoutMasterAreaSize(this.engine, this.log),
new Action.ToggleActiveWindowFloating(this.engine), new Action.ToggleActiveWindowFloating(this.engine, this.log),
new Action.PushActiveWindowIntoMasterAreaFront(this.engine), new Action.PushActiveWindowIntoMasterAreaFront(this.engine, this.log),
new Action.SwitchToNextLayout(this.engine), new Action.SwitchToNextLayout(this.engine, this.log),
new Action.SwitchToPreviousLayout(this.engine), new Action.SwitchToPreviousLayout(this.engine, this.log),
new Action.SetTileLayout(this.engine), new Action.SetTileLayout(this.engine, this.log),
new Action.SetMonocleLayout(this.engine), new Action.SetMonocleLayout(this.engine, this.log),
new Action.SetThreeColumnLayout(this.engine), new Action.SetThreeColumnLayout(this.engine, this.log),
new Action.SetStairLayout(this.engine), new Action.SetStairLayout(this.engine, this.log),
new Action.SetSpreadLayout(this.engine), new Action.SetSpreadLayout(this.engine, this.log),
new Action.SetFloatingLayout(this.engine), new Action.SetFloatingLayout(this.engine, this.log),
new Action.SetQuarterLayout(this.engine), new Action.SetQuarterLayout(this.engine, this.log),
new Action.Rotate(this.engine), new Action.Rotate(this.engine, this.log),
new Action.RotatePart(this.engine), new Action.RotatePart(this.engine, this.log),
]; ];
for (const action of allPossibleActions) { for (const action of allPossibleActions) {

View File

@ -15,7 +15,7 @@ import Window from "../engine/window";
import { WindowState } from "../engine/window"; import { WindowState } from "../engine/window";
import Config from "../config"; import Config from "../config";
import Debug from "../util/debug"; import { Log } from "../util/log";
export interface DriverContext { export interface DriverContext {
readonly screens: DriverSurface[]; readonly screens: DriverSurface[];
@ -65,7 +65,6 @@ export class KWinDriver implements DriverContext {
public get currentWindow(): Window | null { public get currentWindow(): Window | null {
const client = this.kwinApi.workspace.activeClient; const client = this.kwinApi.workspace.activeClient;
console.log(`Active client: ${client}`);
return client ? this.windowMap.get(client) : null; return client ? this.windowMap.get(client) : null;
} }
@ -102,7 +101,6 @@ export class KWinDriver implements DriverContext {
private kwinApi: KWin.Api; private kwinApi: KWin.Api;
private config: Config; private config: Config;
private debug: Debug;
/** /**
* @param qmlObjects objects from QML gui. Required for the interaction with QML, as we cannot access globals. * @param qmlObjects objects from QML gui. Required for the interaction with QML, as we cannot access globals.
@ -114,16 +112,13 @@ export class KWinDriver implements DriverContext {
kwinApi: KWin.Api, kwinApi: KWin.Api,
controller: Controller, controller: Controller,
config: Config, config: Config,
debug: Debug private log: Log
) { ) {
this.config = config; this.config = config;
this.debug = debug;
// TODO: find a better way to to this // TODO: find a better way to to this
if (this.config.preventMinimize && this.config.monocleMinimizeRest) { if (this.config.preventMinimize && this.config.monocleMinimizeRest) {
this.debug.debug( log.log("preventMinimize is disabled because of monocleMinimizeRest");
() => "preventMinimize is disabled because of monocleMinimizeRest."
);
this.config.preventMinimize = false; this.config.preventMinimize = false;
} }
@ -132,15 +127,9 @@ export class KWinDriver implements DriverContext {
(client: KWin.Client) => KWinWindow.generateID(client), (client: KWin.Client) => KWinWindow.generateID(client),
(client: KWin.Client) => (client: KWin.Client) =>
new Window( new Window(
new KWinWindow( new KWinWindow(client, this.qml, this.kwinApi, this.config, this.log),
client,
this.qml,
this.kwinApi,
this.config,
this.debug
),
this.config, this.config,
this.debug this.log
) )
); );
this.entered = false; this.entered = false;
@ -180,17 +169,17 @@ export class KWinDriver implements DriverContext {
}; };
const onClientAdded = (client: KWin.Client): void => { const onClientAdded = (client: KWin.Client): void => {
console.log(`Client added: ${client}`); this.log.log(`Client added: ${client}`);
const window = this.windowMap.add(client); const window = this.windowMap.add(client);
this.controller.onWindowAdded(window); this.controller.onWindowAdded(window);
if (window.state === WindowState.Unmanaged) { if (window.state === WindowState.Unmanaged) {
console.log( this.log.log(
`Window becomes unmanaged and gets removed :( The client was ${client}` `Window becomes unmanaged and gets removed :( The client was ${client}`
); );
this.windowMap.remove(client); this.windowMap.remove(client);
} else { } else {
console.log(`Client is ok, can manage. Bind events now...`); this.log.log(`Client is ok, can manage. Bind events now...`);
this.bindWindowEvents(window, client); this.bindWindowEvents(window, client);
} }
}; };
@ -307,9 +296,6 @@ export class KWinDriver implements DriverContext {
} }
public bindShortcut(action: Action): void { public bindShortcut(action: Action): void {
console.log(
`Registering ${action.key} with the description ${action.description}`
);
this.kwinApi.KWin.registerShortcut( this.kwinApi.KWin.registerShortcut(
action.key, action.key,
action.description, action.description,
@ -356,10 +342,8 @@ export class KWinDriver implements DriverContext {
this.entered = true; this.entered = true;
try { try {
callback(); callback();
} catch (e) { } catch (e: any) {
// TODO: investigate why this line prevents compiling this.log.log(e);
// debug(() => "Error raised from line " + e.lineNumber);
this.debug.debug(() => e);
} finally { } finally {
this.entered = false; this.entered = false;
} }
@ -370,7 +354,7 @@ export class KWinDriver implements DriverContext {
let resizing = false; let resizing = false;
this.connect(client.moveResizedChanged, () => { this.connect(client.moveResizedChanged, () => {
this.debug.debugObj(() => [ this.log.log([
"moveResizedChanged", "moveResizedChanged",
{ window, move: client.move, resize: client.resize }, { window, move: client.move, resize: client.resize },
]); ]);

View File

@ -9,7 +9,7 @@ import Rect from "../util/rect";
import { toQRect, toRect } from "../util/kwinutil"; import { toQRect, toRect } from "../util/kwinutil";
import { clip, matchWords } from "../util/func"; import { clip, matchWords } from "../util/func";
import Config from "../config"; import Config from "../config";
import Debug from "../util/debug"; import { Log } from "../util/log";
export interface DriverWindow { export interface DriverWindow {
readonly fullScreen: boolean; readonly fullScreen: boolean;
@ -132,14 +132,13 @@ export class KWinWindow implements DriverWindow {
private qml: Bismuth.Qml.Main; private qml: Bismuth.Qml.Main;
private kwinApi: KWin.Api; private kwinApi: KWin.Api;
private config: Config; private config: Config;
private debug: Debug;
constructor( constructor(
client: KWin.Client, client: KWin.Client,
qml: Bismuth.Qml.Main, qml: Bismuth.Qml.Main,
kwinApi: KWin.Api, kwinApi: KWin.Api,
config: Config, config: Config,
debug: Debug private log: Log
) { ) {
this.client = client; this.client = client;
this.id = KWinWindow.generateID(client); this.id = KWinWindow.generateID(client);
@ -149,7 +148,6 @@ export class KWinWindow implements DriverWindow {
this.qml = qml; this.qml = qml;
this.kwinApi = kwinApi; this.kwinApi = kwinApi;
this.config = config; this.config = config;
this.debug = debug;
} }
public commit( public commit(
@ -157,10 +155,7 @@ export class KWinWindow implements DriverWindow {
noBorder?: boolean, noBorder?: boolean,
keepAbove?: boolean keepAbove?: boolean
): void { ): void {
this.debug.debugObj(() => [ this.log.log(["KWinWindow#commit", { geometry, noBorder, keepAbove }]);
"KWinWindow#commit",
{ geometry, noBorder, keepAbove },
]);
if (this.client.move || this.client.resize) { if (this.client.move || this.client.resize) {
return; return;

View File

@ -11,7 +11,7 @@ import Config from "../config";
import { Controller } from "../controller"; import { Controller } from "../controller";
import { DriverSurface } from "../driver/surface"; import { DriverSurface } from "../driver/surface";
import Debug from "../util/debug"; import { Log } from "../util/log";
import Rect from "../util/rect"; import Rect from "../util/rect";
import TileLayout from "./layout/tile_layout"; import TileLayout from "./layout/tile_layout";
import LayoutStore from "./layout_store"; import LayoutStore from "./layout_store";
@ -25,9 +25,9 @@ describe("arrange", () => {
const fakeScreens = [screenMock, screenMock, screenMock, screenMock]; const fakeScreens = [screenMock, screenMock, screenMock, screenMock];
const controllerMock = createMock<Controller>({ screens: fakeScreens }); const controllerMock = createMock<Controller>({ screens: fakeScreens });
const debugMock = createMock<Debug>(); const logMock = createMock<Log>();
const configMock = createMock<Config>(); const configMock = createMock<Config>();
const engine = new TilingEngine(controllerMock, configMock, debugMock); const engine = new TilingEngine(controllerMock, configMock, logMock);
jest.spyOn(engine, "arrangeScreen").mockReturnValue(); jest.spyOn(engine, "arrangeScreen").mockReturnValue();
@ -43,9 +43,9 @@ describe("arrangeScreen", () => {
describe("window states are correctly changed", () => { describe("window states are correctly changed", () => {
// Arrange // Arrange
const controllerMock = createMock<Controller>(); const controllerMock = createMock<Controller>();
const debugMock = createMock<Debug>(); const logMock = createMock<Log>();
const configMock = createMock<Config>(); const configMock = createMock<Config>();
const engine = new TilingEngine(controllerMock, configMock, debugMock); const engine = new TilingEngine(controllerMock, configMock, logMock);
const window1 = createMock<Window>({ const window1 = createMock<Window>({
shouldFloat: false, shouldFloat: false,

View File

@ -18,7 +18,7 @@ import Rect from "../util/rect";
import RectDelta from "../util/rectdelta"; import RectDelta from "../util/rectdelta";
import { overlap, wrapIndex } from "../util/func"; import { overlap, wrapIndex } from "../util/func";
import Config from "../config"; import Config from "../config";
import Debug from "../util/debug"; import { Log } from "../util/log";
import { WindowsLayout } from "./layout"; import { WindowsLayout } from "./layout";
export type Direction = "up" | "down" | "left" | "right"; export type Direction = "up" | "down" | "left" | "right";
@ -79,7 +79,7 @@ export class TilingEngine implements Engine {
constructor( constructor(
private controller: Controller, private controller: Controller,
private config: Config, private config: Config,
private debug: Debug private log: Log
) { ) {
this.layouts = new LayoutStore(this.config); this.layouts = new LayoutStore(this.config);
this.windows = new WindowStore(); this.windows = new WindowStore();
@ -236,7 +236,7 @@ export class TilingEngine implements Engine {
* Arrange tiles on all screens. * Arrange tiles on all screens.
*/ */
public arrange(): void { public arrange(): void {
this.debug.debug(() => "arrange"); this.log.log("arrange");
this.controller.screens.forEach((driverSurface: DriverSurface) => { this.controller.screens.forEach((driverSurface: DriverSurface) => {
this.arrangeScreen(driverSurface); this.arrangeScreen(driverSurface);
@ -255,7 +255,7 @@ export class TilingEngine implements Engine {
const tilingArea = this.getTilingArea(workingArea, layout); const tilingArea = this.getTilingArea(workingArea, layout);
const visibleWindows = this.windows.getVisibleWindows(screenSurface); const visibleWindows = this.windows.getVisibleWindows(screenSurface);
this.debug.debugObj(() => [ this.log.log([
"arrangeScreen", "arrangeScreen",
{ {
layout, layout,
@ -304,7 +304,7 @@ export class TilingEngine implements Engine {
// Commit window assigned properties // Commit window assigned properties
visibleWindows.forEach((win: Window) => win.commit()); visibleWindows.forEach((win: Window) => win.commit());
this.debug.debugObj(() => ["arrangeScreen/finished", { screenSurface }]); this.log.log(["arrangeScreen/finished", { screenSurface }]);
} }
public currentLayoutOnCurrentSurface(): WindowsLayout { public currentLayoutOnCurrentSurface(): WindowsLayout {

View File

@ -65,7 +65,6 @@ export default class MonocleLayout implements WindowsLayout {
) { ) {
engine.focusOrder(1, this.config.monocleMinimizeRest); engine.focusOrder(1, this.config.monocleMinimizeRest);
} else { } else {
console.log("Executing from Monocle regular action!");
action.executeWithoutLayoutOverride(); action.executeWithoutLayoutOverride();
} }
} }

View File

@ -7,7 +7,7 @@ import { DriverWindow } from "../driver/window";
import { DriverSurface } from "../driver/surface"; import { DriverSurface } from "../driver/surface";
import Config from "../config"; import Config from "../config";
import Debug from "../util/debug"; import { Log } from "../util/log";
import Rect from "../util/rect"; import Rect from "../util/rect";
import RectDelta from "../util/rectdelta"; import RectDelta from "../util/rectdelta";
@ -163,11 +163,9 @@ export default class Window {
private weightMap: { [key: string]: number }; private weightMap: { [key: string]: number };
private config: Config; private config: Config;
private debug: Debug;
constructor(window: DriverWindow, config: Config, debug: Debug) { constructor(window: DriverWindow, config: Config, private log: Log) {
this.config = config; this.config = config;
this.debug = debug;
this.id = window.id; this.id = window.id;
this.window = window; this.window = window;
@ -183,7 +181,7 @@ export default class Window {
public commit(): void { public commit(): void {
const state = this.state; const state = this.state;
this.debug.debugObj(() => ["Window#commit", { state: WindowState[state] }]); this.log.log(["Window#commit", { state: WindowState[state] }]);
switch (state) { switch (state) {
case WindowState.NativeMaximized: case WindowState.NativeMaximized:
this.window.commit(undefined, undefined, false); this.window.commit(undefined, undefined, false);

View File

@ -4,7 +4,7 @@
import { ConfigImpl } from "./config"; import { ConfigImpl } from "./config";
import { TilingController } from "./controller"; import { TilingController } from "./controller";
import Debug from "./util/debug"; import { LogImpl } from "./util/log";
/** /**
* Script entry-point from QML side. * Script entry-point from QML side.
@ -16,13 +16,13 @@ export function init(
kwinScriptingApi: KWin.Api kwinScriptingApi: KWin.Api
): void { ): void {
const config = new ConfigImpl(kwinScriptingApi); const config = new ConfigImpl(kwinScriptingApi);
const debug = new Debug(config); const logger = new LogImpl(config);
const controller = new TilingController( const controller = new TilingController(
qmlObjects, qmlObjects,
kwinScriptingApi, kwinScriptingApi,
config, config,
debug logger
); );
controller.start(); controller.start();

View File

@ -1,36 +0,0 @@
// SPDX-FileCopyrightText: 2018-2019 Eon S. Jeon <esjeon@hyunmu.am>
// SPDX-FileCopyrightText: 2021 Mikhail Zolotukhin <mail@genda.life>
//
// SPDX-License-Identifier: MIT
import Config from "../config";
export default class Debug {
private enabled: boolean;
private started: number;
constructor(config: Config) {
this.enabled = config.debugEnabled;
this.started = new Date().getTime();
}
public debug(f: () => any): void {
if (this.enabled) {
const timestamp = (new Date().getTime() - this.started) / 1000;
console.log(`[${timestamp}]`, f());
}
}
public debugObj(f: () => [string, any]): void {
if (this.enabled) {
const timestamp = (new Date().getTime() - this.started) / 1000;
const [name, obj] = f();
const buf = [];
for (const i in obj) {
buf.push(`${i}=${obj[i]}`);
}
console.log(`[${timestamp}]`, `${name}: ${buf.join(" ")}`);
}
}
}

87
src/util/log.ts Normal file
View File

@ -0,0 +1,87 @@
// SPDX-FileCopyrightText: 2018-2019 Eon S. Jeon <esjeon@hyunmu.am>
// SPDX-FileCopyrightText: 2021 Mikhail Zolotukhin <mail@genda.life>
//
// SPDX-License-Identifier: MIT
import Config from "../config";
type LogType = string | Record<string, unknown> | LogType[];
export interface Log {
log(str: LogType): void;
}
/**
* Standard logger
*/
export class LogImpl implements Log {
private enabled: boolean;
private started: number;
constructor(config: Config) {
this.enabled = config.debugEnabled;
this.started = new Date().getTime();
}
public log(logObj: LogType): void {
if (this.enabled) {
this.doLog(logObj);
}
}
private doLog(logObj: LogType): void {
if (Object.prototype.toString.call(logObj) === "[object Array]") {
// If log object is an array
this.logArray(logObj as LogType[]);
} else if (typeof logObj == "string") {
this.logString(logObj);
} else if (typeof logObj == "object") {
this.logObject(logObj as Record<string, unknown>);
}
}
/**
* Logs object (without deep inspection)
* @param obj object to log
*/
private logObject(obj: Record<string, unknown>): void {
// NOTE: be aware, that constructor name could change if minification is used
const objectName = obj.constructor.name;
const logQueue = [];
for (const i in obj) {
logQueue.push(`${i}: ${obj[i]}`);
}
this.logString(`${objectName}: ${logQueue.join(", ")}`);
}
/**
* Logs string
* @param str string to log
*/
private logString(str: string): void {
console.log(`[Bismuth] [${this.now()}] ${str}`);
}
/**
* Sequentially logs the contents of the array
* @param arr array to log
*/
private logArray(arr: LogType[]): void {
for (const element of arr) {
this.doLog(element);
}
}
private now(): number {
return (new Date().getTime() - this.started) / 1000;
}
}
/**
* Null log, that does not output anything
*/
export class NullLog implements Log {
public log(_str: LogType): void {
// NOP
}
}