diff --git a/libublsettingsui-gtk3-password.glade b/libublsettingsui-gtk3-password.glade index a841f43..3513a2b 100644 --- a/libublsettingsui-gtk3-password.glade +++ b/libublsettingsui-gtk3-password.glade @@ -2,6 +2,28 @@ + + False + right + False + none + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + - Latin characters only +- Maximum 256 characters + 0 + 0 + + + True False @@ -76,7 +98,6 @@ True True - Password False * True diff --git a/libublsettingsui-gtk3.pot b/libublsettingsui-gtk3.pot index 81193fc..41e251a 100644 --- a/libublsettingsui-gtk3.pot +++ b/libublsettingsui-gtk3.pot @@ -519,6 +519,10 @@ msgstr "" msgid "Repeat password:" msgstr "" +#: source/libublsettingsui-gtk3.h:728 +msgid "Repeat password" +msgstr "" + #: source/libublsettingsui-gtk3.h:728 msgid "Encryption:" msgstr "" @@ -529,4 +533,8 @@ msgstr "" #: source/libublsettingsui-gtk3.h:728 msgid "Password hash:" +msgstr "" + +#: source/libublsettingsui-gtk3.h:728 +msgid "- Latin characters only\n- Maximum 256 characters" msgstr "" \ No newline at end of file diff --git a/libublsettingsui-gtk3_ru.po b/libublsettingsui-gtk3_ru.po index f4b8203..eca66ad 100644 --- a/libublsettingsui-gtk3_ru.po +++ b/libublsettingsui-gtk3_ru.po @@ -528,6 +528,10 @@ msgstr "Пароль:" msgid "Repeat password:" msgstr "Подтверждение пароля:" +#: source/libublsettingsui-gtk3.h:728 +msgid "Repeat password" +msgstr "Подтверждение пароля" + #: source/libublsettingsui-gtk3.h:728 msgid "Encryption:" msgstr "Шифрование:" @@ -539,3 +543,7 @@ msgstr "Не шифровать пароль" #: source/libublsettingsui-gtk3.h:728 msgid "Password hash:" msgstr "Хэш пароля" + +#: source/libublsettingsui-gtk3.h:728 +msgid "- Latin characters only\n- Maximum 256 characters" +msgstr "- Только латинские символы.\n- Максимум 256 символов." \ No newline at end of file diff --git a/source/libublsettingsui-gtk3-password.c b/source/libublsettingsui-gtk3-password.c index b929eb1..3015e83 100644 --- a/source/libublsettingsui-gtk3-password.c +++ b/source/libublsettingsui-gtk3-password.c @@ -4,6 +4,44 @@ #define sha512_encrypt_command(target) yon_char_unite("echo -n \"",target,"\" | sha512sum | cut -f 1 -d ' '",NULL) yon_password_window *yon_password_window_new(); +gboolean on_password_focus_out_event(GtkWidget *self, GdkEvent *, yon_password_window *window); + +gboolean on_password_focus_event(GtkWidget *self, GdkEvent *, yon_password_window *window){ + gtk_popover_set_relative_to(GTK_POPOVER(window->PasswordTooltipPopover),self); + gtk_popover_set_position(GTK_POPOVER(window->PasswordTooltipPopover),GTK_POS_RIGHT); + g_signal_handlers_block_by_func(G_OBJECT(self),G_CALLBACK(on_password_focus_out_event),window); + g_signal_handlers_block_by_func(G_OBJECT(self),G_CALLBACK(on_password_focus_event),window); + gtk_popover_popup(GTK_POPOVER(window->PasswordTooltipPopover)); + gtk_widget_grab_focus(self); + g_signal_handlers_unblock_by_func(G_OBJECT(self),G_CALLBACK(on_password_focus_out_event),window); + g_signal_handlers_unblock_by_func(G_OBJECT(self),G_CALLBACK(on_password_focus_event),window); + return GDK_EVENT_PROPAGATE; +} + +gboolean on_password_focus_out_event(GtkWidget *self, GdkEvent *, yon_password_window *window){ + gtk_popover_set_relative_to(GTK_POPOVER(window->PasswordTooltipPopover),self); + gtk_popover_set_position(GTK_POPOVER(window->PasswordTooltipPopover),GTK_POS_RIGHT); + gtk_popover_popdown(GTK_POPOVER(window->PasswordTooltipPopover)); + return GDK_EVENT_PROPAGATE; +} +gboolean on_password_tooltip_event(GtkWidget *self, GdkEvent *, yon_password_window *window){ + gtk_popover_set_relative_to(GTK_POPOVER(window->PasswordTooltipPopover),self); + gtk_popover_set_position(GTK_POPOVER(window->PasswordTooltipPopover),GTK_POS_RIGHT); + g_signal_handlers_block_by_func(G_OBJECT(self),G_CALLBACK(on_password_focus_out_event),window); + g_signal_handlers_block_by_func(G_OBJECT(self),G_CALLBACK(on_password_focus_event),window); + gtk_popover_popup(GTK_POPOVER(window->PasswordTooltipPopover)); + g_signal_handlers_unblock_by_func(G_OBJECT(self),G_CALLBACK(on_password_focus_out_event),window); + g_signal_handlers_unblock_by_func(G_OBJECT(self),G_CALLBACK(on_password_focus_event),window); + return GDK_EVENT_PROPAGATE; +} + +gboolean on_password_tooltip_out_event(GtkWidget *self, GdkEvent *, yon_password_window *window){ + if (gtk_widget_has_focus(window->PasswordEntry)) return GDK_EVENT_PROPAGATE; + gtk_popover_set_relative_to(GTK_POPOVER(window->PasswordTooltipPopover),self); + gtk_popover_set_position(GTK_POPOVER(window->PasswordTooltipPopover),GTK_POS_RIGHT); + gtk_popover_popdown(GTK_POPOVER(window->PasswordTooltipPopover)); + return GDK_EVENT_PROPAGATE; +} char *yon_password_unencrypted_password_get(yon_password_window *window){ const char *password = gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry)); @@ -208,6 +246,7 @@ yon_password_window *yon_password_window_new(){ window->UserCancelButton = yon_gtk_builder_get_widget(builder,"UserCancelButton"); window->AcceptButton = yon_gtk_builder_get_widget(builder,"UserOkButton"); window->PasswordBox = yon_gtk_builder_get_widget(builder,"PasswordBox"); + window->PasswordTooltipPopover = yon_gtk_builder_get_widget(builder,"PasswordTooltipPopover"); window->HashBox = yon_gtk_builder_get_widget(builder,"HashBox"); window->old_password=NULL; @@ -217,6 +256,10 @@ yon_password_window *yon_password_window_new(){ g_signal_connect(G_OBJECT(window->PasswordHashEntry),"changed",G_CALLBACK(on_password_hash_sensitiveness),window); g_signal_connect(G_OBJECT(window->PasswordEntry),"changed",G_CALLBACK(on_password_hash_sensitiveness),window); g_signal_connect(G_OBJECT(window->RepeatPasswordEntry),"changed",G_CALLBACK(on_password_hash_sensitiveness),window); + g_signal_connect(G_OBJECT(window->PasswordEntry),"focus-in-event",G_CALLBACK(on_password_focus_event),window); + g_signal_connect(G_OBJECT(window->PasswordEntry),"focus-out-event",G_CALLBACK(on_password_focus_out_event),window); + g_signal_connect(G_OBJECT(window->PasswordEntry),"enter-notify-event",G_CALLBACK(on_password_tooltip_event),window); + g_signal_connect(G_OBJECT(window->PasswordEntry),"leave-notify-event",G_CALLBACK(on_password_tooltip_out_event),window); gtk_widget_show(window->Window); return window; } diff --git a/source/libublsettingsui-gtk3.h b/source/libublsettingsui-gtk3.h index 87bc939..04c7f58 100644 --- a/source/libublsettingsui-gtk3.h +++ b/source/libublsettingsui-gtk3.h @@ -568,6 +568,7 @@ typedef struct { GtkWidget *HashBox; GtkWidget *PasswordStrengthProgress; + GtkWidget *PasswordTooltipPopover; void *strength_func; const char *old_password; @@ -727,6 +728,7 @@ yon_window *yon_window_new(); #define _PASSWORD_LABEL yon_char_get_localised_from_lib("Password:") #define _PASSWORD_REPEAT_LABEL yon_char_get_localised_from_lib("Repeat password:") + #define _PASSWORD_REPEAT_TOOLTIP_LABEL yon_char_get_localised_from_lib("Repeat password") #define _PASSWORD_ENCRYPTION_LABEL yon_char_get_localised_from_lib("Encryption:") #define _PASSWORD_NO_ENCRYPTION_LABEL yon_char_get_localised_from_lib("Do not encrypt password") #define _PASSWORD_HASH_LABEL yon_char_get_localised_from_lib("Password hash:") @@ -765,6 +767,6 @@ yon_window *yon_window_new(); #define _CHOOSE_USERS_LABEL yon_char_get_localised_from_lib("Choose users") #define _CHOOSE_USER_LABEL yon_char_get_localised_from_lib("Choose user") - + #define _PASSWORD_LIMITATIONS_TOOLTIP_LABEL yon_char_get_localised_from_lib("- Latin characters only\n- Maximum 256 characters") #endif \ No newline at end of file