diff options
Diffstat (limited to 'src/widget/window.vala')
-rw-r--r-- | src/widget/window.vala | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/src/widget/window.vala b/src/widget/window.vala new file mode 100644 index 0000000..1faaf7b --- /dev/null +++ b/src/widget/window.vala @@ -0,0 +1,136 @@ +using GtkLayerShell; + +namespace Astal { +public enum WindowAnchor { + NONE = 0, + TOP = 1, + RIGHT = 2, + LEFT = 4, + BOTTOM = 8, +} + +public enum Exclusivity { + NORMAL, + EXCLUSIVE, + IGNORE, +} + +public enum Layer { + TOP = GtkLayerShell.Layer.TOP, + OVERLAY = GtkLayerShell.Layer.OVERLAY, + BOTTOM = GtkLayerShell.Layer.BOTTOM, + BACKGROUND = GtkLayerShell.Layer.BACKGROUND, +} + +public enum Keymode { + NONE = GtkLayerShell.KeyboardMode.NONE, + ON_DEMAND = GtkLayerShell.KeyboardMode.ON_DEMAND, + EXCLUSIVE = GtkLayerShell.KeyboardMode.EXCLUSIVE, +} + +public class Window : Gtk.Window { + construct { + height_request = 1; + width_request = 1; + init_for_window(this); + set_namespace(this, name); + notify["name"].connect(() => set_namespace(this, name)); + } + + public int anchor { + set { + set_anchor(this, Edge.TOP, WindowAnchor.TOP in value); + set_anchor(this, Edge.BOTTOM, WindowAnchor.BOTTOM in value); + set_anchor(this, Edge.LEFT, WindowAnchor.LEFT in value); + set_anchor(this, Edge.RIGHT, WindowAnchor.RIGHT in value); + } + get { + var a = WindowAnchor.NONE; + if (get_anchor(this, Edge.TOP)) + a = a | WindowAnchor.TOP; + + if (get_anchor(this, Edge.RIGHT)) + a = a | WindowAnchor.RIGHT; + + if (get_anchor(this, Edge.LEFT)) + a = a | WindowAnchor.LEFT; + + if (get_anchor(this, Edge.BOTTOM)) + a = a | WindowAnchor.BOTTOM; + + return a; + } + } + + public Exclusivity exclusivity { + set { + switch (value) { + case Exclusivity.NORMAL: + set_exclusive_zone(this, 0); + break; + case Exclusivity.EXCLUSIVE: + auto_exclusive_zone_enable (this); + break; + case Exclusivity.IGNORE: + set_exclusive_zone(this, -1); + break; + } + } + get { + if (auto_exclusive_zone_is_enabled (this)) + return Exclusivity.EXCLUSIVE; + + if (get_exclusive_zone(this) == -1) + return Exclusivity.IGNORE; + + return Exclusivity.NORMAL; + } + } + + public Layer layer { + get { return (Layer)get_layer(this); } + set { set_layer(this, (GtkLayerShell.Layer)value); } + } + + public Keymode keymode { + set { set_keyboard_mode(this, (GtkLayerShell.KeyboardMode)value); } + get { return (Keymode)get_keyboard_mode(this); } + } + + public Gdk.Monitor gdkmonitor { + set { set_monitor (this, value); } + get { return get_monitor(this); } + } + + /** + * CAUTION: the id might not be the same mapped by the compositor + * to reset and let the compositor map it pass a negative number + */ + public int monitor { + set { + if (value < 0) + set_monitor(this, (Gdk.Monitor)null); + + var m = Gdk.Display.get_default().get_monitor(value); + set_monitor(this, m); + } + get { + var m = get_monitor(this); + var d = Gdk.Display.get_default(); + for (var i = 0; i < d.get_n_monitors(); ++i) { + if (m == d.get_monitor(i)) + return i; + } + + return -1; + } + } +} + +/** + * CAUTION: the id might not be the same mapped by the compositor + */ +public uint get_num_monitors() { + return Gdk.Display.get_default().get_n_monitors(); +} +} |