diff options
Diffstat (limited to 'core/src/widget')
-rw-r--r-- | core/src/widget/box.vala | 62 | ||||
-rw-r--r-- | core/src/widget/button.vala | 101 | ||||
-rw-r--r-- | core/src/widget/centerbox.vala | 54 | ||||
-rw-r--r-- | core/src/widget/circularprogress.vala | 182 | ||||
-rw-r--r-- | core/src/widget/eventbox.vala | 66 | ||||
-rw-r--r-- | core/src/widget/icon.vala | 107 | ||||
-rw-r--r-- | core/src/widget/label.vala | 18 | ||||
-rw-r--r-- | core/src/widget/levelbar.vala | 15 | ||||
-rw-r--r-- | core/src/widget/overlay.vala | 59 | ||||
-rw-r--r-- | core/src/widget/scrollable.vala | 42 | ||||
-rw-r--r-- | core/src/widget/slider.vala | 73 | ||||
-rw-r--r-- | core/src/widget/stack.vala | 26 | ||||
-rw-r--r-- | core/src/widget/widget.vala | 157 | ||||
-rw-r--r-- | core/src/widget/window.vala | 255 |
14 files changed, 0 insertions, 1217 deletions
diff --git a/core/src/widget/box.vala b/core/src/widget/box.vala deleted file mode 100644 index 943c821..0000000 --- a/core/src/widget/box.vala +++ /dev/null @@ -1,62 +0,0 @@ -namespace Astal { -public class Box : Gtk.Box { - [CCode (notify = false)] - public bool vertical { - get { return orientation == Gtk.Orientation.VERTICAL; } - set { orientation = value ? Gtk.Orientation.VERTICAL : Gtk.Orientation.HORIZONTAL; } - } - - public List<weak Gtk.Widget> children { - set { _set_children(value); } - owned get { return get_children(); } - } - - public new Gtk.Widget child { - owned get { return _get_child(); } - set { _set_child(value); } - } - - construct { - notify["orientation"].connect(() => { - notify_property("vertical"); - }); - } - - private void _set_child(Gtk.Widget child) { - var list = new List<weak Gtk.Widget>(); - list.append(child); - _set_children(list); - } - - private Gtk.Widget? _get_child() { - foreach(var child in get_children()) - return child; - - return null; - } - - private void _set_children(List<weak Gtk.Widget> arr) { - foreach(var child in get_children()) { - remove(child); - } - - foreach(var child in arr) - add(child); - } - - public Box(bool vertical, List<weak Gtk.Widget> children) { - this.vertical = vertical; - _set_children(children); - } - - public Box.newh(List<weak Gtk.Widget> children) { - this.vertical = false; - _set_children(children); - } - - public Box.newv(List<weak Gtk.Widget> children) { - this.vertical = true; - _set_children(children); - } -} -} diff --git a/core/src/widget/button.vala b/core/src/widget/button.vala deleted file mode 100644 index ad60da1..0000000 --- a/core/src/widget/button.vala +++ /dev/null @@ -1,101 +0,0 @@ -namespace Astal { -public class Button : Gtk.Button { - public signal void hover (HoverEvent event); - public signal void hover_lost (HoverEvent event); - public signal void click (ClickEvent event); - public signal void click_release (ClickEvent event); - public signal void scroll (ScrollEvent event); - - construct { - add_events(Gdk.EventMask.SCROLL_MASK); - add_events(Gdk.EventMask.SMOOTH_SCROLL_MASK); - - enter_notify_event.connect((self, event) => { - hover(HoverEvent(event) { lost = false }); - }); - - leave_notify_event.connect((self, event) => { - hover_lost(HoverEvent(event) { lost = true }); - }); - - button_press_event.connect((event) => { - click(ClickEvent(event) { release = false }); - }); - - button_release_event.connect((event) => { - click_release(ClickEvent(event) { release = true }); - }); - - scroll_event.connect((event) => { - scroll(ScrollEvent(event)); - }); - } -} - -public enum MouseButton { - PRIMARY = 1, - MIDDLE = 2, - SECONDARY = 3, - BACK = 4, - FORWARD = 5, -} - -// these structs are here because gjs converts every event -// into a union Gdk.Event, which cannot be destructured -// and are not as convinent to work with as a struct -public struct ClickEvent { - bool release; - uint time; - double x; - double y; - Gdk.ModifierType modifier; - MouseButton button; - - public ClickEvent(Gdk.EventButton event) { - this.time = event.time; - this.x = event.x; - this.y = event.y; - this.button = (MouseButton)event.button; - this.modifier = event.state; - } -} - -public struct HoverEvent { - bool lost; - uint time; - double x; - double y; - Gdk.ModifierType modifier; - Gdk.CrossingMode mode; - Gdk.NotifyType detail; - - public HoverEvent(Gdk.EventCrossing event) { - this.time = event.time; - this.x = event.x; - this.y = event.y; - this.modifier = event.state; - this.mode = event.mode; - this.detail = event.detail; - } -} - -public struct ScrollEvent { - uint time; - double x; - double y; - Gdk.ModifierType modifier; - Gdk.ScrollDirection direction; - double delta_x; - double delta_y; - - public ScrollEvent(Gdk.EventScroll event) { - this.time = event.time; - this.x = event.x; - this.y = event.y; - this.modifier = event.state; - this.direction = event.direction; - this.delta_x = event.delta_x; - this.delta_y = event.delta_y; - } -} -} diff --git a/core/src/widget/centerbox.vala b/core/src/widget/centerbox.vala deleted file mode 100644 index 0588828..0000000 --- a/core/src/widget/centerbox.vala +++ /dev/null @@ -1,54 +0,0 @@ -namespace Astal { -public class CenterBox : Gtk.Box { - [CCode (notify = false)] - public bool vertical { - get { return orientation == Gtk.Orientation.VERTICAL; } - set { orientation = value ? Gtk.Orientation.VERTICAL : Gtk.Orientation.HORIZONTAL; } - } - - construct { - notify["orientation"].connect(() => { - notify_property("vertical"); - }); - } - - static construct { - set_css_name("centerbox"); - } - - private Gtk.Widget _start_widget; - public Gtk.Widget start_widget { - get { return _start_widget; } - set { - if (_start_widget != null) - remove(_start_widget); - - if (value != null) - pack_start(value, true, true, 0); - } - } - - private Gtk.Widget _end_widget; - public Gtk.Widget end_widget { - get { return _end_widget; } - set { - if (_end_widget != null) - remove(_end_widget); - - if (value != null) - pack_end(value, true, true, 0); - } - } - - public Gtk.Widget center_widget { - get { return get_center_widget(); } - set { - if (center_widget != null) - remove(center_widget); - - if (value != null) - set_center_widget(value); - } - } -} -} diff --git a/core/src/widget/circularprogress.vala b/core/src/widget/circularprogress.vala deleted file mode 100644 index 4e1410d..0000000 --- a/core/src/widget/circularprogress.vala +++ /dev/null @@ -1,182 +0,0 @@ -namespace Astal { -public class CircularProgress : Gtk.Bin { - public double start_at { get; set; } - public double end_at { get; set; } - public double value { get; set; } - public bool inverted { get; set; } - public bool rounded { get; set; } - - construct { - notify["start-at"].connect(queue_draw); - notify["end-at"].connect(queue_draw); - notify["value"].connect(queue_draw); - notify["inverted"].connect(queue_draw); - notify["rounded"].connect(queue_draw); - notify["child"].connect(queue_draw); - } - - static construct { - set_css_name("circular-progress"); - } - - public override void get_preferred_height(out int minh, out int nath) { - var val = get_style_context().get_property("min-height", Gtk.StateFlags.NORMAL); - if (val.get_int() <= 0) { - minh = 40; - nath = 40; - } - - minh = val.get_int(); - nath = val.get_int(); - } - - public override void get_preferred_width(out int minw, out int natw) { - var val = get_style_context().get_property("min-width", Gtk.StateFlags.NORMAL); - if (val.get_int() <= 0) { - minw = 40; - natw = 40; - } - - minw = val.get_int(); - natw = val.get_int(); - } - - private double to_radian(double percentage) { - percentage = Math.floor(percentage * 100); - return (percentage / 100) * (2 * Math.PI); - } - - private bool is_full_circle(double start, double end, double epsilon = 1e-10) { - // Ensure that start and end are between 0 and 1 - start = (start % 1 + 1) % 1; - end = (end % 1 + 1) % 1; - - // Check if the difference between start and end is close to 1 - return Math.fabs(start - end) <= epsilon; - } - - private double scale_arc_value(double start, double end, double value) { - // Ensure that start and end are between 0 and 1 - start = (start % 1 + 1) % 1; - end = (end % 1 + 1) % 1; - - // Calculate the length of the arc - var arc_length = end - start; - if (arc_length < 0) - arc_length += 1; // Adjust for circular representation - - // Calculate the position on the arc based on the percentage value - var scaled = arc_length + value; - - // Ensure the position is between 0 and 1 - return (scaled % 1 + 1) % 1; - } - - private double min(double[] arr) { - double min = arr[0]; - foreach(var i in arr) - if (min > i) min = i; - return min; - } - - private double max(double[] arr) { - double max = arr[0]; - foreach(var i in arr) - if (max < i) max = i; - return max; - } - - public override bool draw(Cairo.Context cr) { - Gtk.Allocation allocation; - get_allocation(out allocation); - - var styles = get_style_context(); - var width = allocation.width; - var height = allocation.height; - var thickness = styles.get_property("font-size", Gtk.StateFlags.NORMAL).get_double(); - var margin = styles.get_margin(Gtk.StateFlags.NORMAL); - var fg = styles.get_color(Gtk.StateFlags.NORMAL); - var bg = styles.get_background_color(Gtk.StateFlags.NORMAL); - - var bg_stroke = thickness + min({margin.bottom, margin.top, margin.left, margin.right}); - var fg_stroke = thickness; - var radius = min({width, height}) / 2.0 - max({bg_stroke, fg_stroke}) / 2.0; - var center_x = width / 2; - var center_y = height / 2; - - var start_background = to_radian(start_at); - var end_background = to_radian(end_at); - var ranged_value = value + start_at; - - var is_circle = is_full_circle(this.start_at, this.end_at); - - if (is_circle) { - // Redefine end_draw in radius to create an accurate full circle - end_background = start_background + 2 * Math.PI; - ranged_value = to_radian(value); - } else { - // Range the value for the arc shape - ranged_value = to_radian(scale_arc_value( - start_at, - end_at, - value - )); - } - - double start_progress, end_progress; - - if (inverted) { - start_progress = end_background - ranged_value; - end_progress = end_background; - } else { - start_progress = start_background; - end_progress = start_background + ranged_value; - } - - // Draw background - cr.set_source_rgba(bg.red, bg.green, bg.blue, bg.alpha); - cr.arc(center_x, center_y, radius, start_background, end_background); - cr.set_line_width(bg_stroke); - cr.stroke(); - - // Draw rounded background ends - if (rounded) { - var start_x = center_x + Math.cos(start_background) * radius; - var start_y = center_y + Math.sin(start_background) * radius; - var end_x = center_x + Math.cos(end_background) * radius; - var end_y = center_y + Math.sin(end_background) * radius; - cr.set_line_width(0); - cr.arc(start_x, start_y, bg_stroke / 2, 0, 0 - 0.01); - cr.fill(); - cr.arc(end_x, end_y, bg_stroke / 2, 0, 0 - 0.01); - cr.fill(); - } - - // Draw progress - cr.set_source_rgba(fg.red, fg.green, fg.blue, fg.alpha); - cr.arc(center_x, center_y, radius, start_progress, end_progress); - cr.set_line_width(fg_stroke); - cr.stroke(); - - // Draw rounded progress ends - if (rounded) { - var start_x = center_x + Math.cos(start_progress) * radius; - var start_y = center_y + Math.sin(start_progress) * radius; - var end_x = center_x + Math.cos(end_progress) * radius; - var end_y = center_y + Math.sin(end_progress) * radius; - cr.set_line_width(0); - cr.arc(start_x, start_y, fg_stroke / 2, 0, 0 - 0.01); - cr.fill(); - cr.arc(end_x, end_y, fg_stroke / 2, 0, 0 - 0.01); - cr.fill(); - } - - if (get_child() != null) { - get_child().size_allocate(allocation); - propagate_draw(get_child(), cr); - } - - return true; - } -} -} diff --git a/core/src/widget/eventbox.vala b/core/src/widget/eventbox.vala deleted file mode 100644 index 6b715cc..0000000 --- a/core/src/widget/eventbox.vala +++ /dev/null @@ -1,66 +0,0 @@ -namespace Astal { -public class EventBox : Gtk.EventBox { - public signal void hover (HoverEvent event); - public signal void hover_lost (HoverEvent event); - public signal void click (ClickEvent event); - public signal void click_release (ClickEvent event); - public signal void scroll (ScrollEvent event); - public signal void motion (MotionEvent event); - - static construct { - set_css_name("eventbox"); - } - - construct { - add_events(Gdk.EventMask.SCROLL_MASK); - add_events(Gdk.EventMask.SMOOTH_SCROLL_MASK); - add_events(Gdk.EventMask.POINTER_MOTION_MASK); - - enter_notify_event.connect((self, event) => { - if (event.window == self.get_window() && - event.detail != Gdk.NotifyType.INFERIOR) { - this.set_state_flags(Gtk.StateFlags.PRELIGHT, false); - hover(HoverEvent(event) { lost = false }); - } - }); - - leave_notify_event.connect((self, event) => { - if (event.window == self.get_window() && - event.detail != Gdk.NotifyType.INFERIOR) { - this.unset_state_flags(Gtk.StateFlags.PRELIGHT); - hover_lost(HoverEvent(event) { lost = true }); - } - }); - - button_press_event.connect((event) => { - click(ClickEvent(event) { release = false }); - }); - - button_release_event.connect((event) => { - click_release(ClickEvent(event) { release = true }); - }); - - scroll_event.connect((event) => { - scroll(ScrollEvent(event)); - }); - - motion_notify_event.connect((event) => { - motion(MotionEvent(event)); - }); - } -} - -public struct MotionEvent { - uint time; - double x; - double y; - Gdk.ModifierType modifier; - - public MotionEvent(Gdk.EventMotion event) { - this.time = event.time; - this.x = event.x; - this.y = event.y; - this.modifier = event.state; - } -} -} diff --git a/core/src/widget/icon.vala b/core/src/widget/icon.vala deleted file mode 100644 index 4f1c7f1..0000000 --- a/core/src/widget/icon.vala +++ /dev/null @@ -1,107 +0,0 @@ -namespace Astal { -public Gtk.IconInfo? lookup_icon(string icon) { - var theme = Gtk.IconTheme.get_default(); - return theme.lookup_icon(icon, 16, Gtk.IconLookupFlags.USE_BUILTIN); -} - -public class Icon : Gtk.Image { - private IconType type = IconType.NAMED; - private double size { get; set; default = 14; } - - public new Gdk.Pixbuf pixbuf { get; set; } - public string icon { get; set; default = ""; } - public GLib.Icon g_icon {get; set;} - - private async void display_icon() { - switch(type) { - case IconType.NAMED: - icon_name = icon; - pixel_size = (int)size; - break; - case IconType.FILE: - try { - var file = File.new_for_path(icon); - var stream = yield file.read_async(); - var pb = yield new Gdk.Pixbuf.from_stream_at_scale_async( - stream, - (int)size * scale_factor, - (int)size * scale_factor, - true, - null - ); - var cs = Gdk.cairo_surface_create_from_pixbuf(pb, 0, this.get_window()); - set_from_surface(cs); - } catch (Error err) { - printerr(err.message); - } - break; - case IconType.PIXBUF: - var pb_scaled = pixbuf.scale_simple( - (int)size * scale_factor, - (int)size * scale_factor, - Gdk.InterpType.BILINEAR - ); - if (pb_scaled != null) { - var cs = Gdk.cairo_surface_create_from_pixbuf(pb_scaled, 0, this.get_window()); - set_from_surface(cs); - } - break; - case IconType.GICON: - pixel_size = (int)size; - gicon = g_icon; - break; - - } - } - - static construct { - set_css_name("icon"); - } - - construct { - notify["icon"].connect(() => { - if(FileUtils.test(icon, GLib.FileTest.EXISTS)) - type = IconType.FILE; - else if (lookup_icon(icon) != null) - type = IconType.NAMED; - else { - type = IconType.NAMED; - warning("cannot assign %s as icon, "+ - "it is not a file nor a named icon", icon); - } - display_icon.begin(); - }); - - notify["pixbuf"].connect(() => { - type = IconType.PIXBUF; - display_icon.begin(); - }); - - notify["g-icon"].connect(() => { - type = IconType.GICON; - display_icon.begin(); - }); - - size_allocate.connect(() => { - size = get_style_context() - .get_property("font-size", Gtk.StateFlags.NORMAL).get_double(); - - display_icon.begin(); - }); - - get_style_context().changed.connect(() => { - size = get_style_context() - .get_property("font-size", Gtk.StateFlags.NORMAL).get_double(); - - display_icon.begin(); - }); - } -} - -private enum IconType { - NAMED, - FILE, - PIXBUF, - GICON, -} -} diff --git a/core/src/widget/label.vala b/core/src/widget/label.vala deleted file mode 100644 index 4063b6f..0000000 --- a/core/src/widget/label.vala +++ /dev/null @@ -1,18 +0,0 @@ -using Pango; - -public class Astal.Label : Gtk.Label { - public bool truncate { - set { ellipsize = value ? EllipsizeMode.END : EllipsizeMode.NONE; } - get { return ellipsize == EllipsizeMode.END; } - } - - public new bool justify_fill { - set { justify = value ? Gtk.Justification.FILL : Gtk.Justification.LEFT; } - get { return justify == Gtk.Justification.FILL; } - } - - construct { - notify["ellipsize"].connect(() => notify_property("truncate")); - notify["justify"].connect(() => notify_property("justify_fill")); - } -} diff --git a/core/src/widget/levelbar.vala b/core/src/widget/levelbar.vala deleted file mode 100644 index 1db2cc7..0000000 --- a/core/src/widget/levelbar.vala +++ /dev/null @@ -1,15 +0,0 @@ -namespace Astal { -public class LevelBar : Gtk.LevelBar { - [CCode (notify = false)] - public bool vertical { - get { return orientation == Gtk.Orientation.VERTICAL; } - set { orientation = value ? Gtk.Orientation.VERTICAL : Gtk.Orientation.HORIZONTAL; } - } - - construct { - notify["orientation"].connect(() => { - notify_property("vertical"); - }); - } -} -} diff --git a/core/src/widget/overlay.vala b/core/src/widget/overlay.vala deleted file mode 100644 index 207aaa7..0000000 --- a/core/src/widget/overlay.vala +++ /dev/null @@ -1,59 +0,0 @@ -namespace Astal { -public class Overlay : Gtk.Overlay { - public bool pass_through { get; set; } - - public Gtk.Widget? overlay { - get { return overlays.nth_data(0); } - set { - foreach (var ch in get_children()) { - if (ch != child) - remove(ch); - } - - if (value != null) - add_overlay(value); - } - } - - public List<weak Gtk.Widget> overlays { - owned get { return get_children(); } - set { - foreach (var ch in get_children()) { - if (ch != child) - remove(ch); - } - - foreach (var ch in value) - add_overlay(ch); - } - } - - public new Gtk.Widget? child { - get { return get_child(); } - set { - var ch = get_child(); - if (ch != null) - remove(ch); - - if (value != null) - add(value); - } - } - - construct { - notify["pass-through"].connect(() => { - update_pass_through(); - }); - } - - private void update_pass_through() { - foreach (var child in get_children()) - set_overlay_pass_through(child, pass_through); - } - - public new void add_overlay(Gtk.Widget widget) { - base.add_overlay(widget); - set_overlay_pass_through(widget, pass_through); - } -} -} diff --git a/core/src/widget/scrollable.vala b/core/src/widget/scrollable.vala deleted file mode 100644 index 1a0e081..0000000 --- a/core/src/widget/scrollable.vala +++ /dev/null @@ -1,42 +0,0 @@ -namespace Astal { -public class Scrollable : Gtk.ScrolledWindow { - private Gtk.PolicyType _hscroll = Gtk.PolicyType.AUTOMATIC; - private Gtk.PolicyType _vscroll = Gtk.PolicyType.AUTOMATIC; - - public Gtk.PolicyType hscroll { - get { return _hscroll; } - set { - _hscroll = value; - set_policy(value, vscroll); - } - } - - public Gtk.PolicyType vscroll { - get { return _vscroll; } - set { - _vscroll = value; - set_policy(hscroll, value); - } - } - - static construct { - set_css_name("scrollable"); - } - - construct { - if (hadjustment != null) - hadjustment = new Gtk.Adjustment(0,0,0,0,0,0); - - if (vadjustment != null) - vadjustment = new Gtk.Adjustment(0,0,0,0,0,0); - } - - public new Gtk.Widget get_child() { - var ch = base.get_child(); - if (ch is Gtk.Viewport) { - return ch.get_child(); - } - return ch; - } -} -} diff --git a/core/src/widget/slider.vala b/core/src/widget/slider.vala deleted file mode 100644 index 16e6bd2..0000000 --- a/core/src/widget/slider.vala +++ /dev/null @@ -1,73 +0,0 @@ -namespace Astal { -public class Slider : Gtk.Scale { - [CCode (notify = false)] - public bool vertical { - get { return orientation == Gtk.Orientation.VERTICAL; } - set { orientation = value ? Gtk.Orientation.VERTICAL : Gtk.Orientation.HORIZONTAL; } - } - - // emitted when the user drags the slider - public signal void dragged (); - - construct { - draw_value = false; - - if (adjustment == null) - adjustment = new Gtk.Adjustment(0,0,0,0,0,0); - - if (max == 0 && min == 0) { - max = 1; - } - - if (step == 0) { - step = 0.05; - } - - notify["orientation"].connect(() => { - notify_property("vertical"); - }); - - button_press_event.connect(() => { dragging = true; }); - key_press_event.connect(() => { dragging = true; }); - button_release_event.connect(() => { dragging = false; }); - key_release_event.connect(() => { dragging = false; }); - scroll_event.connect((event) => { - dragging = true; - if (event.delta_y > 0) - value -= step; - else - value += step; - dragging = false; - }); - - value_changed.connect(() => { - if (dragging) - dragged(); - }); - } - - public bool dragging { get; private set; } - - public double value { - get { return adjustment.value; } - set { if (!dragging) adjustment.value = value; } - } - - public double min { - get { return adjustment.lower; } - set { adjustment.lower = value; } - } - - public double max { - get { return adjustment.upper; } - set { adjustment.upper = value; } - } - - public double step { - get { return adjustment.step_increment; } - set { adjustment.step_increment = value; } - } - - // TODO: marks -} -} diff --git a/core/src/widget/stack.vala b/core/src/widget/stack.vala deleted file mode 100644 index 02f9959..0000000 --- a/core/src/widget/stack.vala +++ /dev/null @@ -1,26 +0,0 @@ -public class Astal.Stack : Gtk.Stack { - public string shown { - get { return visible_child_name; } - set { visible_child_name = value; } - } - - public List<weak Gtk.Widget> children { - set { _set_children(value); } - owned get { return get_children(); } - } - - private void _set_children(List<weak Gtk.Widget> arr) { - foreach(var child in get_children()) { - remove(child); - } - - var i = 0; - foreach(var child in arr) { - if (child.name != null) { - add_named(child, child.name); - } else { - add_named(child, (++i).to_string()); - } - } - } -} diff --git a/core/src/widget/widget.vala b/core/src/widget/widget.vala deleted file mode 100644 index 2506bc8..0000000 --- a/core/src/widget/widget.vala +++ /dev/null @@ -1,157 +0,0 @@ -namespace Astal { -private class Css { - private static HashTable<Gtk.Widget, Gtk.CssProvider> _providers; - public static HashTable<Gtk.Widget, Gtk.CssProvider> providers { - get { - if (_providers == null) { - _providers = new HashTable<Gtk.Widget, Gtk.CssProvider>( - (w) => (uint)w, - (a, b) => a == b); - } - - return _providers; - } - } -} - -private void remove_provider(Gtk.Widget widget) { - var providers = Css.providers; - - if (providers.contains(widget)) { - var p = providers.get(widget); - widget.get_style_context().remove_provider(p); - providers.remove(widget); - p.dispose(); - } -} - -public void widget_set_css(Gtk.Widget widget, string css) { - var providers = Css.providers; - - if (providers.contains(widget)) { - remove_provider(widget); - } else { - widget.destroy.connect(() => { - remove_provider(widget); - }); - } - - var style = !css.contains("{") || !css.contains("}") - ? "* { ".concat(css, "}") : css; - - var p = new Gtk.CssProvider(); - widget.get_style_context() - .add_provider(p, Gtk.STYLE_PROVIDER_PRIORITY_USER); - - try { - p.load_from_data(style, style.length); - providers.set(widget, p); - } catch (Error err) { - warning(err.message); - } -} - -public string widget_get_css(Gtk.Widget widget) { - var providers = Css.providers; - - if (providers.contains(widget)) - return providers.get(widget).to_string(); - - return ""; -} - -public void widget_set_class_names(Gtk.Widget widget, string[] class_names) { - foreach (var name in widget_get_class_names(widget)) - widget_toggle_class_name(widget, name, false); - - foreach (var name in class_names) - widget_toggle_class_name(widget, name, true); -} - -public List<weak string> widget_get_class_names(Gtk.Widget widget) { - return widget.get_style_context().list_classes(); -} - -public void widget_toggle_class_name( - Gtk.Widget widget, - string class_name, - bool condition = true -) { - var c = widget.get_style_context(); - if (condition) - c.add_class(class_name); - else - c.remove_class(class_name); -} - -private class Cursor { - private static HashTable<Gtk.Widget, string> _cursors; - public static HashTable<Gtk.Widget, string> cursors { - get { - if (_cursors == null) { - _cursors = new HashTable<Gtk.Widget, string>( - (w) => (uint)w, - (a, b) => a == b); - } - return _cursors; - } - } -} - -private void widget_setup_cursor(Gtk.Widget widget) { - widget.add_events(Gdk.EventMask.ENTER_NOTIFY_MASK); - widget.add_events(Gdk.EventMask.LEAVE_NOTIFY_MASK); - widget.enter_notify_event.connect(() => { - widget.get_window().set_cursor( - new Gdk.Cursor.from_name( - Gdk.Display.get_default(), - Cursor.cursors.get(widget))); - return false; - }); - widget.leave_notify_event.connect(() => { - widget.get_window().set_cursor( - new Gdk.Cursor.from_name( - Gdk.Display.get_default(), - "default")); - return false; - }); - widget.destroy.connect(() => { - if (Cursor.cursors.contains(widget)) - Cursor.cursors.remove(widget); - }); -} - -public void widget_set_cursor(Gtk.Widget widget, string cursor) { - if (!Cursor.cursors.contains(widget)) - widget_setup_cursor(widget); - - Cursor.cursors.set(widget, cursor); -} - -public string widget_get_cursor(Gtk.Widget widget) { - return Cursor.cursors.get(widget); -} - -private class ClickThrough { - private static HashTable<Gtk.Widget, bool> _click_through; - public static HashTable<Gtk.Widget, bool> click_through { - get { - if (_click_through == null) { - _click_through = new HashTable<Gtk.Widget, bool>( - (w) => (uint)w, - (a, b) => a == b); - } - return _click_through; - } - } -} - -public void widget_set_click_through(Gtk.Widget widget, bool click_through) { - ClickThrough.click_through.set(widget, click_through); - widget.input_shape_combine_region(click_through ? new Cairo.Region() : null); -} - -public bool widget_get_click_through(Gtk.Widget widget) { - return ClickThrough.click_through.get(widget); -} -} diff --git a/core/src/widget/window.vala b/core/src/widget/window.vala deleted file mode 100644 index f1a377f..0000000 --- a/core/src/widget/window.vala +++ /dev/null @@ -1,255 +0,0 @@ -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 { - BACKGROUND = 0, // GtkLayerShell.Layer.BACKGROUND - BOTTOM = 1, // GtkLayerShell.Layer.BOTTOM - TOP = 2, // GtkLayerShell.Layer.TOP - OVERLAY = 3, // GtkLayerShell.Layer.OVERLAY -} - -public enum Keymode { - NONE = 0, // GtkLayerShell.KeyboardMode.NONE - ON_DEMAND = 1, // GtkLayerShell.KeyboardMode.ON_DEMAND - EXCLUSIVE = 2, // GtkLayerShell.KeyboardMode.EXCLUSIVE -} - -public class Window : Gtk.Window { - private static bool check(string action) { - if (!is_supported()) { - critical(@"can not $action on window: layer shell not supported"); - print("tip: running from an xwayland terminal can cause this, for example VsCode"); - return true; - } - return false; - } - - private InhibitManager? inhibit_manager; - private Inhibitor? inhibitor; - - construct { - if (check("initialize layer shell")) - return; - - height_request = 1; - width_request = 1; - init_for_window(this); - inhibit_manager = InhibitManager.get_default(); - } - - public bool inhibit { - set { - if (inhibit_manager == null) { - return; - } - if (value && inhibitor == null) { - inhibitor = inhibit_manager.inhibit(this); - } - else if (!value && inhibitor != null) { - inhibitor = null; - } - } - get { - return inhibitor != null; - } - } - - public override void show() { - base.show(); - if(inhibit) { - inhibitor = inhibit_manager.inhibit(this); - } - } - - public string namespace { - get { return get_namespace(this); } - set { set_namespace(this, value); } - } - - public int anchor { - set { - if (check("set anchor")) - return; - - 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 { - if (check("set exclusivity")) - return; - - 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 { - if (check("set layer")) - return; - - set_layer(this, (GtkLayerShell.Layer)value); - } - } - - public Keymode keymode { - get { return (Keymode)get_keyboard_mode(this); } - set { - if (check("set keymode")) - return; - - set_keyboard_mode(this, (GtkLayerShell.KeyboardMode)value); - } - } - - public Gdk.Monitor gdkmonitor { - get { return get_monitor(this); } - set { - if (check("set gdkmonitor")) - return; - - set_monitor (this, value); - } - } - - public new int margin_top { - get { return GtkLayerShell.get_margin(this, Edge.TOP); } - set { - if (check("set margin_top")) - return; - - GtkLayerShell.set_margin(this, Edge.TOP, value); - } - } - - public new int margin_bottom { - get { return GtkLayerShell.get_margin(this, Edge.BOTTOM); } - set { - if (check("set margin_bottom")) - return; - - GtkLayerShell.set_margin(this, Edge.BOTTOM, value); - } - } - - public new int margin_left { - get { return GtkLayerShell.get_margin(this, Edge.LEFT); } - set { - if (check("set margin_left")) - return; - - GtkLayerShell.set_margin(this, Edge.LEFT, value); - } - } - - public new int margin_right { - get { return GtkLayerShell.get_margin(this, Edge.RIGHT); } - set { - if (check("set margin_right")) - return; - - GtkLayerShell.set_margin(this, Edge.RIGHT, value); - } - } - - public new int margin { - set { - if (check("set margin")) - return; - - margin_top = value; - margin_right = value; - margin_bottom = value; - margin_left = value; - } - } - - /** - * 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 (check("set monitor")) - return; - - 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(); -} -} |