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