summaryrefslogtreecommitdiffstats
path: root/lassi-prefs.c
diff options
context:
space:
mode:
Diffstat (limited to 'lassi-prefs.c')
-rw-r--r--lassi-prefs.c148
1 files changed, 147 insertions, 1 deletions
diff --git a/lassi-prefs.c b/lassi-prefs.c
index 50d1c13..c3adf68 100644
--- a/lassi-prefs.c
+++ b/lassi-prefs.c
@@ -1,15 +1,71 @@
#include <string.h>
+#include <avahi-ui/avahi-ui.h>
+
#include "lassi-prefs.h"
#include "lassi-server.h"
+enum {
+ COLUMN_ICON,
+ COLUMN_NAME,
+ COLUMN_GLIST,
+ N_COLUMNS
+};
+
+
static void on_add_button_clicked(GtkButton *widget, LassiPrefsInfo *i) {
+ GtkWidget *d;
+
+ d = aui_service_dialog_new("Choose Desktop to add", GTK_WINDOW(i->dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, NULL);
+ aui_service_dialog_set_browse_service_types(AUI_SERVICE_DIALOG(d), LASSI_SERVICE_TYPE, NULL);
+
+ if (gtk_dialog_run(GTK_DIALOG(d)) == GTK_RESPONSE_ACCEPT) {
+ char a[AVAHI_ADDRESS_STR_MAX], *t;
+
+ avahi_address_snprint(a, sizeof(a), aui_service_dialog_get_address(AUI_SERVICE_DIALOG(d)));
+ t = g_strdup_printf("tcp:port=%u,host=%s", aui_service_dialog_get_port(AUI_SERVICE_DIALOG(d)), a);
+ lassi_server_connect(i->server, t);
+ g_free(t);
+ }
+
+ gtk_widget_destroy(d);
}
static void on_remove_button_clicked(GtkButton *widget, LassiPrefsInfo *i) {
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ char *id;
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(i->tree_view));
+
+ if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
+ return;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(i->list_store), &iter, COLUMN_NAME, &id, -1);
+ if (id) {
+ lassi_server_disconnect(i->server, id, TRUE);
+ g_free(id);
+ }
}
static void on_up_button_clicked(GtkButton *widget, LassiPrefsInfo *i) {
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ char *id;
+
+/* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(i->tree_view));
+
+ if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
+ return;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(i->list_store), &iter, COLUMN_NAME, &id, -1);
+
+ if (id) {
+ GList *o = lassi_list_copy(i->server->order);
+ lissi_list_move_up(o, id);
+ lassi_server_set_order(i->server, o);
+ g_free(id);
+ }*/
}
static void on_down_button_clicked(GtkButton *widget, LassiPrefsInfo *i) {
@@ -19,8 +75,47 @@ static void on_close_button_clicked(GtkButton *widget, LassiPrefsInfo *i) {
gtk_widget_hide(GTK_WIDGET(i->dialog));
}
+static void update_sensitive(LassiPrefsInfo *i) {
+ GtkTreeIter iter;
+ GtkTreePath *path;
+ gboolean is_first;
+ char *id;
+ GtkTreeSelection *selection;
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(i->tree_view));
+
+ if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) {
+ gtk_widget_set_sensitive(i->up_button, FALSE);
+ gtk_widget_set_sensitive(i->down_button, FALSE);
+ gtk_widget_set_sensitive(i->remove_button, FALSE);
+ return;
+ }
+
+ gtk_tree_model_get(GTK_TREE_MODEL(i->list_store), &iter, COLUMN_NAME, &id, -1);
+ gtk_widget_set_sensitive(i->remove_button, strcmp(id, i->server->id) != 0);
+ g_free(id);
+
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(i->list_store), &iter);
+
+ is_first = gtk_tree_path_prev(path);
+ gtk_widget_set_sensitive(i->up_button, is_first);
+ if (is_first)
+ gtk_tree_path_next(path);
+
+ gtk_tree_path_next(path);
+ gtk_widget_set_sensitive(i->down_button, gtk_tree_model_get_iter(GTK_TREE_MODEL(i->list_store), &iter, path));
+
+ gtk_tree_path_free(path);
+}
+
+static void on_selection_changed(GtkTreeSelection *selection, LassiPrefsInfo *i) {
+ update_sensitive(i);
+}
int lassi_prefs_init(LassiPrefsInfo *i, LassiServer *server) {
+ GtkTreeViewColumn *column;
+ GtkTreeSelection *selection;
+
g_assert(i);
g_assert(server);
@@ -45,11 +140,62 @@ int lassi_prefs_init(LassiPrefsInfo *i, LassiServer *server) {
g_signal_connect(G_OBJECT(i->dialog), "delete_event", G_CALLBACK(gtk_widget_hide_on_delete), NULL);
- i->list_store = gtk_list_store_new(1, G_TYPE_STRING);
+ i->list_store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
+ gtk_tree_view_set_model(GTK_TREE_VIEW(i->tree_view), GTK_TREE_MODEL(i->list_store));
+
+ column = gtk_tree_view_column_new_with_attributes("Icon", gtk_cell_renderer_pixbuf_new(), "icon-name", COLUMN_ICON, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(i->tree_view), column);
+
+ column = gtk_tree_view_column_new_with_attributes("Name", gtk_cell_renderer_text_new(), "text", COLUMN_NAME, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(i->tree_view), column);
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(i->tree_view));
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+ g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(on_selection_changed), i);
+
+ lassi_prefs_update(i);
return 0;
}
+void lassi_prefs_update(LassiPrefsInfo *i) {
+ GList *l;
+ char *selected_item = NULL;
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+
+ g_assert(i);
+
+ g_message("prefs update");
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(i->tree_view));
+
+ if (gtk_tree_selection_get_selected(selection, NULL, &iter))
+ gtk_tree_model_get(GTK_TREE_MODEL(i->list_store), &iter, COLUMN_NAME, &selected_item, -1);
+
+ gtk_list_store_clear(GTK_LIST_STORE(i->list_store));
+
+ for (l = i->server->order; l; l = l->next) {
+
+ if (!lassi_server_is_connected(i->server, l->data))
+ continue;
+
+ gtk_list_store_append(GTK_LIST_STORE(i->list_store), &iter);
+ gtk_list_store_set(GTK_LIST_STORE(i->list_store), &iter,
+ COLUMN_ICON, strcmp(i->server->id, l->data) ? "network-wired" : "user-desktop",
+ COLUMN_NAME, l->data,
+ COLUMN_GLIST, l, -1);
+
+ if (selected_item)
+ if (strcmp(selected_item, l->data) == 0)
+ gtk_tree_selection_select_iter(selection, &iter);
+ }
+
+ g_free(selected_item);
+
+ update_sensitive(i);
+}
+
void lassi_prefs_show(LassiPrefsInfo *i) {
g_assert(i);