summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/reference/endless/endless-sections.txt2
-rw-r--r--endless/eospagemanager.c90
-rw-r--r--endless/eospagemanager.h9
-rw-r--r--endless/eoswindow.c92
-rw-r--r--test/smoke-tests/app-window.js2
-rw-r--r--test/smoke-tests/images/cat_eye.jpgbin0 -> 873906 bytes
-rw-r--r--test/smoke-tests/images/dog_eye.jpgbin0 -> 122508 bytes
-rw-r--r--test/test-page-manager.c94
8 files changed, 277 insertions, 12 deletions
diff --git a/docs/reference/endless/endless-sections.txt b/docs/reference/endless/endless-sections.txt
index 329eaf9..b3227a2 100644
--- a/docs/reference/endless/endless-sections.txt
+++ b/docs/reference/endless/endless-sections.txt
@@ -55,6 +55,8 @@ eos_page_manager_get_page_actions
eos_page_manager_set_page_actions
eos_page_manager_get_page_custom_toolbox_widget
eos_page_manager_set_page_custom_toolbox_widget
+eos_page_manager_get_page_background_uri
+eos_page_manager_set_page_background_uri
eos_page_manager_remove_page_by_name
<SUBSECTION Standard>
EOS_IS_PAGE_MANAGER
diff --git a/endless/eospagemanager.c b/endless/eospagemanager.c
index 28eaa13..3919b5b 100644
--- a/endless/eospagemanager.c
+++ b/endless/eospagemanager.c
@@ -58,14 +58,14 @@
* |[
* gtk_container_add_with_properties (GTK_CONTAINER (page_manager), page,
* "name", "front-page",
- * "background", "image.jpg",
+ * "background_uri", "image.jpg",
* NULL);
* ]|
* In Javascript, this has been simplified to use JSON:
* |[
* page_manager.add(page, {
* name: 'front-page',
- * background: 'image.jpg'
+ * background_uri: 'image.jpg'
* });
* ]|
* To remove a page, use gtk_container_remove() or
@@ -97,6 +97,7 @@ struct _EosPageManagerPageInfo
gchar *name;
gboolean fake_page_actions_visible;
GtkWidget *custom_toolbox_widget;
+ gchar *background_uri;
};
struct _EosPageManagerPrivate
@@ -122,6 +123,7 @@ enum
CHILD_PROP_NAME,
CHILD_PROP_PAGE_ACTIONS,
CHILD_PROP_CUSTOM_TOOLBOX_WIDGET,
+ CHILD_PROP_BACKGROUND_URI,
NCHILDPROPS
};
@@ -132,6 +134,7 @@ static void
page_info_free (EosPageManagerPageInfo *info)
{
g_free (info->name);
+ g_free (info->background_uri);
g_slice_free (EosPageManagerPageInfo, info);
}
@@ -399,7 +402,7 @@ eos_page_manager_add (GtkContainer *container,
/* If there were no pages yet, then this one must become the visible one */
if (self->priv->visible_page_info == NULL)
- self->priv->visible_page_info = info;
+ eos_page_manager_set_visible_page (self, new_page);
assert_internal_state (self);
}
@@ -466,6 +469,12 @@ eos_page_manager_get_child_property (GtkContainer *container,
g_value_set_string (value, eos_page_manager_get_page_name (self, child));
break;
+ case CHILD_PROP_BACKGROUND_URI:
+ g_value_set_string (value,
+ eos_page_manager_get_page_background_uri (self,
+ child));
+ break;
+
case CHILD_PROP_PAGE_ACTIONS:
g_value_set_boolean (value,
eos_page_manager_get_page_actions (self, child));
@@ -498,6 +507,11 @@ eos_page_manager_set_child_property (GtkContainer *container,
eos_page_manager_set_page_name (self, child, g_value_get_string (value));
break;
+ case CHILD_PROP_BACKGROUND_URI:
+ eos_page_manager_set_page_background_uri (self, child,
+ g_value_get_string (value));
+ break;
+
case CHILD_PROP_PAGE_ACTIONS:
eos_page_manager_set_page_actions (self, child,
g_value_get_boolean (value));
@@ -619,6 +633,18 @@ eos_page_manager_class_init (EosPageManagerClass *klass)
GTK_TYPE_WIDGET,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ /**
+ * EosPageManager:background-uri:
+ *
+ * The URI for the image file for the background of this page. Setting this to
+ * %NULL indicates that the window's default background should be used.
+ */
+ eos_page_manager_child_props[CHILD_PROP_BACKGROUND_URI] =
+ g_param_spec_string ("background-uri", "Background URI",
+ "URI for background of the page",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
/* Install child properties all at once, because there is no
gtk_container_class_install_child_properties() function */
int count;
@@ -678,7 +704,7 @@ eos_page_manager_get_visible_page (EosPageManager *self)
{
g_return_val_if_fail (EOS_IS_PAGE_MANAGER (self), NULL);
- if(self->priv->visible_page_info == NULL)
+ if (self->priv->visible_page_info == NULL)
return NULL;
return self->priv->visible_page_info->page;
@@ -724,7 +750,7 @@ eos_page_manager_get_visible_page_name (EosPageManager *self)
{
g_return_val_if_fail (EOS_IS_PAGE_MANAGER (self), NULL);
- if(self->priv->visible_page_info == NULL)
+ if (self->priv->visible_page_info == NULL)
return NULL;
return self->priv->visible_page_info->name;
@@ -969,6 +995,60 @@ eos_page_manager_set_page_custom_toolbox_widget (EosPageManager *self,
}
/**
+ * eos_page_manager_get_page_background_uri:
+ * @self: the page manager
+ * @page: the page to be queried
+ *
+ * Gets the URI for the background image of @page, which must previously have
+ * been added to the page manager.
+ * See #EosPageManager:background-uri for more information.
+ *
+ * Returns: the background of @page, or the %NULL if @page does not have a
+ * background.
+ */
+const gchar *
+eos_page_manager_get_page_background_uri (EosPageManager *self,
+ GtkWidget *page)
+{
+ g_return_val_if_fail (self != NULL && EOS_IS_PAGE_MANAGER (self), NULL);
+ g_return_val_if_fail (page != NULL && GTK_IS_WIDGET (page), NULL);
+
+ EosPageManagerPageInfo *info = find_page_info_by_widget (self, page);
+ g_return_val_if_fail (info != NULL, NULL);
+
+ return info->background_uri;
+}
+
+/**
+ * eos_page_manager_set_page_background_uri:
+ * @self: the page manager
+ * @page: the page to be modified
+ * @background: (allow-none): the URI for the background image of this page.
+ *
+ * Changes the background of @page, which must previously have been added to the
+ * page manager.
+ * Setting %NULL removes the background, using the window's default background.
+ * See #EosPageManager:background-uri for more information.
+ */
+void
+eos_page_manager_set_page_background_uri (EosPageManager *self,
+ GtkWidget *page,
+ const gchar *background)
+{
+ g_return_if_fail (self != NULL && EOS_IS_PAGE_MANAGER (self));
+ g_return_if_fail (page != NULL && GTK_IS_WIDGET (page));
+
+ EosPageManagerPageInfo *info = find_page_info_by_widget (self, page);
+ g_return_if_fail (info != NULL);
+
+ if (g_strcmp0 (info->background_uri, background) == 0)
+ return;
+
+ info->background_uri = g_strdup (background);
+ gtk_container_child_notify (GTK_CONTAINER (self), page, "background-uri");
+}
+
+/**
* eos_page_manager_remove_page_by_name:
* @self: the page manager
* @name: the name of the page to remove
diff --git a/endless/eospagemanager.h b/endless/eospagemanager.h
index 90b52e7..a05800a 100644
--- a/endless/eospagemanager.h
+++ b/endless/eospagemanager.h
@@ -107,6 +107,15 @@ void eos_page_manager_set_page_custom_toolbox_widget (EosPageManager *se
GtkWidget *custom_toolbox_widget);
EOS_SDK_ALL_API_VERSIONS
+const gchar *eos_page_manager_get_page_background_uri (EosPageManager *self,
+ GtkWidget *page);
+
+EOS_SDK_ALL_API_VERSIONS
+void eos_page_manager_set_page_background_uri (EosPageManager *self,
+ GtkWidget *page,
+ const gchar *background);
+
+EOS_SDK_ALL_API_VERSIONS
void eos_page_manager_remove_page_by_name (EosPageManager *self,
const gchar *name);
diff --git a/endless/eoswindow.c b/endless/eoswindow.c
index a42d883..7804663 100644
--- a/endless/eoswindow.c
+++ b/endless/eoswindow.c
@@ -1,9 +1,11 @@
/* Copyright 2013 Endless Mobile, Inc. */
#include "config.h"
+#include "string.h"
#include "eoswindow.h"
#include "eosapplication.h"
+#include "eospagemanager.h"
#include "eostopbar-private.h"
#include "eosmainarea-private.h"
@@ -32,6 +34,18 @@
* ]|
*/
+// Put in a transition for fun, should be part of API though someday...
+#define BACKGROUND_IMAGE_CSS_TEMPLATE \
+ "EosWindow { background-image: url(\"%s\");" \
+ "transition-property: background-image;" \
+ "transition-duration: 0.5s;" \
+ "background-size:100%% 100%%; }"
+#define EMPTY_BACKGROUND_CSS \
+ "EosWindow { background-image: none;" \
+ "transition-property: background-image;" \
+ "transition-duration: 0.5s;" \
+ "background-size:100% 100%; }"
+
G_DEFINE_TYPE (EosWindow, eos_window, GTK_TYPE_APPLICATION_WINDOW)
#define WINDOW_PRIVATE(o) \
@@ -48,8 +62,10 @@ struct _EosWindowPrivate
/* For keeping track of what to display alongside the current page */
GtkWidget *current_page;
- gulong child_page_actions_handler;
- gulong child_custom_toolbox_handler;
+ gulong child_page_actions_handler;
+ gulong child_custom_toolbox_handler;
+ gulong child_background_handler;
+ GtkCssProvider *background_provider;
};
enum
@@ -113,6 +129,67 @@ update_page_toolbox (EosWindow *self)
}
}
+static void
+remove_page_background (EosWindow *self)
+{
+ GtkStyleProvider *provider =
+ GTK_STYLE_PROVIDER (self->priv->background_provider);
+ GdkScreen *screen = gdk_screen_get_default ();
+ GError *error = NULL;
+
+ gtk_style_context_remove_provider_for_screen (screen, provider);
+ gtk_css_provider_load_from_data (self->priv->background_provider,
+ EMPTY_BACKGROUND_CSS, -1,
+ &error);
+ gtk_style_context_add_provider_for_screen (screen, provider,
+ GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+ if (error != NULL)
+ g_warning ("Error loading background CSS: %s", error->message);
+}
+
+/*
+ * update_page_background:
+ * @self: the window
+ *
+ * Ensures that the window's background image is in line with the currently
+ * showing page and its child properties.
+ */
+static void
+update_page_background (EosWindow *self)
+{
+ EosPageManager *pm = EOS_PAGE_MANAGER (self->priv->page_manager);
+ GtkWidget *page = self->priv->current_page;
+
+ if (page == NULL)
+ {
+ remove_page_background (self);
+ return;
+ }
+
+ const gchar *background = eos_page_manager_get_page_background_uri (pm, page);
+ if (background == NULL)
+ {
+ remove_page_background (self);
+ return;
+ }
+
+ gchar *background_css = g_strdup_printf (BACKGROUND_IMAGE_CSS_TEMPLATE,
+ background);
+
+ GtkStyleProvider *provider =
+ GTK_STYLE_PROVIDER (self->priv->background_provider);
+ GdkScreen *screen = gdk_screen_get_default ();
+ GError *error = NULL;
+
+ gtk_style_context_remove_provider_for_screen (screen, provider);
+ gtk_css_provider_load_from_data (self->priv->background_provider,
+ background_css, -1, &error);
+ gtk_style_context_add_provider_for_screen (screen, provider,
+ GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+ if (error != NULL)
+ g_warning ("Error loading background CSS: %s", error->message);
+}
+
/*
* update_page:
* @self: the window
@@ -131,12 +208,15 @@ update_page (EosWindow *self)
self->priv->child_page_actions_handler);
g_signal_handler_disconnect (self->priv->current_page,
self->priv->child_custom_toolbox_handler);
+ g_signal_handler_disconnect (self->priv->current_page,
+ self->priv->child_background_handler);
}
self->priv->current_page = eos_page_manager_get_visible_page (pm);
update_page_actions (self);
update_page_toolbox (self);
+ update_page_background (self);
if (self->priv->current_page)
{
@@ -150,6 +230,11 @@ update_page (EosWindow *self)
"child-notify::custom-toolbox-widget",
G_CALLBACK (update_page_toolbox),
self);
+ self->priv->child_background_handler =
+ g_signal_connect_swapped (self->priv->current_page,
+ "child-notify::background-uri",
+ G_CALLBACK (update_page_background),
+ self);
}
}
@@ -392,6 +477,7 @@ eos_window_init (EosWindow *self)
{
self->priv = WINDOW_PRIVATE (self);
+ self->priv->background_provider = gtk_css_provider_new ();
self->priv->top_bar = eos_top_bar_new ();
gtk_widget_set_parent (self->priv->top_bar, GTK_WIDGET (self));
@@ -470,4 +556,4 @@ eos_window_set_page_manager (EosWindow *self,
g_signal_connect_swapped (self->priv->page_manager, "notify::visible-page",
G_CALLBACK (update_page), self);
-} \ No newline at end of file
+}
diff --git a/test/smoke-tests/app-window.js b/test/smoke-tests/app-window.js
index 4c1f9c6..8b5dd15 100644
--- a/test/smoke-tests/app-window.js
+++ b/test/smoke-tests/app-window.js
@@ -100,10 +100,12 @@ const TestApplication = new Lang.Class ({
this._pm = new Endless.PageManager();
this._pm.add(this._page0, {
name: "page0",
+ background_uri: "./test/smoke-tests/images/cat_eye.jpg",
custom_toolbox_widget: this._toolbox
});
this._pm.add(this._page1, {
name: "page1",
+ background_uri: "./test/smoke-tests/images/dog_eye.jpg",
custom_toolbox_widget: this._toolbox,
page_actions: true
});
diff --git a/test/smoke-tests/images/cat_eye.jpg b/test/smoke-tests/images/cat_eye.jpg
new file mode 100644
index 0000000..b041a3a
--- /dev/null
+++ b/test/smoke-tests/images/cat_eye.jpg
Binary files differ
diff --git a/test/smoke-tests/images/dog_eye.jpg b/test/smoke-tests/images/dog_eye.jpg
new file mode 100644
index 0000000..9d851c5
--- /dev/null
+++ b/test/smoke-tests/images/dog_eye.jpg
Binary files differ
diff --git a/test/test-page-manager.c b/test/test-page-manager.c
index 9fc6db1..46ac768 100644
--- a/test/test-page-manager.c
+++ b/test/test-page-manager.c
@@ -6,12 +6,17 @@
#define PAGE1_NAME "page1"
#define PAGE2_NAME "page2"
#define PAGE3_NAME "page3"
+#define PAGE1_BACKGROUND "back1"
+#define PAGE2_BACKGROUND "back2"
+#define PAGE3_BACKGROUND "back3"
#define EXPECTED_PAGE_NAME PAGE2_NAME
#define EXPECTED_CHANGED_PAGE_NAME "changed-name"
#define DUPLICATE_PAGE_NAME "duplicate-name"
#define EXPECTED_DUPLICATE_PAGE_NAME_ERRMSG "*Not setting page name to \"" \
DUPLICATE_PAGE_NAME "\", because page manager already contains a page by " \
"that name*"
+#define EXPECTED_PAGE_BACKGROUND PAGE2_BACKGROUND
+#define EXPECTED_CHANGED_NAME "changed-name"
#define ADD_PAGE_MANAGER_TEST(path, test_func) \
g_test_add ((path), PageManagerFixture, NULL, \
pm_fixture_setup, (test_func), pm_fixture_teardown)
@@ -40,16 +45,19 @@ pm_fixture_setup (PageManagerFixture *fixture,
gtk_container_add_with_properties (GTK_CONTAINER (fixture->pm),
fixture->page1,
"name", PAGE1_NAME,
+ "background-uri", PAGE1_BACKGROUND,
NULL);
gtk_container_add_with_properties (GTK_CONTAINER (fixture->pm),
fixture->page2,
"name", PAGE2_NAME,
"custom-toolbox-widget", fixture->toolbox2,
+ "background-uri", PAGE2_BACKGROUND,
NULL);
gtk_container_add_with_properties (GTK_CONTAINER (fixture->pm),
fixture->page3,
"name", PAGE3_NAME,
"page-actions", TRUE,
+ "background-uri", PAGE3_BACKGROUND,
NULL);
}
@@ -135,10 +143,10 @@ test_pm_get_set_page_name (PageManagerFixture *fixture,
g_assert_cmpstr (name, ==, PAGE3_NAME);
eos_page_manager_set_page_name (EOS_PAGE_MANAGER (fixture->pm),
fixture->page2,
- EXPECTED_CHANGED_PAGE_NAME);
+ EXPECTED_CHANGED_NAME);
name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm),
fixture->page2);
- g_assert_cmpstr (name, ==, EXPECTED_CHANGED_PAGE_NAME);
+ g_assert_cmpstr (name, ==, EXPECTED_CHANGED_NAME);
}
static void
@@ -162,12 +170,12 @@ test_pm_child_prop_name (PageManagerFixture *fixture,
g_assert_cmpstr (name, ==, PAGE3_NAME);
g_free (name);
gtk_container_child_set (GTK_CONTAINER (fixture->pm), fixture->page2,
- "name", EXPECTED_CHANGED_PAGE_NAME,
+ "name", EXPECTED_CHANGED_NAME,
NULL);
gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page2,
"name", &name,
NULL);
- g_assert_cmpstr (name, ==, EXPECTED_CHANGED_PAGE_NAME);
+ g_assert_cmpstr (name, ==, EXPECTED_CHANGED_NAME);
g_free (name);
}
@@ -275,6 +283,36 @@ test_pm_child_prop_custom_toolbox (PageManagerFixture *fixture,
}
static void
+test_pm_child_prop_background (PageManagerFixture *fixture,
+ gconstpointer unused)
+{
+ gchar *background;
+ gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page1,
+ "background-uri", &background,
+ NULL);
+ g_assert_cmpstr (background, ==, PAGE1_BACKGROUND);
+ g_free (background);
+ gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page2,
+ "background-uri", &background,
+ NULL);
+ g_assert_cmpstr (background, ==, PAGE2_BACKGROUND);
+ g_free (background);
+ gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page3,
+ "background-uri", &background,
+ NULL);
+ g_assert_cmpstr (background, ==, PAGE3_BACKGROUND);
+ g_free (background);
+ gtk_container_child_set (GTK_CONTAINER (fixture->pm), fixture->page2,
+ "background-uri", EXPECTED_CHANGED_NAME,
+ NULL);
+ gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page2,
+ "background-uri", &background,
+ NULL);
+ g_assert_cmpstr (background, ==, EXPECTED_CHANGED_NAME);
+ g_free (background);
+}
+
+static void
test_pm_page_no_name (PageManagerFixture *fixture,
gconstpointer unused)
{
@@ -306,6 +344,48 @@ test_pm_set_page_no_name (PageManagerFixture *fixture,
}
static void
+test_pm_page_no_background (PageManagerFixture *fixture,
+ gconstpointer unused)
+{
+ const gchar *background_get;
+ gchar *background_prop;
+ GtkWidget *new_page = gtk_label_new("new");
+ gtk_container_add (GTK_CONTAINER (fixture->pm), new_page);
+ background_get = eos_page_manager_get_page_background_uri (EOS_PAGE_MANAGER (fixture->pm),
+ new_page);
+ g_assert_cmpstr (background_get, ==, NULL);
+ gtk_container_child_get (GTK_CONTAINER (fixture->pm), new_page,
+ "background-uri", &background_prop,
+ NULL);
+ g_assert_cmpstr (background_prop, ==, NULL);
+ g_free (background_prop);
+}
+
+static void
+test_pm_page_change_background (PageManagerFixture *fixture,
+ gconstpointer unused)
+{
+ const gchar *background_get;
+ const gchar *background_name_1 = "first background name";
+ const gchar *background_name_2 = "second background name";
+ GtkWidget *new_page = gtk_label_new("new");
+ gtk_container_add (GTK_CONTAINER (fixture->pm), new_page);
+ eos_page_manager_set_page_background_uri (EOS_PAGE_MANAGER (fixture->pm),
+ new_page,
+ background_name_1);
+ background_get = eos_page_manager_get_page_background_uri (EOS_PAGE_MANAGER (fixture->pm),
+ new_page);
+ g_assert_cmpstr (background_get, ==, background_name_1);
+
+ eos_page_manager_set_page_background_uri (EOS_PAGE_MANAGER (fixture->pm),
+ new_page,
+ background_name_2);
+ background_get = eos_page_manager_get_page_background_uri (EOS_PAGE_MANAGER (fixture->pm),
+ new_page);
+ g_assert_cmpstr (background_get, ==, background_name_2);
+}
+
+static void
test_pm_remove_page_behavior (PageManagerFixture *fixture,
gconstpointer unused)
{
@@ -438,9 +518,15 @@ add_page_manager_tests (void)
test_pm_get_set_page_custom_toolbox);
ADD_PAGE_MANAGER_TEST ("/page-manager/child-prop-custom-toolbox",
test_pm_child_prop_custom_toolbox);
+ ADD_PAGE_MANAGER_TEST ("/page-manager/child-prop-background",
+ test_pm_child_prop_background);
ADD_PAGE_MANAGER_TEST ("/page-manager/page-no-name", test_pm_page_no_name);
ADD_PAGE_MANAGER_TEST ("/page-manager/set-page-no-name",
test_pm_set_page_no_name);
+ ADD_PAGE_MANAGER_TEST ("/page-manager/page-no-background",
+ test_pm_page_no_background);
+ ADD_PAGE_MANAGER_TEST ("/page-manager/page-set-background",
+ test_pm_page_change_background);
ADD_PAGE_MANAGER_TEST ("/page-manager/remove-page-by-name",
test_pm_remove_page_by_name);
ADD_PAGE_MANAGER_TEST ("/page-manager/duplicate-page-name",