From 94ca67e646041b8192f41d6a2a3561eabbc55d12 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 11 Sep 2007 20:52:56 +0200 Subject: wire up config dialog (except up/down buttons) --- lassi-avahi.c | 11 ++-- lassi-avahi.h | 2 + lassi-grab.c | 20 ++++---- lassi-prefs.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++++- lassi-prefs.h | 1 + lassi-server.c | 137 +++++++++++++++++++++++++++++++++++++------------- lassi-server.h | 4 ++ mango-lassi.glade | 58 +++++++++++---------- 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 +#include + #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 %s, which is located to the %s of this screen.", ls->active_connection->id, to_left ? "left" : "right"); + t = g_strdup_printf("Mouse and keyboard are being redirected to %s, which is located to the %s 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 @@ - + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -30,11 +30,12 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False + False @@ -231,41 +232,38 @@ - + True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 12 - 12 + 4 + 6 - + True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 12 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 1 - gtk-dialog-info - 5 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - Reorder the desktops you're already sharing mouse and keyboard with, or add new desktops to your session. - GTK_JUSTIFY_CENTER - True - True - - - 1 - - + 1 + gtk-dialog-info + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + <i>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.</i> + True + GTK_JUSTIFY_CENTER + True + True + 50 + + + 1 + + False -- cgit