--- Begin Message ---
Author: chris
Date: 2007-11-13 19:14:40 +0100 (Tue, 13 Nov 2007)
New Revision: 3407
Added:
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms-dbus.xml
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.c
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.h
Modified:
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/configure.ac
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/Makefile.am
Log:
* configure.ac:
* src/phone-kit/Makefile.am:
* src/phone-kit/moko-dialer-sms-dbus.xml:
* src/phone-kit/moko-dialer-sms.c: (moko_dialer_sms_get_property),
(moko_dialer_sms_set_property), (moko_dialer_sms_dispose),
(moko_dialer_sms_finalize), (moko_dialer_sms_class_init),
(gsmd_eventhandler), (moko_dialer_sms_init), (moko_dialer_sms_new),
(moko_dialer_sms_send), (moko_dialer_sms_sending),
(moko_dialer_sms_sent), (moko_dialer_sms_rejected):
* src/phone-kit/moko-dialer-sms.h:
Add beginnings of SMS part of phone-kit. May or may not work.
Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog
2007-11-13 16:27:39 UTC (rev 3406)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/ChangeLog
2007-11-13 18:14:40 UTC (rev 3407)
@@ -1,3 +1,17 @@
+2007-11-13 Chris Lord <[EMAIL PROTECTED]>
+
+ * configure.ac:
+ * src/phone-kit/Makefile.am:
+ * src/phone-kit/moko-dialer-sms-dbus.xml:
+ * src/phone-kit/moko-dialer-sms.c: (moko_dialer_sms_get_property),
+ (moko_dialer_sms_set_property), (moko_dialer_sms_dispose),
+ (moko_dialer_sms_finalize), (moko_dialer_sms_class_init),
+ (gsmd_eventhandler), (moko_dialer_sms_init), (moko_dialer_sms_new),
+ (moko_dialer_sms_send), (moko_dialer_sms_sending),
+ (moko_dialer_sms_sent), (moko_dialer_sms_rejected):
+ * src/phone-kit/moko-dialer-sms.h:
+ Add beginnings of SMS part of phone-kit. May or may not work.
+
2007-11-12 Thomas Wood <[EMAIL PROTECTED]>
* src/common/moko-contacts.c: (moko_contacts_get_photo),
Modified: trunk/src/target/OM-2007.2/applications/openmoko-dialer2/configure.ac
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-dialer2/configure.ac
2007-11-13 16:27:39 UTC (rev 3406)
+++ trunk/src/target/OM-2007.2/applications/openmoko-dialer2/configure.ac
2007-11-13 18:14:40 UTC (rev 3407)
@@ -20,6 +20,8 @@
libmokoui2
libpulse)
+PKG_CHECK_MODULES(JANA, libjana libjana-ecal)
+
old_cflags=$CFLAGS
CFLAGS=$DIALER_CFLAGS
AC_CHECK_TYPE(EContactPhotoType, [], [], [#include <libebook/e-book.h>])
Modified:
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/Makefile.am
===================================================================
---
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/Makefile.am
2007-11-13 16:27:39 UTC (rev 3406)
+++
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/Makefile.am
2007-11-13 18:14:40 UTC (rev 3407)
@@ -1,5 +1,5 @@
AM_CPPFLAGS = -DDATADIR=\"$(datadir)\" -DPKGDATADIR=\"$(pkgdatadir)\"
-AM_CFLAGS = -Wall @DIALER_CFLAGS@
+AM_CFLAGS = -Wall @DIALER_CFLAGS@ @JANA_CFLAGS@
INCLUDES = -I$(top_srcdir)/src/common
@@ -10,15 +10,16 @@
moko-dialer.c moko-dialer.h \
moko-notify.c moko-notify.h \
moko-sound.c moko-sound.h \
- moko-talking.c moko-talking.h
+ moko-talking.c moko-talking.h \
+ moko-dialer-sms.c moko-dialer-sms.h
-phone_kit_LDADD = @DIALER_LIBS@ $(top_srcdir)/src/common/libdialer-common.a
+phone_kit_LDADD = @DIALER_LIBS@ @JANA_LIBS@
$(top_srcdir)/src/common/libdialer-common.a
-moko-dialer-glue.h: moko-dialer-dbus.xml
- $(LIBTOOL) --mode=execute $(DBUS_GLIB_BIN)/dbus-binding-tool
--prefix=moko_dialer --mode=glib-server --output=$@ $<
+%-glue.h: %-dbus.xml
+ $(LIBTOOL) --mode=execute $(DBUS_GLIB_BIN)/dbus-binding-tool
--prefix=$(subst -,_,$*) --mode=glib-server --output=$@ $<
-BUILT_SOURCES = moko-dialer-glue.h
+BUILT_SOURCES = moko-dialer-glue.h moko-dialer-sms-glue.h
-EXTRA_DIST = moko-dialer-dbus.xml
+EXTRA_DIST = moko-dialer-dbus.xml moko-dialer-sms-dbus.xml
Added:
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms-dbus.xml
===================================================================
---
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms-dbus.xml
2007-11-13 16:27:39 UTC (rev 3406)
+++
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms-dbus.xml
2007-11-13 18:14:40 UTC (rev 3407)
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<node name="/org/openmoko/Dialer">
+<interface name="org.openmoko.Dialer.SMS">
+<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="moko_dialer_sms"/>
+ <method name="Send">
+ <arg type="s" name="number" />
+ <arg type="s" name="message" />
+ <arg type="b" name="ascii" />
+ </method>
+
+ <signal name="Sending">
+ </signal>
+
+ <signal name="Sent">
+ </signal>
+
+ <signal name="Rejected">
+ <arg type="s" name="message" />
+ </signal>
+
+</interface>
+</node>
+
Added:
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.c
===================================================================
---
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.c
2007-11-13 16:27:39 UTC (rev 3406)
+++
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.c
2007-11-13 18:14:40 UTC (rev 3407)
@@ -0,0 +1,242 @@
+
+#include "moko-dialer-sms.h"
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-bindings.h>
+#include <libgsmd/libgsmd.h>
+#include <libgsmd/misc.h>
+#include <libgsmd/sms.h>
+#include <libjana/jana.h>
+#include <libjana-ecal/jana-ecal.h>
+
+#include "moko-dialer-sms-glue.h"
+
+G_DEFINE_TYPE (MokoDialerSMS, moko_dialer_sms, G_TYPE_OBJECT)
+
+#define SMS_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_DIALER_TYPE_SMS,
MokoDialerSMSPrivate))
+
+typedef struct _MokoDialerSMSPrivate MokoDialerSMSPrivate;
+
+struct _MokoDialerSMSPrivate {
+ struct lgsm_handle *handle;
+ JanaStore *note_store;
+};
+
+enum {
+ SENDING,
+ SENT,
+ REJECTED,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
+static void
+moko_dialer_sms_get_property (GObject *object, guint property_id,
+ GValue *value, GParamSpec *pspec)
+{
+ switch (property_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+moko_dialer_sms_set_property (GObject *object, guint property_id,
+ const GValue *value, GParamSpec *pspec)
+{
+ switch (property_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+moko_dialer_sms_dispose (GObject *object)
+{
+ if (G_OBJECT_CLASS (moko_dialer_sms_parent_class)->dispose)
+ G_OBJECT_CLASS (moko_dialer_sms_parent_class)->dispose (object);
+}
+
+static void
+moko_dialer_sms_finalize (GObject *object)
+{
+ G_OBJECT_CLASS (moko_dialer_sms_parent_class)->finalize (object);
+}
+
+static void
+moko_dialer_sms_class_init (MokoDialerSMSClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (MokoDialerSMSPrivate));
+
+ object_class->get_property = moko_dialer_sms_get_property;
+ object_class->set_property = moko_dialer_sms_set_property;
+ object_class->dispose = moko_dialer_sms_dispose;
+ object_class->finalize = moko_dialer_sms_finalize;
+
+ signals[SENDING] = g_signal_new ("sending",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (MokoDialerSMSClass, sending),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ signals[SENT] = g_signal_new ("sent",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (MokoDialerSMSClass, sent),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ signals[REJECTED] = g_signal_new ("rejected",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (MokoDialerSMSClass, rejected),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE, 1, G_TYPE_STRING);
+}
+
+MokoDialerSMS *static_self;
+
+static int
+gsmd_eventhandler (struct lgsm_handle *lh, int evt_type,
+ struct gsmd_evt_auxdata *aux)
+{
+ MokoDialerSMSPrivate *priv = SMS_PRIVATE (static_self);
+
+ switch (evt_type) {
+ case GSMD_EVT_IN_SMS : /* Incoming SMS */
+ if (aux->u.sms.inlined) {
+ gchar *message;
+
+ struct gsmd_sms_list * sms =
+ (struct gsmd_sms_list *)aux->data;
+
+ /* Ignore voicemail notifications */
+ if (sms->payload.is_voicemail) break;
+
+ message = NULL;
+ switch (sms->payload.coding_scheme) {
+ case ALPHABET_DEFAULT :
+ message = g_malloc (GSMD_SMS_DATA_MAXLEN);
+ unpacking_7bit_character (
+ &sms->payload, message);
+ break;
+ case ALPHABET_8BIT :
+ /* TODO: Verify: Is this encoding just UTF-8? */
+ message = g_strdup (sms->payload.data);
+ break;
+ case ALPHABET_UCS2 :
+ message = g_utf16_to_utf8 ((const gunichar2 *)
+ sms->payload.data, sms->payload.length,
+ NULL, NULL, NULL);
+ break;
+ }
+
+ /* Store message in the journal */
+ if (message) {
+ struct lgsm_sms_delete sms_del;
+ gchar *author, *recipient;
+ JanaNote *note = jana_ecal_note_new ();
+
+ author = g_strconcat (((sms->addr.type &
+ __GSMD_TOA_TON_MASK) ==
+ GSMD_TOA_TON_INTERNATIONAL) ? "+" : "",
+ sms->addr.number, NULL);
+ jana_note_set_author (note, author);
+ g_free (author);
+
+ /* TODO: Normalise number necessary? */
+ recipient = g_strdup_printf ("%d",
+ lgsm_get_subscriber_num (priv->handle));
+ jana_note_set_recipient (note, recipient);
+ g_free (recipient);
+
+ jana_note_set_body (note, message);
+
+ /* TODO: Set creation time from SMS timestamp */
+
+ /* Add SMS to store */
+ jana_store_add_component (priv->note_store,
+ JANA_COMPONENT (note));
+
+ /* Delete SMS from internal storage */
+ sms_del.index = sms->index;
+ sms_del.delflg = LGSM_SMS_DELFLG_INDEX;
+ lgsm_sms_delete (priv->handle, &sms_del);
+ }
+ } else {
+ }
+ break;
+ case GSMD_EVT_IN_DS : /* SMS status report */
+ break;
+ default :
+ g_warning ("Unhandled gsmd event (%d)", evt_type);
+ }
+
+ return 0;
+}
+
+static void
+moko_dialer_sms_init (MokoDialerSMS *self)
+{
+ static gboolean first_init = TRUE;
+ MokoDialerSMSPrivate *priv = SMS_PRIVATE (self);
+
+ /* We can only have one of these objects per process, as the gsmd
+ * event handling callback does not allow for custom data...
+ */
+ if (!first_init)
+ g_error ("MokoDialerSMS already created in this process");
+ first_init = FALSE;
+ static_self = self;
+
+ /* Get the note store */
+ priv->note_store = jana_ecal_store_new (JANA_COMPONENT_NOTE);
+
+ /* Initialise gsmd and connect event handler */
+ if (!(priv->handle = lgsm_init (LGSMD_DEVICE_GSMD))) {
+ g_warning ("Failed to connect to gsmd, signals won't work");
+ } else {
+ lgsm_evt_handler_register (priv->handle, GSMD_EVT_IN_SMS,
+ gsmd_eventhandler);
+ lgsm_evt_handler_register (priv->handle, GSMD_EVT_IN_DS,
+ gsmd_eventhandler);
+ }
+}
+
+MokoDialerSMS*
+moko_dialer_sms_new (void)
+{
+ return g_object_new (MOKO_DIALER_TYPE_SMS, NULL);
+}
+
+gboolean
+moko_dialer_sms_send (MokoDialerSMS *sms, const gchar *number,
+ const gchar *message, gboolean ascii, GError **error)
+{
+}
+
+void
+moko_dialer_sms_sending (MokoDialerSMS *sms)
+{
+ g_signal_emit (sms, signals[SENDING], 0);
+}
+
+void
+moko_dialer_sms_sent (MokoDialerSMS *sms)
+{
+ g_signal_emit (sms, signals[SENT], 0);
+}
+
+void
+moko_dialer_sms_rejected (MokoDialerSMS *sms, const gchar *message)
+{
+ g_signal_emit (sms, signals[REJECTED], 0, message);
+}
+
Added:
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.h
===================================================================
---
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.h
2007-11-13 16:27:39 UTC (rev 3406)
+++
trunk/src/target/OM-2007.2/applications/openmoko-dialer2/src/phone-kit/moko-dialer-sms.h
2007-11-13 18:14:40 UTC (rev 3407)
@@ -0,0 +1,57 @@
+#ifndef _MOKO_DIALER_SMS_H
+#define _MOKO_DIALER_SMS_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define MOKO_DIALER_TYPE_SMS moko_dialer_sms_get_type()
+
+#define MOKO_DIALER_SMS(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ MOKO_DIALER_TYPE_SMS, MokoDialerSMS))
+
+#define MOKO_DIALER_SMS_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ MOKO_DIALER_TYPE_SMS, MokoDialerSMSClass))
+
+#define MOKO_DIALER_IS_SMS(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ MOKO_DIALER_TYPE_SMS))
+
+#define MOKO_DIALER_IS_SMS_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ MOKO_DIALER_TYPE_SMS))
+
+#define MOKO_DIALER_SMS_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ MOKO_DIALER_TYPE_SMS, MokoDialerSMSClass))
+
+typedef struct {
+ GObject parent;
+} MokoDialerSMS;
+
+typedef struct {
+ GObjectClass parent_class;
+
+ void (*sending) (MokoDialerSMS *sms);
+ void (*sent) (MokoDialerSMS *sms);
+ void (*rejected) (MokoDialerSMS *sms, const gchar *message);
+} MokoDialerSMSClass;
+
+GType moko_dialer_sms_get_type (void);
+
+MokoDialerSMS * moko_dialer_sms_new (void);
+
+gboolean moko_dialer_sms_send (MokoDialerSMS *sms, const gchar *number,
+ const gchar *message, gboolean ascii,
+ GError **error);
+
+void moko_dialer_sms_sending (MokoDialerSMS *sms);
+void moko_dialer_sms_sent (MokoDialerSMS *sms);
+void moko_dialer_sms_rejected (MokoDialerSMS *sms, const gchar *message);
+
+G_END_DECLS
+
+#endif /* _MOKO_DIALER_SMS_H */
+
--- End Message ---
--- Begin Message ---
Author: mickey
Date: 2007-11-13 20:36:17 +0100 (Tue, 13 Nov 2007)
New Revision: 3408
Added:
trunk/src/target/OM-2007.2/daemons/neod/data/
trunk/src/target/OM-2007.2/daemons/neod/data/Makefile.am
trunk/src/target/OM-2007.2/daemons/neod/data/openmoko-logo.jpg
Modified:
trunk/src/target/OM-2007.2/daemons/neod/Makefile.am
trunk/src/target/OM-2007.2/daemons/neod/configure.ac
trunk/src/target/OM-2007.2/daemons/neod/src/Makefile.am
trunk/src/target/OM-2007.2/daemons/neod/src/buttonactions.c
Log:
neod: major revamp
* make popup menus fullscreen
* first shot at power handling
* add easter egg about dialog
Modified: trunk/src/target/OM-2007.2/daemons/neod/Makefile.am
===================================================================
--- trunk/src/target/OM-2007.2/daemons/neod/Makefile.am 2007-11-13 18:14:40 UTC
(rev 3407)
+++ trunk/src/target/OM-2007.2/daemons/neod/Makefile.am 2007-11-13 19:36:17 UTC
(rev 3408)
@@ -1,4 +1,4 @@
-SUBDIRS = src po
+SUBDIRS = src data po
INTLTOOL_BUILT = \
intltool-extract \
Modified: trunk/src/target/OM-2007.2/daemons/neod/configure.ac
===================================================================
--- trunk/src/target/OM-2007.2/daemons/neod/configure.ac 2007-11-13
18:14:40 UTC (rev 3407)
+++ trunk/src/target/OM-2007.2/daemons/neod/configure.ac 2007-11-13
19:36:17 UTC (rev 3408)
@@ -46,4 +46,5 @@
Makefile
po/Makefile.in
src/Makefile
+data/Makefile
])
Added: trunk/src/target/OM-2007.2/daemons/neod/data/Makefile.am
===================================================================
--- trunk/src/target/OM-2007.2/daemons/neod/data/Makefile.am 2007-11-13
18:14:40 UTC (rev 3407)
+++ trunk/src/target/OM-2007.2/daemons/neod/data/Makefile.am 2007-11-13
19:36:17 UTC (rev 3408)
@@ -0,0 +1,5 @@
+resourcedir = $(pkgdatadir)
+resource_DATA = openmoko-logo.jpg
+
+EXTRA_DIST = $(resource_DATA)
+
Added: trunk/src/target/OM-2007.2/daemons/neod/data/openmoko-logo.jpg
===================================================================
(Binary files differ)
Property changes on:
trunk/src/target/OM-2007.2/daemons/neod/data/openmoko-logo.jpg
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: trunk/src/target/OM-2007.2/daemons/neod/src/Makefile.am
===================================================================
--- trunk/src/target/OM-2007.2/daemons/neod/src/Makefile.am 2007-11-13
18:14:40 UTC (rev 3407)
+++ trunk/src/target/OM-2007.2/daemons/neod/src/Makefile.am 2007-11-13
19:36:17 UTC (rev 3408)
@@ -10,6 +10,7 @@
neod_SOURCES = \
buttonactions.c \
+ moko-adaptive-box.c \
neod-main.c
neod_LDADD = @NEOD_LIBS@ -lapm
Modified: trunk/src/target/OM-2007.2/daemons/neod/src/buttonactions.c
===================================================================
--- trunk/src/target/OM-2007.2/daemons/neod/src/buttonactions.c 2007-11-13
18:14:40 UTC (rev 3407)
+++ trunk/src/target/OM-2007.2/daemons/neod/src/buttonactions.c 2007-11-13
19:36:17 UTC (rev 3408)
@@ -16,15 +16,11 @@
#include <gconf/gconf-client.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkmenu.h>
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtkcheckmenuitem.h>
-#include <gtk/gtkseparatormenuitem.h>
-
+#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <glib.h>
+#include <glib/gstdio.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
@@ -70,8 +66,8 @@
#endif
#ifdef NEOD_PLATFORM_IPAQ
- #define AUX_BUTTON_KEYCODE 89 /* _KEY_RECORD */
- #define POWER_BUTTON_KEYCODE 0x74 /* KEY_POWER */
+ #define AUX_BUTTON_KEYCODE 89 /* record */
+ #define POWER_BUTTON_KEYCODE 0x74 /* power */
#define TOUCHSCREEN_BUTTON_KEYCODE 0x14a
#endif
@@ -100,6 +96,13 @@
GConfClient* gconfc = 0;
+enum PeripheralUnit
+{
+ GSM = 0,
+ BLUETOOTH = 1,
+ GPS = 2,
+};
+
enum PowerManagementMode
{
FULL = 0,
@@ -411,6 +414,8 @@
gboolean neod_buttonactions_aux_timeout( guint timeout )
{
+ if ( aux_timer == -1 )
+ return FALSE;
g_debug( "aux pressed for %d", timeout );
neod_buttonactions_sound_play( "touchscreen" );
@@ -476,37 +481,8 @@
return FALSE;
}
-// this is hardcoded to the Neo1973
-void neod_buttonactions_popup_positioning_cb( GtkMenu* menu, gint* x, gint* y,
gboolean* push_in, gpointer user_data )
+void neod_buttonactions_popup_selected_fullscreen( GtkWidget* button, gpointer
user_data )
{
- GtkRequisition req;
- gtk_widget_size_request( GTK_WIDGET(menu), &req );
- gint screen_width = gdk_screen_width();
- gint screen_height = gdk_screen_height();
- gboolean landscape_mode = gdk_screen_width() >= gdk_screen_height();
-
- if ( GTK_WIDGET(menu) == aux_menu )
- {
- if (landscape_mode)
- *x = screen_width - req.width;
- else
- *x = 0;
- *y = 0;
- }
- else if ( GTK_WIDGET(menu) == power_menu )
- {
- if (landscape_mode)
- *x = 0;
- else
- *x = screen_width - req.width;
- *y = screen_height - req.height;
- }
- else
- g_assert( FALSE ); // fail here if called for unknown menu
-}
-
-void neod_buttonactions_popup_selected_fullscreen( GtkMenuItem* menu, gpointer
user_data )
-{
static int is_fullscreen = 0;
gtk_widget_hide( aux_menu );
@@ -539,7 +515,7 @@
is_fullscreen = 1 - is_fullscreen;
}
-void neod_buttonactions_popup_selected_orientation( GtkMenuItem* menu,
gpointer user_data )
+void neod_buttonactions_popup_selected_orientation( GtkWidget* button,
gpointer user_data )
{
gtk_widget_hide( aux_menu );
if ( orientation )
@@ -549,29 +525,14 @@
orientation = !orientation;
}
-void neod_buttonactions_popup_selected_screenshot( GtkMenuItem* menu, gpointer
user_data )
+void neod_buttonactions_popup_selected_screenshot( GtkWidget* button, gpointer
user_data )
{
gtk_widget_hide( aux_menu );
g_spawn_command_line_async( "gpe-scap", NULL );
}
-void neod_buttonactions_popup_selected_fullPM( GtkMenuItem* menu, gpointer
user_data )
+void neod_buttonactions_popup_selected_lock( GtkWidget* button, gpointer
user_data )
{
- gconf_client_set_int( gconfc, "/desktop/openmoko/neod/power_management",
FULL, NULL );
-}
-
-void neod_buttonactions_popup_selected_dimOnly( GtkMenuItem* menu, gpointer
user_data )
-{
- gconf_client_set_int( gconfc, "/desktop/openmoko/neod/power_management",
DIM_ONLY, NULL );
-}
-
-void neod_buttonactions_popup_selected_noPM( GtkMenuItem* menu, gpointer
user_data )
-{
- gconf_client_set_int( gconfc, "/desktop/openmoko/neod/power_management",
NONE, NULL );
-}
-
-void neod_buttonactions_popup_selected_lock( GtkMenuItem* menu, gpointer
user_data )
-{
int fd = open( "/sys/power/state", O_WRONLY );
if ( fd != -1 )
{
@@ -581,24 +542,119 @@
}
}
-void neod_buttonactions_popup_selected_restartUI( GtkMenuItem* menu, gpointer
user_data )
+void neod_buttonactions_popup_selected_restartUI( GtkWidget* button, gpointer
user_data )
{
+ gtk_widget_hide( power_menu );
//FIXME notify user
system( "/etc/init.d/xserver-nodm restart");
}
-void neod_buttonactions_popup_selected_reboot( GtkMenuItem* menu, gpointer
user_data )
+void neod_buttonactions_popup_selected_reboot( GtkWidget* button, gpointer
user_data )
{
+ gtk_widget_hide( power_menu );
//moko_ui_banner_show_text( 4, "Rebooting System..." );
system( "/sbin/reboot");
}
-void neod_buttonactions_popup_selected_poweroff( GtkMenuItem* menu, gpointer
user_data )
+void neod_buttonactions_popup_selected_poweroff( GtkWidget* button, gpointer
user_data )
{
+ gtk_widget_hide( power_menu );
//moko_ui_banner_show_text( 4, "Shutting down System..." );
system( "/sbin/poweroff");
}
+void neod_buttonactions_popup_selected_pmprofile( GtkComboBox* combo, gpointer
user_data )
+{
+ gtk_widget_hide( power_menu );
+ int new_pmprofile = gtk_combo_box_get_active( combo );
+ g_assert( FULL <= new_pmprofile && new_pmprofile <= NONE );
+ g_debug( "switch pm profile to %d", new_pmprofile );
+ gconf_client_set_int( gconfc, "/desktop/openmoko/neod/power_management",
new_pmprofile, NULL );
+}
+
+static gboolean read_boolean_from_path( const gchar* path )
+{
+ int value;
+ FILE* f = fopen( path, "r" );
+ if ( f == NULL )
+ {
+ g_debug( "can't open file '%s': (%s), aborting.", path, strerror(
errno ) );
+ return FALSE;
+ }
+ fscanf( f, "%d", &value );
+ fclose( f );
+ g_debug( "read value from '%s' = '%d'", path, value );
+ return value;
+}
+
+static void write_boolean_to_path( const gchar* path, gboolean b )
+{
+ FILE* f = fopen( path, "w" );
+ if ( f == NULL )
+ {
+ g_debug( "can't open file '%s': (%s), aborting.", path, strerror(
errno ) );
+ return;
+ }
+ fprintf( f, b ? "1\n" : "0\n" );
+ fclose( f );
+}
+
+static gboolean is_turned_on( int unit )
+{
+ switch( unit )
+ {
+ case GSM:
+#ifdef NEOD_PLATFORM_FIC_NEO1973
+ return read_boolean_from_path(
"/sys/devices/platform/gta01-pm-gsm.0/power_on" );
+#endif
+ return FALSE;
+ case BLUETOOTH:
+#ifdef NEOD_PLATFORM_FIC_NEO1973
+ return read_boolean_from_path(
"/sys/devices/platform/s3c2410-i2c/i2c-adapter/i2c-0/0-0008/gta01-pm-bt.0/power_on"
);
+#endif
+ return FALSE;
+ case GPS:
+#ifdef NEOD_PLATFORM_FIC_NEO1973
+ return read_boolean_from_path(
"/sys/devices/platform/s3c2410-i2c/i2c-adapter/i2c-0/0-0008/gta01-pm-gps.0/power_on"
);
+#endif
+ return FALSE;
+ default:
+ g_assert( FALSE ); // should never reach this
+ }
+}
+
+static void peripheral_set_power( int unit, gboolean on )
+{
+ switch( unit )
+ {
+ case GSM:
+#ifdef NEOD_PLATFORM_FIC_NEO1973
+ write_boolean_to_path(
"/sys/devices/platform/gta01-pm-gsm.0/power_on", on );
+#endif
+ break;
+ case BLUETOOTH:
+#ifdef NEOD_PLATFORM_FIC_NEO1973
+ write_boolean_to_path(
"/sys/devices/platform/s3c2410-i2c/i2c-adapter/i2c-0/0-0008/gta01-pm-bt.0/power_on",
on );
+#endif
+ break;
+ case GPS:
+#ifdef NEOD_PLATFORM_FIC_NEO1973
+ write_boolean_to_path(
"/sys/devices/platform/s3c2410-i2c/i2c-adapter/i2c-0/0-0008/gta01-pm-gps.0/power_on",
on );
+#endif
+ break;
+ default:
+ g_assert( FALSE ); // should never reach this
+ }
+}
+
+void neod_buttonactions_popup_selected_switch_power( GtkWidget* button,
gpointer user_data )
+{
+ gtk_widget_hide( power_menu );
+ gboolean new_power_state = !is_turned_on( (int)user_data );
+ g_debug( "switch power of unit %d to %d", (int)user_data,
(int)new_power_state );
+ //FIXME implement this and notify user
+}
+
void neod_buttonactions_gconf_cb( GConfClient *client, guint cnxn_id,
GConfEntry *entry, gpointer data )
{
g_debug( "gconf callback" );
@@ -616,88 +672,173 @@
// show popup menu requesting for actions
if ( !aux_menu )
{
- aux_menu = gtk_menu_new();
+ aux_menu = gtk_dialog_new_with_buttons( "AUX Menu",
+ NULL,
+ GTK_DIALOG_MODAL,
+ "Dismiss this menu",
GTK_RESPONSE_OK,
+ NULL );
+ gtk_widget_set_name( GTK_WIDGET(aux_menu), "neod-dialog" );
+ gtk_button_box_set_layout(
GTK_BUTTON_BOX(GTK_DIALOG(aux_menu)->action_area), GTK_BUTTONBOX_SPREAD );
+ GtkWidget* box = gtk_vbox_new( 0, 0 );
+ gtk_widget_set_name( box, "neod-menu" );
+// GtkWidget* title = gtk_label_new( "AUX Button Menu" );
+// gtk_box_pack_start_defaults( GTK_BOX(box), title );
- GtkWidget* fullscreen = gtk_menu_item_new_with_label( "Toggle
Fullscreen" );
- g_signal_connect( G_OBJECT(fullscreen), "activate",
G_CALLBACK(neod_buttonactions_popup_selected_fullscreen), NULL );
- gtk_menu_shell_append( GTK_MENU_SHELL(aux_menu), fullscreen );
+ GtkWidget* fullscreen = gtk_button_new_with_label( "Toggle Fullscreen"
);
+ g_signal_connect( G_OBJECT(fullscreen), "clicked",
G_CALLBACK(neod_buttonactions_popup_selected_fullscreen), NULL );
+ gtk_box_pack_start_defaults( GTK_BOX(box), fullscreen );
- GtkWidget* orientation = gtk_menu_item_new_with_label( "Swap
Orientation" );
- g_signal_connect( G_OBJECT(orientation), "activate",
G_CALLBACK(neod_buttonactions_popup_selected_orientation), NULL );
- gtk_menu_shell_append( GTK_MENU_SHELL(aux_menu), orientation );
+ GtkWidget* orientation = gtk_button_new_with_label( "Swap Orientation"
);
+ g_signal_connect( G_OBJECT(orientation), "clicked",
G_CALLBACK(neod_buttonactions_popup_selected_orientation), NULL );
+ gtk_box_pack_start_defaults( GTK_BOX(box), orientation );
- GtkWidget* scap = gtk_menu_item_new_with_label( "Screenshot" );
- g_signal_connect( G_OBJECT(scap), "activate",
G_CALLBACK(neod_buttonactions_popup_selected_screenshot), NULL );
- gtk_menu_shell_append( GTK_MENU_SHELL(aux_menu), scap );
+ GtkWidget* scap = gtk_button_new_with_label( "Screenshot" );
+ g_signal_connect( G_OBJECT(scap), "clicked",
G_CALLBACK(neod_buttonactions_popup_selected_screenshot), NULL );
+ gtk_box_pack_start_defaults( GTK_BOX(box), scap );
- gtk_widget_show_all( GTK_WIDGET(aux_menu) );
+ gtk_widget_show_all( GTK_WIDGET(box) );
+
+ // override, otherwise matchbox won't show it fullscreen
+ gtk_window_set_type_hint( GTK_WINDOW(aux_menu),
GDK_WINDOW_TYPE_HINT_NORMAL );
+ //gtk_window_fullscreen( GTK_WINDOW(aux_menu) );
+ g_signal_connect_swapped( aux_menu, "response",
G_CALLBACK(gtk_widget_hide), aux_menu);
+ gtk_box_pack_start_defaults( GTK_BOX(GTK_DIALOG(aux_menu)->vbox), box
);
}
- gtk_menu_popup( GTK_MENU(aux_menu), NULL, NULL,
neod_buttonactions_popup_positioning_cb, 0, 0, GDK_CURRENT_TIME );
+ int response = gtk_dialog_run( GTK_DIALOG(aux_menu) );
+ g_debug( "gtk_dialog_run completed, response = %d", response );
}
void neod_buttonactions_show_power_menu()
{
+ static GtkWidget* gsmpower = 0;
+ static GtkWidget* btpower = 0;
+ static GtkWidget* gpspower = 0;
+ static GtkWidget* pmprofile = 0;
+
// show popup menu requesting for actions
if ( !power_menu )
{
- power_menu = gtk_menu_new();
+ power_menu = gtk_dialog_new_with_buttons( "POWER Menu",
+ NULL,
+ GTK_DIALOG_MODAL,
+ "Dismiss this menu", GTK_RESPONSE_OK,
+ NULL );
+ gtk_widget_set_name( GTK_WIDGET(power_menu), "neod-dialog" );
+ gtk_button_box_set_layout(
GTK_BUTTON_BOX(GTK_DIALOG(power_menu)->action_area), GTK_BUTTONBOX_SPREAD );
+ GtkWidget* box = gtk_vbox_new( 0, 0 );
+ gtk_widget_set_name( box, "neod-menu" );
+// GtkWidget* title = gtk_label_new( "POWER Button Menu" );
+// gtk_box_pack_start_defaults( GTK_BOX(box), title );
- GtkWidget* bluetooth = gtk_check_menu_item_new_with_label( "Bluetooth
Power" );
- gtk_widget_set_state( bluetooth, GTK_STATE_INSENSITIVE );
- gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), bluetooth );
+ gsmpower = gtk_button_new();
+ g_signal_connect( G_OBJECT(gsmpower), "clicked",
G_CALLBACK(neod_buttonactions_popup_selected_switch_power), (void*)GSM );
+ gtk_box_pack_start_defaults( GTK_BOX(box), gsmpower );
- GtkWidget* gps = gtk_check_menu_item_new_with_label( "GPS Power" );
- gtk_widget_set_state( gps, GTK_STATE_INSENSITIVE );
- gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), gps );
+ btpower = gtk_button_new();
+ g_signal_connect( G_OBJECT(btpower), "clicked",
G_CALLBACK(neod_buttonactions_popup_selected_switch_power), (void*)BLUETOOTH );
+ gtk_box_pack_start_defaults( GTK_BOX(box), btpower );
- GtkWidget* gsm = gtk_check_menu_item_new_with_label( "GSM Power" );
- gtk_widget_set_state( gsm, GTK_STATE_INSENSITIVE );
- gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), gsm );
+ gpspower = gtk_button_new();
+ g_signal_connect( G_OBJECT(gpspower), "clicked",
G_CALLBACK(neod_buttonactions_popup_selected_switch_power), (void*)GPS );
+ gtk_box_pack_start_defaults( GTK_BOX(box), gpspower );
- gtk_menu_shell_append( GTK_MENU_SHELL(power_menu),
gtk_separator_menu_item_new() );
+ gtk_box_pack_start_defaults( GTK_BOX(box), gtk_hseparator_new() );
- // add profiles
- // TODO build profile list dynamically from database
- GtkWidget* profile = 0;
- profile = gtk_check_menu_item_new_with_label( "Profile: Full PM" );
- gtk_check_menu_item_set_draw_as_radio( GTK_CHECK_MENU_ITEM(profile),
TRUE );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(profile), pm_value
== FULL );
- g_signal_connect( G_OBJECT(profile), "activate",
G_CALLBACK(neod_buttonactions_popup_selected_fullPM), NULL );
- gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), profile );
- profile = gtk_check_menu_item_new_with_label( "Profile: Dim Only" );
- gtk_check_menu_item_set_draw_as_radio( GTK_CHECK_MENU_ITEM(profile),
TRUE );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(profile), pm_value
== DIM_ONLY );
- g_signal_connect( G_OBJECT(profile), "activate",
G_CALLBACK(neod_buttonactions_popup_selected_dimOnly), NULL );
- gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), profile );
- profile = gtk_check_menu_item_new_with_label( "Profile: No PM" );
- gtk_check_menu_item_set_draw_as_radio( GTK_CHECK_MENU_ITEM(profile),
TRUE );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(profile), pm_value
== NONE );
- g_signal_connect( G_OBJECT(profile), "activate",
G_CALLBACK(neod_buttonactions_popup_selected_noPM), NULL );
- gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), profile );
+ pmprofile = gtk_combo_box_new_text();
+ gtk_combo_box_append_text( GTK_COMBO_BOX(pmprofile), "Power
Management:\nDim first, then lock" );
+ gtk_combo_box_append_text( GTK_COMBO_BOX(pmprofile), "Power
Management:\nDim only, don't lock" );
+ gtk_combo_box_append_text( GTK_COMBO_BOX(pmprofile), "Power
Management:\nDisabled" );
+ gtk_combo_box_set_active( GTK_COMBO_BOX(pmprofile), pm_value );
+ g_signal_connect( G_OBJECT(pmprofile), "changed",
G_CALLBACK(neod_buttonactions_popup_selected_pmprofile), NULL );
+ gtk_box_pack_start_defaults( GTK_BOX(box), pmprofile );
- gtk_menu_shell_append( GTK_MENU_SHELL(power_menu),
gtk_separator_menu_item_new() );
+ gtk_box_pack_start_defaults( GTK_BOX(box), gtk_hseparator_new() );
- GtkWidget* lock = gtk_menu_item_new_with_label( "Lock Phone" );
- g_signal_connect( G_OBJECT(lock), "activate",
G_CALLBACK(neod_buttonactions_popup_selected_lock), NULL );
- gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), lock );
- //GtkWidget* flightmode = gtk_menu_item_new_with_label( "Flight
Mode" );
- //gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), flightmode );
- //GtkWidget* profilelist = gtk_menu_item_new_with_label( "<Profile
List>" );
- //gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), profilelist );
- //GtkWidget* restartUI = gtk_menu_item_new_with_label( "Restart
UI" );
- //g_signal_connect( G_OBJECT(restartUI), "activate",
G_CALLBACK(neod_buttonactions_popup_selected_restartUI), NULL );
- //gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), restartUI );
- GtkWidget* reboot = gtk_menu_item_new_with_label( "Reboot Phone" );
- g_signal_connect( G_OBJECT(reboot), "activate",
G_CALLBACK(neod_buttonactions_popup_selected_reboot), NULL );
- gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), reboot );
- GtkWidget* poweroff = gtk_menu_item_new_with_label( "Power Off" );
- g_signal_connect( G_OBJECT(poweroff), "activate",
G_CALLBACK(neod_buttonactions_popup_selected_poweroff), NULL );
- gtk_menu_shell_append( GTK_MENU_SHELL(power_menu), poweroff );
- gtk_widget_show_all( GTK_WIDGET(power_menu) );
+ GtkWidget* lock = gtk_button_new_with_label( "Lock Now" );
+ g_signal_connect( G_OBJECT(lock), "clicked",
G_CALLBACK(neod_buttonactions_popup_selected_lock), NULL );
+ gtk_box_pack_start_defaults( GTK_BOX(box), lock );
+
+ GtkWidget* poweroff = gtk_button_new_with_label( "Shutdown Now" );
+ g_signal_connect( G_OBJECT(poweroff), "clicked",
G_CALLBACK(neod_buttonactions_popup_selected_poweroff), NULL );
+ gtk_box_pack_start_defaults( GTK_BOX(box), poweroff );
+
+ gtk_widget_show_all( GTK_WIDGET(box) );
+
+ // override, otherwise matchbox won't show it fullscreen
+ gtk_window_set_type_hint( GTK_WINDOW(power_menu),
GDK_WINDOW_TYPE_HINT_NORMAL );
+ //gtk_window_fullscreen( GTK_WINDOW(power_menu) );
+ g_signal_connect_swapped( power_menu, "response",
G_CALLBACK(gtk_widget_hide), power_menu);
+ gtk_box_pack_start_defaults( GTK_BOX(GTK_DIALOG(power_menu)->vbox),
box );
}
- gtk_menu_popup( GTK_MENU(power_menu), NULL, NULL,
neod_buttonactions_popup_positioning_cb, 0, 0, GDK_CURRENT_TIME );
+ gtk_button_set_label( gsmpower, g_strdup_printf( "Turn %s GSM",
is_turned_on( GSM ) ? "off" : "on" ) );
+ gtk_button_set_label( btpower, g_strdup_printf( "Turn %s Bluetooth",
is_turned_on( BLUETOOTH ) ? "off" : "on" ) );
+ gtk_button_set_label( gpspower, g_strdup_printf( "Turn %s GPS",
is_turned_on( GPS ) ? "off" : "on" ) );
+ int response = gtk_dialog_run( GTK_DIALOG(power_menu) );
+ g_debug( "gtk_dialog_run completed, response = %d", response );
}
+const gchar* authors[] = {
+ "OpenMoko has been brought to you by:",
+ " "
+ "Sean Moss-Pultz",
+ "Harald 'LaF0rge' Welte",
+ "Michael 'Mickey' Lauer",
+ "Werner Almesberger",
+ "Alice Tang",
+ "Allen Chang",
+ "Dave Wu",
+ "Wanda",
+ "Jelan Hsu",
+ "Miles Hsieh",
+ "Nod Huang",
+ "Paul Tian",
+ "Sean Chiang",
+ "Shawn Lin",
+ "Timmy Huang",
+ "Willie Chen",
+ "Olv",
+ "JServ",
+ "Jollen",
+ "Rasterman",
+ "Matt Hsu",
+ "John Lee",
+ "Tick",
+ "Roh",
+ "Erin Yueh",
+ "Jeremy",
+ "Holger 'Zecke' Freyther",
+ "Daniel 'Alphaone' Willmann",
+ "Stefan Schmidt",
+ "Jan 'Shoragan' Luebbe",
+ "Soeren 'Abraxa' Apel",
+ "Rod Whitby",
+ "Chris @ O-Hand",
+ "Ross @ O-Hand",
+ "Thomas @ O-Hand",
+ "Rob @ O-Hand",
+ "Dodji @ O-Hand",
+ "NJP @ O-Hand",
+ " ",
+ "@" __DATE__ ":" __TIME__,
+ "gcc " __VERSION__,
+};
+
+gboolean neod_buttonactions_power_while_aux()
+{
+ g_debug( "aux and power pressed together" );
+ if ( aux_menu )
+ gtk_widget_hide( aux_menu );
+ gtk_show_about_dialog( NULL,
+ "authors", authors,
+ "comments", "open. mobile. free.",
+ "copyright", "2006-2007 OpenMoko, Inc.",
+ "program-name", "OpenMoko 2007.2",
+ "website", "http://www.openmoko.org",
+ "logo", gdk_pixbuf_new_from_file( PKGDATADIR "/openmoko-logo.jpg",
NULL ),
+ NULL );
+ return FALSE;
+}
+
gboolean neod_buttonactions_power_timeout( guint timeout )
{
g_debug( "power pressed for %d", timeout );
@@ -707,6 +848,11 @@
neod_buttonactions_set_display( 100 );
power_timer = -1;
+
+ // special case for power button being pressed while aux is held
+ if ( aux_timer != -1 || ( aux_menu && GTK_WIDGET_MAPPED( aux_menu ) ) )
+ return neod_buttonactions_power_while_aux();
+
if ( timeout < 1 )
{
Window xwindow = get_window_property(
gdk_x11_get_default_root_xwindow(),
gdk_x11_get_xatom_by_name("_NET_ACTIVE_WINDOW") );
@@ -821,7 +967,7 @@
gboolean neod_buttonactions_powersave_timeout1( guint timeout )
{
g_debug( "mainmenu powersave timeout 1" );
- //FIXME talk to neod
+ //FIXME talk to peripheral device abstraction daemon
power_state = DISPLAY_DIM;
neod_buttonactions_set_display( 25 );
return FALSE;
@@ -830,7 +976,7 @@
gboolean neod_buttonactions_powersave_timeout2( guint timeout )
{
g_debug( "mainmenu powersave timeout 2" );
- //FIXME talk to neod
+ //FIXME talk to peripheral device abstraction daemon
neod_buttonactions_set_display( 0 );
power_state = DISPLAY_OFF;
return FALSE;
@@ -841,7 +987,7 @@
if ( pm_value != FULL )
return FALSE;
g_debug( "mainmenu powersave timeout 3" );
- //FIXME talk to neod
+ //FIXME talk to peripheral device abstraction daemon
power_state = SUSPEND;
system( "/usr/bin/apm -s");
neod_buttonactions_powersave_reset();
--- End Message ---