user-accounts: Add a launcher for parental controls app
malcontent ships malcontent-control[1] which is the user interface to interact with various parental-control settings. Add a launcher as per the design mockups[2] to launch malcontent-control. [1]: https://gitlab.freedesktop.org/pwithnall/malcontent/-/blob/master/README.md [2]: https://gitlab.gnome.org/Teams/Design/settings-mockups/blob/master/users/users.png
This commit is contained in:
parent
dbf1b0dafb
commit
cd391b4942
3 changed files with 153 additions and 1 deletions
|
@ -39,6 +39,10 @@
|
||||||
#define GNOME_DESKTOP_USE_UNSTABLE_API
|
#define GNOME_DESKTOP_USE_UNSTABLE_API
|
||||||
#include <libgnome-desktop/gnome-languages.h>
|
#include <libgnome-desktop/gnome-languages.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_MALCONTENT
|
||||||
|
#include <libmalcontent/malcontent.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "cc-add-user-dialog.h"
|
#include "cc-add-user-dialog.h"
|
||||||
#include "cc-avatar-chooser.h"
|
#include "cc-avatar-chooser.h"
|
||||||
#include "cc-carousel.h"
|
#include "cc-carousel.h"
|
||||||
|
@ -87,6 +91,11 @@ struct _CcUserPanel {
|
||||||
GtkBox *no_users_box;
|
GtkBox *no_users_box;
|
||||||
GtkRevealer *notification_revealer;
|
GtkRevealer *notification_revealer;
|
||||||
GtkLabel *password_button_label;
|
GtkLabel *password_button_label;
|
||||||
|
#ifdef HAVE_MALCONTENT
|
||||||
|
GtkLabel *parental_controls_button_label;
|
||||||
|
GtkImage *parental_control_go_next;
|
||||||
|
GtkListBoxRow *parental_controls_row;
|
||||||
|
#endif
|
||||||
GtkListBoxRow *password_row;
|
GtkListBoxRow *password_row;
|
||||||
CcPermissionInfobar *permission_infobar;
|
CcPermissionInfobar *permission_infobar;
|
||||||
GtkButton *remove_user_button;
|
GtkButton *remove_user_button;
|
||||||
|
@ -291,6 +300,7 @@ reload_users (CcUserPanel *self, ActUser *selected_user)
|
||||||
CcCarouselItem *item = NULL;
|
CcCarouselItem *item = NULL;
|
||||||
GtkSettings *settings;
|
GtkSettings *settings;
|
||||||
gboolean animations;
|
gboolean animations;
|
||||||
|
guint users_count;
|
||||||
|
|
||||||
settings = gtk_widget_get_settings (GTK_WIDGET (self->carousel));
|
settings = gtk_widget_get_settings (GTK_WIDGET (self->carousel));
|
||||||
|
|
||||||
|
@ -301,7 +311,8 @@ reload_users (CcUserPanel *self, ActUser *selected_user)
|
||||||
self->other_accounts = 0;
|
self->other_accounts = 0;
|
||||||
|
|
||||||
list = act_user_manager_list_users (self->um);
|
list = act_user_manager_list_users (self->um);
|
||||||
g_debug ("Got %d users\n", g_slist_length (list));
|
users_count = g_slist_length (list);
|
||||||
|
g_debug ("Got %d users\n", users_count);
|
||||||
|
|
||||||
list = g_slist_sort (list, (GCompareFunc) sort_users);
|
list = g_slist_sort (list, (GCompareFunc) sort_users);
|
||||||
for (l = list; l; l = l->next) {
|
for (l = list; l; l = l->next) {
|
||||||
|
@ -321,6 +332,10 @@ reload_users (CcUserPanel *self, ActUser *selected_user)
|
||||||
cc_carousel_select_item (self->carousel, item);
|
cc_carousel_select_item (self->carousel, item);
|
||||||
|
|
||||||
g_object_set (settings, "gtk-enable-animations", animations, NULL);
|
g_object_set (settings, "gtk-enable-animations", animations, NULL);
|
||||||
|
#ifdef HAVE_MALCONTENT
|
||||||
|
/* Parental Controls row not to be shown for single user setups. */
|
||||||
|
gtk_widget_set_visible (GTK_WIDGET (self->parental_controls_row), users_count > 1);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
|
@ -796,6 +811,41 @@ get_autologin_possible (ActUser *user)
|
||||||
static void on_permission_changed (CcUserPanel *self);
|
static void on_permission_changed (CcUserPanel *self);
|
||||||
static void full_name_edit_button_toggled (CcUserPanel *self);
|
static void full_name_edit_button_toggled (CcUserPanel *self);
|
||||||
|
|
||||||
|
#ifdef HAVE_MALCONTENT
|
||||||
|
static gboolean
|
||||||
|
is_parental_controls_enabled_for_user (ActUser *user)
|
||||||
|
{
|
||||||
|
g_autoptr(MctManager) manager = NULL;
|
||||||
|
g_autoptr(MctAppFilter) app_filter = NULL;
|
||||||
|
g_autoptr(GDBusConnection) system_bus = NULL;
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
|
||||||
|
/* FIXME: should become asynchronous */
|
||||||
|
system_bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
|
||||||
|
if (system_bus == NULL) {
|
||||||
|
g_warning ("Error getting system bus while trying to show user details: %s", error->message);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
manager = mct_manager_new (system_bus);
|
||||||
|
app_filter = mct_manager_get_app_filter (manager,
|
||||||
|
act_user_get_uid (user),
|
||||||
|
MCT_GET_APP_FILTER_FLAGS_NONE,
|
||||||
|
NULL,
|
||||||
|
&error);
|
||||||
|
if (error) {
|
||||||
|
if (!g_error_matches (error, MCT_MANAGER_ERROR, MCT_MANAGER_ERROR_DISABLED))
|
||||||
|
g_warning ("Error retrieving app filter for user %s: %s",
|
||||||
|
act_user_get_user_name (user),
|
||||||
|
error->message);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mct_app_filter_is_enabled (app_filter);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
show_user (ActUser *user, CcUserPanel *self)
|
show_user (ActUser *user, CcUserPanel *self)
|
||||||
{
|
{
|
||||||
|
@ -877,6 +927,24 @@ show_user (ActUser *user, CcUserPanel *self)
|
||||||
show = act_user_is_local_account (user);
|
show = act_user_is_local_account (user);
|
||||||
gtk_widget_set_visible (GTK_WIDGET (self->autologin_row), show);
|
gtk_widget_set_visible (GTK_WIDGET (self->autologin_row), show);
|
||||||
|
|
||||||
|
#ifdef HAVE_MALCONTENT
|
||||||
|
/* Parental Controls: Unavailable if user is admin */
|
||||||
|
if (act_user_get_account_type (user) == ACT_USER_ACCOUNT_TYPE_ADMINISTRATOR) {
|
||||||
|
gtk_widget_hide (GTK_WIDGET (self->parental_control_go_next));
|
||||||
|
/* TRANSLATORS: Status of Parental Controls setup */
|
||||||
|
gtk_label_set_text (self->parental_controls_button_label, _("Unavailable"));
|
||||||
|
} else {
|
||||||
|
if (is_parental_controls_enabled_for_user (user))
|
||||||
|
/* TRANSLATORS: Status of Parental Controls setup */
|
||||||
|
gtk_label_set_text (self->parental_controls_button_label, _("Enabled"));
|
||||||
|
else
|
||||||
|
/* TRANSLATORS: Status of Parental Controls setup */
|
||||||
|
gtk_label_set_text (self->parental_controls_button_label, _("Disabled"));
|
||||||
|
|
||||||
|
gtk_widget_show (GTK_WIDGET (self->parental_control_go_next));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Language: do not show for current user */
|
/* Language: do not show for current user */
|
||||||
show = act_user_get_uid (user) != getuid();
|
show = act_user_get_uid (user) != getuid();
|
||||||
gtk_widget_set_visible (GTK_WIDGET (self->language_row), show);
|
gtk_widget_set_visible (GTK_WIDGET (self->language_row), show);
|
||||||
|
@ -1134,6 +1202,22 @@ show_history (CcUserPanel *self)
|
||||||
gtk_widget_destroy (GTK_WIDGET (dialog));
|
gtk_widget_destroy (GTK_WIDGET (dialog));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_MALCONTENT
|
||||||
|
static void
|
||||||
|
spawn_malcontent_control (CcUserPanel *self)
|
||||||
|
{
|
||||||
|
ActUser *user;
|
||||||
|
|
||||||
|
user = get_selected_user (self);
|
||||||
|
|
||||||
|
/* no-op if the user is administrator */
|
||||||
|
if (act_user_get_account_type (user) != ACT_USER_ACCOUNT_TYPE_ADMINISTRATOR) {
|
||||||
|
const gchar *argv[] = { "malcontent-control", NULL };
|
||||||
|
g_spawn_async (NULL, (char **)argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
activate_row (GtkListBox *box, GtkListBoxRow *row, CcUserPanel *self)
|
activate_row (GtkListBox *box, GtkListBoxRow *row, CcUserPanel *self)
|
||||||
{
|
{
|
||||||
|
@ -1149,6 +1233,12 @@ activate_row (GtkListBox *box, GtkListBoxRow *row, CcUserPanel *self)
|
||||||
} else if (row == self->last_login_row) {
|
} else if (row == self->last_login_row) {
|
||||||
show_history (self);
|
show_history (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_MALCONTENT
|
||||||
|
if (row == self->parental_controls_row) {
|
||||||
|
spawn_malcontent_control (self);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1343,6 +1433,10 @@ on_permission_changed (CcUserPanel *self)
|
||||||
|
|
||||||
gtk_widget_set_sensitive (GTK_WIDGET (self->last_login_row), TRUE);
|
gtk_widget_set_sensitive (GTK_WIDGET (self->last_login_row), TRUE);
|
||||||
remove_unlock_tooltip (GTK_WIDGET (self->last_login_row));
|
remove_unlock_tooltip (GTK_WIDGET (self->last_login_row));
|
||||||
|
#ifdef HAVE_MALCONTENT
|
||||||
|
gtk_widget_set_sensitive (GTK_WIDGET (self->parental_controls_row), TRUE);
|
||||||
|
remove_unlock_tooltip (GTK_WIDGET (self->parental_controls_row));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
gtk_stack_set_visible_child (self->user_icon_stack, GTK_WIDGET (self->user_icon_image));
|
gtk_stack_set_visible_child (self->user_icon_stack, GTK_WIDGET (self->user_icon_image));
|
||||||
|
@ -1358,6 +1452,10 @@ on_permission_changed (CcUserPanel *self)
|
||||||
|
|
||||||
gtk_widget_set_sensitive (GTK_WIDGET (self->last_login_row), FALSE);
|
gtk_widget_set_sensitive (GTK_WIDGET (self->last_login_row), FALSE);
|
||||||
add_unlock_tooltip (GTK_WIDGET (self->last_login_row));
|
add_unlock_tooltip (GTK_WIDGET (self->last_login_row));
|
||||||
|
#ifdef HAVE_MALCONTENT
|
||||||
|
gtk_widget_set_sensitive (GTK_WIDGET (self->parental_controls_row), FALSE);
|
||||||
|
add_unlock_tooltip (GTK_WIDGET (self->parental_controls_row));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1534,6 +1632,11 @@ cc_user_panel_class_init (CcUserPanelClass *klass)
|
||||||
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, last_login_row);
|
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, last_login_row);
|
||||||
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, no_users_box);
|
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, no_users_box);
|
||||||
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, notification_revealer);
|
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, notification_revealer);
|
||||||
|
#ifdef HAVE_MALCONTENT
|
||||||
|
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, parental_controls_button_label);
|
||||||
|
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, parental_control_go_next);
|
||||||
|
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, parental_controls_row);
|
||||||
|
#endif
|
||||||
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, password_button_label);
|
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, password_button_label);
|
||||||
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, password_row);
|
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, password_row);
|
||||||
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, permission_infobar);
|
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, permission_infobar);
|
||||||
|
|
|
@ -305,6 +305,51 @@
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBoxRow" id="parental_controls_row">
|
||||||
|
<property name="visible">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="border-width">10</property>
|
||||||
|
<property name="spacing">10</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label" translatable="yes">_Parental Controls</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="mnemonic_widget">parental_controls_button_label</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage" id="parental_control_go_next">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="icon-name">go-next-symbolic</property>
|
||||||
|
<style>
|
||||||
|
<class name="dim-label"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="pack_type">end</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="parental_controls_button_label">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<style>
|
||||||
|
<class name="dim-label"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="pack_type">end</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkListBoxRow" id="language_row">
|
<object class="GtkListBoxRow" id="language_row">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
|
|
@ -175,6 +175,10 @@ if enable_cheese
|
||||||
deps += cheese_deps
|
deps += cheese_deps
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if enable_malcontent
|
||||||
|
deps += malcontent_dep
|
||||||
|
endif
|
||||||
|
|
||||||
cflags += [
|
cflags += [
|
||||||
'-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir),
|
'-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir),
|
||||||
'-DHAVE_LIBPWQUALITY',
|
'-DHAVE_LIBPWQUALITY',
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue