Review of "PaperWM" version 3

Details Page Preview

Tiling window manager with a twist! PaperWM is a Gnome Shell extension which provides scrollable tiling of windows and per monitor workspaces. It's inspired by paper notebooks and tiling window managers. Please see our github page to report issues, understand features, and learn how to configure PaperWM to your liking.

Extension Homepage
https://github.com/paperwm/PaperWM

No comments.

Diff Against

Files

Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.

All Versions

Version Status
47.1.0 (135) Active
47.1.0 (134) Active
47.0.0 (133) Active
46.17.1 (132) Active
46.17.0 (131) Active
46.16.1 (130) Active
46.16.0 (129) Rejected
46.15.1 (128) Active
46.15.0 (127) Active
46.14.0 (126) Active
46.13.8 (125) Active
46.13.7 (124) Active
46.13.6 (123) Active
46.13.5 (122) Active
46.13.4 (121) Active
46.13.3 (120) Inactive
46.13.2 (119) Active
46.13.1 (118) Active
46.13.0 (117) Active
46.12.1 (116) Active
46.12.0 (115) Active
46.11.2 (114) Active
46.11.1 (113) Active
46.10.2 (112) Active
46.10.1 (111) Active
46.10.0 (110) Rejected
46.9.1 (109) Active
46.9.0 (108) Active
46.8.1 (107) Active
46.8.0 (106) Rejected
46.7.0 (105) Active
46.6.7 (104) Active
46.6.6 (103) Active
46.6.5 (102) Active
44.18.0 (101) Active
46.6.4 (100) Active
46.6.3 (99) Active
46.6.2 (98) Rejected
46.6.1 (97) Rejected
46.6.0 (96) Active
46.5.1 (95) Active
46.5.0 (94) Rejected
46.4.1 (93) Active
46.4.0 (92) Active
46.3.2 (91) Active
46.3.1 (90) Active
46.3.0 (89) Active
46.2.0 (88) Active
46.1.0 (87) Active
46.0.0 (86) Active
46.0.0 (85) Active
45.14.0 (84) Inactive
45.13.0 (83) Inactive
45.12.2 (82) Inactive
45.12.1 (81) Inactive
45.12.0 (80) Inactive
45.11.0 (79) Inactive
45.10.1 (78) Inactive
45.10.0 (77) Inactive
45.9.2 (76) Inactive
45.9.1 (75) Inactive
45.9.0 (74) Inactive
45.8.1 (73) Inactive
45.8.0 (72) Inactive
44.17.0 (71) Active
45.7.0 (70) Inactive
44.16.0 (69) Inactive
45.6.0 (68) Inactive
44.15.2 (67) Inactive
45.5.0 (66) Inactive
45.4.2 (65) Inactive
44.15.1 (64) Inactive
44.15.0 (63) Inactive
45.4.1 (62) Inactive
44.14.0 (61) Inactive
45.4.0 (60) Inactive
59 Inactive
58 Rejected
57 Inactive
56 Inactive
55 Inactive
54 Inactive
53 Inactive
52 Inactive
51 Inactive
50 Inactive
49 Inactive
48 Inactive
47 Inactive
46 Inactive
45 Inactive
44 Inactive
43 Rejected
42 Rejected
41 Inactive
40 Inactive
39 Inactive
38 Inactive
37 Inactive
36 Inactive
35 Inactive
34 Inactive
33 Inactive
32 Inactive
31 Inactive
30 Inactive
29 Inactive
28 Inactive
27 Inactive
26 Inactive
25 Inactive
24 Inactive
23 Inactive
22 Inactive
21 Inactive
20 Inactive
19 Inactive
18 Rejected
17 Inactive
16 Inactive
15 Inactive
14 Inactive
13 Inactive
12 Inactive
11 Inactive
10 Inactive
9 Inactive
8 Inactive
7 Inactive
6 Rejected
5 Inactive
4 Rejected
3 Rejected
2 Rejected
1 Rejected

Previous Reviews on this Version

