diff options
Diffstat (limited to 'river/src/river-output.c')
-rw-r--r-- | river/src/river-output.c | 343 |
1 files changed, 0 insertions, 343 deletions
diff --git a/river/src/river-output.c b/river/src/river-output.c deleted file mode 100644 index 6317db1..0000000 --- a/river/src/river-output.c +++ /dev/null @@ -1,343 +0,0 @@ -#include <gio/gio.h> - -#include "river-private.h" -#include "river-status-unstable-v1-client.h" - -struct _AstalRiverOutput { - GObject parent_instance; - guint focused_tags; - guint occupied_tags; - guint urgent_tags; - gchar* layout_name; - gchar* focused_view; - guint id; - gchar* name; -}; - -typedef struct { - struct zriver_status_manager_v1* river_status_manager; - struct zriver_output_status_v1* river_output_status; - struct wl_display* wl_display; - struct wl_output* wl_output; -} AstalRiverOutputPrivate; - -G_DEFINE_FINAL_TYPE_WITH_PRIVATE(AstalRiverOutput, astal_river_output, G_TYPE_OBJECT); - -typedef enum { - ASTAL_RIVER_OUTPUT_PROP_FOCUSED_TAGS = 1, - ASTAL_RIVER_OUTPUT_PROP_OCCUPIED_TAGS, - ASTAL_RIVER_OUTPUT_PROP_URGENT_TAGS, - ASTAL_RIVER_OUTPUT_PROP_LAYOUT_NAME, - ASTAL_RIVER_OUTPUT_PROP_NAME, - ASTAL_RIVER_OUTPUT_PROP_FOCUSED_VIEW, - ASTAL_RIVER_OUTPUT_PROP_ID, - ASTAL_RIVER_OUTPUT_N_PROPERTIES -} AstalRiverOutputProperties; - -typedef enum { - ASTAL_RIVER_OUTPUT_SIGNAL_CHANGED, - ASTAL_RIVER_OUTPUT_N_SIGNALS -} AstalRiverOutputSignals; - -static guint astal_river_output_signals[ASTAL_RIVER_OUTPUT_N_SIGNALS] = { - 0, -}; - -static GParamSpec* astal_river_output_properties[ASTAL_RIVER_OUTPUT_N_PROPERTIES] = { - NULL, -}; - -/** - * astal_river_output_get_nid - * @self: the AstalRiverOutput object - * - * Returns: the id of the underlying wl_output object - */ -guint astal_river_output_get_id(AstalRiverOutput* self) { return self->id; } - -/** - * astal_river_output_get_name - * @self: the AstalRiverOutput object - * - * Returns: (transfer none) (nullable): the name of the output - */ -gchar* astal_river_output_get_name(AstalRiverOutput* self) { return self->name; } - -/** - * astal_river_output_get_layout_name - * @self: the AstalRiverOutput object - * - * Returns: (transfer none) (nullable): the currently used layout name of the output - */ -gchar* astal_river_output_get_layout_name(AstalRiverOutput* self) { return self->layout_name; } - -/** - * astal_river_output_get_focused_view - * @self: the AstalRiverOutput object - * - * Returns: (transfer none) (nullable): the focused view on the output - */ -gchar* astal_river_output_get_focused_view(AstalRiverOutput* self) { return self->focused_view; } - -void astal_river_output_set_focused_view(AstalRiverOutput* self, const gchar* focused_view) { - g_free(self->focused_view); - self->focused_view = g_strdup(focused_view); - g_object_notify(G_OBJECT(self), "focused-view"); - g_signal_emit(self, astal_river_output_signals[ASTAL_RIVER_OUTPUT_SIGNAL_CHANGED], 0); -} - -/** - * astal_river_output_get_focused_tags - * @self: the AstalRiverOutput object - * - * Returns: the focused tags of the output - */ -guint astal_river_output_get_focused_tags(AstalRiverOutput* self) { return self->focused_tags; } - -/** - * astal_river_output_get_urgent_tags - * @self: the AstalRiverOutput object - * - * Returns: the urgent tags of the output - */ -guint astal_river_output_get_urgent_tags(AstalRiverOutput* self) { return self->urgent_tags; } - -/** - * astal_river_output_get_occupied_tags - * @self: the AstalRiverOutput object - * - * Returns: the occupied tags of the output - */ -guint astal_river_output_get_occupied_tags(AstalRiverOutput* self) { return self->occupied_tags; } - -struct wl_output* astal_river_output_get_wl_output(AstalRiverOutput* self) { - AstalRiverOutputPrivate* priv = astal_river_output_get_instance_private(self); - return priv->wl_output; -} - -static void astal_river_output_get_property(GObject* object, guint property_id, GValue* value, - GParamSpec* pspec) { - AstalRiverOutput* self = ASTAL_RIVER_OUTPUT(object); - - switch (property_id) { - case ASTAL_RIVER_OUTPUT_PROP_FOCUSED_TAGS: - g_value_set_uint(value, self->focused_tags); - break; - case ASTAL_RIVER_OUTPUT_PROP_OCCUPIED_TAGS: - g_value_set_uint(value, self->occupied_tags); - break; - case ASTAL_RIVER_OUTPUT_PROP_URGENT_TAGS: - g_value_set_uint(value, self->urgent_tags); - break; - case ASTAL_RIVER_OUTPUT_PROP_ID: - g_value_set_uint(value, self->id); - break; - case ASTAL_RIVER_OUTPUT_PROP_NAME: - g_value_set_string(value, self->name); - break; - case ASTAL_RIVER_OUTPUT_PROP_LAYOUT_NAME: - g_value_set_string(value, self->layout_name); - break; - case ASTAL_RIVER_OUTPUT_PROP_FOCUSED_VIEW: - g_value_set_string(value, self->focused_view); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); - break; - } -} - -static void astal_river_output_set_property(GObject* object, guint property_id, const GValue* value, - GParamSpec* pspec) { - AstalRiverOutput* self = ASTAL_RIVER_OUTPUT(object); - - switch (property_id) { - case ASTAL_RIVER_OUTPUT_PROP_ID: - self->id = g_value_get_uint(value); - g_object_notify(G_OBJECT(self), "id"); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); - break; - } - g_signal_emit(self, astal_river_output_signals[ASTAL_RIVER_OUTPUT_SIGNAL_CHANGED], 0); -} - -static void noop() {} - -static void astal_river_handle_focused_tags(void* data, struct zriver_output_status_v1* status, - uint32_t tags) { - AstalRiverOutput* self = ASTAL_RIVER_OUTPUT(data); - self->focused_tags = tags; - g_object_notify(G_OBJECT(self), "focused-tags"); - g_signal_emit(self, astal_river_output_signals[ASTAL_RIVER_OUTPUT_SIGNAL_CHANGED], 0); -} - -static void astal_river_handle_urgent_tags(void* data, struct zriver_output_status_v1* status, - uint32_t tags) { - AstalRiverOutput* self = ASTAL_RIVER_OUTPUT(data); - self->urgent_tags = tags; - g_object_notify(G_OBJECT(self), "urgent-tags"); - g_signal_emit(self, astal_river_output_signals[ASTAL_RIVER_OUTPUT_SIGNAL_CHANGED], 0); -} - -static void astal_river_handle_occupied_tags(void* data, struct zriver_output_status_v1* status, - struct wl_array* view_tags) { - AstalRiverOutput* self = ASTAL_RIVER_OUTPUT(data); - guint tags = 0; - guint* view; - wl_array_for_each(view, view_tags) { tags |= *view; } - - self->occupied_tags = tags; - g_object_notify(G_OBJECT(self), "occupied-tags"); - g_signal_emit(self, astal_river_output_signals[ASTAL_RIVER_OUTPUT_SIGNAL_CHANGED], 0); -} - -static void astal_river_handle_layout_name(void* data, struct zriver_output_status_v1* status, - const char* name) { - AstalRiverOutput* self = ASTAL_RIVER_OUTPUT(data); - g_free(self->layout_name); - self->layout_name = g_strdup(name); - g_object_notify(G_OBJECT(self), "layout-name"); - g_signal_emit(self, astal_river_output_signals[ASTAL_RIVER_OUTPUT_SIGNAL_CHANGED], 0); -} - -static void astal_river_handle_layout_name_clear(void* data, - struct zriver_output_status_v1* status) { - AstalRiverOutput* self = ASTAL_RIVER_OUTPUT(data); - g_free(self->layout_name); - self->layout_name = NULL; - g_object_notify(G_OBJECT(self), "layout-name"); - g_signal_emit(self, astal_river_output_signals[ASTAL_RIVER_OUTPUT_SIGNAL_CHANGED], 0); -} - -static void astal_river_wl_output_handle_name(void* data, struct wl_output* output, - const char* name) { - AstalRiverOutput* self = ASTAL_RIVER_OUTPUT(data); - g_free(self->name); - self->name = g_strdup(name); - g_object_notify(G_OBJECT(self), "name"); - g_signal_emit(self, astal_river_output_signals[ASTAL_RIVER_OUTPUT_SIGNAL_CHANGED], 0); -} - -static const struct zriver_output_status_v1_listener output_status_listener = { - .focused_tags = astal_river_handle_focused_tags, - .view_tags = astal_river_handle_occupied_tags, - .urgent_tags = astal_river_handle_urgent_tags, - .layout_name = astal_river_handle_layout_name, - .layout_name_clear = astal_river_handle_layout_name_clear, -}; - -static const struct wl_output_listener wl_output_listener = { - .name = astal_river_wl_output_handle_name, - .geometry = noop, - .mode = noop, - .scale = noop, - .description = noop, - .done = noop, -}; - -static void astal_river_output_finalize(GObject* object) { - AstalRiverOutput* self = ASTAL_RIVER_OUTPUT(object); - AstalRiverOutputPrivate* priv = astal_river_output_get_instance_private(self); - - zriver_output_status_v1_destroy(priv->river_output_status); - wl_output_destroy(priv->wl_output); - - wl_display_roundtrip(priv->wl_display); - - g_free(self->layout_name); - g_free(self->name); - - G_OBJECT_CLASS(astal_river_output_parent_class)->finalize(object); -} - -static void astal_river_output_init(AstalRiverOutput* self) {} - -AstalRiverOutput* astal_river_output_new(guint id, struct wl_output* wl_output, - struct zriver_status_manager_v1* status_manager, - struct wl_display* wl_display) { - AstalRiverOutput* self = g_object_new(ASTAL_RIVER_TYPE_OUTPUT, NULL); - AstalRiverOutputPrivate* priv = astal_river_output_get_instance_private(self); - - self->id = id; - priv->wl_display = wl_display; - priv->wl_output = wl_output; - priv->river_status_manager = status_manager; - - priv->river_output_status = - zriver_status_manager_v1_get_river_output_status(priv->river_status_manager, wl_output); - - zriver_output_status_v1_add_listener(priv->river_output_status, &output_status_listener, self); - - wl_output_add_listener(wl_output, &wl_output_listener, self); - - wl_display_roundtrip(priv->wl_display); - - return self; -} - -static void astal_river_output_class_init(AstalRiverOutputClass* class) { - GObjectClass* object_class = G_OBJECT_CLASS(class); - object_class->get_property = astal_river_output_get_property; - object_class->set_property = astal_river_output_set_property; - object_class->finalize = astal_river_output_finalize; - /** - * AstalRiverOutput:focused-tags: - * - * The currently focused tags - */ - astal_river_output_properties[ASTAL_RIVER_OUTPUT_PROP_FOCUSED_TAGS] = g_param_spec_uint( - "focused-tags", "focused-tags", "currently focused tags", 0, INT_MAX, 0, G_PARAM_READABLE); - /** - * AstalRiverOutput:occupied-tags: - * - * The currently occupied tags - */ - astal_river_output_properties[ASTAL_RIVER_OUTPUT_PROP_OCCUPIED_TAGS] = - g_param_spec_uint("occupied-tags", "occupied-tags", "currently occupied tags", 0, INT_MAX, - 0, G_PARAM_READABLE); - /** - * AstalRiverOutput:urgent-tags: - * - * The currently tags marked as urgent - */ - astal_river_output_properties[ASTAL_RIVER_OUTPUT_PROP_URGENT_TAGS] = g_param_spec_uint( - "urgent-tags", "urgent-tags", "currently urgent tags", 0, INT_MAX, 0, G_PARAM_READABLE); - /** - * AstalRiverOutput:id: - * - * The id of the underlying wl_output object - */ - astal_river_output_properties[ASTAL_RIVER_OUTPUT_PROP_ID] = - g_param_spec_uint("id", "id", "id of the output object", 0, INT_MAX, 0, G_PARAM_READABLE); - /** - * AstalRiverOutput:layout-name: - * - * The name of active layout - */ - astal_river_output_properties[ASTAL_RIVER_OUTPUT_PROP_LAYOUT_NAME] = g_param_spec_string( - "layout-name", "layout-name", "name of the current layout", NULL, G_PARAM_READABLE); - /** - * AstalRiverOutput:name: - * - * The name of this output - */ - astal_river_output_properties[ASTAL_RIVER_OUTPUT_PROP_NAME] = - g_param_spec_string("name", "name", "name of the output", NULL, G_PARAM_READABLE); - /** - * AstalRiverOutput:focused-view: - * - * The name of currently focused view - */ - astal_river_output_properties[ASTAL_RIVER_OUTPUT_PROP_FOCUSED_VIEW] = - g_param_spec_string("focused-view", "focused-view", - "name of last focused view on this output", NULL, G_PARAM_READABLE); - - g_object_class_install_properties(object_class, ASTAL_RIVER_OUTPUT_N_PROPERTIES, - astal_river_output_properties); - - astal_river_output_signals[ASTAL_RIVER_OUTPUT_SIGNAL_CHANGED] = - g_signal_new("changed", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, - G_TYPE_NONE, 0); -} |