static void check_for_users (void) { char *result_string; char **servers; int i; // Return if we're not on a VT if (auth_cookie == NULL || get_cur_vt () < 0) { return; } // Get the list of running servers from the daemon result_string = mdmcomm_send_cmd_to_daemon_with_args (MDM_SUP_ATTACHED_SERVERS, auth_cookie, 5); // Return if the daemon didn't send us the list if (ve_string_empty (result_string) || strncmp (result_string, "OK ", 3) != 0) { g_free (result_string); return; } // Place the servers into the servers variable servers = g_strsplit (&result_string[3], ";", -1); g_free (result_string); // Return if there are no servers running if (servers == NULL) return; // Each server is composed of 3 parts: [display, user, tty] for (i = 0; servers[i] != NULL; i++) { char **server; int vt; server = g_strsplit (servers[i], ",", -1); if (mdm_vector_len (server) != 3) { g_strfreev (server); continue; } // Get the VT of the server vt = get_vt_num (servers, server[2], 5); // If the server's username is empty, this is a greeter and we want to switch to it if (strcmp (server[1], "") == 0 && vt >= 0) { // lock the screen if ( ! no_lock && vt != get_cur_vt () && vt >= 0) { maybe_lock_screen (); } // Switch VT change_vt (vt); printf ("Switching to MDM server on VT #%d\n", vt); exit (0); } g_strfreev (server); } printf ("Found no MDM server, ordering a new one\n"); g_strfreev (servers); }
static void check_for_users (void) { char *ret; char **vec; int i; int extra; /* only for console logins on vt supporting systems */ if (auth_cookie == NULL || get_cur_vt () < 0) return; ret = mdmcomm_call_mdm ("CONSOLE_SERVERS", auth_cookie, "1.0.0.0", 5); if (ve_string_empty (ret) || strncmp (ret, "OK ", 3) != 0) { g_free (ret); return; } vec = g_strsplit (&ret[3], ";", -1); g_free (ret); if (vec == NULL) return; extra = 0; for (i = 0; vec[i] != NULL; i++) { char **rvec; int vt; rvec = g_strsplit (vec[i], ",", -1); if (mdm_vector_len (rvec) != 3) { g_strfreev (rvec); continue; } vt = get_vt_num (vec, rvec[2], 5); if (strcmp (rvec[0], mdmcomm_get_display ()) != 0 && vt >= 0) { /* this is not the current display */ extra++; } g_strfreev (rvec); } if (extra == 0) { g_strfreev (vec); return; } run_logged_in_dialogue (vec); g_strfreev (vec); }
static void run_logged_in_dialogue (char **vec) { GtkWidget *dialog; GtkWidget *vbox; GtkWidget *w; GtkWidget *sw; GtkTreeModel *model; GtkWidget *treeview; GtkTreeIter iter; GtkTreeSelection *selection; gint response; if (startnew == TRUE) { /* Just return if the user doesn't want to see the dialog */ return; } dialog = gtk_dialog_new_with_buttons (_("Open Displays"), NULL /* parent */, 0 /* flags */, _("_Open New Display"), RESPONSE_OPEN_NEW_DISPLAY, _("Change to _Existing Display"), RESPONSE_OPEN_EXISTING_DISPLAY, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); vbox = GTK_DIALOG (dialog)->vbox; w = gtk_label_new (_("There are some displays already open. You can select " "one from the list below or open a new one.")); gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0); /* create tree model */ model = create_model (vec); /* create tree view */ treeview = gtk_tree_view_new_with_model (model); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE); g_object_unref (model); gtk_container_add (GTK_CONTAINER (sw), treeview); /* add columns to the tree view */ add_columns (GTK_TREE_VIEW (treeview)); /* finish & show */ gtk_window_set_default_size (GTK_WINDOW (dialog), 280, 250); g_signal_connect (G_OBJECT (treeview), "row_activated", G_CALLBACK (row_activated), dialog); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); g_signal_connect (selection, "changed", G_CALLBACK (selection_changed), dialog); gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), RESPONSE_OPEN_EXISTING_DISPLAY, FALSE); gtk_widget_show_all (dialog); response = gtk_dialog_run (GTK_DIALOG (dialog)); run_again: switch (response) { case RESPONSE_OPEN_NEW_DISPLAY: gtk_widget_destroy (dialog); /* just continue what you are doing */ return; case RESPONSE_OPEN_EXISTING_DISPLAY: if (gtk_tree_selection_get_selected (selection, NULL, &iter)) { GValue value = {0}; int vt; gtk_tree_model_get_value (model, &iter, COLUMN_VT, &value); vt = g_value_get_int (&value); g_value_unset (&value); /* we switched to a different screen as a result of this, * lock the current screen */ if ( ! no_lock && vt != get_cur_vt () && vt >= 0) { maybe_lock_screen (); } change_vt (vt); /* FIXME: wait + disturb the pointer (need SUP?), * perhaps part of the sup command to CHVT ?? */ exit (0); } else { /* EEK */ goto run_again; } break; default: gtk_widget_destroy (dialog); /* cancel, or close */ exit (0); break; } }