1/* Entry/Password Entry
2 *
3 * GtkPasswordEntry provides common functionality of
4 * entries that are used to enter passwords and other
5 * secrets.
6 *
7 * It will display a warning if CapsLock is on, and it
8 * can optionally provide a way to see the text.
9 */
10
11#include <glib/gi18n.h>
12#include <gtk/gtk.h>
13
14
15static GtkWidget *entry;
16static GtkWidget *entry2;
17static GtkWidget *button;
18
19static void
20update_button (GObject *object,
21 GParamSpec *pspec,
22 gpointer data)
23{
24 const char *text = gtk_editable_get_text (GTK_EDITABLE (entry));
25 const char *text2 = gtk_editable_get_text (GTK_EDITABLE (entry2));
26
27 gtk_widget_set_sensitive (widget: button,
28 sensitive: text[0] != '\0' && g_str_equal (v1: text, v2: text2));
29}
30
31static void
32button_pressed (GtkButton *widget,
33 GtkWidget *window)
34{
35 gtk_window_destroy (GTK_WINDOW (window));
36}
37
38GtkWidget *
39do_password_entry (GtkWidget *do_widget)
40{
41 static GtkWidget *window = NULL;
42 GtkWidget *box;
43 GtkWidget *header;
44
45 if (!window)
46 {
47 window = gtk_window_new ();
48 gtk_window_set_display (GTK_WINDOW (window),
49 display: gtk_widget_get_display (widget: do_widget));
50 header = gtk_header_bar_new ();
51 gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
52 gtk_window_set_titlebar (GTK_WINDOW (window), titlebar: header);
53 gtk_window_set_title (GTK_WINDOW (window), title: "Choose a Password");
54 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
55 gtk_window_set_deletable (GTK_WINDOW (window), FALSE);
56 g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window);
57
58 box = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 6);
59 gtk_widget_set_margin_start (widget: box, margin: 18);
60 gtk_widget_set_margin_end (widget: box, margin: 18);
61 gtk_widget_set_margin_top (widget: box, margin: 18);
62 gtk_widget_set_margin_bottom (widget: box, margin: 18);
63 gtk_window_set_child (GTK_WINDOW (window), child: box);
64
65 entry = gtk_password_entry_new ();
66 gtk_password_entry_set_show_peek_icon (GTK_PASSWORD_ENTRY (entry), TRUE);
67 g_object_set (object: entry,
68 first_property_name: "placeholder-text", "Password",
69 "activates-default", TRUE,
70 NULL);
71 g_signal_connect (entry, "notify::text", G_CALLBACK (update_button), NULL);
72 gtk_box_append (GTK_BOX (box), child: entry);
73
74 entry2 = gtk_password_entry_new ();
75 gtk_password_entry_set_show_peek_icon (GTK_PASSWORD_ENTRY (entry2), TRUE);
76 g_object_set (object: entry2,
77 first_property_name: "placeholder-text", "Confirm",
78 "activates-default", TRUE,
79 NULL);
80 g_signal_connect (entry2, "notify::text", G_CALLBACK (update_button), NULL);
81 gtk_box_append (GTK_BOX (box), child: entry2);
82
83 button = gtk_button_new_with_mnemonic (label: "_Done");
84 gtk_widget_add_css_class (widget: button, css_class: "suggested-action");
85 g_signal_connect (button, "clicked", G_CALLBACK (button_pressed), window);
86 gtk_widget_set_sensitive (widget: button, FALSE);
87 gtk_header_bar_pack_end (GTK_HEADER_BAR (header), child: button);
88
89 gtk_window_set_default_widget (GTK_WINDOW (window), default_widget: button);
90 }
91
92 if (!gtk_widget_get_visible (widget: window))
93 gtk_widget_show (widget: window);
94 else
95 gtk_window_destroy (GTK_WINDOW (window));
96
97 return window;
98}
99

source code of gtk/demos/gtk-demo/password_entry.c