From 4acb7d797f9ed950758b593a328cdcf50d0ce6d4 Mon Sep 17 00:00:00 2001 From: Ivan Dmitrievich Yartsev Date: Tue, 9 Dec 2025 15:19:04 +0600 Subject: [PATCH] Limitation tooltips added --- locale/ubl-settings-usergroups.pot | 8 +++++ locale/ubl-settings-usergroups_ru.po | 11 ++++-- source/ubl-settings-usergroups-password.c | 44 +++++++++++++++++++++++ source/ubl-settings-usergroups-user.c | 42 ++++++++++++++++++++++ source/ubl-settings-usergroups.h | 11 ++++++ source/ubl-strings.h | 4 ++- ubl-settings-usergroups-password.glade | 21 +++++++++++ ubl-settings-usergroups-user.glade | 25 +++++++++++++ 8 files changed, 163 insertions(+), 3 deletions(-) diff --git a/locale/ubl-settings-usergroups.pot b/locale/ubl-settings-usergroups.pot index cec9580..06afdf3 100644 --- a/locale/ubl-settings-usergroups.pot +++ b/locale/ubl-settings-usergroups.pot @@ -1062,4 +1062,12 @@ msgstr "" #: source/ubl-strings.h:302 msgid "The password does not meet the password policy requirements" +msgstr "" + +#: source/ubl-strings.h:302 +msgid "- Latin characters only\n- Maximum 256 characters" +msgstr "" + +#: source/ubl-strings.h:302 +msgid "- Latin characters only\n- Start with a-zA-Z_ only\n- Use only characters a-zA-Z0-9_-\n- Maximum 32 characters\n- Regexp check [a-zA-Z_][a-zA-Z0-9_-]*" msgstr "" \ No newline at end of file diff --git a/locale/ubl-settings-usergroups_ru.po b/locale/ubl-settings-usergroups_ru.po index b96e9e1..6ba7b67 100644 --- a/locale/ubl-settings-usergroups_ru.po +++ b/locale/ubl-settings-usergroups_ru.po @@ -1153,7 +1153,14 @@ msgstr "Правила составления логина не соблюден #~ msgid "main group will be set to default group" #~ msgstr "получит(-ат) основную группу по умолчанию" - #: source/ubl-strings.h:302 msgid "The password does not meet the password policy requirements" -msgstr "Пароль не соответствует требованиям политики паролей" \ No newline at end of file +msgstr "Пароль не соответствует требованиям политики паролей" + +#: source/ubl-strings.h:302 +msgid "- Latin characters only\n- Maximum 256 characters" +msgstr "- Только латинские символы.\n- Максимум 256 символов." + +#: source/ubl-strings.h:302 +msgid "- Latin characters only\n- Start with a-zA-Z_ only\n- Use only characters a-zA-Z0-9_-\n- Maximum 32 characters\n- Regexp check [a-zA-Z_][a-zA-Z0-9_-]*" +msgstr "- Только латинские символы\n- Начало только c a-zA-Z_\n- Использовать только символы a-zA-Z0-9_-\n- Максимум 32 символа\n- Проверка regexp [a-zA-Z_][a-zA-Z0-9_-]*" \ No newline at end of file diff --git a/source/ubl-settings-usergroups-password.c b/source/ubl-settings-usergroups-password.c index fe70465..ce1bfaa 100644 --- a/source/ubl-settings-usergroups-password.c +++ b/source/ubl-settings-usergroups-password.c @@ -141,6 +141,43 @@ void on_password_hash_sensitiveness(GtkWidget *,ubl_settings_usergroups_password } } +gboolean on_password_focus_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_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 *, ubl_settings_usergroups_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 *, ubl_settings_usergroups_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 *, ubl_settings_usergroups_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; +} + ubl_settings_usergroups_password_window *yon_ubl_settings_usergroups_password_new(){ ubl_settings_usergroups_password_window *window = malloc(sizeof(ubl_settings_usergroups_password_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_ubl_settings_usergroups_password); @@ -153,6 +190,8 @@ ubl_settings_usergroups_password_window *yon_ubl_settings_usergroups_password_ne window->PasswordBox=yon_gtk_builder_get_widget(builder,"PasswordBox"); window->NoEncriptionCheck=yon_gtk_builder_get_widget(builder,"NoEncriptionCheck"); window->PasswordStrengthProgress=yon_gtk_builder_get_widget(builder,"PasswordStrengthProgress"); + window->PasswordTooltipPopover=yon_gtk_builder_get_widget(builder,"PasswordTooltipPopover"); + window->PassowordTooltipLabel=yon_gtk_builder_get_widget(builder,"PassowordTooltipLabel"); window->UserCancelButton=yon_gtk_builder_get_widget(builder,"UserCancelButton"); window->UserOkButton=yon_gtk_builder_get_widget(builder,"UserOkButton"); @@ -166,8 +205,13 @@ ubl_settings_usergroups_password_window *yon_ubl_settings_usergroups_password_ne g_signal_connect(G_OBJECT(window->PasswordHashEntry),"changed",G_CALLBACK(on_password_hash_sensitiveness),window); g_signal_connect(G_OBJECT(window->RepeatPasswordEntry),"icon-press",G_CALLBACK(on_password_show_hide),NULL); g_signal_connect(G_OBJECT(window->PasswordHashEntry),"icon-press",G_CALLBACK(on_password_show_hide),NULL); + 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_window_set_title(GTK_WINDOW(window->CreateGroupWindow),PASSWORD_TITLE_LABEL); + return window; } diff --git a/source/ubl-settings-usergroups-user.c b/source/ubl-settings-usergroups-user.c index f0f49e7..21e773c 100644 --- a/source/ubl-settings-usergroups-user.c +++ b/source/ubl-settings-usergroups-user.c @@ -1,5 +1,42 @@ #include "ubl-settings-usergroups.h" +gboolean on_login_focus_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_user_window *window){ + gtk_popover_set_relative_to(GTK_POPOVER(window->LoginTooltipPopover),self); + gtk_popover_set_position(GTK_POPOVER(window->LoginTooltipPopover),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->LoginTooltipPopover)); + 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_login_focus_out_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_user_window *window){ + gtk_popover_set_relative_to(GTK_POPOVER(window->LoginTooltipPopover),self); + gtk_popover_set_position(GTK_POPOVER(window->LoginTooltipPopover),GTK_POS_RIGHT); + gtk_popover_popdown(GTK_POPOVER(window->LoginTooltipPopover)); + return GDK_EVENT_PROPAGATE; +} +gboolean on_login_tooltip_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_user_window *window){ + gtk_popover_set_relative_to(GTK_POPOVER(window->LoginTooltipPopover),self); + gtk_popover_set_position(GTK_POPOVER(window->LoginTooltipPopover),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->LoginTooltipPopover)); + 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_login_tooltip_out_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_user_window *window){ + if (gtk_widget_has_focus(window->userLoginEntry)) return GDK_EVENT_PROPAGATE; + gtk_popover_set_relative_to(GTK_POPOVER(window->LoginTooltipPopover),self); + gtk_popover_set_position(GTK_POPOVER(window->LoginTooltipPopover),GTK_POS_RIGHT); + gtk_popover_popdown(GTK_POPOVER(window->LoginTooltipPopover)); + return GDK_EVENT_PROPAGATE; +} + char *yon_user_get_system_groups(char *target_login){ char *groups_string = NULL; groups_string=""; @@ -269,6 +306,7 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ window->UsershadowShutdownCheck=yon_gtk_builder_get_widget(builder,"UsershadowShutdownCheck"); window->userTitleNameLabel=yon_gtk_builder_get_widget(builder,"userTitleNameLabel"); window->MainNotebook=yon_gtk_builder_get_widget(builder,"MainNotebook"); + window->LoginTooltipPopover=yon_gtk_builder_get_widget(builder,"LoginTooltipPopover"); window->expiration_unix=NULL; window->last_uid=NULL; yon_gtk_entry_block_symbols(GTK_ENTRY(window->userUserNameEntry),"'\":\n"); @@ -305,6 +343,10 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){ yon_dictionary_add_or_create_if_exists_with_data(entry_dict,"combo",window->userPasswordCombo); yon_dictionary_add_or_create_if_exists_with_data(entry_dict,"entry",window->userPasswordEntry); // char *password = yon_config_get_by_key(USERADD((char*)gtk_entry_get_text(GTK_ENTRY(window->userLoginEntry)))); + g_signal_connect(G_OBJECT(window->userLoginEntry),"focus-in-event",G_CALLBACK(on_login_focus_event),window); + g_signal_connect(G_OBJECT(window->userLoginEntry),"focus-out-event",G_CALLBACK(on_login_focus_out_event),window); + g_signal_connect(G_OBJECT(window->userLoginEntry),"enter-notify-event",G_CALLBACK(on_login_tooltip_event),window); + g_signal_connect(G_OBJECT(window->userLoginEntry),"leave-notify-event",G_CALLBACK(on_login_tooltip_out_event),window); g_signal_connect(G_OBJECT(window->UserCancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),window->userUIDEntry); g_signal_connect(G_OBJECT(window->userHomeButton),"clicked",G_CALLBACK(on_filechooser_open),window->userHomeEntry); diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h index 482c6a5..6cb8b55 100644 --- a/source/ubl-settings-usergroups.h +++ b/source/ubl-settings-usergroups.h @@ -372,6 +372,8 @@ typedef struct{ GtkWidget *PasswordBox; GtkWidget *NoEncriptionCheck; GtkWidget *PasswordStrengthProgress; + GtkWidget *PasswordTooltipPopover; + GtkWidget *PassowordTooltipLabel; } ubl_settings_usergroups_password_window; typedef struct { @@ -440,6 +442,7 @@ typedef struct{ GtkWidget *userTitleNameLabel; GtkWidget *userSyncSAMBAPasswordCheck; GtkWidget *MainNotebook; + GtkWidget *LoginTooltipPopover; char *expiration_unix; @@ -641,4 +644,12 @@ void on_home_changed(GtkWidget *self,ubl_settings_usergroups_user_window *window gboolean yon_user_set_locales(GtkWidget *target); void *yon_load_languages(void *target); void on_password_changed(GtkWidget *, ubl_settings_usergroups_password_window *window); +gboolean on_password_focus_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_password_window *window); +gboolean on_password_focus_out_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_password_window *window); +gboolean on_password_tooltip_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_password_window *window); +gboolean on_password_tooltip_out_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_password_window *window); +gboolean on_login_focus_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_user_window *window); +gboolean on_login_focus_out_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_user_window *window); +gboolean on_login_tooltip_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_user_window *window); +gboolean on_login_tooltip_out_event(GtkWidget *self, GdkEvent *, ubl_settings_usergroups_user_window *window); #endif \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 1e2cc6f..948c679 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -298,4 +298,6 @@ #define REGIONAL_SETTINGS_LABEL _("Regional settings") #define SYSTEM_LABEL _("System") #define INVALID_LOGIN_LABEL _("The login rules are not followed") -#define WEAK_PASSWORD_LABEL _("The password does not meet the password policy requirements") \ No newline at end of file +#define WEAK_PASSWORD_LABEL _("The password does not meet the password policy requirements") +#define PASSWORD_LIMITATIONS_TOOLTIP_LABEL _("- Latin characters only\n- Maximum 256 characters") +#define LOGIN_LIMITATIONS_TOOLTIP_LABEL _("- Latin characters only\n- Start with a-zA-Z_ only\n- Use only characters a-zA-Z0-9_-\n- Maximum 32 characters\n- Regexp check [a-zA-Z_][a-zA-Z0-9_-]*") \ No newline at end of file diff --git a/ubl-settings-usergroups-password.glade b/ubl-settings-usergroups-password.glade index 5ed4c65..39a212f 100644 --- a/ubl-settings-usergroups-password.glade +++ b/ubl-settings-usergroups-password.glade @@ -3,6 +3,26 @@ + + False + right + False + none + + + True + False + 5 + 5 + 5 + 5 + - Latin characters only +- Maximum 256 characters + 0 + 0 + + + True False @@ -77,6 +97,7 @@ True True + 256 False * True diff --git a/ubl-settings-usergroups-user.glade b/ubl-settings-usergroups-user.glade index 6c829cd..2483580 100644 --- a/ubl-settings-usergroups-user.glade +++ b/ubl-settings-usergroups-user.glade @@ -3,6 +3,31 @@ + + False + right + False + none + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + - Latin characters only +- Start with a-zA-Z_ only +- Use only characters a-zA-Z0-9_- +- Maximum 32 characters +- Regexp check [a-zA-Z_][a-zA-Z0-9_-]* + 0 + 0 + + + 1e+21