diff options
Diffstat (limited to 'lassi-prefs.c')
-rw-r--r-- | lassi-prefs.c | 148 |
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); |