--- /dev/null
+/*
+ * This file is a part of MAFW
+ *
+ * Copyright (C) 2007, 2008, 2009 Nokia Corporation, all rights reserved.
+ *
+ * Contact: Visa Smolander <visa.smolander@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib.h>
+#include <libosso.h>
+#include "blanking.h"
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "mafw-gst-renderer-blanking"
+
+/* In seconds */
+#define VIDEO_BLANKING_TIMER_INTERVAL 45
+
+static guint blanking_timeout_id = 0;
+static osso_context_t *osso_ctx = NULL;
+static gboolean can_control_blanking = TRUE;
+static gboolean is_blanking_prohibited = FALSE;
+
+static void remove_blanking_timeout(void)
+{
+ if (blanking_timeout_id) {
+ g_source_remove(blanking_timeout_id);
+ blanking_timeout_id = 0;
+ }
+}
+
+/*
+ * Re-enables screen blanking.
+ */
+void blanking_allow(void)
+{
+ is_blanking_prohibited = FALSE;
+ remove_blanking_timeout();
+}
+
+static gboolean no_blanking_timeout(void)
+{
+ /* Stop trying if it fails. */
+ return osso_display_blanking_pause(osso_ctx) == OSSO_OK;
+}
+
+/*
+ * Adds a timeout to periodically disable screen blanking.
+ */
+void blanking_prohibit(void)
+{
+ is_blanking_prohibited = TRUE;
+ if ((!osso_ctx) || (!can_control_blanking))
+ return;
+ osso_display_state_on(osso_ctx);
+ osso_display_blanking_pause(osso_ctx);
+ if (blanking_timeout_id == 0) {
+ blanking_timeout_id =
+ g_timeout_add_seconds(VIDEO_BLANKING_TIMER_INTERVAL,
+ (gpointer)no_blanking_timeout,
+ NULL);
+ }
+}
+
+void blanking_init(void)
+{
+ /* It's enough to initialize it once for a process. */
+ if (osso_ctx)
+ return;
+ osso_ctx = osso_initialize(PACKAGE, VERSION, 0, NULL);
+ if (!osso_ctx)
+ g_warning("osso_initialize failed, screen may go black");
+ is_blanking_prohibited = FALSE;
+ /* Default policy is to allow user to control blanking */
+ blanking_control(TRUE);
+}
+
+void blanking_deinit(void)
+{
+ if (!osso_ctx)
+ return;
+ blanking_control(FALSE);
+ osso_deinitialize(osso_ctx);
+ osso_ctx = NULL;
+}
+
+void blanking_control(gboolean activate)
+{
+ can_control_blanking = activate;
+ if (!can_control_blanking) {
+ remove_blanking_timeout();
+ } else {
+ /* Restore the last state */
+ if (is_blanking_prohibited) {
+ blanking_prohibit();
+ } else {
+ blanking_allow();
+ }
+ }
+}