Bug 679733 - Widget Qt should send system notifications (display, taskswitcher, flight modes); f=azakai,jeremias.bosch r=dougt
authorOleg Romashin <romaxa@gmail.com>
Sun, 21 Aug 2011 08:32:38 -0400
changeset 75630 b51e7241dd13b91294e5f31a46d734dfa611f78b
parent 75619 482742e6fff759fb007cb4414208862a72308b77
child 75631 45f8416ebe6560de8c2f1cb3448e54b0504dad09
push id3
push userfelipc@gmail.com
push dateFri, 30 Sep 2011 20:09:13 +0000
reviewersdougt
bugs679733
milestone9.0a1
Bug 679733 - Widget Qt should send system notifications (display, taskswitcher, flight modes); f=azakai,jeremias.bosch r=dougt
toolkit/xre/Makefile.in
toolkit/xre/nsNativeAppSupportQt.cpp
toolkit/xre/nsNativeAppSupportQt.h
widget/src/qt/mozqwidget.h
--- a/toolkit/xre/Makefile.in
+++ b/toolkit/xre/Makefile.in
@@ -97,16 +97,19 @@ CMMSRCS = nsNativeAppSupportCocoa.mm
 else
 ifeq ($(MOZ_WIDGET_TOOLKIT),os2)
 CPPSRCS += nsNativeAppSupportOS2.cpp
 else
 ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2)
 CPPSRCS += nsNativeAppSupportUnix.cpp
 else
 ifeq ($(MOZ_WIDGET_TOOLKIT),qt)
+MOCSRCS += moc_nsNativeAppSupportQt.cpp
+  $(NULL)
+CPPSRCS += $(MOCSRCS)
 CPPSRCS += nsNativeAppSupportQt.cpp
 CPPSRCS += nsQAppInstance.cpp
 EXPORTS += nsQAppInstance.h
 else
 CPPSRCS += nsNativeAppSupportDefault.cpp
 endif
 endif
 endif
--- a/toolkit/xre/nsNativeAppSupportQt.cpp
+++ b/toolkit/xre/nsNativeAppSupportQt.cpp
@@ -32,43 +32,102 @@
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 #include <stdlib.h>
-#include "nsNativeAppSupportBase.h"
-#include "nsString.h"
+#include <QTimer>
+#include "mozilla/ipc/GeckoChildProcessHost.h"
+#include "nsNativeAppSupportQt.h"
+#include "nsCOMPtr.h"
+#include "nsIObserverService.h"
+#include "mozilla/Services.h"
 
-#ifdef MOZ_ENABLE_LIBCONIC
-#include <glib-object.h>
-#endif
+#ifdef MOZ_ENABLE_QMSYSTEM2
+void
+nsNativeAppSupportQt::activityChanged(MeeGo::QmActivity::Activity activity)
+{
+    nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
+    if (!os)
+        return;
 
-#if (MOZ_PLATFORM_MAEMO == 5)
-#include <libosso.h>
-#endif
+    if (MeeGo::QmActivity::Inactive == activity) {
+        os->NotifyObservers(nsnull, "system-idle", nsnull);
+    } else {
+        os->NotifyObservers(nsnull, "system-active", nsnull);
+    }
+}
+
+void
+nsNativeAppSupportQt::displayStateChanged(MeeGo::QmDisplayState::DisplayState state)
+{
+    nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
+    if (!os)
+        return;
 
-class nsNativeAppSupportQt : public nsNativeAppSupportBase
+    switch (state) {
+    case MeeGo::QmDisplayState::On:
+        os->NotifyObservers(nsnull, "system-display-on", nsnull);
+        break;
+    case MeeGo::QmDisplayState::Off:
+        os->NotifyObservers(nsnull, "system-display-dimmed", nsnull);
+        break;
+    case MeeGo::QmDisplayState::Dimmed:
+        os->NotifyObservers(nsnull, "system-display-off", nsnull);
+        break;
+    default:
+        NS_WARNING("Unknown display state");
+        break;
+    }
+}
+
+void nsNativeAppSupportQt::deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode mode)
 {
-public:
-  NS_IMETHOD Start(PRBool* aRetVal);
-  NS_IMETHOD Stop(PRBool* aResult);
-#if (MOZ_PLATFORM_MAEMO == 5)
-  // Osso context must be initialized for maemo5 otherwise we will be killed in ~20 seconds
-  osso_context_t *m_osso_context;
+    nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
+    if (!os)
+        return;
+
+    switch (mode) {
+    case MeeGo::QmDeviceMode::DeviceMode::Normal:
+        os->NotifyObservers(nsnull, "profile-change-net-restore", nsnull);
+        break;
+    case MeeGo::QmDeviceMode::DeviceMode::Flight:
+        os->NotifyObservers(nsnull, "profile-change-net-teardown", nsnull);
+        break;
+    case MeeGo::QmDeviceMode::DeviceMode::Error:
+    default:
+        NS_WARNING("Unknown DeviceMode");
+        break;
+    }
+}
+
+void nsNativeAppSupportQt::RefreshStates()
+{
+  activityChanged(mActivity.get());
+  displayStateChanged(mDisplayState.get());
+  deviceModeChanged(mDeviceMode.getMode());
+}
 #endif
