Synchronize multiple ulock instances
This commit is contained in:
parent
aff9ec19a2
commit
198c0c3c72
1 changed files with 42 additions and 2 deletions
44
ulock.c
44
ulock.c
|
@ -40,6 +40,10 @@ static char *logoutCommand = NULL;
|
||||||
static int logoutTime = 0;
|
static int logoutTime = 0;
|
||||||
|
|
||||||
|
|
||||||
|
static Atom atom;
|
||||||
|
static Window selection;
|
||||||
|
|
||||||
|
|
||||||
static gboolean do_grab_devices(gpointer user_data) {
|
static gboolean do_grab_devices(gpointer user_data) {
|
||||||
DEBUG("do_grab_devices");
|
DEBUG("do_grab_devices");
|
||||||
|
|
||||||
|
@ -181,7 +185,7 @@ static void try_unlock(void) {
|
||||||
gtk_label_set_label(GTK_LABEL(messageLabel), "");
|
gtk_label_set_label(GTK_LABEL(messageLabel), "");
|
||||||
|
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
pthread_create(&thread, NULL, try_unlock_thread, strdup((char*)gtk_entry_get_text(GTK_ENTRY(promptEntry))));
|
pthread_create(&thread, NULL, try_unlock_thread, strdup(gtk_entry_get_text(GTK_ENTRY(promptEntry))));
|
||||||
pthread_detach(thread);
|
pthread_detach(thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,6 +217,11 @@ static GdkFilterReturn xevent_filter(GdkXEvent *xevent, GdkEvent *event, gpointe
|
||||||
gtk_window_present(GTK_WINDOW(window));
|
gtk_window_present(GTK_WINDOW(window));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DestroyNotify:
|
||||||
|
if (ev->xdestroywindow.window == selection)
|
||||||
|
gtk_main_quit();
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -220,10 +229,42 @@ static GdkFilterReturn xevent_filter(GdkXEvent *xevent, GdkEvent *event, gpointe
|
||||||
return GDK_FILTER_CONTINUE;
|
return GDK_FILTER_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void wait_for_selection(void) {
|
||||||
|
DEBUG("wait_for_selection");
|
||||||
|
|
||||||
|
GdkDisplay *display = gdk_display_get_default();
|
||||||
|
Display *xdisplay = gdk_x11_display_get_xdisplay(display);
|
||||||
|
gdk_x11_display_error_trap_push(display);
|
||||||
|
|
||||||
|
XSelectInput(xdisplay, selection, StructureNotifyMask);
|
||||||
|
|
||||||
|
if (gdk_x11_display_error_trap_pop(display))
|
||||||
|
return;
|
||||||
|
|
||||||
|
gtk_main();
|
||||||
|
}
|
||||||
|
|
||||||
static void create_lock_window(void) {
|
static void create_lock_window(void) {
|
||||||
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||||
|
|
||||||
|
gtk_widget_realize(window);
|
||||||
|
gdk_window_add_filter(NULL, (GdkFilterFunc)xevent_filter, NULL);
|
||||||
|
|
||||||
|
atom = gdk_x11_get_xatom_by_name("ULOCK");
|
||||||
|
|
||||||
|
gdk_x11_grab_server();
|
||||||
|
|
||||||
|
selection = XGetSelectionOwner(gdk_x11_get_default_xdisplay(), atom);
|
||||||
|
if (selection == None)
|
||||||
|
XSetSelectionOwner(gdk_x11_get_default_xdisplay(), atom, gdk_x11_window_get_xid(gtk_widget_get_window(window)), CurrentTime);
|
||||||
|
|
||||||
|
gdk_x11_ungrab_server();
|
||||||
|
|
||||||
|
if (selection != None) {
|
||||||
|
wait_for_selection();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
|
gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
|
||||||
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(window), TRUE);
|
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(window), TRUE);
|
||||||
gtk_window_set_skip_pager_hint(GTK_WINDOW(window), TRUE);
|
gtk_window_set_skip_pager_hint(GTK_WINDOW(window), TRUE);
|
||||||
|
@ -262,7 +303,6 @@ static void create_lock_window(void) {
|
||||||
g_signal_connect(window, "delete-event", G_CALLBACK(gtk_true), NULL);
|
g_signal_connect(window, "delete-event", G_CALLBACK(gtk_true), NULL);
|
||||||
|
|
||||||
XSelectInput(gdk_x11_get_default_xdisplay(), gdk_x11_get_default_root_xwindow(), SubstructureNotifyMask);
|
XSelectInput(gdk_x11_get_default_xdisplay(), gdk_x11_get_default_root_xwindow(), SubstructureNotifyMask);
|
||||||
gdk_window_add_filter(NULL, (GdkFilterFunc)xevent_filter, NULL);
|
|
||||||
|
|
||||||
update_logout_time();
|
update_logout_time();
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue