summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2007-09-11 20:52:56 +0200
committerLennart Poettering <lennart@poettering.net>2007-09-11 20:52:56 +0200
commit94ca67e646041b8192f41d6a2a3561eabbc55d12 (patch)
tree7dd144549c22cc9006cb96ce095ab6b6e29e33ab
parent95c687c6de9906c99e50b458b8f8b33440099173 (diff)
wire up config dialog (except up/down buttons)
-rw-r--r--lassi-avahi.c11
-rw-r--r--lassi-avahi.h2
-rw-r--r--lassi-grab.c20
-rw-r--r--lassi-prefs.c148
-rw-r--r--lassi-prefs.h1
-rw-r--r--lassi-server.c137
-rw-r--r--lassi-server.h4
-rw-r--r--mango-lassi.glade58
8 files changed, 300 insertions, 81 deletions
diff --git a/lassi-avahi.c b/lassi-avahi.c
index 79fec53..a247070 100644
--- a/lassi-avahi.c
+++ b/lassi-avahi.c
@@ -7,8 +7,6 @@
#include "lassi-avahi.h"
-#define SERVICE_TYPE "_mango-lassi._tcp"
-
/* FIXME: Error and collision handling is suboptimal */
static void resolve_cb(
@@ -72,7 +70,10 @@ static void browse_cb(
switch (event) {
case AVAHI_BROWSER_NEW:
- if (!(flags & AVAHI_LOOKUP_RESULT_OUR_OWN))
+ if (!(flags & AVAHI_LOOKUP_RESULT_OUR_OWN) &&
+ !lassi_server_is_connected(i->server, name) &&
+ lassi_server_is_known(i->server, name))
+
if (!(avahi_service_resolver_new(i->client, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, resolve_cb, i)))
g_message("Failed to resolve service '%s': %s", name, avahi_strerror(avahi_client_errno(i->client)));
break;
@@ -146,7 +147,7 @@ static void create_service(LassiAvahiInfo *i) {
if (!i->service_name)
i->service_name = g_strdup(i->server->id);
- if ((ret = avahi_entry_group_add_service(i->group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, i->service_name, SERVICE_TYPE, NULL, NULL, i->server->port, NULL)) < 0) {
+ if ((ret = avahi_entry_group_add_service(i->group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, i->service_name, LASSI_SERVICE_TYPE, NULL, NULL, i->server->port, NULL)) < 0) {
g_message("Failed to add service: %s", avahi_strerror(ret));
gtk_main_quit();
return;
@@ -209,7 +210,7 @@ int lassi_avahi_init(LassiAvahiInfo *i, LassiServer *server) {
goto fail;
}
- if (!(i->browser = avahi_service_browser_new(i->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, SERVICE_TYPE, NULL, 0, browse_cb, i))) {
+ if (!(i->browser = avahi_service_browser_new(i->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, LASSI_SERVICE_TYPE, NULL, 0, browse_cb, i))) {
g_message("avahi_service_browser_new(): %s", avahi_strerror(avahi_client_errno(i->client)));
goto fail;
}
diff --git a/lassi-avahi.h b/lassi-avahi.h
index 34484db..04b634c 100644
--- a/lassi-avahi.h
+++ b/lassi-avahi.h
@@ -26,4 +26,6 @@ struct LassiAvahiInfo {
int lassi_avahi_init(LassiAvahiInfo *i, LassiServer *server);
void lassi_avahi_done(LassiAvahiInfo *i);
+#define LASSI_SERVICE_TYPE "_mango-lassi._tcp"
+
#endif
diff --git a/lassi-grab.c b/lassi-grab.c
index 4a2be87..e2bda77 100644
--- a/lassi-grab.c
+++ b/lassi-grab.c
@@ -143,7 +143,7 @@ static void handle_motion(LassiGrabInfo *i, int x, int y) {
i->last_x = x;
i->last_y = y;
- g_debug("rel motion %i %i", dx, dy);
+/* g_debug("rel motion %i %i", dx, dy); */
w = gdk_screen_get_width(i->screen);
h = gdk_screen_get_height(i->screen);
@@ -157,7 +157,7 @@ static void handle_motion(LassiGrabInfo *i, int x, int y) {
* back to center, so that further movements are
* not clipped */
- g_debug("centering");
+ g_debug("centering");
/* First, make sure there is no further motion event in the queue */
while (XCheckTypedEvent(GDK_DISPLAY_XDISPLAY(i->display), MotionNotify, &txe)) {
@@ -175,7 +175,7 @@ static void handle_motion(LassiGrabInfo *i, int x, int y) {
if ((dx != 0 || dy != 0) &&
((abs(dx) <= (w*9)/20) && (abs(dy) <= (h*9)/20))) {
- g_debug("sending motion");
+/* g_debug("sending motion"); */
/* Send the event */
r = lassi_server_motion_event(i->server, dx, dy);
@@ -198,7 +198,7 @@ static GdkFilterReturn filter_func(GdkXEvent *gxe, GdkEvent *event, gpointer dat
XEnterWindowEvent *ewe = (XEnterWindowEvent*) xe;
if (ewe->mode == NotifyNormal && ewe->state == 0 && !i->grab_window) {
- g_debug("enter %u %u", ewe->x_root, ewe->y_root);
+/* g_debug("enter %u %u", ewe->x_root, ewe->y_root); */
/* Only honour this when no button/key is pressed */
@@ -216,7 +216,7 @@ static GdkFilterReturn filter_func(GdkXEvent *gxe, GdkEvent *event, gpointer dat
if (i->grab_window) {
XMotionEvent *me = (XMotionEvent*) xe;
- g_debug("motion %u %u", me->x_root, me->y_root);
+/* g_debug("motion %u %u", me->x_root, me->y_root); */
handle_motion(i, me->x_root, me->y_root);
}
@@ -229,7 +229,7 @@ static GdkFilterReturn filter_func(GdkXEvent *gxe, GdkEvent *event, gpointer dat
int r;
XButtonEvent *be = (XButtonEvent*) xe;
- g_debug("button press/release");
+/* g_debug("button press/release"); */
handle_motion(i, be->x_root, be->y_root);
/* Send the event */
@@ -241,7 +241,7 @@ static GdkFilterReturn filter_func(GdkXEvent *gxe, GdkEvent *event, gpointer dat
case KeyPress:
case KeyRelease:
- g_debug("raw key");
+/* g_debug("raw key"); */
if (i->grab_window) {
int r;
@@ -258,9 +258,9 @@ static GdkFilterReturn filter_func(GdkXEvent *gxe, GdkEvent *event, gpointer dat
if (i->left_shift && i->right_shift)
i->double_shift = TRUE;
- g_debug("left_shift=%i right_shift=%i 0x04%x", i->left_shift, i->right_shift, (unsigned) keysym);
+/* g_debug("left_shift=%i right_shift=%i 0x04%x", i->left_shift, i->right_shift, (unsigned) keysym); */
- g_debug("key press/release");
+/* g_debug("key press/release"); */
handle_motion(i, ke->x_root, ke->y_root);
/* Send the event */
@@ -268,7 +268,7 @@ static GdkFilterReturn filter_func(GdkXEvent *gxe, GdkEvent *event, gpointer dat
g_assert(r >= 0);
if (!i->left_shift && !i->right_shift && i->double_shift) {
- g_debug("Got double shift");
+/* g_debug("Got double shift"); */
lassi_server_acquire_grab(i->server);
lassi_grab_stop(i, -1);
}
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);
diff --git a/lassi-prefs.h b/lassi-prefs.h
index 2755351..a948709 100644
--- a/lassi-prefs.h
+++ b/lassi-prefs.h
@@ -23,6 +23,7 @@ struct LassiPrefsInfo {
int lassi_prefs_init(LassiPrefsInfo *i, LassiServer *server);
void lassi_prefs_show(LassiPrefsInfo *i);
+void lassi_prefs_update(LassiPrefsInfo *i);
void lassi_prefs_done(LassiPrefsInfo *i);
#endif
diff --git a/lassi-server.c b/lassi-server.c
index 9d43eda..2b0a25d 100644
--- a/lassi-server.c
+++ b/lassi-server.c
@@ -26,7 +26,7 @@
#define CONNECTIONS_MAX 16
-static void server_disconnect_all(LassiServer *ls);
+static void server_disconnect_all(LassiServer *ls, gboolean clear_order);
static void server_send_update_grab(LassiServer *ls, int y);
static void server_broadcast(LassiServer *ls, DBusMessage *m, LassiConnection *except) {
@@ -62,7 +62,9 @@ static void server_layout_changed(LassiServer *ls, int y) {
char *t;
gboolean to_left = !!g_list_find(ls->connections_left, ls->active_connection);
- t = g_strdup_printf("Mouse and keyboard are being redirected to <b>%s</b>, which is located to the <b>%s</b> of this screen.", ls->active_connection->id, to_left ? "left" : "right");
+ t = g_strdup_printf("Mouse and keyboard are being redirected to <b>%s</b>, which is located to the <b>%s</b> of this screen.\n"
+ "To redirect input back to this screen, press and release both shift keys simultaneously.",
+ ls->active_connection->id, to_left ? "left" : "right");
if (to_left)
lassi_osd_set_text(&ls->osd_info, t, "go-previous", NULL);
@@ -127,6 +129,8 @@ static void server_set_order(LassiServer *ls, GList *order) {
ls->connections_right = g_list_reverse(ls->connections_right);
server_layout_changed(ls, -1);
+
+ lassi_prefs_update(&ls->prefs_info);
}
static void server_dump(LassiServer *ls) {
@@ -161,7 +165,8 @@ static void server_dump(LassiServer *ls) {
static void connection_destroy(LassiConnection *lc) {
g_assert(lc);
-
+
+ dbus_connection_flush(lc->dbus_connection);
dbus_connection_close(lc->dbus_connection);
dbus_connection_unref(lc->dbus_connection);
g_free(lc->id);
@@ -381,35 +386,42 @@ static void show_welcome(LassiConnection *lc, gboolean connect) {
g_free(body);
}
-static void connection_unlink(LassiConnection *lc) {
- DBusMessage *n;
- dbus_bool_t b;
+static void connection_unlink(LassiConnection *lc, gboolean remove_from_order) {
LassiServer *ls;
g_assert(lc);
- g_debug("Unlinked %s (%s)", lc->id, lc->address);
+ g_debug("Unlinking %s (%s)", lc->id, lc->address);
ls = lc->server;
- ls->connections = g_list_remove(ls->connections, lc);
- ls->n_connections --;
-
if (lc->id) {
- show_welcome(lc, FALSE);
+ DBusMessage *n;
+ dbus_bool_t b;
- g_hash_table_remove(ls->connections_by_id, lc->id);
- ls->connections_left = g_list_remove(ls->connections_left, lc);
- ls->connections_right = g_list_remove(ls->connections_right, lc);
-
/* Tell everyone */
n = dbus_message_new_signal("/", LASSI_INTERFACE, "NodeRemoved");
g_assert(n);
- b = dbus_message_append_args(n, DBUS_TYPE_STRING, &lc->id, DBUS_TYPE_STRING, &lc->address, DBUS_TYPE_INVALID);
+ b = dbus_message_append_args(n,
+ DBUS_TYPE_STRING, &lc->id,
+ DBUS_TYPE_STRING, &lc->address,
+ DBUS_TYPE_BOOLEAN, &remove_from_order,
+ DBUS_TYPE_INVALID);
g_assert(b);
-
+
server_broadcast(ls, n, NULL);
dbus_message_unref(n);
+ }
+
+ ls->connections = g_list_remove(ls->connections, lc);
+ ls->n_connections --;
+
+ if (lc->id) {
+ show_welcome(lc, FALSE);
+
+ g_hash_table_remove(ls->connections_by_id, lc->id);
+ ls->connections_left = g_list_remove(ls->connections_left, lc);
+ ls->connections_right = g_list_remove(ls->connections_right, lc);
if (ls->active_connection == lc)
server_pick_active_connection(ls);
@@ -426,7 +438,15 @@ static void connection_unlink(LassiConnection *lc) {
lassi_clipboard_clear(&lc->server->clipboard_info, TRUE);
}
+ if (remove_from_order) {
+ GList *i = g_list_find_custom(ls->order, lc->id, (GCompareFunc) strcmp);
+
+ if (i)
+ ls->order = g_list_delete_link(ls->order, i);
+ }
+
server_layout_changed(ls, -1);
+ lassi_prefs_update(&ls->prefs_info);
server_dump(ls);
}
@@ -729,6 +749,7 @@ static int signal_hello(LassiConnection *lc, DBusMessage *m) {
lc->delayed_welcome = TRUE;
server_layout_changed(lc->server, -1);
+ lassi_prefs_update(&lc->server->prefs_info);
server_dump(lc->server);
@@ -775,11 +796,16 @@ static int signal_node_removed(LassiConnection *lc, DBusMessage *m) {
const char *id, *address;
DBusError e;
LassiConnection *k;
+ gboolean remove_from_order;
LassiServer *ls;
dbus_error_init(&e);
- if (!(dbus_message_get_args(m, &e, DBUS_TYPE_STRING, &id, DBUS_TYPE_STRING, &address, DBUS_TYPE_INVALID))) {
+ if (!(dbus_message_get_args(m, &e,
+ DBUS_TYPE_STRING, &id,
+ DBUS_TYPE_STRING, &address,
+ DBUS_TYPE_BOOLEAN, &remove_from_order,
+ DBUS_TYPE_INVALID))) {
g_debug("Received invalid message: %s", e.message);
dbus_error_free(&e);
return -1;
@@ -788,15 +814,21 @@ static int signal_node_removed(LassiConnection *lc, DBusMessage *m) {
if (strcmp(id, lc->server->id) == 0) {
g_debug("We've been kicked ourselves.");
- server_disconnect_all(lc->server);
+ server_disconnect_all(lc->server, TRUE);
return 0;
}
- if (!(k = g_hash_table_lookup(lc->server->connections_by_id, id)))
- return 0;
+ if (remove_from_order) {
+ GList *i = g_list_find_custom(ls->order, id, (GCompareFunc) strcmp);
+
+ if (i)
+ ls->order = g_list_delete_link(ls->order, i);
+ }
ls = lc->server;
- connection_unlink(k);
+
+ if ((k = g_hash_table_lookup(lc->server->connections_by_id, id)))
+ connection_unlink(k, remove_from_order);
server_broadcast(ls, m, lc == k ? NULL : lc);
@@ -954,7 +986,7 @@ static int signal_key_event(LassiConnection *lc, DBusMessage *m) {
return -1;
}
- g_debug("got dbus key %i %i", key, !!is_press);
+/* g_debug("got dbus key %i %i", key, !!is_press); */
lassi_grab_press_key(&lc->server->grab_info, key, is_press);
return 0;
@@ -972,7 +1004,7 @@ static int signal_motion_event(LassiConnection *lc, DBusMessage *m) {
return -1;
}
- g_debug("got dbus motion %i %i", dx, dy);
+/* g_debug("got dbus motion %i %i", dx, dy); */
lassi_grab_move_pointer_relative(&lc->server->grab_info, dx, dy);
return 0;
@@ -991,7 +1023,7 @@ static int signal_button_event(LassiConnection *lc, DBusMessage *m) {
return -1;
}
- g_debug("got dbus button %i %i", button, !!is_press);
+/* g_debug("got dbus button %i %i", button, !!is_press); */
lassi_grab_press_button(&lc->server->grab_info, button, is_press);
return 0;
@@ -1177,12 +1209,12 @@ DBusHandlerResult message_function(DBusConnection *c, DBusMessage *m, void *user
dbus_error_init(&e);
- g_debug("[%s] interface=%s, path=%s, member=%s serial=%u",
- lc->id,
- dbus_message_get_interface(m),
- dbus_message_get_path(m),
- dbus_message_get_member(m),
- dbus_message_get_serial(m));
+/* g_debug("[%s] interface=%s, path=%s, member=%s serial=%u", */
+/* lc->id, */
+/* dbus_message_get_interface(m), */
+/* dbus_message_get_path(m), */
+/* dbus_message_get_member(m), */
+/* dbus_message_get_serial(m)); */
if (dbus_message_is_signal(m, DBUS_INTERFACE_LOCAL, "Disconnected"))
goto fail;
@@ -1255,7 +1287,7 @@ fail:
dbus_error_free(&e);
- connection_unlink(lc);
+ connection_unlink(lc, TRUE);
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
@@ -1402,10 +1434,31 @@ finish:
return r;
}
-static void server_disconnect_all(LassiServer *ls) {
+void lassi_server_disconnect(LassiServer *ls, const char *id, gboolean remove_from_order) {
+ LassiConnection *lc;
+
+ g_assert(ls);
+ g_assert(id);
+
+ if ((lc = g_hash_table_lookup(ls->connections_by_id, id)))
+ connection_unlink(lc, remove_from_order);
+ else if (remove_from_order) {
+ GList *i = g_list_find_custom(ls->order, id, (GCompareFunc) strcmp);
+
+ if (i)
+ ls->order = g_list_delete_link(ls->order, i);
+ }
+}
+
+static void server_disconnect_all(LassiServer *ls, gboolean clear_order) {
while (ls->connections)
- connection_unlink(ls->connections->data);
+ connection_unlink(ls->connections->data, clear_order);
+
+ if (clear_order) {
+ lassi_list_free(ls->order);
+ ls->order = NULL;
+ }
}
static void server_done(LassiServer *ls) {
@@ -1417,7 +1470,7 @@ static void server_done(LassiServer *ls) {
dbus_server_unref(ls->dbus_server);
}
- server_disconnect_all(ls);
+ server_disconnect_all(ls, FALSE);
if (ls->connections_by_id)
g_hash_table_destroy(ls->connections_by_id);
@@ -1437,6 +1490,20 @@ static void server_done(LassiServer *ls) {
memset(ls, 0, sizeof(*ls));
}
+gboolean lassi_server_is_connected(LassiServer *ls, const char *id) {
+ g_assert(ls);
+ g_assert(id);
+
+ return strcmp(id, ls->id) == 0 || g_hash_table_lookup(ls->connections_by_id, id);
+}
+
+gboolean lassi_server_is_known(LassiServer *ls, const char *id) {
+ g_assert(ls);
+ g_assert(id);
+
+ return !!g_list_find_custom(ls->order, id, (GCompareFunc) strcmp);
+}
+
LassiConnection* lassi_server_connect(LassiServer *ls, const char *a) {
DBusError e;
DBusConnection *c;
diff --git a/lassi-server.h b/lassi-server.h
index fb1d7bf..55849d4 100644
--- a/lassi-server.h
+++ b/lassi-server.h
@@ -76,5 +76,9 @@ int lassi_server_return_clipboard(LassiServer *ls, gboolean primary);
int lassi_server_get_clipboard(LassiServer *ls, gboolean primary, const char *t, int *f, gpointer *p, int *l);
LassiConnection* lassi_server_connect(LassiServer *ls, const char *a);
+void lassi_server_disconnect(LassiServer *ls, const char *id, gboolean remove_from_order);
+
+gboolean lassi_server_is_connected(LassiServer *ls, const char *id);
+gboolean lassi_server_is_known(LassiServer *ls, const char *id);
#endif
diff --git a/mango-lassi.glade b/mango-lassi.glade
index 54ba598..2be70a0 100644
--- a/mango-lassi.glade
+++ b/mango-lassi.glade
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--Generated with glade3 3.2.2 on Sat Sep 8 01:45:26 2007 by lennart@ecstasy-->
+<!--Generated with glade3 3.2.2 on Sun Sep 9 23:32:09 2007 by lennart@ecstasy-->
<glade-interface>
<widget class="GtkDialog" id="preferences_dialog">
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
@@ -30,11 +30,12 @@
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<child>
- <widget class="GtkTreeView" id="desktopsTreeView">
+ <widget class="GtkTreeView" id="tree_view">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="headers_visible">False</property>
+ <property name="show_expanders">False</property>
</widget>
</child>
</widget>
@@ -231,41 +232,38 @@
</packing>
</child>
<child>
- <widget class="GtkAlignment" id="alignment1">
+ <widget class="GtkHBox" id="hbox7">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="left_padding">12</property>
- <property name="right_padding">12</property>
+ <property name="border_width">4</property>
+ <property name="spacing">6</property>
<child>
- <widget class="GtkHBox" id="hbox7">
+ <widget class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="spacing">12</property>
- <child>
- <widget class="GtkImage" id="image6">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">1</property>
- <property name="stock">gtk-dialog-info</property>
- <property name="icon_size">5</property>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label6">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Reorder the desktops you're already sharing mouse and keyboard with, or add new desktops to your session.</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">True</property>
- <property name="selectable">True</property>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
+ <property name="xalign">1</property>
+ <property name="stock">gtk-dialog-info</property>
+ <property name="icon_size">6</property>
</widget>
</child>
+ <child>
+ <widget class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;i&gt;Reorder the desktops you're already sharing mouse and keyboard with, or add new desktops to your session.
+Order the desktops in the list above from left to right how they are positioned on your desk.
+Please make sure to run Mango Lassi Input Sharing on all computers you want so share input with.&lt;/i&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">True</property>
+ <property name="selectable">True</property>
+ <property name="width_chars">50</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="expand">False</property>