floating.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Gtk imports
  2. import Gtk from "gi://Gtk";
  3. import GObject from "gi://GObject";
  4. // Gnome imports
  5. import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js";
  6. // Extension imports
  7. import { PreferencesPage, RemoveItemRow, ResetButton } from "./widgets.js";
  8. import { ConfigManager } from "../shared/settings.js";
  9. export class FloatingPage extends PreferencesPage {
  10. static {
  11. GObject.registerClass(this);
  12. }
  13. constructor({ settings, dir }) {
  14. super({ title: _("Windows"), icon_name: "window-symbolic" });
  15. this.settings = settings;
  16. this.configMgr = new ConfigManager({ dir });
  17. let overrides = this.configMgr.windowProps.overrides;
  18. this.rows = this.loadItemsFromConfig(overrides);
  19. this.floatingWindowGroup = this.add_group({
  20. title: _("Floating Windows"),
  21. description: _("Windows that will not be tiled"),
  22. header_suffix: new ResetButton({ onReset: () => this.onResetHandler() }),
  23. children: this.rows,
  24. });
  25. }
  26. loadItemsFromConfig(overrides) {
  27. let children = [];
  28. for (let override of overrides) {
  29. if (override.mode === "float") {
  30. let itemrow = new RemoveItemRow({
  31. title: override.wmTitle ?? override.wmClass,
  32. subtitle: override.wmClass,
  33. onRemove: (item, parent) => this.onRemoveHandler(item, parent),
  34. });
  35. children.push(itemrow);
  36. }
  37. }
  38. return children;
  39. }
  40. onRemoveHandler(item, parent) {
  41. this.floatingWindowGroup.remove(parent);
  42. this.rows = this.rows.filter((row) => row != parent);
  43. const existing = this.configMgr.windowProps.overrides;
  44. const modified = existing.filter((row) => item != row.wmClass);
  45. this.saveOverrides(modified);
  46. }
  47. saveOverrides(modified) {
  48. if (modified) {
  49. this.configMgr.windowProps = {
  50. overrides: modified,
  51. };
  52. // Signal the main extension to reload floating overrides
  53. const changed = Math.floor(Date.now() / 1000);
  54. this.settings.set_uint("window-overrides-reload-trigger", changed);
  55. }
  56. }
  57. onResetHandler() {
  58. const defaultWindowProps = this.configMgr.loadDefaultWindowConfigContents();
  59. const original = defaultWindowProps.overrides;
  60. this.saveOverrides(original);
  61. for (const child of this.rows) {
  62. this.floatingWindowGroup.remove(child);
  63. }
  64. this.rows = this.loadItemsFromConfig(original);
  65. for (const item of this.rows) {
  66. this.floatingWindowGroup.add(item);
  67. }
  68. }
  69. }