X-Git-Url: http://git.maemo.org/git/?p=stopish;a=blobdiff_plain;f=src%2Fstopish.c;fp=src%2Fstopish.c;h=e44879d6c1251b35a93675b746e1e53b5b858d4f;hp=9b8b4947e512330c922811ef2f695f42abc69de4;hb=a6b04cf30d423b987e232a6bda555b63a8da3ae6;hpb=011f75fb2bec03561385abd2b1c1d88007a5a6b0 diff --git a/src/stopish.c b/src/stopish.c index 9b8b494..e44879d 100644 --- a/src/stopish.c +++ b/src/stopish.c @@ -22,9 +22,25 @@ #include #include #include +#include +#include +#include +#include +#define MCE_SIGNAL_MATCH "type='signal'," \ + "interface='" MCE_SIGNAL_IF "'," \ + "member='" MCE_DEVICE_ORIENTATION_SIG "'" #include "stopish.h" +// Application data struct +typedef struct _AppData AppData; +struct _AppData { + GtkWindow *main_window; + osso_context_t *osso_context; + DBusConnection *system_bus; +}; + +static AppData appdata; static GtkWidget *timerLabel = NULL; static GtkWidget *timerHistoryLabel1 = NULL; static GtkWidget *timerHistoryLabel2 = NULL; @@ -41,27 +57,50 @@ static GtkWindow *stopish_new( void ); static void start_cb( GtkButton* button, gpointer data ); static void reset_cb( GtkButton* button, gpointer data ); static void close_cb( GtkButton* button, gpointer data ); +static gboolean focus_in_cb( GtkWidget *widget, GdkEventFocus *event, + gpointer data ); +static gboolean focus_out_cb( GtkWidget *widget, GdkEventFocus *event, + gpointer data ); +static void accelerometer_enable( void ); +static void accelerometer_disable( void ); +static DBusHandlerResult mce_filter_func( DBusConnection * connection, + DBusMessage * message, + void *data ); int main( int argc, char *argv[] ) { - osso_context_t *ctxt; osso_return_t ret; - GtkWindow *window; - - //printf( "stopish: starting up\n" ); + HildonProgram *program; - ctxt = osso_initialize( "com.nokia.stopish", PACKAGE_VERSION, TRUE, NULL ); - if ( ctxt == NULL ) { + appdata.osso_context = osso_initialize( "com.nokia.stopish", + PACKAGE_VERSION, TRUE, NULL ); + if ( appdata.osso_context == NULL ) { fprintf( stderr, "osso_initialize failed.\n" ); exit( 1 ); } - gtk_init( &argc, &argv ); - - window = stopish_new( ); + // initialize Hildonized GTK libraries + hildon_gtk_init( &argc, &argv ); + program = hildon_program_get_instance( ); + + // create main window + appdata.main_window = stopish_new( ); + hildon_program_add_window( program, HILDON_WINDOW( appdata.main_window ) ); + + // Connect to session bus, add a match rule, install filter callback + appdata.system_bus = osso_get_sys_dbus_connection( appdata.osso_context ); + if ( appdata.system_bus ) { + dbus_bus_add_match( appdata.system_bus, MCE_SIGNAL_MATCH, NULL ); + dbus_connection_add_filter( appdata.system_bus, + mce_filter_func, + NULL, NULL ); + } + else + g_printerr( "ERROR: Cannot connect to system dbus.\n" ); - ret = osso_rpc_set_default_cb_f( ctxt, dbus_callback, window ); + ret = osso_rpc_set_default_cb_f( appdata.osso_context, + dbus_callback, appdata.main_window ); if ( ret != OSSO_OK ) { fprintf( stderr, "osso_rpc_set_default_cb_f failed: %d.\n", ret ); exit( 1 ); @@ -95,74 +134,86 @@ int stopish_get_mode( void ) static GtkWindow *stopish_new( void ) { - GtkWidget *window, *hBox, *label, *button, *button0; - GtkWidget *vBox, *vBox0, *vBox1; + GtkWidget *window, *button, *button0, *label; + GtkWidget *vBoxMain, *vBox0, *hBox0; - window = gtk_window_new( GTK_WINDOW_TOPLEVEL ); + window = hildon_stackable_window_new( ); gtk_container_set_border_width( GTK_CONTAINER( window ), 20 ); gtk_window_set_title( GTK_WINDOW( window ), "Stopish" ); + // attach signals to main window g_signal_connect( G_OBJECT( window ), "destroy", G_CALLBACK( close_cb ), window ); + g_signal_connect( G_OBJECT( window ), "focus-in-event", + G_CALLBACK( focus_in_cb ), NULL ); + g_signal_connect( G_OBJECT( window ), "focus-out-event", + G_CALLBACK( focus_out_cb ), NULL ); - vBox = gtk_vbox_new( FALSE, 20 ); - - label = gtk_label_new( "Stopish - The Stopwatch" ); - gtk_box_pack_start( GTK_BOX( vBox ), label, FALSE, FALSE, 0 ); + vBoxMain = gtk_vbox_new( FALSE, 10 ); - hBox = gtk_hbox_new( FALSE, 10 ); + // separator + label = gtk_label_new( NULL ); + gtk_container_add( GTK_CONTAINER( vBoxMain ), label ); // stop watch area vBox0 = gtk_vbox_new( FALSE, 5 ); - gtk_widget_set_size_request( vBox0, 250, -1 ); // main timer timerLabel = gtk_label_new( NULL ); - gtk_widget_set_size_request( timerLabel, -1, 150 ); gtk_label_set_markup( GTK_LABEL( timerLabel ), - "00:00:00.0" ); - gtk_box_pack_start( GTK_BOX( vBox0 ), timerLabel, FALSE, FALSE, 0 ); + "" + "00:00:00.0" ); + gtk_container_add( GTK_CONTAINER( vBox0 ), timerLabel ); // history area timerHistoryLabel1 = gtk_label_new( NULL ); + gtk_label_set_markup( GTK_LABEL( timerHistoryLabel1 ), + " " ); gtk_box_pack_start( GTK_BOX( vBox0 ), timerHistoryLabel1, FALSE, FALSE, 0 ); timerHistoryLabel2 = gtk_label_new( NULL ); gtk_box_pack_start( GTK_BOX( vBox0 ), timerHistoryLabel2, FALSE, FALSE, 0 ); timerHistoryLabel3 = gtk_label_new( NULL ); + gtk_label_set_markup( GTK_LABEL( timerHistoryLabel3 ), + " " ); gtk_box_pack_start( GTK_BOX( vBox0 ), timerHistoryLabel3, FALSE, FALSE, 0 ); timerHistoryLabel4 = gtk_label_new( NULL ); + gtk_label_set_markup( GTK_LABEL( timerHistoryLabel4 ), + " " ); gtk_box_pack_start( GTK_BOX( vBox0 ), timerHistoryLabel4, FALSE, FALSE, 0 ); - label = gtk_label_new( NULL ); - gtk_container_add( GTK_CONTAINER( vBox0 ), label ); - gtk_container_add( GTK_CONTAINER( hBox ), vBox0 ); + gtk_container_add( GTK_CONTAINER( vBoxMain ), vBox0 ); + + // separator + label = gtk_label_new( NULL ); + gtk_container_add( GTK_CONTAINER( vBoxMain ), label ); // button area - vBox1 = gtk_vbox_new( FALSE, 15 ); - gtk_widget_set_size_request( vBox1, 200, -1 ); + hBox0 = gtk_hbox_new( FALSE, 15 ); + gtk_widget_set_size_request( hBox0, -1, 80 ); // start/pause stopwatch button - button = gtk_button_new_with_label( "Start" ); - button0 = gtk_button_new_with_label( "Reset" ); - gtk_widget_set_size_request( button, -1, 60 ); + button = hildon_button_new_with_text( HILDON_SIZE_HALFSCREEN_WIDTH, + HILDON_BUTTON_ARRANGEMENT_HORIZONTAL, + "Start", NULL ); + button0 = hildon_button_new_with_text( HILDON_SIZE_HALFSCREEN_WIDTH, + HILDON_BUTTON_ARRANGEMENT_HORIZONTAL, + "Reset", NULL ); g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( start_cb ), button0 ); - gtk_box_pack_start( GTK_BOX( vBox1 ), button, FALSE, FALSE, 0 ); + gtk_container_add( GTK_CONTAINER( hBox0 ), button ); // reset button gtk_widget_set_sensitive( button0, FALSE ); - gtk_widget_set_size_request( button0, -1, 60 ); g_signal_connect( G_OBJECT( button0 ), "clicked", G_CALLBACK( reset_cb ), button ); - gtk_box_pack_start( GTK_BOX( vBox1 ), button0, FALSE, FALSE, 0 ); + gtk_container_add( GTK_CONTAINER( hBox0 ), button0 ); - gtk_container_add( GTK_CONTAINER( hBox ), vBox1 ); + gtk_box_pack_start( GTK_BOX( vBoxMain ), hBox0, FALSE, FALSE, 0 ); - gtk_container_add( GTK_CONTAINER( vBox ), hBox ); - - gtk_container_add( GTK_CONTAINER( window ), vBox ); + gtk_container_add( GTK_CONTAINER( window ), vBoxMain ); gtk_widget_show_all( window ); @@ -203,7 +254,7 @@ static void reset_cb( GtkButton* button, gpointer data ) { GSList *tempList; char *tempString; - char formatString[64]; + char formatString[128]; if ( stopishMode == STOPISH_MODE_RESUME ) stopish_timer_resume( ); @@ -212,32 +263,34 @@ static void reset_cb( GtkButton* button, gpointer data ) gtk_button_set_label( GTK_BUTTON( data ), "Start" ); stopishMode = STOPISH_MODE_START; gtk_label_set_markup( GTK_LABEL( timerLabel ), - "00:00:00.0" ); + "" + "00:00:00.0" ); g_source_remove( timerHandle ); // add current time to history historyList = g_slist_prepend( historyList, ( gpointer ) stopish_get_time_string( ) ); - gtk_label_set_text( GTK_LABEL( timerHistoryLabel1 ), - ( char * ) historyList->data ); + sprintf( formatString, "%s", + ( char * ) historyList->data ); + gtk_label_set_markup( GTK_LABEL( timerHistoryLabel1 ), + formatString ); tempList = historyList; tempList = g_slist_next( tempList ); if ( tempList ) { - sprintf( formatString, "%s", - ( char * ) tempList->data ); - gtk_label_set_markup( GTK_LABEL( timerHistoryLabel2 ), - formatString ); + gtk_label_set_text( GTK_LABEL( timerHistoryLabel2 ), + ( char * ) tempList->data ); } tempList = g_slist_next( tempList ); if ( tempList ) { - sprintf( formatString, "%s", + sprintf( formatString, "%s", ( char * ) tempList->data ); gtk_label_set_markup( GTK_LABEL( timerHistoryLabel3 ), formatString ); } tempList = g_slist_next( tempList ); if ( tempList ) { - sprintf( formatString, "%s", + sprintf( formatString, "%s", ( char * ) tempList->data ); gtk_label_set_markup( GTK_LABEL( timerHistoryLabel4 ), formatString ); @@ -261,7 +314,81 @@ static void reset_cb( GtkButton* button, gpointer data ) static void close_cb( GtkButton* button, gpointer data ) { + // disable accelerometer for battery savings + accelerometer_disable( ); + // destroy main window and exit gtk main loop gtk_widget_destroy( GTK_WIDGET( data ) ); gtk_main_quit( ); } + + +static gboolean focus_in_cb( GtkWidget *widget, GdkEventFocus *event, + gpointer data ) +{ + // enable accelerometer hardware for portrait mode support + accelerometer_enable( ); + + return FALSE; +} + + +static gboolean focus_out_cb( GtkWidget *widget, GdkEventFocus *event, + gpointer data ) +{ + // disable accelerometer for battery savings + accelerometer_disable( ); + + return FALSE; +} + + +static void accelerometer_enable( void ) +{ + if ( osso_rpc_run_system( appdata.osso_context, MCE_SERVICE, + MCE_REQUEST_PATH, MCE_REQUEST_IF, + "req_accelerometer_enable", NULL, + DBUS_TYPE_INVALID ) != OSSO_OK ) { + g_printerr("WARN: Cannot enable accelerometers\n"); + } +} + + +static void accelerometer_disable( void ) +{ + if ( osso_rpc_run_system( appdata.osso_context, MCE_SERVICE, + MCE_REQUEST_PATH, MCE_REQUEST_IF, + "req_accelerometer_disable", NULL, + DBUS_TYPE_INVALID ) != OSSO_OK ) { + g_printerr("WARN: Cannot disable accelerometers\n"); + } +} + + +static DBusHandlerResult mce_filter_func( DBusConnection * connection, + DBusMessage * message, + void *data ) +{ + DBusMessageIter iter; + char *rotation = NULL; + + if ( dbus_message_is_signal( message, MCE_SIGNAL_IF, + MCE_DEVICE_ORIENTATION_SIG ) ) { + // here if we received an orientation dbus signal + if ( dbus_message_iter_init( message, &iter ) ) { + dbus_message_iter_get_basic( &iter, &rotation ); + + // Rotate main window + if ( !strcmp( rotation, MCE_ORIENTATION_PORTRAIT ) ) + hildon_gtk_window_set_portrait_flags( GTK_WINDOW( appdata.main_window ), + HILDON_PORTRAIT_MODE_REQUEST ); + else + hildon_gtk_window_set_portrait_flags( GTK_WINDOW( appdata.main_window ), + ~HILDON_PORTRAIT_MODE_REQUEST ); + } + else + g_printerr( "ERROR: dbus_message_iter_init() failed.\n" ); + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +}