src: use embedded eye icon in password entry box

This improves the UI for the password auth box by using an inline icon
for showing/hiding the password text. This is the UI pattern uses by
GNOME shell and other GTK applications.

The two svg files added here are copied from the GTK4 codebase which
is under the LGPLv2+.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2021-02-19 13:13:26 +00:00 committed by Daniel P. Berrangé
parent c6f429627c
commit abbd076fdb
5 changed files with 55 additions and 24 deletions

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
<path d="M13.98 1.99a1 1 0 0 0-.687.303l-.984.984A8 8 0 0 0 8 2 8 8 0 0 0 .262 8.01a8 8 0 0 0 2.943 4.37l-.912.913a1 1 0 1 0 1.414 1.414l11-11a1 1 0 0 0-.727-1.717zM8 4a4 4 0 0 1 2.611.974l-1.42 1.42A2 2 0 0 0 8 6a2 2 0 0 0-2 2 2 2 0 0 0 .396 1.19l-1.42 1.42A4 4 0 0 1 4 8a4 4 0 0 1 4-4zm7.03 2.209l-3.344 3.343a4 4 0 0 1-2.127 2.127l-2.28 2.28a8 8 0 0 0 .721.04 8 8 0 0 0 7.738-6.01 8 8 0 0 0-.709-1.78zm-7.53.79a.5.5 0 0 1 .5.5.5.5 0 0 1-.5.5.5.5 0 0 1-.5-.5.5.5 0 0 1 .5-.5z" fill="#2e3436"/>
</svg>

After

Width:  |  Height:  |  Size: 570 B

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="16" viewBox="0 0 16 16" version="1.1" id="svg7384" height="16">
<metadata id="metadata90">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title>Gnome Symbolic Icon Theme</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<title id="title9167">Gnome Symbolic Icon Theme</title>
<defs id="defs7386">
<linearGradient osb:paint="solid" id="linearGradient7212">
<stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop7214"/>
</linearGradient>
</defs>
<g transform="translate(-341.0002,-13.000323)" style="display:inline" id="layer9"/>
<g transform="translate(-100,-380.00032)" id="layer1"/>
<g transform="translate(-100,-380.00032)" style="display:inline" id="layer10">
<path d="m 108,382 a 8,8 0 0 0 -7.73828,6.00977 A 8,8 0 0 0 108,394 8,8 0 0 0 115.73828,387.99023 8,8 0 0 0 108,382 Z m 0,2 a 4,4 0 0 1 4,4 4,4 0 0 1 -4,4 4,4 0 0 1 -4,-4 4,4 0 0 1 4,-4 z" id="path2314" style="opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"/>
<path id="path2318" d="m 110,388.00003 a 2,2 0 0 1 -2,2 2,2 0 0 1 -2,-2 2,2 0 0 1 2,-2 2,2 0 0 1 2,2 z" style="vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
</g>
<g transform="translate(-100,-380.00032)" id="g6387"/>
<g transform="translate(-100,-380.00032)" id="layer11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -130,24 +130,6 @@
<property name="bottom-attach">2</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="show-password">
<property name="label" translatable="yes">Show password</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">False</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="right-attach">2</property>
<property name="top-attach">2</property>
<property name="bottom-attach">3</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>

View File

@ -18,5 +18,7 @@
<file alias="icons/32x32/virt-viewer.png">../../icons/32x32/virt-viewer.png</file>
<file alias="icons/48x48/virt-viewer.png">../../icons/48x48/virt-viewer.png</file>
<file alias="icons/256x256/virt-viewer.png">../../icons/256x256/virt-viewer.png</file>
<file alias="icons/eye-not-looking-symbolic.svg">../../icons/scalable/eye-not-looking-symbolic.svg</file>
<file alias="icons/eye-open-negative-filled-symbolic.svg">../../icons/scalable/eye-open-negative-filled-symbolic.svg</file>
</gresource>
</gresources>

View File

@ -34,10 +34,17 @@
#include "virt-viewer-util.h"
static void
show_password(GtkCheckButton *check_button G_GNUC_UNUSED,
GtkEntry *entry)
show_password(GtkEntry *entry,
GtkEntryIconPosition pos G_GNUC_UNUSED,
GdkEvent event G_GNUC_UNUSED)
{
gtk_entry_set_visibility(entry, !gtk_entry_get_visibility(entry));
gboolean visible = gtk_entry_get_visibility(entry);
gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry),
GTK_ENTRY_ICON_SECONDARY,
visible ?
"eye-not-looking-symbolic" :
"eye-open-negative-filled-symbolic");
gtk_entry_set_visibility(entry, !visible);
}
/* NOTE: if username is provided, and *username is non-NULL, the user input
@ -58,7 +65,6 @@ virt_viewer_auth_collect_credentials(GtkWindow *window,
GtkWidget *promptUsername;
GtkWidget *promptPassword;
GtkWidget *labelMessage;
GtkWidget *checkPassword;
int response;
char *message;
@ -71,7 +77,6 @@ virt_viewer_auth_collect_credentials(GtkWindow *window,
promptUsername = GTK_WIDGET(gtk_builder_get_object(creds, "prompt-username"));
credPassword = GTK_WIDGET(gtk_builder_get_object(creds, "cred-password"));
promptPassword = GTK_WIDGET(gtk_builder_get_object(creds, "prompt-password"));
checkPassword = GTK_WIDGET(gtk_builder_get_object(creds, "show-password"));
gtk_widget_set_sensitive(credUsername, username != NULL);
if (username && *username) {
@ -83,7 +88,20 @@ virt_viewer_auth_collect_credentials(GtkWindow *window,
gtk_widget_set_sensitive(credPassword, password != NULL);
gtk_widget_set_sensitive(promptPassword, password != NULL);
g_signal_connect(checkPassword, "clicked", G_CALLBACK(show_password), credPassword);
gtk_entry_set_icon_from_icon_name(GTK_ENTRY(credPassword),
GTK_ENTRY_ICON_SECONDARY,
"eye-not-looking-symbolic");
gtk_entry_set_icon_sensitive(GTK_ENTRY(credPassword),
GTK_ENTRY_ICON_SECONDARY,
TRUE);
gtk_entry_set_icon_activatable(GTK_ENTRY(credPassword),
GTK_ENTRY_ICON_SECONDARY,
TRUE);
gtk_entry_set_icon_tooltip_text(GTK_ENTRY(credPassword),
GTK_ENTRY_ICON_SECONDARY,
_("Show / hide password text"));
g_signal_connect(credPassword, "icon-press", G_CALLBACK(show_password), credPassword);
if (address) {
message = g_strdup_printf(_("Authentication is required for the %s connection to:\n\n<b>%s</b>\n\n"),