19928N/A--- libgksu-2.0.12/libgksuui/gksuui-dialog.c-orig 2010-11-30 17:01:53.344848453 -0600
19928N/A+++ libgksu-2.0.12/libgksuui/gksuui-dialog.c 2010-11-30 17:12:37.311927624 -0600
19928N/A@@ -22,15 +22,37 @@
19928N/A
19928N/A #include <gtk/gtk.h>
19928N/A #include <gdk/gdkx.h>
19928N/A+#include <X11/Xlib.h>
19928N/A #include <X11/XKBlib.h>
19928N/A+#include <gdk/gdkkeysyms.h>
19928N/A+#include <gdk/gdkx.h>
19928N/A
19928N/A+#if 0
19928N/A #include <gconf/gconf-client.h>
19928N/A+#endif
19928N/A
19928N/A #include "defines.h"
19928N/A #include "../config.h"
19928N/A
19928N/A #include "gksuui-dialog.h"
19928N/A
19928N/A+static gboolean caps_lock_state = FALSE;
19928N/A+
19928N/A+gboolean
19928N/A+gksuui_is_capslock_on (void);
19928N/A+
19928N/A+void
19928N/A+capslock_update (GksuuiDialog *gksuui_dialog, gboolean new_state);
19928N/A+
19928N/A+void
19928N/A+ok_button_update ( GksuuiDialog *dialog );
19928N/A+
19928N/A+void
19928N/A+entry_key_release_event ( GtkWidget *widget, GdkEventKey *key, gpointer data);
19928N/A+
19928N/A+gboolean
19928N/A+cl_key_press_event (GtkWidget *widget, GdkEventKey *key, gpointer data);
19928N/A+
19928N/A enum {
19928N/A GKSUUI_DIALOG_SUDO_MODE = 1,
19928N/A };
19928N/A@@ -166,6 +188,7 @@ set_sensitivity_cb (GtkWidget *button, g
19928N/A static void
19928N/A cb_toggled_cb (GtkWidget *button, gpointer data)
19928N/A {
19928N/A+#if 0
19928N/A GConfClient *gconf_client;
19928N/A gchar *key;
19928N/A gboolean toggled;
19928N/A@@ -193,11 +216,13 @@ cb_toggled_cb (GtkWidget *button, gpoint
19928N/A g_object_unref (gconf_client);
19928N/A
19928N/A g_free (key);
19928N/A+#endif
19928N/A }
19928N/A
19928N/A static void
19928N/A gksuui_dialog_create_gnome_keyring_ui (GksuuiDialog *dialog)
19928N/A {
19928N/A+#if 0
19928N/A /* gnome-keyring stuff */
19928N/A GtkWidget *vbox;
19928N/A GtkWidget *check_button;
19928N/A@@ -250,6 +275,7 @@ gksuui_dialog_create_gnome_keyring_ui (G
19928N/A g_free (tmp);
19928N/A
19928N/A g_object_unref (gconf_client);
19928N/A+#endif
19928N/A }
19928N/A
19928N/A static gboolean
19928N/A@@ -264,6 +290,13 @@ gksuui_dialog_init (GksuuiDialog *gksuui
19928N/A {
19928N/A GtkDialog *dialog;
19928N/A GtkWidget *hbox; /* aditional hbox for 'password: entry' label */
19928N/A+ AtkObject *atk_entry, *atk_label;
19928N/A+ AtkObject *rel_obj[1];
19928N/A+ AtkRelation *relation;
19928N/A+ AtkRelationSet *set;
19928N/A+ GtkWidget *table;
19928N/A+ GtkWidget *warning_image;
19928N/A+ GtkWidget *warning_info;
19928N/A
19928N/A /*
19928N/A make sure we're using UTF-8 and getting our locale files
19928N/A@@ -284,7 +317,7 @@ gksuui_dialog_init (GksuuiDialog *gksuui
19928N/A gksuui_dialog->main_vbox = dialog->vbox;
19928N/A
19928N/A gtk_window_set_title (GTK_WINDOW(gksuui_dialog), "");
19928N/A- gtk_dialog_set_has_separator (GTK_DIALOG(gksuui_dialog), FALSE);
19928N/A+ gtk_dialog_set_has_separator (GTK_DIALOG(gksuui_dialog), TRUE);
19928N/A gtk_container_set_border_width (GTK_CONTAINER(gksuui_dialog), 6);
19928N/A gtk_box_set_spacing (GTK_BOX(gksuui_dialog->main_vbox), 12);
19928N/A gtk_window_set_resizable (GTK_WINDOW(gksuui_dialog), FALSE);
19928N/A@@ -306,14 +339,16 @@ gksuui_dialog_init (GksuuiDialog *gksuui
19928N/A gksuui_dialog->ok_button = gtk_dialog_add_button (dialog,
19928N/A GTK_STOCK_OK,
19928N/A GTK_RESPONSE_OK);
19928N/A- gtk_widget_grab_default (gksuui_dialog->ok_button);
19928N/A+ gtk_widget_set_sensitive ( gksuui_dialog->ok_button, FALSE);
19928N/A
19928N/A+ g_signal_connect (G_OBJECT (gksuui_dialog), "key_press_event",
19928N/A+ G_CALLBACK (cl_key_press_event), NULL);
19928N/A
19928N/A /* hbox */
19928N/A gksuui_dialog->hbox = gtk_hbox_new (FALSE, 12);
19928N/A gtk_container_set_border_width (GTK_CONTAINER(gksuui_dialog->hbox), 6);
19928N/A gtk_box_pack_start (GTK_BOX(gksuui_dialog->main_vbox),
19928N/A- gksuui_dialog->hbox, TRUE, TRUE, 0);
19928N/A+ gksuui_dialog->hbox, FALSE, FALSE, 0);
19928N/A gtk_widget_show (gksuui_dialog->hbox);
19928N/A
19928N/A /* image */
19928N/A@@ -326,13 +361,25 @@ gksuui_dialog_init (GksuuiDialog *gksuui
19928N/A gtk_widget_show (gksuui_dialog->image);
19928N/A
19928N/A /* vbox for label and entry */
19928N/A- gksuui_dialog->entry_vbox = gtk_vbox_new (FALSE, 12);
19928N/A+ gksuui_dialog->entry_vbox = gtk_vbox_new (FALSE, 6);
19928N/A gtk_box_pack_start (GTK_BOX(gksuui_dialog->hbox), gksuui_dialog->entry_vbox,
19928N/A TRUE, TRUE, 0);
19928N/A gtk_widget_show (gksuui_dialog->entry_vbox);
19928N/A
19928N/A- /* label */
19928N/A- gksuui_dialog->label = gtk_label_new (_("<span weight=\"bold\" size=\"larger\">"
19928N/A+ /* SUN_BRANDING required_label */
19928N/A+ gksuui_dialog->required_label = gtk_label_new (_("<span weight=\"bold\" size=\"larger\">"
19928N/A+ "Password Required</span>"));
19928N/A+ gtk_label_set_justify (GTK_LABEL(gksuui_dialog->required_label),
19928N/A+ GTK_JUSTIFY_CENTER);
19928N/A+ gtk_label_set_use_markup (GTK_LABEL(gksuui_dialog->required_label), TRUE);
19928N/A+ gtk_label_set_line_wrap (GTK_LABEL(gksuui_dialog->required_label), TRUE);
19928N/A+ gtk_misc_set_alignment (GTK_MISC(gksuui_dialog->required_label), 0.0, 0);
19928N/A+ gtk_box_pack_start (GTK_BOX(gksuui_dialog->entry_vbox),
19928N/A+ gksuui_dialog->required_label, TRUE, TRUE, 0);
19928N/A+ gtk_widget_show (gksuui_dialog->required_label);
19928N/A+
19928N/A+ /* SUN_BRANDING label */
19928N/A+ gksuui_dialog->label = gtk_label_new (_("<span weight=\"normal\" size=\"medium\">"
19928N/A "Type the root password.</span>\n"));
19928N/A gtk_label_set_use_markup (GTK_LABEL(gksuui_dialog->label), TRUE);
19928N/A gtk_label_set_line_wrap (GTK_LABEL(gksuui_dialog->label), TRUE);
19928N/A@@ -346,16 +393,17 @@ gksuui_dialog_init (GksuuiDialog *gksuui
19928N/A gtk_box_pack_start (GTK_BOX(gksuui_dialog->entry_vbox),
19928N/A gksuui_dialog->alert, TRUE, TRUE, 0);
19928N/A
19928N/A- /* hbox for entry and label */
19928N/A- hbox = gtk_hbox_new (FALSE, 6);
19928N/A- gtk_box_pack_start (GTK_BOX (gksuui_dialog->entry_vbox), hbox,
19928N/A- TRUE, TRUE, 0);
19928N/A- gtk_widget_show (hbox);
19928N/A+ /* table for entry and password label, warning image and warning info */
19928N/A+ table = gtk_table_new ( 3, 2, FALSE);
19928N/A+ gtk_container_add (GTK_CONTAINER(gksuui_dialog->entry_vbox), table);
19928N/A+ gtk_widget_show (table);
19928N/A
19928N/A /* entry label */
19928N/A- gksuui_dialog->prompt_label = gtk_label_new (_("Password:"));
19928N/A- gtk_box_pack_start (GTK_BOX(hbox), gksuui_dialog->prompt_label,
19928N/A- FALSE, FALSE, 0);
19928N/A+ gksuui_dialog->prompt_label = gtk_label_new (NULL);
19928N/A+ /* SUN_BRANDING entry label */
19928N/A+ gtk_label_set_text_with_mnemonic(GTK_LABEL(gksuui_dialog->prompt_label), _("_Password:"));
19928N/A+ gtk_table_attach ( GTK_TABLE (table), gksuui_dialog->prompt_label, 0, 1, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
19928N/A+
19928N/A gtk_widget_show (gksuui_dialog->prompt_label);
19928N/A
19928N/A /* entry */
19928N/A@@ -365,14 +413,58 @@ gksuui_dialog_init (GksuuiDialog *gksuui
19928N/A g_signal_connect_swapped (G_OBJECT(gksuui_dialog->entry), "activate",
19928N/A G_CALLBACK(gtk_button_clicked),
19928N/A gksuui_dialog->ok_button);
19928N/A+
19928N/A+ /* "notify" works with GOK, "key-press" does not */
19928N/A+ g_signal_connect (G_OBJECT (gksuui_dialog->entry), "notify",
19928N/A+ G_CALLBACK (entry_key_release_event), gksuui_dialog);
19928N/A+
19928N/A+ gtk_label_set_mnemonic_widget (GTK_LABEL (gksuui_dialog->prompt_label), gksuui_dialog->entry);
19928N/A+
19928N/A+ atk_entry = gtk_widget_get_accessible(gksuui_dialog->entry);
19928N/A+ atk_label = gtk_widget_get_accessible(gksuui_dialog->prompt_label);
19928N/A+
19928N/A+ /* Create the labelled-by relation */
19928N/A+ set = atk_object_ref_relation_set (atk_entry);
19928N/A+ rel_obj[0] = atk_label;
19928N/A+ relation = atk_relation_new (rel_obj, 1, ATK_RELATION_LABEL_FOR);
19928N/A+ atk_relation_set_add (set, relation);
19928N/A+ g_object_unref ( relation );
19928N/A+
19928N/A+ /* Create the label-for relation */
19928N/A+ set = atk_object_ref_relation_set (atk_label);
19928N/A+ rel_obj[0] = atk_entry;
19928N/A+ relation = atk_relation_new (rel_obj, 1, ATK_RELATION_LABELLED_BY);
19928N/A+ atk_relation_set_add (set, relation);
19928N/A+ g_object_unref ( relation );
19928N/A+
19928N/A gtk_entry_set_visibility(GTK_ENTRY(gksuui_dialog->entry), FALSE);
19928N/A if ('*' == gtk_entry_get_invisible_char(GTK_ENTRY(gksuui_dialog->entry)))
19928N/A gtk_entry_set_invisible_char(GTK_ENTRY(gksuui_dialog->entry), 0x25cf);
19928N/A- gtk_box_pack_start (GTK_BOX (hbox), gksuui_dialog->entry,
19928N/A- TRUE, TRUE, 0);
19928N/A+ gtk_table_attach_defaults ( GTK_TABLE (table), gksuui_dialog->entry, 1, 3, 0, 1);
19928N/A gtk_widget_show (gksuui_dialog->entry);
19928N/A gtk_widget_grab_focus(gksuui_dialog->entry);
19928N/A
19928N/A+ /* add warning image */
19928N/A+ gksuui_dialog->info_image =
19928N/A+ gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
19928N/A+ GTK_ICON_SIZE_SMALL_TOOLBAR);
19928N/A+ gtk_table_attach ( GTK_TABLE (table), gksuui_dialog->info_image, 1, 2, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
19928N/A+ gtk_misc_set_alignment (GTK_MISC(gksuui_dialog->info_image), 0.5, 0);
19928N/A+ gtk_widget_show (gksuui_dialog->info_image);
19928N/A+
19928N/A+ /* add warning info */
19928N/A+ gksuui_dialog->info_label = gtk_label_new( NULL );
19928N/A+
19928N/A+ gtk_label_set_justify (GTK_LABEL(gksuui_dialog->info_label),
19928N/A+ GTK_JUSTIFY_LEFT );
19928N/A+ gtk_label_set_use_markup (GTK_LABEL(gksuui_dialog->info_label), TRUE);
19928N/A+ gtk_label_set_line_wrap (GTK_LABEL(gksuui_dialog->info_label), TRUE);
19928N/A+ gtk_misc_set_alignment (GTK_MISC(gksuui_dialog->info_label), 0.0, 0);
19928N/A+ gtk_table_attach ( GTK_TABLE (table), gksuui_dialog->info_label, 2,3,1,2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 10);
19928N/A+ gtk_widget_show (gksuui_dialog->info_label);
19928N/A+ caps_lock_state = gksuui_is_capslock_on();
19928N/A+ capslock_update ( GKSUUI_DIALOG (dialog), caps_lock_state );
19928N/A+
19928N/A /* label capslock warning */
19928N/A gksuui_dialog->label_warn_capslock = gtk_label_new ("");
19928N/A gtk_widget_show (gksuui_dialog->label_warn_capslock);
19928N/A@@ -460,6 +552,10 @@ gksuui_dialog_set_alert (GksuuiDialog *d
19928N/A GtkWidget *label = dialog->alert;
19928N/A
19928N/A gtk_label_set_markup (GTK_LABEL(label), alert);
19928N/A+ if (alert != NULL && alert[0] != '\0')
19928N/A+ {
19928N/A+ gtk_widget_show (dialog->alert);
19928N/A+ }
19928N/A }
19928N/A
19928N/A /**
19928N/A@@ -532,6 +628,113 @@ gksuui_dialog_get_password (GksuuiDialog
19928N/A return gtk_editable_get_chars (entry, 0, -1);
19928N/A }
19928N/A
19928N/A+Display*
19928N/A+get_parent_display (void)
19928N/A+{
19928N/A+ gboolean tested = FALSE;
19928N/A+ Display *dsp = NULL;
19928N/A+
19928N/A+ if (tested)
19928N/A+ return dsp;
19928N/A+
19928N/A+ tested = TRUE;
19928N/A+
19928N/A+ if (g_getenv ("GDM_PARENT_DISPLAY") != NULL)
19928N/A+ {
19928N/A+ char *old_xauth = g_strdup (g_getenv ("XAUTHORITY"));
19928N/A+ if (g_getenv ("GDM_PARENT_XAUTHORITY") != NULL)
19928N/A+ {
19928N/A+ g_setenv ("XAUTHORITY",
19928N/A+ g_getenv ("GDM_PARENT_XAUTHORITY"), TRUE);
19928N/A+ }
19928N/A+ dsp = XOpenDisplay (g_getenv ("GDM_PARENT_DISPLAY"));
19928N/A+ if (old_xauth != NULL)
19928N/A+ g_setenv ("XAUTHORITY", old_xauth, TRUE);
19928N/A+ else
19928N/A+ g_unsetenv ("XAUTHORITY");
19928N/A+ g_free (old_xauth);
19928N/A+ }
19928N/A+
19928N/A+ return dsp;
19928N/A+}
19928N/A+
19928N/A+gboolean
19928N/A+gksuui_is_capslock_on (void)
19928N/A+{
19928N/A+ XkbStateRec states;
19928N/A+ Display *dsp;
19928N/A+
19928N/A+ /* HACK! incredible hack, if this is set we get
19928N/A+ * indicator state from the parent display, since we must be inside an
19928N/A+ * Xnest */
19928N/A+ dsp = get_parent_display ();
19928N/A+ if (dsp == NULL)
19928N/A+ dsp = GDK_DISPLAY ();
19928N/A+
19928N/A+ if (XkbGetState (dsp, XkbUseCoreKbd, &states) != Success)
19928N/A+ return FALSE;
19928N/A+
19928N/A+ return (states.locked_mods & LockMask) != 0;
19928N/A+}
19928N/A+
19928N/A+gboolean
19928N/A+cl_key_press_event (GtkWidget *widget, GdkEventKey *key, gpointer data)
19928N/A+{
19928N/A+ gboolean new_state;
19928N/A+
19928N/A+ new_state = gksuui_is_capslock_on ();
19928N/A+ if (new_state != caps_lock_state) {
19928N/A+ caps_lock_state = new_state;
19928N/A+ capslock_update (GKSUUI_DIALOG(widget), new_state);
19928N/A+ }
19928N/A+ return FALSE;
19928N/A+}
19928N/A+
19928N/A+void
19928N/A+entry_key_release_event ( GtkWidget *widget, GdkEventKey *key, gpointer data)
19928N/A+{
19928N/A+ ok_button_update ( GKSUUI_DIALOG(data) );
19928N/A+}
19928N/A+
19928N/A+void
19928N/A+capslock_update (GksuuiDialog *gksuui_dialog, gboolean new_state)
19928N/A+{
19928N/A+ GtkDialog *dialog;
19928N/A+
19928N/A+ dialog = GTK_DIALOG(gksuui_dialog);
19928N/A+ if ( new_state ) {
19928N/A+ /* SUN_BRANDING */
19928N/A+ gtk_label_set_markup (GTK_LABEL(gksuui_dialog->info_label), _("<span weight=\"normal\" size=\"medium\">"
19928N/A+ "Caps Locks is turned on</span>"));
19928N/A+ gtk_image_set_from_stock (gksuui_dialog->info_image, GTK_STOCK_DIALOG_WARNING,
19928N/A+ GTK_ICON_SIZE_SMALL_TOOLBAR);
19928N/A+ } else {
19928N/A+ gtk_label_set_markup (GTK_LABEL(gksuui_dialog->info_label), _("<span weight=\"normal\" size=\"medium\">"
19928N/A+ " </span>"));
19928N/A+ gtk_image_set_from_pixbuf (gksuui_dialog->info_image, NULL); }
19928N/A+}
19928N/A+
19928N/A+void
19928N/A+ok_button_update ( GksuuiDialog *dialog )
19928N/A+{
19928N/A+ if (!gtk_widget_get_mapped (dialog->ok_button) || !gtk_widget_get_mapped (dialog->cancel_button))
19928N/A+ return;
19928N/A+
19928N/A+ if ( strlen (gtk_entry_get_text ( dialog->entry)) == 0 ) {
19928N/A+ g_signal_handlers_disconnect_by_func ( G_OBJECT(dialog->entry),
19928N/A+ G_CALLBACK(gtk_button_clicked),
19928N/A+ dialog->ok_button);
19928N/A+ gtk_widget_grab_default ( dialog->cancel_button );
19928N/A+ gtk_widget_set_sensitive ( dialog->ok_button, FALSE);
19928N/A+ } else {
19928N/A+ g_signal_connect_swapped (G_OBJECT(dialog->entry), "activate",
19928N/A+ G_CALLBACK(gtk_button_clicked),
19928N/A+ dialog->ok_button);
19928N/A+ gtk_widget_grab_default (dialog->ok_button);
19928N/A+ gtk_widget_set_sensitive ( dialog->ok_button, TRUE);
19928N/A+ }
19928N/A+}
19928N/A+
19928N/A /**
19928N/A * gksuui_dialog_set_prompt:
19928N/A * @dialog: the dialog on which to set the prompt
19928N/A--- libgksu-2.0.12/libgksuui/gksuui-dialog.h-orig 2010-11-30 17:10:03.967832164 -0600
19928N/A+++ libgksu-2.0.12/libgksuui/gksuui-dialog.h 2010-11-30 17:10:21.043599236 -0600
19928N/A@@ -69,6 +69,9 @@ struct _GksuuiDialog
19928N/A GtkWidget *entry;
19928N/A GtkWidget *ok_button;
19928N/A GtkWidget *cancel_button;
19928N/A+ GtkWidget *required_label;
19928N/A+ GtkWidget *info_image;
19928N/A+ GtkWidget *info_label;
19928N/A GtkWidget *prompt_label;
19928N/A
19928N/A /* private */
19928N/A--- libgksu-2.0.12/libgksuui/test-gksuui.c-orig 2010-11-30 17:10:37.791621938 -0600
19928N/A+++ libgksu-2.0.12/libgksuui/test-gksuui.c 2010-11-30 17:21:26.508330923 -0600
19928N/A@@ -42,13 +42,13 @@ main (gint argc, gchar **argv)
19928N/A NULL);
19928N/A gksuui_dialog_set_icon (GKSUUI_DIALOG(gksuui_dialog), pixbuf);
19928N/A
19928N/A- gtk_widget_show_all (gksuui_dialog);
19928N/A+ gtk_widget_show (gksuui_dialog);
19928N/A
19928N/A response = gtk_dialog_run (GTK_DIALOG(gksuui_dialog));
19928N/A- fprintf (stderr, "response ID: %d\n", response);
19928N/A+ fprintf (stderr, "response ID: %d\n", response ? response : "(null)");
19928N/A
19928N/A password = gksuui_dialog_get_password (GKSUUI_DIALOG(gksuui_dialog));
19928N/A- fprintf (stderr, "password: %s\n", password);
19928N/A+ fprintf (stderr, "password: %s\n", password ? password : "(null)");
19928N/A
19928N/A gtk_widget_hide (gksuui_dialog);
19928N/A while (gtk_events_pending ())
19928N/A--- libgksu-2.0.12/libgksu/libgksu.c-orig 2010-11-30 17:22:26.945502491 -0600
19928N/A+++ libgksu-2.0.12/libgksu/libgksu.c 2010-11-30 17:22:34.811726641 -0600
19928N/A@@ -564,7 +564,7 @@ grab_keyboard_and_mouse (GtkWidget *dial
19928N/A
19928N/A gdk_threads_enter ();
19928N/A fadeout_screen (gdk_screen_get_default (), 0);
19928N/A- gtk_widget_show_all (dialog);
19928N/A+ gtk_widget_show (dialog);
19928N/A
19928N/A /* reset cursor */
19928N/A gdk_window_set_cursor(dialog->window, gdk_cursor_new(GDK_LEFT_PTR));
19928N/A@@ -1034,7 +1034,7 @@ no_pass (GksuContext *context, gpointer
19928N/A G_CALLBACK(cb_toggled_cb), "display-no-pass-info");
19928N/A gtk_container_add (GTK_CONTAINER(alignment), check_button);
19928N/A
19928N/A- gtk_widget_show_all (dialog);
19928N/A+ gtk_widget_show (dialog);
19928N/A gtk_dialog_run (GTK_DIALOG(dialog));
19928N/A gtk_widget_destroy (GTK_WIDGET(dialog));
19928N/A