diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2240f62..61ed3c7 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,7 +5,7 @@ before_script:
libxml2-devel dbus-daemon
glib2-devel dbus-devel gobject-introspection-devel
gettext-devel polkit-devel polkit-gnome git
- lcov pam-devel gtk3-devel
+ lcov pam-devel gtk3-devel accountsservice-devel flatpak-devel
- export LANG=C.UTF-8
stages:
diff --git a/malcontent-control/carousel.c b/malcontent-control/carousel.c
index 928028b..85afad1 100644
--- a/malcontent-control/carousel.c
+++ b/malcontent-control/carousel.c
@@ -1,6 +1,7 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
- * Copyright 2016 (c) Red Hat, Inc,
+ * Copyright © 2016 Red Hat, Inc.
+ * Copyright © 2019 Endless Mobile, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -15,66 +16,69 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
- * Author: Felipe Borges
+ * Authors:
+ * - Felipe Borges
+ * - Philip Withnall
*/
-#include "cc-carousel.h"
-
#include
#include
+#include "carousel.h"
+
+
#define ARROW_SIZE 20
-struct _CcCarouselItem {
- GtkRadioButton parent;
+struct _MctCarouselItem {
+ GtkRadioButton parent;
- gint page;
+ gint page;
};
-G_DEFINE_TYPE (CcCarouselItem, cc_carousel_item, GTK_TYPE_RADIO_BUTTON)
+G_DEFINE_TYPE (MctCarouselItem, mct_carousel_item, GTK_TYPE_RADIO_BUTTON)
GtkWidget *
-cc_carousel_item_new (void)
+mct_carousel_item_new (void)
{
- return g_object_new (CC_TYPE_CAROUSEL_ITEM, NULL);
+ return g_object_new (MCT_TYPE_CAROUSEL_ITEM, NULL);
}
static void
-cc_carousel_item_class_init (CcCarouselItemClass *klass)
+mct_carousel_item_class_init (MctCarouselItemClass *klass)
{
}
static void
-cc_carousel_item_init (CcCarouselItem *self)
+mct_carousel_item_init (MctCarouselItem *self)
{
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (self), FALSE);
- gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (self)),
- "carousel-item");
+ gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (self), FALSE);
+ gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (self)),
+ "carousel-item");
}
-struct _CcCarousel {
- GtkRevealer parent;
+struct _MctCarousel {
+ GtkRevealer parent;
- GList *children;
- gint visible_page;
- CcCarouselItem *selected_item;
- GtkWidget *last_box;
- GtkWidget *arrow;
- gint arrow_start_x;
+ GList *children;
+ gint visible_page;
+ MctCarouselItem *selected_item;
+ GtkWidget *last_box;
+ GtkWidget *arrow;
+ gint arrow_start_x;
- /* Widgets */
- GtkStack *stack;
- GtkWidget *go_back_button;
- GtkWidget *go_next_button;
+ /* Widgets */
+ GtkStack *stack;
+ GtkWidget *go_back_button;
+ GtkWidget *go_next_button;
- GtkStyleProvider *provider;
+ GtkStyleProvider *provider;
};
-G_DEFINE_TYPE (CcCarousel, cc_carousel, GTK_TYPE_REVEALER)
+G_DEFINE_TYPE (MctCarousel, mct_carousel, GTK_TYPE_REVEALER)
enum {
- ITEM_ACTIVATED,
- NUM_SIGNALS
+ ITEM_ACTIVATED,
+ NUM_SIGNALS
};
static guint signals[NUM_SIGNALS] = { 0, };
@@ -82,348 +86,358 @@ static guint signals[NUM_SIGNALS] = { 0, };
#define ITEMS_PER_PAGE 3
static gint
-cc_carousel_item_get_x (CcCarouselItem *item,
- CcCarousel *carousel)
+mct_carousel_item_get_x (MctCarouselItem *item,
+ MctCarousel *carousel)
{
- GtkWidget *widget, *parent;
- gint width;
- gint dest_x;
+ GtkWidget *widget, *parent;
+ gint width;
+ gint dest_x;
- parent = GTK_WIDGET (carousel->stack);
- widget = GTK_WIDGET (item);
+ parent = GTK_WIDGET (carousel->stack);
+ widget = GTK_WIDGET (item);
- width = gtk_widget_get_allocated_width (widget);
- gtk_widget_translate_coordinates (widget,
- parent,
- width / 2,
- 0,
- &dest_x,
- NULL);
+ width = gtk_widget_get_allocated_width (widget);
+ gtk_widget_translate_coordinates (widget,
+ parent,
+ width / 2,
+ 0,
+ &dest_x,
+ NULL);
- return CLAMP (dest_x - ARROW_SIZE,
- 0,
- gtk_widget_get_allocated_width (parent));
+ return CLAMP (dest_x - ARROW_SIZE,
+ 0,
+ gtk_widget_get_allocated_width (parent));
}
static void
-cc_carousel_move_arrow (CcCarousel *self)
+mct_carousel_move_arrow (MctCarousel *self)
{
- GtkStyleContext *context;
- gchar *css;
- gint end_x;
- GtkSettings *settings;
- gboolean animations;
+ GtkStyleContext *context;
+ gchar *css;
+ gint end_x;
+ GtkSettings *settings;
+ gboolean animations;
- if (!self->selected_item)
- return;
+ if (!self->selected_item)
+ return;
- end_x = cc_carousel_item_get_x (self->selected_item, self);
+ end_x = mct_carousel_item_get_x (self->selected_item, self);
- context = gtk_widget_get_style_context (self->arrow);
- if (self->provider)
- gtk_style_context_remove_provider (context, self->provider);
- g_clear_object (&self->provider);
+ context = gtk_widget_get_style_context (self->arrow);
+ if (self->provider)
+ gtk_style_context_remove_provider (context, self->provider);
+ g_clear_object (&self->provider);
- settings = gtk_widget_get_settings (GTK_WIDGET (self));
- g_object_get (settings, "gtk-enable-animations", &animations, NULL);
+ settings = gtk_widget_get_settings (GTK_WIDGET (self));
+ g_object_get (settings, "gtk-enable-animations", &animations, NULL);
- /* Animate the arrow movement if animations are enabled. Otherwise,
- * jump the arrow to the right location instantly. */
- if (animations)
- {
- css = g_strdup_printf ("@keyframes arrow_keyframes-%d-%d {\n"
- " from { margin-left: %dpx; }\n"
- " to { margin-left: %dpx; }\n"
- "}\n"
- "* {\n"
- " animation-name: arrow_keyframes-%d-%d;\n"
- "}\n",
- self->arrow_start_x, end_x,
- self->arrow_start_x, end_x,
- self->arrow_start_x, end_x);
- }
- else
- {
- css = g_strdup_printf ("* { margin-left: %dpx }", end_x);
- }
+ /* Animate the arrow movement if animations are enabled. Otherwise,
+ * jump the arrow to the right location instantly. */
+ if (animations)
+ {
+ css = g_strdup_printf ("@keyframes arrow_keyframes-%d-%d {\n"
+ " from { margin-left: %dpx; }\n"
+ " to { margin-left: %dpx; }\n"
+ "}\n"
+ "* {\n"
+ " animation-name: arrow_keyframes-%d-%d;\n"
+ "}\n",
+ self->arrow_start_x, end_x,
+ self->arrow_start_x, end_x,
+ self->arrow_start_x, end_x);
+ }
+ else
+ {
+ css = g_strdup_printf ("* { margin-left: %dpx }", end_x);
+ }
- self->provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
- gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (self->provider), css, -1, NULL);
- gtk_style_context_add_provider (context, self->provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+ self->provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
+ gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (self->provider), css, -1, NULL);
+ gtk_style_context_add_provider (context, self->provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
- g_free (css);
+ g_free (css);
}
static gint
-get_last_page_number (CcCarousel *self)
+get_last_page_number (MctCarousel *self)
{
- if (g_list_length (self->children) == 0)
- return 0;
+ if (g_list_length (self->children) == 0)
+ return 0;
- return ((g_list_length (self->children) - 1) / ITEMS_PER_PAGE);
+ return ((g_list_length (self->children) - 1) / ITEMS_PER_PAGE);
}
static void
-update_buttons_visibility (CcCarousel *self)
+update_buttons_visibility (MctCarousel *self)
{
- gtk_widget_set_visible (self->go_back_button, (self->visible_page > 0));
- gtk_widget_set_visible (self->go_next_button, (self->visible_page < get_last_page_number (self)));
+ gtk_widget_set_visible (self->go_back_button, (self->visible_page > 0));
+ gtk_widget_set_visible (self->go_next_button, (self->visible_page < get_last_page_number (self)));
}
/**
- * cc_carousel_find_item:
- * @carousel: an CcCarousel instance
+ * mct_carousel_find_item:
+ * @carousel: an MctCarousel instance
* @data: user data passed to the comparation function
* @func: the function to call for each element.
* It should return 0 when the desired element is found
*
- * Finds an CcCarousel item using the supplied function to find the
+ * Finds an MctCarousel item using the supplied function to find the
* desired element.
* Ideally useful for matching a model object and its correspondent
* widget.
*
- * Returns: the found CcCarouselItem, or %NULL if it is not found
+ * Returns: the found MctCarouselItem, or %NULL if it is not found
*/
-CcCarouselItem *
-cc_carousel_find_item (CcCarousel *self,
- gconstpointer data,
- GCompareFunc func)
+MctCarouselItem *
+mct_carousel_find_item (MctCarousel *self,
+ gconstpointer data,
+ GCompareFunc func)
{
- GList *list;
+ GList *list;
- list = self->children;
- while (list != NULL)
- {
- if (!func (list->data, data))
- return list->data;
- list = list->next;
- }
+ list = self->children;
+ while (list != NULL)
+ {
+ if (!func (list->data, data))
+ return list->data;
+ list = list->next;
+ }
- return NULL;
+ return NULL;
}
static void
-on_item_toggled (CcCarouselItem *item,
- GdkEvent *event,
- gpointer user_data)
+on_item_toggled (MctCarouselItem *item,
+ GdkEvent *event,
+ gpointer user_data)
{
- CcCarousel *self = CC_CAROUSEL (user_data);
+ MctCarousel *self = MCT_CAROUSEL (user_data);
- cc_carousel_select_item (self, item);
+ mct_carousel_select_item (self, item);
}
void
-cc_carousel_select_item (CcCarousel *self,
- CcCarouselItem *item)
+mct_carousel_select_item (MctCarousel *self,
+ MctCarouselItem *item)
{
- gchar *page_name;
- gboolean page_changed = TRUE;
+ gchar *page_name;
+ gboolean page_changed = TRUE;
- /* Select first user if none is specified */
- if (item == NULL)
- {
- if (self->children != NULL)
- item = self->children->data;
- else
- return;
- }
+ /* Select first user if none is specified */
+ if (item == NULL)
+ {
+ if (self->children != NULL)
+ item = self->children->data;
+ else
+ return;
+ }
- if (self->selected_item != NULL)
- {
- page_changed = (self->selected_item->page != item->page);
- self->arrow_start_x = cc_carousel_item_get_x (self->selected_item, self);
- }
+ if (self->selected_item != NULL)
+ {
+ page_changed = (self->selected_item->page != item->page);
+ self->arrow_start_x = mct_carousel_item_get_x (self->selected_item, self);
+ }
- self->selected_item = item;
- self->visible_page = item->page;
- g_signal_emit (self, signals[ITEM_ACTIVATED], 0, item);
+ self->selected_item = item;
+ self->visible_page = item->page;
+ g_signal_emit (self, signals[ITEM_ACTIVATED], 0, item);
- if (!page_changed)
- {
- cc_carousel_move_arrow (self);
- return;
- }
+ if (!page_changed)
+ {
+ mct_carousel_move_arrow (self);
+ return;
+ }
- page_name = g_strdup_printf ("%d", self->visible_page);
- gtk_stack_set_visible_child_name (self->stack, page_name);
+ page_name = g_strdup_printf ("%d", self->visible_page);
+ gtk_stack_set_visible_child_name (self->stack, page_name);
- g_free (page_name);
+ g_free (page_name);
- update_buttons_visibility (self);
+ update_buttons_visibility (self);
- /* cc_carousel_move_arrow is called from on_transition_running */
+ /* mct_carousel_move_arrow is called from on_transition_running */
}
static void
-cc_carousel_select_item_at_index (CcCarousel *self,
- gint index)
+mct_carousel_select_item_at_index (MctCarousel *self,
+ gint index)
{
- GList *l = NULL;
+ GList *l = NULL;
- l = g_list_nth (self->children, index);
- cc_carousel_select_item (self, l->data);
+ l = g_list_nth (self->children, index);
+ mct_carousel_select_item (self, l->data);
}
static void
-cc_carousel_goto_previous_page (GtkWidget *button,
- gpointer user_data)
+mct_carousel_goto_previous_page (GtkWidget *button,
+ gpointer user_data)
{
- CcCarousel *self = CC_CAROUSEL (user_data);
+ MctCarousel *self = MCT_CAROUSEL (user_data);
- self->visible_page--;
- if (self->visible_page < 0)
- self->visible_page = 0;
+ self->visible_page--;
+ if (self->visible_page < 0)
+ self->visible_page = 0;
- /* Select first item of the page */
- cc_carousel_select_item_at_index (self, self->visible_page * ITEMS_PER_PAGE);
+ /* Select first item of the page */
+ mct_carousel_select_item_at_index (self, self->visible_page * ITEMS_PER_PAGE);
}
static void
-cc_carousel_goto_next_page (GtkWidget *button,
- gpointer user_data)
+mct_carousel_goto_next_page (GtkWidget *button,
+ gpointer user_data)
{
- CcCarousel *self = CC_CAROUSEL (user_data);
- gint last_page;
+ MctCarousel *self = MCT_CAROUSEL (user_data);
+ gint last_page;
- last_page = get_last_page_number (self);
+ last_page = get_last_page_number (self);
- self->visible_page++;
- if (self->visible_page > last_page)
- self->visible_page = last_page;
+ self->visible_page++;
+ if (self->visible_page > last_page)
+ self->visible_page = last_page;
- /* Select first item of the page */
- cc_carousel_select_item_at_index (self, self->visible_page * ITEMS_PER_PAGE);
+ /* Select first item of the page */
+ mct_carousel_select_item_at_index (self, self->visible_page * ITEMS_PER_PAGE);
}
static void
-cc_carousel_add (GtkContainer *container,
- GtkWidget *widget)
+mct_carousel_add (GtkContainer *container,
+ GtkWidget *widget)
{
- CcCarousel *self = CC_CAROUSEL (container);
- gboolean last_box_is_full;
+ MctCarousel *self = MCT_CAROUSEL (container);
+ gboolean last_box_is_full;
- if (!CC_IS_CAROUSEL_ITEM (widget)) {
- GTK_CONTAINER_CLASS (cc_carousel_parent_class)->add (container, widget);
- return;
- }
+ if (!MCT_IS_CAROUSEL_ITEM (widget))
+ {
+ GTK_CONTAINER_CLASS (mct_carousel_parent_class)->add (container, widget);
+ return;
+ }
- gtk_style_context_add_class (gtk_widget_get_style_context (widget), "menu");
- gtk_button_set_relief (GTK_BUTTON (widget), GTK_RELIEF_NONE);
+ gtk_style_context_add_class (gtk_widget_get_style_context (widget), "menu");
+ gtk_button_set_relief (GTK_BUTTON (widget), GTK_RELIEF_NONE);
- self->children = g_list_append (self->children, widget);
- CC_CAROUSEL_ITEM (widget)->page = get_last_page_number (self);
- if (self->selected_item != NULL)
- gtk_radio_button_join_group (GTK_RADIO_BUTTON (widget), GTK_RADIO_BUTTON (self->selected_item));
- g_signal_connect (widget, "button-press-event", G_CALLBACK (on_item_toggled), self);
+ self->children = g_list_append (self->children, widget);
+ MCT_CAROUSEL_ITEM (widget)->page = get_last_page_number (self);
+ if (self->selected_item != NULL)
+ gtk_radio_button_join_group (GTK_RADIO_BUTTON (widget), GTK_RADIO_BUTTON (self->selected_item));
+ g_signal_connect (widget, "button-press-event", G_CALLBACK (on_item_toggled), self);
- last_box_is_full = ((g_list_length (self->children) - 1) % ITEMS_PER_PAGE == 0);
- if (last_box_is_full) {
- gchar *page;
+ last_box_is_full = ((g_list_length (self->children) - 1) % ITEMS_PER_PAGE == 0);
+ if (last_box_is_full)
+ {
+ gchar *page;
- page = g_strdup_printf ("%d", CC_CAROUSEL_ITEM (widget)->page);
- self->last_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
- gtk_widget_show (self->last_box);
- gtk_widget_set_valign (self->last_box, GTK_ALIGN_CENTER);
- gtk_stack_add_named (self->stack, self->last_box, page);
- }
+ page = g_strdup_printf ("%d", MCT_CAROUSEL_ITEM (widget)->page);
+ self->last_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_widget_show (self->last_box);
+ gtk_widget_set_valign (self->last_box, GTK_ALIGN_CENTER);
+ gtk_stack_add_named (self->stack, self->last_box, page);
+ }
- gtk_widget_show_all (widget);
- gtk_box_pack_start (GTK_BOX (self->last_box), widget, TRUE, FALSE, 10);
+ gtk_widget_show_all (widget);
+ gtk_box_pack_start (GTK_BOX (self->last_box), widget, TRUE, FALSE, 10);
- update_buttons_visibility (self);
+ update_buttons_visibility (self);
+}
+
+static void
+destroy_widget_cb (GtkWidget *widget,
+ gpointer user_data)
+{
+ gtk_widget_destroy (widget);
}
void
-cc_carousel_purge_items (CcCarousel *self)
+mct_carousel_purge_items (MctCarousel *self)
{
- gtk_container_forall (GTK_CONTAINER (self->stack),
- (GtkCallback) gtk_widget_destroy,
- NULL);
+ gtk_container_forall (GTK_CONTAINER (self->stack),
+ destroy_widget_cb,
+ NULL);
- g_list_free (self->children);
- self->children = NULL;
- self->visible_page = 0;
- self->selected_item = NULL;
+ g_list_free (self->children);
+ self->children = NULL;
+ self->visible_page = 0;
+ self->selected_item = NULL;
}
-CcCarousel *
-cc_carousel_new (void)
+MctCarousel *
+mct_carousel_new (void)
{
- return g_object_new (CC_TYPE_CAROUSEL, NULL);
+ return g_object_new (MCT_TYPE_CAROUSEL, NULL);
}
static void
-cc_carousel_class_init (CcCarouselClass *klass)
+mct_carousel_class_init (MctCarouselClass *klass)
{
- GtkWidgetClass *wclass = GTK_WIDGET_CLASS (klass);
- GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
+ GtkWidgetClass *wclass = GTK_WIDGET_CLASS (klass);
+ GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
- gtk_widget_class_set_template_from_resource (wclass,
- "/org/gnome/control-center/user-accounts/cc-carousel.ui");
+ gtk_widget_class_set_template_from_resource (wclass,
+ "/org/freedesktop/MalcontentControl/ui/carousel.ui");
- gtk_widget_class_bind_template_child (wclass, CcCarousel, stack);
- gtk_widget_class_bind_template_child (wclass, CcCarousel, go_back_button);
- gtk_widget_class_bind_template_child (wclass, CcCarousel, go_next_button);
- gtk_widget_class_bind_template_child (wclass, CcCarousel, arrow);
+ gtk_widget_class_bind_template_child (wclass, MctCarousel, stack);
+ gtk_widget_class_bind_template_child (wclass, MctCarousel, go_back_button);
+ gtk_widget_class_bind_template_child (wclass, MctCarousel, go_next_button);
+ gtk_widget_class_bind_template_child (wclass, MctCarousel, arrow);
- gtk_widget_class_bind_template_callback (wclass, cc_carousel_goto_previous_page);
- gtk_widget_class_bind_template_callback (wclass, cc_carousel_goto_next_page);
+ gtk_widget_class_bind_template_callback (wclass, mct_carousel_goto_previous_page);
+ gtk_widget_class_bind_template_callback (wclass, mct_carousel_goto_next_page);
- container_class->add = cc_carousel_add;
+ container_class->add = mct_carousel_add;
- signals[ITEM_ACTIVATED] = g_signal_new ("item-activated",
- CC_TYPE_CAROUSEL,
- G_SIGNAL_RUN_LAST,
- 0,
- NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1,
- CC_TYPE_CAROUSEL_ITEM);
+ signals[ITEM_ACTIVATED] =
+ g_signal_new ("item-activated",
+ MCT_TYPE_CAROUSEL,
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ MCT_TYPE_CAROUSEL_ITEM);
}
static void
-on_size_allocate (CcCarousel *self)
+on_size_allocate (MctCarousel *self)
{
- if (self->selected_item == NULL)
- return;
+ if (self->selected_item == NULL)
+ return;
- if (gtk_stack_get_transition_running (self->stack))
- return;
+ if (gtk_stack_get_transition_running (self->stack))
+ return;
- self->arrow_start_x = cc_carousel_item_get_x (self->selected_item, self);
- cc_carousel_move_arrow (self);
+ self->arrow_start_x = mct_carousel_item_get_x (self->selected_item, self);
+ mct_carousel_move_arrow (self);
}
static void
-on_transition_running (CcCarousel *self)
+on_transition_running (MctCarousel *self)
{
- if (!gtk_stack_get_transition_running (self->stack))
- cc_carousel_move_arrow (self);
+ if (!gtk_stack_get_transition_running (self->stack))
+ mct_carousel_move_arrow (self);
}
static void
-cc_carousel_init (CcCarousel *self)
+mct_carousel_init (MctCarousel *self)
{
- GtkStyleProvider *provider;
+ GtkStyleProvider *provider;
- gtk_widget_init_template (GTK_WIDGET (self));
+ gtk_widget_init_template (GTK_WIDGET (self));
- provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
- gtk_css_provider_load_from_resource (GTK_CSS_PROVIDER (provider),
- "/org/gnome/control-center/user-accounts/carousel.css");
+ provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
+ gtk_css_provider_load_from_resource (GTK_CSS_PROVIDER (provider),
+ "/org/freedesktop/MalcontentControl/ui/carousel.css");
- gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
- provider,
- GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+ gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
+ provider,
+ GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
- g_object_unref (provider);
+ g_object_unref (provider);
- g_signal_connect_swapped (self->stack, "size-allocate", G_CALLBACK (on_size_allocate), self);
- g_signal_connect_swapped (self->stack, "notify::transition-running", G_CALLBACK (on_transition_running), self);
+ g_signal_connect_swapped (self->stack, "size-allocate", G_CALLBACK (on_size_allocate), self);
+ g_signal_connect_swapped (self->stack, "notify::transition-running", G_CALLBACK (on_transition_running), self);
}
guint
-cc_carousel_get_item_count (CcCarousel *self)
+mct_carousel_get_item_count (MctCarousel *self)
{
- return g_list_length (self->children);
+ return g_list_length (self->children);
}
diff --git a/malcontent-control/carousel.h b/malcontent-control/carousel.h
index 8cd3f9a..db18e9e 100644
--- a/malcontent-control/carousel.h
+++ b/malcontent-control/carousel.h
@@ -1,6 +1,7 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
- * Copyright 2016 (c) Red Hat, Inc,
+ * Copyright © 2016 Red Hat, Inc.
+ * Copyright © 2019 Endless Mobile, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -15,36 +16,37 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
- * Author: Felipe Borges
+ * Authors:
+ * - Felipe Borges
+ * - Philip Withnall
*/
#pragma once
#include
+
G_BEGIN_DECLS
-#define CC_TYPE_CAROUSEL_ITEM (cc_carousel_item_get_type ())
+#define MCT_TYPE_CAROUSEL_ITEM (mct_carousel_item_get_type ())
+G_DECLARE_FINAL_TYPE (MctCarouselItem, mct_carousel_item, MCT, CAROUSEL_ITEM, GtkRadioButton)
-G_DECLARE_FINAL_TYPE (CcCarouselItem, cc_carousel_item, CC, CAROUSEL_ITEM, GtkRadioButton)
+#define MCT_TYPE_CAROUSEL (mct_carousel_get_type ())
+G_DECLARE_FINAL_TYPE (MctCarousel, mct_carousel, MCT, CAROUSEL, GtkRevealer)
-#define CC_TYPE_CAROUSEL (cc_carousel_get_type ())
+GtkWidget *mct_carousel_item_new (void);
-G_DECLARE_FINAL_TYPE (CcCarousel, cc_carousel, CC, CAROUSEL, GtkRevealer)
+MctCarousel *mct_carousel_new (void);
-GtkWidget *cc_carousel_item_new (void);
+void mct_carousel_purge_items (MctCarousel *self);
-CcCarousel *cc_carousel_new (void);
+MctCarouselItem *mct_carousel_find_item (MctCarousel *self,
+ gconstpointer data,
+ GCompareFunc func);
-void cc_carousel_purge_items (CcCarousel *self);
+void mct_carousel_select_item (MctCarousel *self,
+ MctCarouselItem *item);
-CcCarouselItem *cc_carousel_find_item (CcCarousel *self,
- gconstpointer data,
- GCompareFunc func);
-
-void cc_carousel_select_item (CcCarousel *self,
- CcCarouselItem *item);
-
-guint cc_carousel_get_item_count (CcCarousel *self);
+guint mct_carousel_get_item_count (MctCarousel *self);
G_END_DECLS
diff --git a/malcontent-control/carousel.ui b/malcontent-control/carousel.ui
index 77ba44b..8b65160 100644
--- a/malcontent-control/carousel.ui
+++ b/malcontent-control/carousel.ui
@@ -1,7 +1,9 @@
-
+
+
+
-
-
+
+
400
True
@@ -43,7 +45,7 @@
go-previous-symbolic
-
+
GTK_PACK_START
@@ -64,7 +66,7 @@
go-next-symbolic
-
+
GTK_PACK_END
diff --git a/malcontent-control/malcontent-control.gresource.xml b/malcontent-control/malcontent-control.gresource.xml
index c0ec8fd..f74e34e 100644
--- a/malcontent-control/malcontent-control.gresource.xml
+++ b/malcontent-control/malcontent-control.gresource.xml
@@ -2,6 +2,9 @@
+ carousel.css
+ carousel.ui
main.ui
+ user-controls.ui
diff --git a/malcontent-control/meson.build b/malcontent-control/meson.build
index 7834dc3..8abe3b7 100644
--- a/malcontent-control/meson.build
+++ b/malcontent-control/meson.build
@@ -14,13 +14,23 @@ malcontent_control = executable('malcontent-control',
[
'application.c',
'application.h',
+ 'carousel.c',
+ 'carousel.h',
+ 'gs-content-rating.c',
+ 'gs-content-rating.h',
'main.c',
+ 'user-controls.c',
+ 'user-controls.h',
+ 'user-image.c',
+ 'user-image.h',
] + resources,
dependencies: [
+ dependency('accountsservice'),
dependency('gio-2.0', version: '>= 2.44'),
dependency('glib-2.0', version: '>= 2.54.2'),
dependency('gobject-2.0', version: '>= 2.54'),
dependency('gtk+-3.0'),
+ dependency('flatpak'),
libmalcontent_dep,
],
include_directories: root_inc,
@@ -75,7 +85,11 @@ if xmllint.found()
args: [
'--nonet', '--noblanks', '--noout',
'--relaxng', join_paths(gtk_prefix, 'share', 'gtk-3.0', 'gtkbuilder.rng'),
- files('main.ui'),
+ files(
+ 'carousel.ui',
+ 'main.ui',
+ 'user-controls.ui',
+ ),
],
suite: ['malcontent-control'],
)
diff --git a/malcontent-control/user-controls.c b/malcontent-control/user-controls.c
index 4fa2951..4ad4a08 100644
--- a/malcontent-control/user-controls.c
+++ b/malcontent-control/user-controls.c
@@ -1,10 +1,10 @@
-/* cc-app-permissions.c
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
- * Copyright 2018, 2019 Endless, Inc.
+ * Copyright © 2018, 2019, 2020 Endless Mobile, Inc.
*
- * This program is free software: you can redistribute it and/or modify
+ * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
+ * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
@@ -13,9 +13,11 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
+ * along with this program; if not, see .
*
- * SPDX-License-Identifier: GPL-3.0-or-later
+ * Authors:
+ * - Georges Basile Stavracas Neto
+ * - Philip Withnall
*/
#include
@@ -26,15 +28,15 @@
#include
#include "gs-content-rating.h"
+#include "user-controls.h"
-#include "cc-app-permissions.h"
#define WEB_BROWSERS_CONTENT_TYPE "x-scheme-handler/http"
/* The value which we store as an age to indicate that OARS filtering is disabled. */
static const guint32 oars_disabled_age = (guint32) -1;
-struct _CcAppPermissions
+struct _MctUserControls
{
GtkGrid parent_instance;
@@ -79,11 +81,11 @@ static gint compare_app_info_cb (gconstpointer a,
static void on_allow_installation_switch_active_changed_cb (GtkSwitch *s,
GParamSpec *pspec,
- CcAppPermissions *self);
+ MctUserControls *self);
static void on_allow_web_browsers_switch_active_changed_cb (GtkSwitch *s,
GParamSpec *pspec,
- CcAppPermissions *self);
+ MctUserControls *self);
static void on_set_age_action_activated (GSimpleAction *action,
GVariant *param,
@@ -93,7 +95,7 @@ static void on_permission_allowed_cb (GObject *obj,
GParamSpec *pspec,
gpointer user_data);
-G_DEFINE_TYPE (CcAppPermissions, cc_app_permissions, GTK_TYPE_GRID)
+G_DEFINE_TYPE (MctUserControls, mct_user_controls, GTK_TYPE_GRID)
enum
{
@@ -165,7 +167,7 @@ app_compare_id_length_cb (gconstpointer a,
}
static void
-reload_apps (CcAppPermissions *self)
+reload_apps (MctUserControls *self)
{
GList *iter, *apps;
g_autoptr(GHashTable) seen_flatpak_ids = NULL;
@@ -272,7 +274,7 @@ static void
app_info_changed_cb (GAppInfoMonitor *monitor,
gpointer user_data)
{
- CcAppPermissions *self = CC_APP_PERMISSIONS (user_data);
+ MctUserControls *self = MCT_USER_CONTROLS (user_data);
reload_apps (self);
}
@@ -288,7 +290,7 @@ get_content_rating_system (ActUser *user)
}
static void
-schedule_update_blacklisted_apps (CcAppPermissions *self)
+schedule_update_blacklisted_apps (MctUserControls *self)
{
if (self->blacklist_apps_source_id > 0)
return;
@@ -299,7 +301,7 @@ schedule_update_blacklisted_apps (CcAppPermissions *self)
}
static void
-flush_update_blacklisted_apps (CcAppPermissions *self)
+flush_update_blacklisted_apps (MctUserControls *self)
{
if (self->blacklist_apps_source_id > 0)
{
@@ -310,7 +312,7 @@ flush_update_blacklisted_apps (CcAppPermissions *self)
}
static void
-update_app_filter (CcAppPermissions *self)
+update_app_filter (MctUserControls *self)
{
g_autoptr(GError) error = NULL;
@@ -335,7 +337,7 @@ update_app_filter (CcAppPermissions *self)
}
static void
-update_categories_from_language (CcAppPermissions *self)
+update_categories_from_language (MctUserControls *self)
{
GsContentRatingSystem rating_system;
const gchar * const * entries;
@@ -372,7 +374,7 @@ update_categories_from_language (CcAppPermissions *self)
/* Returns a human-readable but untranslated string, not suitable
* to be shown in any UI */
-static const gchar*
+static const gchar *
oars_value_to_string (MctAppFilterOarsValue oars_value)
{
switch (oars_value)
@@ -387,12 +389,13 @@ oars_value_to_string (MctAppFilterOarsValue oars_value)
return "moderate";
case MCT_APP_FILTER_OARS_VALUE_INTENSE:
return "intense";
+ default:
+ return "";
}
- return "";
}
static void
-update_oars_level (CcAppPermissions *self)
+update_oars_level (MctUserControls *self)
{
GsContentRatingSystem rating_system;
const gchar *rating_age_category;
@@ -434,7 +437,7 @@ update_oars_level (CcAppPermissions *self)
}
static void
-update_allow_app_installation (CcAppPermissions *self)
+update_allow_app_installation (MctUserControls *self)
{
gboolean allow_system_installation;
gboolean allow_user_installation;
@@ -490,7 +493,7 @@ update_allow_app_installation (CcAppPermissions *self)
}
static void
-update_allow_web_browsers (CcAppPermissions *self)
+update_allow_web_browsers (MctUserControls *self)
{
gboolean allow_web_browsers;
@@ -511,7 +514,7 @@ update_allow_web_browsers (CcAppPermissions *self)
}
static void
-setup_parental_control_settings (CcAppPermissions *self)
+setup_parental_control_settings (MctUserControls *self)
{
gboolean is_authorized;
@@ -540,8 +543,8 @@ setup_parental_control_settings (CcAppPermissions *self)
/* Will return %NULL if @flatpak_id is not installed. */
static gchar *
-get_flatpak_ref_for_app_id (CcAppPermissions *self,
- const gchar *flatpak_id)
+get_flatpak_ref_for_app_id (MctUserControls *self,
+ const gchar *flatpak_id)
{
g_autoptr(FlatpakInstalledRef) ref = NULL;
g_autoptr(GError) error = NULL;
@@ -588,7 +591,7 @@ blacklist_apps_cb (gpointer data)
g_auto(MctAppFilterBuilder) builder = MCT_APP_FILTER_BUILDER_INIT ();
g_autoptr(MctAppFilter) new_filter = NULL;
g_autoptr(GError) error = NULL;
- CcAppPermissions *self = data;
+ MctUserControls *self = data;
GDesktopAppInfo *app;
GHashTableIter iter;
gboolean allow_web_browsers;
@@ -706,7 +709,7 @@ blacklist_apps_cb (gpointer data)
static void
on_allow_installation_switch_active_changed_cb (GtkSwitch *s,
GParamSpec *pspec,
- CcAppPermissions *self)
+ MctUserControls *self)
{
/* See the comment about policy in update_allow_app_installation(). */
if (s == self->allow_user_installation_switch &&
@@ -729,7 +732,7 @@ on_allow_installation_switch_active_changed_cb (GtkSwitch *s,
static void
on_allow_web_browsers_switch_active_changed_cb (GtkSwitch *s,
GParamSpec *pspec,
- CcAppPermissions *self)
+ MctUserControls *self)
{
/* Save the changes. */
schedule_update_blacklisted_apps (self);
@@ -738,7 +741,7 @@ on_allow_web_browsers_switch_active_changed_cb (GtkSwitch *s,
static void
on_switch_active_changed_cb (GtkSwitch *s,
GParamSpec *pspec,
- CcAppPermissions *self)
+ MctUserControls *self)
{
GAppInfo *app;
gboolean allowed;
@@ -773,14 +776,14 @@ create_row_for_app_cb (gpointer item,
gpointer user_data)
{
g_autoptr(GIcon) icon = NULL;
- CcAppPermissions *self;
+ MctUserControls *self;
GtkWidget *box, *w;
GAppInfo *app;
gboolean allowed;
const gchar *app_name;
gint size;
- self = CC_APP_PERMISSIONS (user_data);
+ self = MCT_USER_CONTROLS (user_data);
app = item;
app_name = g_app_info_get_name (app);
@@ -852,13 +855,13 @@ on_set_age_action_activated (GSimpleAction *action,
gpointer user_data)
{
GsContentRatingSystem rating_system;
- CcAppPermissions *self;
+ MctUserControls *self;
const gchar * const * entries;
const guint *ages;
guint age;
guint i;
- self = CC_APP_PERMISSIONS (user_data);
+ self = MCT_USER_CONTROLS (user_data);
age = g_variant_get_uint32 (param);
rating_system = get_content_rating_system (self->user);
@@ -893,9 +896,9 @@ on_set_age_action_activated (GSimpleAction *action,
/* GObject overrides */
static void
-cc_app_permissions_finalize (GObject *object)
+mct_user_controls_finalize (GObject *object)
{
- CcAppPermissions *self = (CcAppPermissions *)object;
+ MctUserControls *self = (MctUserControls *)object;
g_assert (self->blacklist_apps_source_id == 0);
@@ -919,27 +922,27 @@ cc_app_permissions_finalize (GObject *object)
g_clear_object (&self->manager);
g_clear_object (&self->app_info_monitor);
- G_OBJECT_CLASS (cc_app_permissions_parent_class)->finalize (object);
+ G_OBJECT_CLASS (mct_user_controls_parent_class)->finalize (object);
}
static void
-cc_app_permissions_dispose (GObject *object)
+mct_user_controls_dispose (GObject *object)
{
- CcAppPermissions *self = (CcAppPermissions *)object;
+ MctUserControls *self = (MctUserControls *)object;
flush_update_blacklisted_apps (self);
- G_OBJECT_CLASS (cc_app_permissions_parent_class)->dispose (object);
+ G_OBJECT_CLASS (mct_user_controls_parent_class)->dispose (object);
}
static void
-cc_app_permissions_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
+mct_user_controls_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
{
- CcAppPermissions *self = CC_APP_PERMISSIONS (object);
+ MctUserControls *self = MCT_USER_CONTROLS (object);
switch (prop_id)
{
@@ -957,21 +960,21 @@ cc_app_permissions_get_property (GObject *object,
}
static void
-cc_app_permissions_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
+mct_user_controls_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
{
- CcAppPermissions *self = CC_APP_PERMISSIONS (object);
+ MctUserControls *self = MCT_USER_CONTROLS (object);
switch (prop_id)
{
case PROP_USER:
- cc_app_permissions_set_user (self, g_value_get_object (value));
+ mct_user_controls_set_user (self, g_value_get_object (value));
break;
case PROP_PERMISSION:
- cc_app_permissions_set_permission (self, g_value_get_object (value));
+ mct_user_controls_set_permission (self, g_value_get_object (value));
break;
default:
@@ -980,15 +983,15 @@ cc_app_permissions_set_property (GObject *object,
}
static void
-cc_app_permissions_class_init (CcAppPermissionsClass *klass)
+mct_user_controls_class_init (MctUserControlsClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
- object_class->finalize = cc_app_permissions_finalize;
- object_class->dispose = cc_app_permissions_dispose;
- object_class->get_property = cc_app_permissions_get_property;
- object_class->set_property = cc_app_permissions_set_property;
+ object_class->finalize = mct_user_controls_finalize;
+ object_class->dispose = mct_user_controls_dispose;
+ object_class->get_property = mct_user_controls_get_property;
+ object_class->set_property = mct_user_controls_set_property;
properties[PROP_USER] = g_param_spec_object ("user",
"User",
@@ -1008,22 +1011,22 @@ cc_app_permissions_class_init (CcAppPermissionsClass *klass)
g_object_class_install_properties (object_class, N_PROPS, properties);
- gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/user-accounts/cc-app-permissions.ui");
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/freedesktop/MalcontentControl/ui/user-controls.ui");
- gtk_widget_class_bind_template_child (widget_class, CcAppPermissions, age_menu);
- gtk_widget_class_bind_template_child (widget_class, CcAppPermissions, allow_system_installation_switch);
- gtk_widget_class_bind_template_child (widget_class, CcAppPermissions, allow_user_installation_switch);
- gtk_widget_class_bind_template_child (widget_class, CcAppPermissions, allow_web_browsers_switch);
- gtk_widget_class_bind_template_child (widget_class, CcAppPermissions, restriction_button);
- gtk_widget_class_bind_template_child (widget_class, CcAppPermissions, restriction_popover);
- gtk_widget_class_bind_template_child (widget_class, CcAppPermissions, listbox);
+ gtk_widget_class_bind_template_child (widget_class, MctUserControls, age_menu);
+ gtk_widget_class_bind_template_child (widget_class, MctUserControls, allow_system_installation_switch);
+ gtk_widget_class_bind_template_child (widget_class, MctUserControls, allow_user_installation_switch);
+ gtk_widget_class_bind_template_child (widget_class, MctUserControls, allow_web_browsers_switch);
+ gtk_widget_class_bind_template_child (widget_class, MctUserControls, restriction_button);
+ gtk_widget_class_bind_template_child (widget_class, MctUserControls, restriction_popover);
+ gtk_widget_class_bind_template_child (widget_class, MctUserControls, listbox);
gtk_widget_class_bind_template_callback (widget_class, on_allow_installation_switch_active_changed_cb);
gtk_widget_class_bind_template_callback (widget_class, on_allow_web_browsers_switch_active_changed_cb);
}
static void
-cc_app_permissions_init (CcAppPermissions *self)
+mct_user_controls_init (MctUserControls *self)
{
g_autoptr(GDBusConnection) system_bus = NULL;
g_autoptr(GError) error = NULL;
@@ -1076,19 +1079,19 @@ cc_app_permissions_init (CcAppPermissions *self)
G_BINDING_DEFAULT);
}
-ActUser*
-cc_app_permissions_get_user (CcAppPermissions *self)
+ActUser *
+mct_user_controls_get_user (MctUserControls *self)
{
- g_return_val_if_fail (CC_IS_APP_PERMISSIONS (self), NULL);
+ g_return_val_if_fail (MCT_IS_USER_CONTROLS (self), NULL);
return self->user;
}
void
-cc_app_permissions_set_user (CcAppPermissions *self,
- ActUser *user)
+mct_user_controls_set_user (MctUserControls *self,
+ ActUser *user)
{
- g_return_if_fail (CC_IS_APP_PERMISSIONS (self));
+ g_return_if_fail (MCT_IS_USER_CONTROLS (self));
g_return_if_fail (ACT_IS_USER (user));
/* If we have pending unsaved changes from the previous user, force them to be
@@ -1109,24 +1112,24 @@ on_permission_allowed_cb (GObject *obj,
GParamSpec *pspec,
gpointer user_data)
{
- CcAppPermissions *self = CC_APP_PERMISSIONS (user_data);
+ MctUserControls *self = MCT_USER_CONTROLS (user_data);
setup_parental_control_settings (self);
}
GPermission * /* (nullable) */
-cc_app_permissions_get_permission (CcAppPermissions *self)
+mct_user_controls_get_permission (MctUserControls *self)
{
- g_return_val_if_fail (CC_IS_APP_PERMISSIONS (self), NULL);
+ g_return_val_if_fail (MCT_IS_USER_CONTROLS (self), NULL);
return self->permission;
}
void
-cc_app_permissions_set_permission (CcAppPermissions *self,
- GPermission *permission /* (nullable) */)
+mct_user_controls_set_permission (MctUserControls *self,
+ GPermission *permission /* (nullable) */)
{
- g_return_if_fail (CC_IS_APP_PERMISSIONS (self));
+ g_return_if_fail (MCT_IS_USER_CONTROLS (self));
g_return_if_fail (permission == NULL || G_IS_PERMISSION (permission));
if (self->permission == permission)
diff --git a/malcontent-control/user-controls.h b/malcontent-control/user-controls.h
index 8a1f24e..a18d1c9 100644
--- a/malcontent-control/user-controls.h
+++ b/malcontent-control/user-controls.h
@@ -1,10 +1,10 @@
-/* cc-app-permissions.h
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
- * Copyright 2018 Georges Basile Stavracas Neto
+ * Copyright © 2018, 2019, 2020 Endless Mobile, Inc.
*
- * This program is free software: you can redistribute it and/or modify
+ * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
+ * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
@@ -13,29 +13,30 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
+ * along with this program; if not, see .
*
- * SPDX-License-Identifier: GPL-3.0-or-later
+ * Authors:
+ * - Georges Basile Stavracas Neto
+ * - Philip Withnall
*/
#pragma once
#include
#include
-#include
+
G_BEGIN_DECLS
-#define CC_TYPE_APP_PERMISSIONS (cc_app_permissions_get_type())
+#define MCT_TYPE_USER_CONTROLS (mct_user_controls_get_type())
+G_DECLARE_FINAL_TYPE (MctUserControls, mct_user_controls, MCT, USER_CONTROLS, GtkGrid)
-G_DECLARE_FINAL_TYPE (CcAppPermissions, cc_app_permissions, CC, APP_PERMISSIONS, GtkGrid)
+ActUser *mct_user_controls_get_user (MctUserControls *self);
+void mct_user_controls_set_user (MctUserControls *self,
+ ActUser *user);
-ActUser* cc_app_permissions_get_user (CcAppPermissions *self);
-void cc_app_permissions_set_user (CcAppPermissions *self,
- ActUser *user);
-
-GPermission *cc_app_permissions_get_permission (CcAppPermissions *self);
-void cc_app_permissions_set_permission (CcAppPermissions *self,
- GPermission *permission);
+GPermission *mct_user_controls_get_permission (MctUserControls *self);
+void mct_user_controls_set_permission (MctUserControls *self,
+ GPermission *permission);
G_END_DECLS
diff --git a/malcontent-control/user-controls.ui b/malcontent-control/user-controls.ui
index 8b9438c..9c0a164 100644
--- a/malcontent-control/user-controls.ui
+++ b/malcontent-control/user-controls.ui
@@ -1,6 +1,8 @@
+
-
+
+
True
18
6
@@ -132,7 +134,7 @@
True
True
start
-
+
@@ -185,7 +187,7 @@
True
True
start
-
+
@@ -221,7 +223,7 @@
True
True
start
-
+
@@ -293,4 +295,3 @@
-
diff --git a/malcontent-control/user-image.c b/malcontent-control/user-image.c
index 26a430d..851ffb6 100644
--- a/malcontent-control/user-image.c
+++ b/malcontent-control/user-image.c
@@ -1,4 +1,7 @@
-/*
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright © 2015 Red Hat, Inc.
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -9,134 +12,163 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
*
- * (C) Copyright 2015 Red Hat, Inc.
+ * Authors:
+ * - Ondrej Holy
*/
-#include "cc-user-image.h"
-
#include
#include
#include
-#include "user-utils.h"
+#include "user-image.h"
-struct _CcUserImage {
- GtkImage parent_instance;
- ActUser *user;
+struct _MctUserImage
+{
+ GtkImage parent_instance;
+
+ ActUser *user;
};
-G_DEFINE_TYPE (CcUserImage, cc_user_image, GTK_TYPE_IMAGE)
+G_DEFINE_TYPE (MctUserImage, mct_user_image, GTK_TYPE_IMAGE)
+
+static GdkPixbuf *
+round_image (GdkPixbuf *pixbuf)
+{
+ GdkPixbuf *dest = NULL;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+ gint size;
+
+ size = gdk_pixbuf_get_width (pixbuf);
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, size, size);
+ cr = cairo_create (surface);
+
+ /* Clip a circle */
+ cairo_arc (cr, size / 2, size / 2, size / 2, 0, 2 * G_PI);
+ cairo_clip (cr);
+ cairo_new_path (cr);
+
+ gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
+ cairo_paint (cr);
+
+ dest = gdk_pixbuf_get_from_surface (surface, 0, 0, size, size);
+ cairo_surface_destroy (surface);
+ cairo_destroy (cr);
+
+ return dest;
+}
static cairo_surface_t *
render_user_icon (ActUser *user,
gint icon_size,
gint scale)
{
- g_autoptr(GdkPixbuf) source_pixbuf = NULL;
- GdkPixbuf *pixbuf = NULL;
- GError *error;
- const gchar *icon_file;
- cairo_surface_t *surface = NULL;
+ g_autoptr(GdkPixbuf) source_pixbuf = NULL;
+ GdkPixbuf *pixbuf = NULL;
+ GError *error;
+ const gchar *icon_file;
+ cairo_surface_t *surface = NULL;
- g_return_val_if_fail (ACT_IS_USER (user), NULL);
- g_return_val_if_fail (icon_size > 12, NULL);
+ g_return_val_if_fail (ACT_IS_USER (user), NULL);
+ g_return_val_if_fail (icon_size > 12, NULL);
- icon_file = act_user_get_icon_file (user);
- pixbuf = NULL;
- if (icon_file) {
- source_pixbuf = gdk_pixbuf_new_from_file_at_size (icon_file,
- icon_size * scale,
- icon_size * scale,
- NULL);
- if (source_pixbuf)
- pixbuf = round_image (source_pixbuf);
- }
+ icon_file = act_user_get_icon_file (user);
+ pixbuf = NULL;
+ if (icon_file)
+ {
+ source_pixbuf = gdk_pixbuf_new_from_file_at_size (icon_file,
+ icon_size * scale,
+ icon_size * scale,
+ NULL);
+ if (source_pixbuf)
+ pixbuf = round_image (source_pixbuf);
+ }
- if (pixbuf != NULL) {
- goto out;
- }
+ if (pixbuf != NULL)
+ goto out;
- error = NULL;
- pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
- "avatar-default",
- icon_size * scale,
- GTK_ICON_LOOKUP_FORCE_SIZE,
- &error);
- if (error) {
- g_warning ("%s", error->message);
- g_error_free (error);
- }
+ error = NULL;
+ pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+ "avatar-default",
+ icon_size * scale,
+ GTK_ICON_LOOKUP_FORCE_SIZE,
+ &error);
+ if (error)
+ {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ }
- out:
+out:
- if (pixbuf != NULL) {
- surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, scale, NULL);
- g_object_unref (pixbuf);
- }
+ if (pixbuf != NULL)
+ {
+ surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, scale, NULL);
+ g_object_unref (pixbuf);
+ }
- return surface;
+ return surface;
}
static void
-render_image (CcUserImage *image)
+render_image (MctUserImage *image)
{
- cairo_surface_t *surface;
- gint scale, pixel_size;
+ cairo_surface_t *surface;
+ gint scale, pixel_size;
- if (image->user == NULL)
- return;
+ if (image->user == NULL)
+ return;
- pixel_size = gtk_image_get_pixel_size (GTK_IMAGE (image));
- scale = gtk_widget_get_scale_factor (GTK_WIDGET (image));
- surface = render_user_icon (image->user,
- pixel_size > 0 ? pixel_size : 48,
- scale);
- gtk_image_set_from_surface (GTK_IMAGE (image), surface);
- cairo_surface_destroy (surface);
+ pixel_size = gtk_image_get_pixel_size (GTK_IMAGE (image));
+ scale = gtk_widget_get_scale_factor (GTK_WIDGET (image));
+ surface = render_user_icon (image->user,
+ pixel_size > 0 ? pixel_size : 48,
+ scale);
+ gtk_image_set_from_surface (GTK_IMAGE (image), surface);
+ cairo_surface_destroy (surface);
}
void
-cc_user_image_set_user (CcUserImage *image,
- ActUser *user)
+mct_user_image_set_user (MctUserImage *image,
+ ActUser *user)
{
- g_clear_object (&image->user);
- image->user = g_object_ref (user);
+ g_clear_object (&image->user);
+ image->user = g_object_ref (user);
- render_image (image);
+ render_image (image);
}
static void
-cc_user_image_finalize (GObject *object)
+mct_user_image_finalize (GObject *object)
{
- CcUserImage *image = CC_USER_IMAGE (object);
+ MctUserImage *image = MCT_USER_IMAGE (object);
- g_clear_object (&image->user);
+ g_clear_object (&image->user);
- G_OBJECT_CLASS (cc_user_image_parent_class)->finalize (object);
+ G_OBJECT_CLASS (mct_user_image_parent_class)->finalize (object);
}
static void
-cc_user_image_class_init (CcUserImageClass *class)
+mct_user_image_class_init (MctUserImageClass *class)
{
- GObjectClass *object_class = G_OBJECT_CLASS (class);
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
- object_class->finalize = cc_user_image_finalize;
+ object_class->finalize = mct_user_image_finalize;
}
static void
-cc_user_image_init (CcUserImage *image)
+mct_user_image_init (MctUserImage *image)
{
- g_signal_connect_swapped (image, "notify::scale-factor", G_CALLBACK (render_image), image);
- g_signal_connect_swapped (image, "notify::pixel-size", G_CALLBACK (render_image), image);
+ g_signal_connect_swapped (image, "notify::scale-factor", G_CALLBACK (render_image), image);
+ g_signal_connect_swapped (image, "notify::pixel-size", G_CALLBACK (render_image), image);
}
GtkWidget *
-cc_user_image_new (void)
+mct_user_image_new (void)
{
- return g_object_new (CC_TYPE_USER_IMAGE, NULL);
+ return g_object_new (MCT_TYPE_USER_IMAGE, NULL);
}
diff --git a/malcontent-control/user-image.h b/malcontent-control/user-image.h
index a7f69a8..4126073 100644
--- a/malcontent-control/user-image.h
+++ b/malcontent-control/user-image.h
@@ -1,4 +1,7 @@
-/*
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright © 2015 Red Hat, Inc.
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -9,11 +12,11 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
*
- * (C) Copyright 2015 Red Hat, Inc.
+ * Authors:
+ * - Ondrej Holy
*/
#pragma once
@@ -21,12 +24,14 @@
#include
#include
+
G_BEGIN_DECLS
-#define CC_TYPE_USER_IMAGE (cc_user_image_get_type ())
-G_DECLARE_FINAL_TYPE (CcUserImage, cc_user_image, CC, USER_IMAGE, GtkImage)
+#define MCT_TYPE_USER_IMAGE (mct_user_image_get_type ())
+G_DECLARE_FINAL_TYPE (MctUserImage, mct_user_image, MCT, USER_IMAGE, GtkImage)
-GtkWidget *cc_user_image_new (void);
-void cc_user_image_set_user (CcUserImage *image, ActUser *user);
+GtkWidget *mct_user_image_new (void);
+void mct_user_image_set_user (MctUserImage *image,
+ ActUser *user);
G_END_DECLS
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 10ec5ad..f5380f0 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -3,7 +3,10 @@
accounts-service/com.endlessm.ParentalControls.policy.in
libmalcontent/manager.c
malcontent-control/application.c
+malcontent-control/gs-content-rating.c
malcontent-control/main.ui
malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in
malcontent-control/org.freedesktop.MalcontentControl.desktop.in
+malcontent-control/user-controls.c
+malcontent-control/user-controls.ui
pam/pam_malcontent.c