jtaala posted a review
Please see https://github.com/paperwm/PaperWM/pull/556 for notes on changes implemented addressing each of the review issues (from review 1). Justification for session-mode `unlock-dialog`: PaperWM requires session mode `unlock-dialog` to maintain multi-monitor tiling layouts when locking/unlocking Gnome. Without this, tiled windows can move to different monitors on gnome unlock, which severely impacts/destroys user workflows and window placements. Regards, Jay.
JustPerfection rejected
Good but theses issues still need to get fixed: 1. Selective disable isn't allowed (line 122 and 126 extension.js): https://gjs.guide/extensions/review-guidelines/review-guidelines.html#session-modes 2. Move import lines to top of the file: - line 140-143 extension.js - line 219-221 scratch.js 3. Does `warnAboutGnomeShellVersionCompatibility()` function exist because of legacy code (line 147 extension.js)? 4. Too much for init (line 90-91 extension.js): https://gjs.guide/extensions/review-guidelines/review-guidelines.html#only-use-init-for-initialization 5. You should remove the timeout in disable: - line 405 gestures.js. - line 208 navigator.js - line 44 settings.js - line 89, 235 stackoverlay.js - line 1729, 2742, 2756 tiling.js https://gjs.guide/extensions/review-guidelines/review-guidelines.html#remove-main-loop-sources 6. For `session-modes` you should add the reason to the disable function but I don't think moving windows to another place is a good reason for that. because in lock, your extension will be disabled too, despite the fact you have `unlock-dialog` in session mode. after disable, it will be re-enable because you have `unlock-dialog` to `session-modes`. IMO you shouldn't rely on that to avoid windows getting out order. Maybe saving the window positions and re-arranging them on enable is the better solution. Read about session modes here: https://discourse.gnome.org/t/extension-disable-called-on-session-mode-change-but-only-for-the-first-time/15832 7. You cannot create instances in global scope which is the same as init: - line 12 extension.js https://gjs.guide/extensions/review-guidelines/review-guidelines.html#only-use-init-for-initialization 8. You forgot to untrack (line 253 stackoverlay.js). 9. You are still using many `log()`s. Use `console.log()` instead: https://gjs.guide/extensions/review-guidelines/review-guidelines.html#no-excessive-logging
jtaala posted a review
> 3. Does `warnAboutGnomeShellVersionCompatibility()` function exist because of legacy code (line 147 extension.js)? Yes. But also, since PaperWM can be installed from source (which is how we've been doing it for the last 3-4 years) - often we'll enable a gnome-shell version (say like Gnome 45) so that our users can test and report issues - that notification is to remind users of this. > 4. Too much for init (line 90-91 extension.js) Fair enough for line 90, but line 91 does not create any instances etc - it basically calls `init' methods in other modules (since we spread and organise our code into various modules). Other PaperWM modules don't use init. PaperWM allows users to add a `user.js` file to provide some user specific customisation (which is a loved feature in PaperWM) - so line 91 calls a `init` in user.js (if a user has one). > 6. For `session-modes` you should add the reason to the disable function but I don't think moving windows to another place is a good reason for that. I was hoping you would say that :-). Hmmm - yes, I've seen the behaviour linked... what I've seen is that usually on the first lock, it seems to disable/enable PaperWM on unlock, but subsequent locks don't actually disable/enable it (have confirmed this through gnome logs too. The moving windows isssues I see only occur when using multiple monitors - and on enable individual windows seem to jump/move to another monitor. I'll look at that - but I had assumed "unlock-dialog" allows PaperWM to NOT disable/enable when the lockscreen is up. If it doesn't, what exactly does "unlock-dialog" do? > 7. You cannot create instances in global scope which is the same as init: - line 12 extension.js Can you confirm where you're seeing this? Line 12 in extension.js is part way through a comment. > 9 . You are still using many `log()`s. Use `console.log()` instead Can do. Do you see an issue with the number of log calls (or just the fact that we aren't using `console.log(...)`? Well, on the plus-side, 8 issues is much less than last time! (28). Thanks JustPerfection!
jtaala posted a review
Re my comment for (6): * I was hoping you wouldn't say that * :-)
JustPerfection posted a review
# 4 I understand but we don't want other than init translation there. # 6 Can still get disabled on lock because: - GNOME Shell disabling all extensions first. - Then enables extensions with `unlcok-dialog`. This can allow GNOME Shell to rebase properly. `session-modes` is more suited for extensions changing the lock screen look and for extensions want to work while the screen is locked. But your extension cannot use that for these reasons: - The disable enable process still happens (it can even happen multiple times with one lock). - You are using keybindings which is not allowed in lock screen for security reason. As we stated in ego review guidelines: > All signals related to keyboard events MUST be disconnected in unlock-dialog session mode. https://gjs.guide/extensions/review-guidelines/review-guidelines.html#session-modes # 7 Sorry about that. I meant line 12 `settings.js`. # 9 We generally prefer not using like that because log should be only available on debug mode. We have `console` since 42. That gives you the ability to still use log in different levels (`console.debug`, `console.log`, ...). You can read the debug with: ```bash journalctl -fo cat GNOME_SHELL_EXTENSION_UUID=paperwm@paperwm.github.com ```
jtaala posted a review
> We have `console` since 42. That gives you the ability to still use log > in different levels (`console.debug`, `console.log`, ...). > > You can read the debug with: > > ```bash > journalctl -fo cat GNOME_SHELL_EXTENSION_UUID=paperwm@paperwm.github.com > ``` Okay, I've gone through and replaced log() with console.log(), console.debug(), and console.error(). Only console.log entries are showing in `journalctl -r /usr/bin/gnome-shell` and I'm not getting much `journalctl -fo cat GNOME_SHELL_EXTENSION_UUID=paperwm@paperwm.github.com`. How do you start the extension (or gnome) in debug mode to see the console.debug() messages?
jtaala posted a review
I notice this (referring to `journalctl -fo cat GNOME_SHELL_EXTENSION_UUID=paperwm@paperwm.github.com`) at https://gjs.guide/extensions/development/debugging.html#filtering-by-extension: ``` Filtering by Extension WARNING This feature has limited usefulness, because it silences other messages from GNOME Shell and only works with the built-in log() function (not console.log()). ``` e.g. this doesn't actually work with `console.log()`... it only works with `log()` (which you've asked us not to use... I seem to be missing something here.
JustPerfection posted a review
Oh! Sorry, I gave you wrong command. To enable debug mode, you can use this in your `.js` file: ```js GLib.log_set_debug_enabled(true); ``` or in nested session: ```bash G_MESSAGES_DEBUG=all dbus-run-session gnome-shell --nested --wayland ```
jtaala posted a review
Hey @Javad, I'm putting some final touches/changes on PaperWM for the next submission. Question re `Mainloop` sources: So, I understand and agree with the intent of running a `remove_source` call for any Mainloop sources added in `disable`. Given that all our Mainloop sources return false, the and the sources get removed at the end of the callback function, removing these in `disable` does pollute the log with quite a few lines like ``` Source ID 41357 was not found when attempting to remove it ``` Since the source has actually already been removed from the Mainloop. Do we just accept those console lines as cleanup checks? (e.g. "oh, tried to remove it just in case but it's not there"). Alternatively, I was thinking of null the timeoutid just before a `return false` - then the check in `disable` won't attempt to remove a source that's already been removed (with a null check). Thoughts?
JustPerfection posted a review
Hi, Because you are not cleaning up the source inside the *timeout callback*. ``` timeoutId = GLib.timeout_add( GLib.PRIORITY_IDLE, 500, () => { timeoutId = null; return GLib.SOURCE_REMOVE; } ); ``` Now you can remove it on disable: ```js if (timeoutId) { GLib.source_remove(timeoutId); timeoutId = null; } ``` btw, we want the timeout cleanup on disable because timeouts can get delayed. so the callback can get triggered on lock screen and that's a security issue. as we mentioned in the review guidelines: > You MUST remove all active main loop sources in disable(), > even if the callback function will eventually return false or GLib.SOURCE_REMOVE. https://gjs.guide/extensions/review-guidelines/review-guidelines.html#remove-main-loop-sources
jtaala posted a review
Awesome, thanks Javad! Yep, I like the removal in disable, just wanted to remove those console lines and checking it's okay to do what you mentioned. Cheers.