-};
 
 NS_IMETHODIMP
 nsNativeAppSupportQt::Start(PRBool* aRetVal)
 {
   NS_ASSERTION(gAppData, "gAppData must not be null.");
 
+#ifdef MOZ_ENABLE_QMSYSTEM2
+  connect(&mActivity, SIGNAL(activityChanged(MeeGo::QmActivity::Activity)), this, SLOT(activityChanged(MeeGo::QmActivity::Activity)));
+  connect(&mDeviceMode, SIGNAL(deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode)), this, SLOT(deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode)));
+  connect(&mDisplayState, SIGNAL(displayStateChanged(MeeGo::QmDisplayState::DisplayState)), this, SLOT(displayStateChanged(MeeGo::QmDisplayState::DisplayState)));
+  // Init states withing next event loop iteration
+  QTimer::singleShot(0, this, SLOT(RefreshStates()));
+#endif
+
   *aRetVal = PR_TRUE;
 #ifdef MOZ_ENABLE_LIBCONIC
   g_type_init();
 #endif
 
 #if (MOZ_PLATFORM_MAEMO == 5)
   /* Initialize maemo application
 
new file mode 100644
--- /dev/null
+++ b/toolkit/xre/nsNativeAppSupportQt.h
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 et sw=2 tw=80: */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Corporation code.
+ *
+ * The Initial Developer of the Original Code is Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2011
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Oleg Romashin <romaxa@gmail.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include <stdlib.h>
+#include <QObject>
+#ifdef MOZ_ENABLE_QMSYSTEM2
+#include "qmdevicemode.h"
+#include "qmdisplaystate.h"
+#include "qmactivity.h"
+#endif
+#include "nsNativeAppSupportBase.h"
+#include "nsString.h"
+
+#ifdef MOZ_ENABLE_LIBCONIC
+#include <glib-object.h>
+#endif
+
+#if (MOZ_PLATFORM_MAEMO == 5)
+#include <libosso.h>
+#endif
+
+class nsNativeAppSupportQt : public QObject, public nsNativeAppSupportBase
+{
+  Q_OBJECT
+public:
+  NS_IMETHOD Start(PRBool* aRetVal);
+  NS_IMETHOD Stop(PRBool* aResult);
+#if (MOZ_PLATFORM_MAEMO == 5)
+  // Osso context must be initialized for maemo5 otherwise we will be killed in ~20 seconds
+  osso_context_t *m_osso_context;
+#endif
+#ifdef MOZ_ENABLE_QMSYSTEM2
+public Q_SLOTS:
+  void activityChanged(MeeGo::QmActivity::Activity activity);
+  void deviceModeChanged(MeeGo::QmDeviceMode::DeviceMode mode);
+  void displayStateChanged(MeeGo::QmDisplayState::DisplayState state);
+  void RefreshStates();
+
+private:
+  MeeGo::QmDeviceMode mDeviceMode;
+  MeeGo::QmDisplayState mDisplayState;
+  MeeGo::QmActivity mActivity;
+#endif
+};
+
--- a/widget/src/qt/mozqwidget.h
+++ b/widget/src/qt/mozqwidget.h
@@ -316,25 +316,41 @@ private:
 
 /**
   This is a helper class to synchronize the MWindow window with
   its contained QGraphicsWidget for things like resizing and closing
   by the user.
 */
 class MozMGraphicsView : public MWindow
 {
-
+    Q_OBJECT
 public:
     MozMGraphicsView(MozQWidget* aTopLevel, QWidget* aParent = nsnull)
      : MWindow(aParent)
      , mEventHandler(this)
      , mTopLevelWidget(aTopLevel)
     {
         MozMSceneWindow* page = new MozMSceneWindow(aTopLevel);
         page->appear(this);
+        QObject::connect(this, SIGNAL(switcherEntered()), this, SLOT(onSwitcherEntered()));
+        QObject::connect(this, SIGNAL(switcherExited()), this, SLOT(onSwitcherExited()));
+    }
+
+public Q_SLOTS:
+    void onSwitcherEntered() {
+        nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
+        if (!os)
+            return;
+        os->NotifyObservers(nsnull, "application-background", nsnull);
+    }
+    void onSwitcherExited() {
+        nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
+        if (!os)
+            return;
+        os->NotifyObservers(nsnull, "application-foreground", nsnull);
     }
 
 protected:
     virtual bool event(QEvent* aEvent) {
         mEventHandler.handleEvent(aEvent, mTopLevelWidget);
         return MWindow::event(aEvent);
     }