summaryrefslogtreecommitdiff
path: root/rcm-client-hardware-list.c
diff options
context:
space:
mode:
Diffstat (limited to 'rcm-client-hardware-list.c')
-rw-r--r--rcm-client-hardware-list.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/rcm-client-hardware-list.c b/rcm-client-hardware-list.c
new file mode 100644
index 0000000..eec0d03
--- /dev/null
+++ b/rcm-client-hardware-list.c
@@ -0,0 +1,140 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <math.h>
+#include <gtk/gtk.h>
+
+#include "generated.h"
+#include "rcm-client-main.h"
+#include "rcm-client-hardware-list.h"
+#include "rcm-client-hardware-info.h"
+
+static GtkWidget *status_msg;
+static GtkWidget *hw_list_box;
+static GtkWidget *stack;
+static GList *hw_list = NULL;
+
+struct hwentry {
+ GDBusObject *hw;
+ GtkWidget *widget;
+};
+
+static gint
+find_hwentry_by_object(gconstpointer a, gconstpointer user_data)
+{
+ const struct hwentry *hwe = a;
+
+ return hwe->hw == user_data ? 0 : -1;
+}
+
+static gint
+find_hwentry_by_widget(gconstpointer a, gconstpointer user_data)
+{
+ const struct hwentry *hwe = a;
+
+ return hwe->widget == user_data ? 0 : -1;
+}
+
+void rcng_client_hardware_list_remove(GDBusObject *hw)
+{
+ GList *entry;
+ struct hwentry *hwe;
+
+ entry = g_list_find_custom(hw_list, hw, find_hwentry_by_object);
+ if (!entry)
+ return;
+
+ hwe = entry->data;
+ hw_list = g_list_remove_all(hw_list, hwe);
+
+ g_print(" - Object removed %s\n", g_dbus_object_get_object_path(hwe->hw));
+ gtk_widget_destroy(hwe->widget);
+ g_free(hwe);
+
+ if (!hw_list)
+ gtk_stack_set_visible_child(GTK_STACK(stack), status_msg);
+}
+
+void rcng_client_hardware_list_add(GDBusObject *hw)
+{
+ GList *interfaces;
+ GList *ll;
+ GtkWidget *box;
+ GtkWidget *icon;
+ GtkWidget *label;
+ struct hwentry *hwe;
+
+ g_print(" - Object at %s\n", g_dbus_object_get_object_path(hw));
+
+ interfaces = g_dbus_object_get_interfaces(hw);
+ for (ll = interfaces; ll != NULL; ll = ll->next) {
+ GDBusInterface *interface = G_DBUS_INTERFACE(ll->data);
+ g_print (" - Interface %s\n", g_dbus_interface_get_info(interface)->name);
+ }
+ g_list_free_full (interfaces, g_object_unref);
+
+ if (!hw_list)
+ gtk_stack_set_visible_child(GTK_STACK(stack), hw_list_box);
+
+ box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ icon = gtk_image_new_from_icon_name("gtk-harddisk", GTK_ICON_SIZE_DIALOG);
+ gtk_widget_set_valign(icon, GTK_ALIGN_START);
+ gtk_widget_set_halign(icon, GTK_ALIGN_START);
+ gtk_widget_set_margin_start(icon, 12);
+ gtk_widget_set_margin_end(icon, 12);
+ label = gtk_label_new(g_dbus_object_get_object_path(hw));
+ gtk_box_pack_start(GTK_BOX(box), icon, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
+ gtk_widget_show_all(box);
+
+ gtk_list_box_insert(GTK_LIST_BOX(hw_list_box), box, -1);
+
+ hwe = g_malloc(sizeof(*hwe));
+ hwe->hw = hw;
+ hwe->widget = box;
+ hw_list = g_list_append(hw_list, hwe);
+}
+
+static void
+on_hw_selected(GtkListBox *box,
+ GtkListBoxRow *row,
+ gpointer user_data)
+{
+ GList *entry;
+ GtkWidget *child;
+ struct hwentry *hwe;
+
+ child = row ? gtk_bin_get_child(GTK_BIN(row)) : NULL;
+ entry = g_list_find_custom(hw_list, child, find_hwentry_by_widget);
+ hwe = entry ? entry->data : NULL;
+
+ rcng_client_hardware_init_info_ui(hwe ? hwe->hw : NULL);
+}
+
+void rcng_client_hardware_list_update_status(gchar *status)
+{
+ gtk_label_set_text(GTK_LABEL(status_msg), status);
+}
+
+void rcng_client_hardware_list_init_ui()
+{
+ stack = gtk_stack_new();
+ gtk_widget_set_margin_start(stack, 12);
+ gtk_widget_set_margin_end(stack, 12);
+ gtk_widget_set_margin_top(stack, 12);
+ gtk_widget_set_margin_bottom(stack, 12);
+ gtk_stack_set_transition_type(GTK_STACK(stack), GTK_STACK_TRANSITION_TYPE_CROSSFADE);
+
+ status_msg = gtk_label_new("Connecting to server...");
+ gtk_stack_add_named(GTK_STACK(stack), status_msg, "nohw");
+ gtk_stack_set_visible_child(GTK_STACK(stack), status_msg);
+
+ hw_list_box = gtk_list_box_new();
+ gtk_stack_add_named(GTK_STACK(stack), hw_list_box, "yeshw");
+ g_signal_connect(hw_list_box, "row-selected", G_CALLBACK(on_hw_selected), NULL);
+
+ gtk_notebook_append_page(global->notebook, stack, gtk_label_new("Hardware"));
+}
+
+