diff --git a/build.sh b/build.sh index b7ab7c3..a7cdfc3 100755 --- a/build.sh +++ b/build.sh @@ -1,3 +1,4 @@ #!/bin/bash +glib-compile-schemas schemas/ zip -xdemo.gif -xREADME.md -xbuild.sh wintile.zip * diff --git a/extension.js b/extension.js index 22d0db1..f7937f4 100644 --- a/extension.js +++ b/extension.js @@ -3,11 +3,12 @@ const Main = imports.ui.main const Mainloop = imports.mainloop; const Gio = imports.gi.Gio; -let config = { - cols: 2, - useMaximize: true, - debug: true -} +const ModalDialog = imports.ui.modalDialog; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; + +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); // View logs with `journalctl -qf |grep WinTile` var _log = function(str) { @@ -16,6 +17,40 @@ var _log = function(str) { } } +let config = { + cols: 2, + useMaximize: true, + debug: true +} + +// Get the GSchema for our settings +let gschema = Gio.SettingsSchemaSource.new_from_directory( + Me.dir.get_child('schemas').get_path(), + Gio.SettingsSchemaSource.get_default(), + false +); + +// Create a new settings object +let settings = new Gio.Settings({ + settings_schema: gschema.lookup('org.gnome.shell.extensions.wintile', true) +}); + +function updateSettings() { + // 0 = 2 cols, 1 = 4 cols + if (settings.get_value('cols').deep_unpack() == 0) + config.cols = 2; + else + config.cols = 4; + config.useMaximize = settings.get_value('use-maximize').deep_unpack(); + config.debug = settings.get_value('debug').deep_unpack(); + _log(JSON.stringify(config)); +} + +updateSettings(); + +// Watch the settings for changes +let settingsChangedId = settings.connect('changed', updateSettings.bind()); + const Config = imports.misc.config; window.gsconnect = { extdatadir: imports.misc.extensionUtils.getCurrentExtension().path, @@ -34,6 +69,8 @@ var oldbindings = { function moveApp(app, loc) { _log("moveApp: " + JSON.stringify(loc)); + //let ws = new Gio.Settings({ schema_id: 'org.gnome.shell.extensions.wintile' }); + //_log(ws.get_strv('cols')); var space = app.get_work_area_current_monitor() colWidth = Math.floor(space.width/config.cols) rowHeight = Math.floor(space.height/2) diff --git a/prefs.js b/prefs.js new file mode 100644 index 0000000..2e63a64 --- /dev/null +++ b/prefs.js @@ -0,0 +1,114 @@ +'use strict'; + +const Gio = imports.gi.Gio; +const Gtk = imports.gi.Gtk; +const GObject = imports.gi.GObject; + +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +const Gettext = imports.gettext; +const _ = Gettext.domain('wintile').gettext; + +function init() { +} + +function createColOptions(){ + let options = [ + { name: _("2") }, + { name: _("4"),} + ]; + let liststore = new Gtk.ListStore(); + liststore.set_column_types([GObject.TYPE_STRING]) + for (let i = 0; i < options.length; i++ ) { + let option = options[i]; + let iter = liststore.append(); + liststore.set (iter, [0], [option.name]); + } + return liststore; +} + +function buildPrefsWidget() { + // Copy the same GSettings code from `extension.js` + let gschema = Gio.SettingsSchemaSource.new_from_directory( + Me.dir.get_child('schemas').get_path(), + Gio.SettingsSchemaSource.get_default(), + false + ); + + this.settings = new Gio.Settings({ + settings_schema: gschema.lookup('org.gnome.shell.extensions.wintile', true) + }); + + let rendererText = new Gtk.CellRendererText(); + + // Create a parent widget that we'll return from this function + let layout = new Gtk.Grid({ + margin: 18, + column_spacing: 12, + row_spacing: 12, + visible: true + }); + + // Add a simple title and add it to the layout + let title = new Gtk.Label({ + label: `${Me.metadata.name} Extension Preferences`, + halign: Gtk.Align.CENTER, + use_markup: true, + visible: true + }); + layout.attach(title, 0, 0, 2, 1); + + // Column setting + let colsLabel = new Gtk.Label({ + label: _("Number of columns"), + visible: true, + hexpand: true, + halign: Gtk.Align.START + }); + let colsInput = new Gtk.ComboBox({ + model: createColOptions(), + visible: true + }); + colsInput.pack_start (rendererText, false); + colsInput.add_attribute (rendererText, "text", 0); + layout.attach(colsLabel, 0, 1, 1, 1); + layout.attach(colsInput, 1, 1, 1, 1); + + // Maximize setting + let maximizeLabel = new Gtk.Label({ + label: _("Use true maximizing of windows"), + visible: true, + hexpand: true, + halign: Gtk.Align.START + }); + let maximizeInput = new Gtk.Switch({ + active: this.settings.get_boolean ('use-maximize'), + halign: Gtk.Align.END, + visible: true + }); + layout.attach(maximizeLabel, 0, 2, 1, 1); + layout.attach(maximizeInput, 1, 2, 1, 1); + + // Debug setting + let debugLabel = new Gtk.Label({ + label: _("Turn on debugging"), + visible: true, + hexpand: true, + halign: Gtk.Align.START + }); + let debugInput = new Gtk.Switch({ + active: this.settings.get_boolean ('debug'), + halign: Gtk.Align.END, + visible: true + }); + layout.attach(debugLabel, 0, 3, 1, 1); + layout.attach(debugInput, 1, 3, 1, 1); + + this.settings.bind('cols', colsInput, 'active', Gio.SettingsBindFlags.DEFAULT); + this.settings.bind('use-maximize', maximizeInput, 'active', Gio.SettingsBindFlags.DEFAULT); + this.settings.bind('debug', debugInput, 'active', Gio.SettingsBindFlags.DEFAULT); + + // Return our widget which will be added to the window + return layout; +} \ No newline at end of file diff --git a/schemas/gschemas.compiled b/schemas/gschemas.compiled new file mode 100644 index 0000000..8c9678e Binary files /dev/null and b/schemas/gschemas.compiled differ diff --git a/schemas/org.gnome.shell.extensions.wintile.gschema.xml b/schemas/org.gnome.shell.extensions.wintile.gschema.xml new file mode 100644 index 0000000..f38d6d0 --- /dev/null +++ b/schemas/org.gnome.shell.extensions.wintile.gschema.xml @@ -0,0 +1,21 @@ + + + + + 0 + Number of columns (2 or 4 only) + + + + + true + Turn on/off use of maximizing windows + When on, certain windows that won't resize full screen like Terminal will, however animations may occur between tile shifts. + + + false + Turn on/off debug output + + + + \ No newline at end of file