# Widget ## Gtk3 ### Additional widget properties These are properties that Astal additionally adds to Gtk.Widgets - `className`: `string` - List of class CSS selectors separated by white space. - `css`: `string` - Inline CSS. e.g `label { color: white; }`. If no selector is specified `*` will be assumed. e.g `color: white;` will be inferred as `* { color: white; }`. - `cursor`: `string` - Cursor style when hovering over widgets that have hover states, e.g it won't work on labels. [list of valid values](https://docs.gtk.org/gdk3/ctor.Cursor.new_from_name.html). - `clickThrough`: `boolean` - Lets click events through. To have a full list of available properties, reference the documentation of the widget. - [Astal3 widgets](https://aylur.github.io/libastal/astal3/index.html#classes) - [Gtk3 widgets](https://docs.gtk.org/gtk3/#classes) Most common ones you will use frequently are - [halign](https://docs.gtk.org/gtk3/property.Widget.halign.html) - [valign](https://docs.gtk.org/gtk3/property.Widget.valign.html) - [hexpand](https://docs.gtk.org/gtk3/property.Widget.hexpand.html) - [vexpand](https://docs.gtk.org/gtk3/property.Widget.vexpand.html) ### Additional widget methods #### setup `setup` is a convenience prop to remove the need to predefine widgets before returning them in cases where a reference is needed. without `setup` ```tsx function MyWidget() { const button = new Widget.Button() // setup button return button } ``` using `setup` ```tsx function MyWidget() { function setup(button: Widget.Button) { // setup button } return } ``` #### hook Shorthand for connection and disconnecting to [Subscribable and Connectable](./binding#subscribable-and-connectable-interface) objects. without `hook` ```tsx function MyWidget() { const id = gobject.connect("signal", callback) const unsub = variable.subscribe(callback) return { gobject.disconnect(id) unsub() }} /> } ``` with `hook` ```tsx function MyWidget() { return { self.hook(gobject, "signal", callback) self.hook(variable, callback) }} /> } ``` #### toggleClassName Toggle classNames based on a condition ```tsx function MyWidget() { return { self.toggleClassName("classname", someCondition) }} /> } ``` ### How to use non builtin Gtk widgets Using the `astalify` mixin you can subclass widgets to behave like builtin widgets. The `astalify` mixin will apply the following: - set `visible` to true by default (Gtk3 widgets are invisible by default) - make gobject properties accept and consume `Binding` objects - add properties and methods listed above - set up signal handlers that are passed as props prefixed with `on` ```tsx import GObject from "gi://GObject" import { Gtk, Gdk, Widget, astalify, type ConstructProps } from "astal/gtk3" // subclass, register, define constructor props class ColorButton extends astalify(Gtk.ColorButton) { static { GObject.registerClass(this) } constructor(props: ConstructProps< ColorButton, Gtk.ColorButton.ConstructorProps, { onColorSet: [] } // signals of Gtk.ColorButton have to be manually typed >) { super(props as any) } } function MyWidget() { function setup(button: ColorButton) { } return { print(self.rgba) }} /> } ``` :::info Signal properties have to be annotated manually for TypeScript. You can reference [Gtk3](https://gjs-docs.gnome.org/gtk30~3.0/) and [Astal3](https://aylur.github.io/libastal/astal3/#classes) for available signals. ::: ### TypeScript Type of widgets are available through `Widget`. Here is an example Widget that takes in and handles a possibly `Binding` prop. ```tsx import { Binding, Variable } from "astal" import { Widget } from "astal/gtk3" export interface ToggleButtonProps extends Widget.ButtonProps { onToggled?: (self: Widget.Button, on: boolean) => void state?: Binding | boolean child?: JSX.Element } export default function ToggleButton(btnprops: ToggleButtonProps) { const { state = false, onToggled, setup, child, ...props } = btnprops const innerState = Variable(state instanceof Binding ? state.get() : state) return } ``` ### Builtin Widgets These widgets are available by default in JSX. - box: [Astal.Box](https://aylur.github.io/libastal/astal3/class.Box.html) ```tsx Horizontal Box ``` ```tsx Vertical Box ``` - button: [Astal.Button](https://aylur.github.io/libastal/astal3/class.Button.html) ```tsx ``` - centerbox: [Astal.CenterBox](https://aylur.github.io/libastal/astal3/class.CenterBox.html) ```tsx ``` - circularprogress: [Astal.CircularProgress](https://aylur.github.io/libastal/astal3/class.CircularProgress.html) ```tsx ``` ```css circularprogress { color: green; background-color: black; font-size: 6px; margin: 2px; min-width: 32px; } ``` - drawingarea: [Gtk.DrawingArea](https://docs.gtk.org/gtk3/class.DrawingArea.html) ```tsx ``` - entry: [Gtk.Entry](https://docs.gtk.org/gtk3/class.Entry.html) ```tsx print("text changed", self.text)} onActivate={self => print("enter", self.text)} /> ``` - eventbox: [Astal.EventBox](https://aylur.github.io/libastal/astal3/class.EventBox.html) ```tsx { print(event.modifier, event.button) }} /> ``` - icon: [Astal.Icon](https://aylur.github.io/libastal/astal3/class.Icon.html) ```tsx ``` ```css icon { font-size: 16px; } ``` - label: [Astal.Label](https://aylur.github.io/libastal/astal3/class.Label.html) ```tsx