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); }
int main (int argc, char *argv[]) { GOptionContext *ctx; gboolean res; GError *error; bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); setlocale (LC_ALL, ""); /* Option parsing */ ctx = g_option_context_new (_("- New GDM login")); g_option_context_set_translation_domain (ctx, GETTEXT_PACKAGE); g_option_context_add_main_entries (ctx, options, NULL); g_option_context_parse (ctx, &argc, &argv, NULL); g_option_context_free (ctx); if (show_version) { g_print ("%s %s\n", argv [0], VERSION); exit (1); } /* don't support commands other than VERSION */ if (send_command != NULL) { if (strcmp (send_command, "VERSION") == 0) { g_print ("GDM %s \n", VERSION); return 0; } else { g_warning ("No longer supported"); } return 1; } if (monte_carlo_pi) { calc_pi (); return 0; } if (use_xnest) { g_warning ("Not yet implemented"); return 1; } error = NULL; res = gdm_goto_login_session (&error); if (! res) { g_printerr ("%s", error->message); } else { maybe_lock_screen (); } return 1; }
static void do_switch (ShellStatusMenu *status, GdmUser *user) { ShellStatusMenuPrivate *priv = status->priv; guint num_sessions; g_debug ("Do user switch"); if (user == NULL) { gdm_user_manager_goto_login_session (priv->manager); goto out; } num_sessions = gdm_user_get_num_sessions (user); if (num_sessions > 0) gdm_user_manager_activate_user_session (priv->manager, user); else gdm_user_manager_goto_login_session (priv->manager); out: maybe_lock_screen (status); }
static void on_lock_screen_activate (GtkMenuItem *item, ShellStatusMenu *status) { maybe_lock_screen (status); }
int main (int argc, char *argv[]) { GtkWidget *dialog; char *command; char *version; char *ret; const char *message; GOptionContext *ctx; bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); /* Option parsing */ ctx = g_option_context_new ("- New mdm login"); g_option_context_add_main_entries (ctx, options, _("main options")); g_option_context_parse (ctx, &argc, &argv, NULL); g_option_context_free (ctx); if (monte_carlo_pi) { calc_pi (); return 0; } mdm_log_init (); mdm_log_set_debug (debug_in); if (args_remaining != NULL && args_remaining[0] != NULL) server = args_remaining[0]; if (send_command != NULL) { if ( ! mdmcomm_check (FALSE)) { mdm_common_error (_("Error: MDM (MDM Display Manager) is not running.")); mdm_common_error (_("You might be using a different display manager.")); return 1; } } else { /* * The --command argument does not display anything, so avoid * running gtk_init until it finishes. Sometimes the * --command argument is used when there is no display so it * will fail and cause the program to exit, complaining about * "no display". */ gtk_init (&argc, &argv); if ( ! mdmcomm_check (TRUE)) { return 1; } } /* Start reading config data in bulk */ mdmcomm_comm_bulk_start (); /* Process --command option */ g_type_init (); if (send_command != NULL) { /* gdk_init is needed for cookie code to get display */ gdk_init (&argc, &argv); if (authenticate) auth_cookie = mdmcomm_get_auth_cookie (); /* * If asking for a translatable config value, then try to get * the translated value first. If this fails, then go ahead * and call the normal sockets command. */ if (strncmp (send_command, MDM_SUP_GET_CONFIG " ", strlen (MDM_SUP_GET_CONFIG " ")) == 0) { gchar *value = NULL; const char *key = &send_command[strlen (MDM_SUP_GET_CONFIG " ")]; if (is_key (MDM_KEY_WELCOME, key) || is_key (MDM_KEY_REMOTE_WELCOME, key)) { value = mdm_config_get_translated_string ((gchar *)key); if (value != NULL) { ret = g_strdup_printf ("OK %s", value); } } /* * If the above didn't return a value, then must be a * different key, so call mdmcomm_call_mdm. */ if (value == NULL) ret = mdmcomm_call_mdm (send_command, auth_cookie, "1.0.0.0", 5); } else { ret = mdmcomm_call_mdm (send_command, auth_cookie, "1.0.0.0", 5); } /* At this point we are done using the socket, so close it */ mdmcomm_comm_bulk_stop (); if (ret != NULL) { g_print ("%s\n", ret); return 0; } else { dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Cannot communicate with MDM " "(The MDM Display Manager)"), _("Perhaps you have an old version " "of MDM running.")); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return 1; } } /* * Now process what mdmflexiserver is more frequently used to * do, start VT (Virtual Terminal) sesions - at least on * systems where it is supported. On systems where it is not * supporteed VT stands for "Very Tight" and will mess up your * display if you use it. Tight! So do not use it. * * I would accept a patch to disable it on such systems, but it * is easy to avoid not using it as long as your distro does not * put the menu choice in the application launch button on the * panel (don't ship the desktop file). */ /* * Always attempt to get cookie and authenticate. On remote * servers */ auth_cookie = mdmcomm_get_auth_cookie (); if (use_xnest) { char *cookie = mdmcomm_get_a_cookie (FALSE /* binary */); if (cookie == NULL) { /* At this point we are done using the socket, so close it */ mdmcomm_comm_bulk_stop (); dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You do not seem to have the " "authentication needed for this " "operation"), _("Perhaps your .Xauthority " "file is not set up correctly.")); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return 1; } command = g_strdup_printf (MDM_SUP_FLEXI_XNEST " %s %d %s %s", mdmcomm_get_display (), (int)getuid (), cookie, XauFileName ()); g_free (cookie); version = "1.0.0.0"; auth_cookie = NULL; } else { /* check for other displays/logged in users */ check_for_users (); if (auth_cookie == NULL) { /* At this point we are done using the socket, so close it */ mdmcomm_comm_bulk_stop (); dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You do not seem to be logged in on the " "console"), _("Starting a new login only " "works correctly on the console.")); gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return 1; } read_servers (); server = choose_server (); if (server == NULL) command = g_strdup (MDM_SUP_FLEXI_XSERVER); else command = g_strdup_printf (MDM_SUP_FLEXI_XSERVER " %s", server); version = "1.0.0.0"; } ret = mdmcomm_call_mdm (command, auth_cookie, version, 5); g_free (command); g_free (auth_cookie); g_strfreev (args_remaining); /* At this point we are done using the socket, so close it */ mdmcomm_comm_bulk_stop (); if (ret != NULL && strncmp (ret, "OK ", 3) == 0) { /* if we switched to a different screen as a result of this, * lock the current screen */ if ( ! no_lock && ! use_xnest) { maybe_lock_screen (); } /* all fine and dandy */ g_free (ret); return 0; } message = mdmcomm_get_error_message (ret, use_xnest); dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Cannot start new display"), message); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); g_free (ret); return 1; }
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; } }
int main (int argc, char *argv[]) { GtkWidget *dialog; char *ret; const char *message; GOptionContext *ctx; bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); /* Option parsing */ ctx = g_option_context_new ("- New mdm login"); g_option_context_add_main_entries (ctx, options, _("main options")); g_option_context_parse (ctx, &argc, &argv, NULL); g_option_context_free (ctx); mdm_log_init (); mdm_log_set_debug (debug_in); if (send_command != NULL) { if ( ! mdmcomm_is_daemon_running (FALSE)) { mdm_common_error (_("Error: MDM (MDM Display Manager) is not running.")); mdm_common_error (_("You might be using a different display manager.")); return 1; } } else { /* * The --command argument does not display anything, so avoid * running gtk_init until it finishes. Sometimes the * --command argument is used when there is no display so it * will fail and cause the program to exit, complaining about * "no display". */ gtk_init (&argc, &argv); if ( ! mdmcomm_is_daemon_running (TRUE)) { return 1; } } mdmcomm_open_connection_to_daemon (); /* Process --command option */ g_type_init (); if (send_command != NULL) { /* gdk_init is needed for cookie code to get display */ gdk_init (&argc, &argv); if (authenticate) auth_cookie = mdmcomm_get_auth_cookie (); /* * If asking for a translatable config value, then try to get * the translated value first. If this fails, then go ahead * and call the normal sockets command. */ if (strncmp (send_command, MDM_SUP_GET_CONFIG " ", strlen (MDM_SUP_GET_CONFIG " ")) == 0) { gchar *value = NULL; const char *key = &send_command[strlen (MDM_SUP_GET_CONFIG " ")]; if (is_key (MDM_KEY_WELCOME, key)) { value = mdm_config_get_translated_string ((gchar *)key); if (value != NULL) { ret = g_strdup_printf ("OK %s", value); } } /* * If the above didn't return a value, then must be a * different key, so call the daemon. */ if (value == NULL) ret = mdmcomm_send_cmd_to_daemon_with_args (send_command, auth_cookie, 5); } else { ret = mdmcomm_send_cmd_to_daemon_with_args (send_command, auth_cookie, 5); } /* At this point we are done using the socket, so close it */ mdmcomm_close_connection_to_daemon (); if (ret != NULL) { g_print ("%s\n", ret); return 0; } else { dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Cannot communicate with MDM " "(The MDM Display Manager)"), _("Perhaps you have an old version " "of MDM running.")); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return 1; } } /* * Always attempt to get cookie and authenticate. On remote * servers */ auth_cookie = mdmcomm_get_auth_cookie (); /* check for other displays/logged in users */ check_for_users (); if (auth_cookie == NULL) { /* At this point we are done using the socket, so close it */ mdmcomm_close_connection_to_daemon (); dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You do not seem to be logged in on the " "console"), _("Starting a new login only " "works correctly on the console.")); gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); return 1; } ret = mdmcomm_send_cmd_to_daemon_with_args (MDM_SUP_FLEXI_XSERVER, auth_cookie, 5); g_free (auth_cookie); g_strfreev (args_remaining); /* At this point we are done using the socket, so close it */ mdmcomm_close_connection_to_daemon (); if (ret != NULL && strncmp (ret, "OK ", 3) == 0) { /* if we switched to a different screen as a result of this, * lock the current screen */ if ( ! no_lock ) { maybe_lock_screen (); } /* all fine and dandy */ g_free (ret); return 0; } message = mdmcomm_get_error_message (ret); dialog = hig_dialog_new (NULL /* parent */, GTK_DIALOG_MODAL /* flags */, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Cannot start new display"), message); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); g_free (ret); return 1; }