#include <stdlib.h>
#include <sys/time.h>
#include <gtk/gtk.h>
-#include <libosso.h>
#include <hildon/hildon.h>
#include <dbus/dbus.h>
#include <mce/mode-names.h>
typedef struct _AppData AppData;
struct _AppData {
GtkWindow *main_window;
+ GtkWindow *countdown_window;
osso_context_t *osso_context;
DBusConnection *system_bus;
};
-typedef struct timerData {
- GtkWidget *vBox;
- GtkWidget *label;
- GtkWidget *labelHour;
- GtkWidget *labelMinute;
- GtkWidget *labelSecond;
-};
static AppData appdata;
-static struct timerData timerdata;
-static GtkWidget *timerHistoryLabel1 = NULL;
-static GtkWidget *timerHistoryLabel2 = NULL;
-static GtkWidget *timerHistoryLabel3 = NULL;
-static GtkWidget *timerHistoryLabel4 = NULL;
-static GSList *historyList = NULL;
static int stopishMode = STOPISH_MODE_START;
static int stopishOrientation = STOPISH_LANDSCAPE;
-static int timerHandle = -1;
+static int stopishType = STOPISH_TYPE_STOPWATCH;
//Prototypes
gint dbus_callback( const gchar *interface, const gchar *method,
GArray *arguments, gpointer data, osso_rpc_t *retval );
-static GtkWindow *stopish_new( void );
static void main_menu( GtkWindow *window );
-static void label_timer_landscape( void );
-static void label_timer_portrait( void );
-static gint timeout_cb( gpointer data );
-static void start_cb( GtkButton* button, gpointer data );
-static void reset_cb( GtkButton* button, gpointer data );
+static void change_type_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 preference_timer_hour( GtkRadioButton* radio, GtkLabel *label );
-static void preference_timer_minute( GtkRadioButton* radio, GtkLabel *label );
static void accelerometer_enable( void );
static void accelerometer_disable( void );
static DBusHandlerResult mce_filter_func( DBusConnection * connection,
program = hildon_program_get_instance( );
// create main window
- appdata.main_window = stopish_new( );
+ appdata.main_window = stopish_stopwatch_new( );
+
+ // attach signals to main window
+ g_signal_connect( G_OBJECT( appdata.main_window ), "destroy",
+ G_CALLBACK( close_cb ), appdata.main_window );
+ g_signal_connect( G_OBJECT( appdata.main_window ), "focus-in-event",
+ G_CALLBACK( stopish_focus_in_cb ), NULL );
+ g_signal_connect( G_OBJECT( appdata.main_window ), "focus-out-event",
+ G_CALLBACK( stopish_focus_out_cb ), NULL );
+
+ // setup main menu
+ main_menu( appdata.main_window );
+
hildon_program_add_window( program, HILDON_WINDOW( appdata.main_window ) );
// Connect to session bus, add a match rule, install filter callback
}
-int stopish_get_mode( void )
+void stopish_about_cb( GtkButton* button, gpointer data )
{
- return stopishMode;
+ GdkPixbuf *logo;
+ GError *error;
+ GtkWidget *dialog;
+ char *authors[2];
+
+ authors[0] = strdup( "Michael Cronenworth" );
+ authors[1] = NULL;
+
+ dialog = gtk_about_dialog_new( );
+
+ gtk_about_dialog_set_program_name( GTK_ABOUT_DIALOG( dialog ),
+ "Stopish" );
+ gtk_about_dialog_set_version( GTK_ABOUT_DIALOG( dialog ),
+ STOPISH_VERSION_STR );
+ gtk_about_dialog_set_authors( GTK_ABOUT_DIALOG( dialog ),
+ ( const char ** ) authors );
+ logo = gdk_pixbuf_new_from_file( "/usr/share/icons/hicolor/40x40/hildon/stopish.png",
+ &error );
+ gtk_about_dialog_set_logo( GTK_ABOUT_DIALOG( dialog ),
+ logo );
+
+ gtk_dialog_run( GTK_DIALOG( dialog ) );
+
+ gtk_widget_destroy( dialog );
+ free( authors[0] );
}
-static GtkWindow *stopish_new( void )
+int stopish_get_mode( void )
{
- GtkWidget *window, *button, *button0, *label;
- GtkWidget *vBoxMain, *vBox0, *hBox0;
-
- 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 );
-
- // setup main menu
- main_menu( window );
-
- vBoxMain = gtk_vbox_new( FALSE, 10 );
-
- // separator
- label = gtk_label_new( NULL );
- gtk_container_add( GTK_CONTAINER( vBoxMain ), label );
-
- vBox0 = gtk_vbox_new( FALSE, 5 );
-
- // stop watch area
- timerdata.vBox = gtk_vbox_new( FALSE, 0 );
- gtk_container_add( GTK_CONTAINER( vBox0 ), timerdata.vBox );
- label_timer_landscape( );
-
- // history area
- timerHistoryLabel1 = gtk_label_new( NULL );
- gtk_label_set_markup( GTK_LABEL( timerHistoryLabel1 ),
- "<span size=\"large\"> </span>" );
- 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 ),
- "<span size=\"small\"> </span>" );
- gtk_box_pack_start( GTK_BOX( vBox0 ), timerHistoryLabel3, FALSE, FALSE, 0 );
- timerHistoryLabel4 = gtk_label_new( NULL );
- gtk_label_set_markup( GTK_LABEL( timerHistoryLabel4 ),
- "<span size=\"x-small\"> </span>" );
- gtk_box_pack_start( GTK_BOX( vBox0 ), timerHistoryLabel4, FALSE, FALSE, 0 );
-
- gtk_container_add( GTK_CONTAINER( vBoxMain ), vBox0 );
-
- // separator
- label = gtk_label_new( NULL );
- gtk_container_add( GTK_CONTAINER( vBoxMain ), label );
-
- // button area
- hBox0 = gtk_hbox_new( FALSE, 15 );
- gtk_widget_set_size_request( hBox0, -1, 80 );
-
- // start/pause stopwatch button
- 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_container_add( GTK_CONTAINER( hBox0 ), button );
-
- // reset button
- gtk_widget_set_sensitive( button0, FALSE );
- g_signal_connect( G_OBJECT( button0 ), "clicked",
- G_CALLBACK( reset_cb ), button );
- gtk_container_add( GTK_CONTAINER( hBox0 ), button0 );
-
- gtk_box_pack_start( GTK_BOX( vBoxMain ), hBox0, FALSE, FALSE, 0 );
-
- gtk_container_add( GTK_CONTAINER( window ), vBoxMain );
-
- gtk_widget_show_all( window );
-
- return GTK_WINDOW( window );
+ return stopishMode;
}
-static void main_menu( GtkWindow *window )
+void stopish_set_mode( int newMode )
{
- GtkWidget *menu, *radio;
-
- menu = hildon_app_menu_new( );
-
- // Hour preference
- radio = gtk_radio_button_new_with_label( NULL, "Hour" );
- gtk_toggle_button_set_mode( GTK_TOGGLE_BUTTON( radio ), FALSE );
- g_signal_connect_after( radio, "clicked",
- G_CALLBACK( preference_timer_hour ), NULL );
- hildon_app_menu_add_filter( menu, GTK_BUTTON( radio ) );
-
- // Minute preference
- radio = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON( radio ), "Minute" );
- gtk_toggle_button_set_mode( GTK_TOGGLE_BUTTON ( radio ), FALSE );
- g_signal_connect_after( radio, "clicked",
- G_CALLBACK( preference_timer_minute ), NULL );
- hildon_app_menu_add_filter( menu, GTK_BUTTON( radio ) );
-
- // default to minute
- gtk_toggle_button_set_active( radio, TRUE );
-
- gtk_widget_show_all( menu );
-
- hildon_window_set_app_menu( HILDON_WINDOW( window ), menu );
+ stopishMode = newMode;
}
-static void label_timer_landscape( void )
+int stopish_get_type( void )
{
- gtk_widget_set_size_request( timerdata.vBox, 800, -1 );
-
- gtk_widget_destroy( timerdata.label );
- timerdata.label = gtk_label_new( NULL );
- if ( stopish_timer_get_precision( ) == TIMER_PRECISION_MINUTE )
- gtk_label_set_markup( GTK_LABEL( timerdata.label ),
- "<span font_family=\"monospace\" "
- "size=\"70000\" weight=\"ultrabold\">"
- "00:00.0</span>" );
- else
- gtk_label_set_markup( GTK_LABEL( timerdata.label ),
- "<span font_family=\"monospace\" "
- "size=\"70000\" weight=\"ultrabold\">"
- "00:00:00.0</span>" );
- gtk_misc_set_alignment( GTK_MISC( timerdata.label ), 0.5f, 0.5f );
- gtk_container_add( GTK_CONTAINER( timerdata.vBox ), timerdata.label );
- gtk_widget_show( timerdata.label );
+ return stopishType;
}
-static void label_timer_portrait( void )
+void stopish_set_type( int newType )
{
- GtkWidget *vBox, *hBox, *label;
-
- gtk_widget_set_size_request( timerdata.vBox, 480, -1 );
-
- gtk_widget_destroy( timerdata.label );
- vBox = gtk_vbox_new( FALSE, 10 );
-
- if ( stopish_timer_get_precision( ) == TIMER_PRECISION_HOUR ) {
- hBox = gtk_hbox_new( FALSE, 10 );
- label = gtk_label_new( "Hours" );
- gtk_widget_set_size_request( label, 100, -1 );
- gtk_misc_set_alignment( GTK_MISC( label ), 1.0f, 0.5f );
- gtk_container_add( GTK_CONTAINER( hBox ), label );
- timerdata.labelHour = gtk_label_new( NULL );
- gtk_widget_set_size_request( timerdata.labelHour, 350, -1 );
- gtk_misc_set_alignment( GTK_MISC( timerdata.labelHour ), 0.0f, 0.5f );
- gtk_label_set_markup( GTK_LABEL( timerdata.labelHour ),
- "<span font_family=\"monospace\" "
- "size=\"80000\" weight=\"ultrabold\">"
- "00</span>" );
- gtk_container_add( GTK_CONTAINER( hBox ), timerdata.labelHour );
- gtk_container_add( GTK_CONTAINER( vBox ), hBox );
- }
-
- hBox = gtk_hbox_new( FALSE, 10 );
- label = gtk_label_new( "Minutes" );
- gtk_widget_set_size_request( label, 100, -1 );
- gtk_misc_set_alignment( GTK_MISC( label ), 1.0f, 0.5f );
- gtk_container_add( GTK_CONTAINER( hBox ), label );
- timerdata.labelMinute = gtk_label_new( NULL );
- gtk_widget_set_size_request( timerdata.labelMinute, 350, -1 );
- gtk_misc_set_alignment( GTK_MISC( timerdata.labelMinute ), 0.0f, 0.5f );
- gtk_label_set_markup( GTK_LABEL( timerdata.labelMinute ),
- "<span font_family=\"monospace\" "
- "size=\"80000\" weight=\"ultrabold\">"
- "00</span>" );
- gtk_container_add( GTK_CONTAINER( hBox ), timerdata.labelMinute );
- gtk_container_add( GTK_CONTAINER( vBox ), hBox );
-
- hBox = gtk_hbox_new( FALSE, 10 );
- label = gtk_label_new( "Seconds" );
- gtk_widget_set_size_request( label, 100, -1 );
- gtk_misc_set_alignment( GTK_MISC( label ), 1.0f, 0.5f );
- gtk_container_add( GTK_CONTAINER( hBox ), label );
- timerdata.labelSecond = gtk_label_new( NULL );
- gtk_widget_set_size_request( timerdata.labelSecond, 350, -1 );
- gtk_misc_set_alignment( GTK_MISC( timerdata.labelSecond ), 0.0f, 0.5f );
- gtk_label_set_markup( GTK_LABEL( timerdata.labelSecond ),
- "<span font_family=\"monospace\" "
- "size=\"80000\" weight=\"ultrabold\">"
- "00.0</span>" );
- gtk_container_add( GTK_CONTAINER( hBox ), timerdata.labelSecond );
- gtk_container_add( GTK_CONTAINER( vBox ), hBox );
-
- timerdata.label = vBox;
- gtk_container_add( GTK_CONTAINER( timerdata.vBox ), vBox );
- gtk_widget_show_all( vBox );
+ stopishType = newType;
}
-//
-// Timer callback
-//
-static gint timeout_cb( gpointer data )
+int stopish_get_orientation( void )
{
- char formatBuffer[128], tempBuffer[8];
- char *tempString;
-
- // print to screen
- tempString = stopish_get_time_string( );
- if ( stopishOrientation == STOPISH_LANDSCAPE ) {
- sprintf( formatBuffer, "<span font_family=\"monospace\" "
- "size=\"70000\" weight=\"ultrabold\">"
- "%s</span>", tempString );
- gtk_label_set_markup( GTK_LABEL( timerdata.label ), formatBuffer );
- }
- else {
- if ( stopish_timer_get_precision( ) == TIMER_PRECISION_HOUR ) {
- sprintf( tempBuffer, "%.2s", tempString );
- sprintf( formatBuffer, "<span font_family=\"monospace\" "
- "size=\"80000\" weight=\"ultrabold\">"
- "%s</span>", tempBuffer );
- gtk_label_set_markup( GTK_LABEL( timerdata.labelHour ),
- formatBuffer );
- }
- if ( stopish_timer_get_precision( ) == TIMER_PRECISION_HOUR )
- sprintf( tempBuffer, "%.2s", tempString + 3 );
- else
- sprintf( tempBuffer, "%.2s", tempString );
- sprintf( formatBuffer, "<span font_family=\"monospace\" "
- "size=\"80000\" weight=\"ultrabold\">"
- "%s</span>", tempBuffer );
- gtk_label_set_markup( GTK_LABEL( timerdata.labelMinute ),
- formatBuffer );
- if ( stopish_timer_get_precision( ) == TIMER_PRECISION_HOUR )
- sprintf( tempBuffer, "%.4s", tempString + 6 );
- else
- sprintf( tempBuffer, "%.4s", tempString + 3 );
- sprintf( formatBuffer, "<span font_family=\"monospace\" "
- "size=\"80000\" weight=\"ultrabold\">"
- "%s</span>", tempBuffer );
- gtk_label_set_markup( GTK_LABEL( timerdata.labelSecond ),
- formatBuffer );
- }
- free( tempString );
-
- return TRUE;
+ return stopishOrientation;
}
-static void start_cb( GtkButton* button, gpointer data )
+gboolean stopish_focus_in_cb( GtkWidget *widget, GdkEventFocus *event,
+ gpointer data )
{
- if ( stopishMode == STOPISH_MODE_START ) {
- // set label text and add timer handle
- gtk_button_set_label( button, "Pause" );
- stopishMode = STOPISH_MODE_PAUSE;
- stopish_set_time_start( stopish_current_time( ) );
- timerHandle = g_timeout_add( 100, timeout_cb, NULL );
- }
- else if ( stopishMode == STOPISH_MODE_RESUME ) {
- // resume timer
- gtk_button_set_label( button, "Pause" );
- stopishMode = STOPISH_MODE_PAUSE;
- stopish_timer_resume( );
- timerHandle = g_timeout_add( 100, timeout_cb, NULL );
- }
- else {
- // pause timer, remove timeout
- gtk_button_set_label( button, "Resume" );
- stopishMode = STOPISH_MODE_RESUME;
- g_source_remove( timerHandle );
- stopish_timer_save( );
- }
+ // enable accelerometer hardware for portrait mode support
+ accelerometer_enable( );
- // allow user to reset timer
- gtk_widget_set_sensitive( GTK_WIDGET( data ), TRUE );
+ return FALSE;
}
-static void reset_cb( GtkButton* button, gpointer data )
+gboolean stopish_focus_out_cb( GtkWidget *widget, GdkEventFocus *event,
+ gpointer data )
{
- GSList *tempList;
- char *tempString;
- char formatString[128];
-
- if ( stopishMode == STOPISH_MODE_RESUME )
- stopish_timer_resume( );
-
- // set label text and remove timer handle
- gtk_button_set_label( GTK_BUTTON( data ), "Start" );
- stopishMode = STOPISH_MODE_START;
- if ( stopish_timer_get_precision( ) == TIMER_PRECISION_MINUTE )
- gtk_label_set_markup( GTK_LABEL( timerdata.label ),
- "<span font_family=\"monospace\" "
- "size=\"70000\" weight=\"ultrabold\">"
- "00:00.0</span>" );
- else
- gtk_label_set_markup( GTK_LABEL( timerdata.label ),
- "<span font_family=\"monospace\" "
- "size=\"70000\" weight=\"ultrabold\">"
- "00:00:00.0</span>" );
- g_source_remove( timerHandle );
-
- // add current time to history
- historyList = g_slist_prepend( historyList,
- ( gpointer ) stopish_get_time_string( ) );
- sprintf( formatString, "<span size=\"large\">%s</span>",
- ( char * ) historyList->data );
- gtk_label_set_markup( GTK_LABEL( timerHistoryLabel1 ),
- formatString );
- tempList = historyList;
- tempList = g_slist_next( tempList );
- if ( tempList ) {
- gtk_label_set_text( GTK_LABEL( timerHistoryLabel2 ),
- ( char * ) tempList->data );
- }
- tempList = g_slist_next( tempList );
- if ( tempList ) {
- sprintf( formatString, "<span size=\"small\">%s</span>",
- ( char * ) tempList->data );
- gtk_label_set_markup( GTK_LABEL( timerHistoryLabel3 ),
- formatString );
- }
- tempList = g_slist_next( tempList );
- if ( tempList ) {
- sprintf( formatString, "<span size=\"x-small\">%s</span>",
- ( char * ) tempList->data );
- gtk_label_set_markup( GTK_LABEL( timerHistoryLabel4 ),
- formatString );
- }
-
- // remove the history time after the 4th
- tempList = g_slist_next( tempList );
- if ( tempList ) {
- tempString = tempList->data;
- historyList = g_slist_remove( historyList, tempList->data );
- free( tempString );
- }
-
- // reset start time
- stopish_set_time_start( 0 );
+ // disable accelerometer for battery savings
+ accelerometer_disable( );
- // disallow user to reset timer
- gtk_widget_set_sensitive( GTK_WIDGET( button ), FALSE );
+ return FALSE;
}
-static void close_cb( GtkButton* button, gpointer data )
+static void main_menu( GtkWindow *window )
{
- // disable accelerometer for battery savings
- accelerometer_disable( );
+ HildonAppMenu *menu;
+ GtkWidget *button, *radio;
- // destroy main window and exit gtk main loop
- gtk_widget_destroy( GTK_WIDGET( data ) );
- gtk_main_quit( );
-}
+ menu = ( HildonAppMenu * ) hildon_app_menu_new( );
+ button = gtk_button_new_with_label( "Countdown" );
+ g_signal_connect_after( G_OBJECT( button ), "clicked",
+ G_CALLBACK( change_type_cb ), NULL );
+ hildon_app_menu_append( menu, GTK_BUTTON( button ) );
-static gboolean focus_in_cb( GtkWidget *widget, GdkEventFocus *event,
- gpointer data )
-{
- // enable accelerometer hardware for portrait mode support
- accelerometer_enable( );
+ button = gtk_button_new_with_label( "About" );
+ g_signal_connect_after( G_OBJECT( button ), "clicked",
+ G_CALLBACK( stopish_about_cb ), NULL );
+ hildon_app_menu_append( menu, GTK_BUTTON( button ) );
- return FALSE;
-}
+ // Hour preference
+ radio = gtk_radio_button_new_with_label( NULL, "Hour" );
+ gtk_toggle_button_set_mode( GTK_TOGGLE_BUTTON( radio ), FALSE );
+ g_signal_connect_after( G_OBJECT( radio ), "clicked",
+ G_CALLBACK( stopish_stopwatch_perf_timer_hour ), NULL );
+ hildon_app_menu_add_filter( menu, GTK_BUTTON( radio ) );
+ // Minute preference
+ radio = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON( radio ), "Minute" );
+ gtk_toggle_button_set_mode( GTK_TOGGLE_BUTTON ( radio ), FALSE );
+ g_signal_connect_after( G_OBJECT( radio ), "clicked",
+ G_CALLBACK( stopish_stopwatch_perf_timer_minute ), NULL );
+ hildon_app_menu_add_filter( menu, GTK_BUTTON( radio ) );
-static gboolean focus_out_cb( GtkWidget *widget, GdkEventFocus *event,
- gpointer data )
-{
- // disable accelerometer for battery savings
- accelerometer_disable( );
+ // default to minute
+ gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( radio ), TRUE );
- return FALSE;
+ gtk_widget_show_all( GTK_WIDGET( menu ) );
+
+ hildon_window_set_app_menu( HILDON_WINDOW( window ), menu );
}
-static void preference_timer_hour( GtkRadioButton* radio, GtkLabel *label )
+static void change_type_cb( GtkButton* button, gpointer data )
{
- stopish_timer_set_precision( TIMER_PRECISION_HOUR );
- if ( stopishOrientation == STOPISH_LANDSCAPE )
- label_timer_landscape( );
- else
- label_timer_portrait( );
+ stopish_stopwatch_reset( );
+ stopishType = STOPISH_TYPE_COUNTDOWN;
+ stopish_countdown_new( );
}
-static void preference_timer_minute( GtkRadioButton* radio, GtkLabel *label )
+static void close_cb( GtkButton* button, gpointer data )
{
- stopish_timer_set_precision( TIMER_PRECISION_MINUTE );
- if ( stopishOrientation == STOPISH_LANDSCAPE )
- label_timer_landscape( );
- else
- label_timer_portrait( );
+ // disable accelerometer for battery savings
+ accelerometer_disable( );
+
+ // destroy main window and exit gtk main loop
+ gtk_widget_destroy( GTK_WIDGET( data ) );
+ gtk_main_quit( );
}
if ( !strcmp( rotation, MCE_ORIENTATION_PORTRAIT ) ) {
hildon_gtk_window_set_portrait_flags( GTK_WINDOW( appdata.main_window ),
HILDON_PORTRAIT_MODE_REQUEST );
- label_timer_portrait( );
+ if ( stopishType == STOPISH_TYPE_STOPWATCH )
+ stopish_stopwatch_label_timer_portrait( );
+ else
+ stopish_countdown_label_timer_portrait( );
stopishOrientation = STOPISH_PORTRAIT;
}
else {
hildon_gtk_window_set_portrait_flags( GTK_WINDOW( appdata.main_window ),
~HILDON_PORTRAIT_MODE_REQUEST );
- label_timer_landscape( );
+ if ( stopishType == STOPISH_TYPE_STOPWATCH )
+ stopish_stopwatch_label_timer_landscape( );
+ else
+ stopish_countdown_label_timer_landscape( );
stopishOrientation = STOPISH_LANDSCAPE;
}
}