static void clock_app_add_browser_cb (MidoriApp* app, MidoriBrowser* browser, MidoriExtension* extension) { GtkWidget* statusbar; GtkWidget* label; label = gtk_label_new (NULL); statusbar = katze_object_get_object (browser, "statusbar"); gtk_box_pack_end (GTK_BOX (statusbar), label, FALSE, FALSE, 0); g_object_set_data (G_OBJECT (browser), "clock-label", label); g_object_set_data (G_OBJECT (browser), "clock-extension", extension); clock_set_current_time (browser); gtk_widget_show (label); g_object_unref (statusbar); g_signal_connect (browser, "destroy", G_CALLBACK (clock_browser_destroy_cb), NULL); }
/** * Handle keypresses on the keypad, primarily for editing current/closing times. * * This function implements a state machine for editing displayed times. * * It also allows you to cancel the incessant beeping that occurs when closing * time is reached. */ static void process_keypress() { unsigned char row, digit, editing_this_row, ok; timestamp_t ts; if (keypad.keypress == KEY_CURRENT_TIME || keypad.keypress == KEY_CLOSING_TIME) { if (keypad.keypress == KEY_CURRENT_TIME) edit_activity = EDIT_CURRENT_TIME; else edit_activity = EDIT_CLOSING_TIME; edit_position = 0; memset(&edit_value, 0xff, sizeof(edit_value)); } else if (edit_activity != EDIT_INACTIVE) { if (keypad.keypress <= KEY_MAX_DIGIT) { edit_value[edit_position] = keypad.keypress; if (edit_position<3) ++edit_position; } else { switch(keypad.keypress) { case KEY_CLEAR: if (edit_activity == EDIT_CLOSING_TIME) clock_clear_closing_time(); edit_activity = EDIT_INACTIVE; break; case KEY_LEFT: if (edit_position > 0) --edit_position; break; case KEY_RIGHT: if (edit_position < 3) ++edit_position; break; case KEY_ENTER: if (!was_time_edited()) { // if no editing was performed, ignore the input } else if (edit_activity == EDIT_CURRENT_TIME) { ok = parse_time(&ts, ¤t_time); if (ok) clock_set_current_time(&ts, 0); // 0 = approximate time, we're not doing drift calculations with it } else { ok = parse_time(&ts, &closing_time); if (ok) clock_set_closing_time(&ts); } edit_activity = EDIT_INACTIVE; break; default: // This is only present to surpress compiler warnings, break; // it should never actually be hit. } } } for (row=0; row<2; ++row) { if ((row==0 && edit_activity==EDIT_CURRENT_TIME) || (row==1 && edit_activity==EDIT_CLOSING_TIME) ) editing_this_row = 1; else editing_this_row = 0; for (digit=0; digit<4; ++digit) { if (editing_this_row) { if (edit_value[digit] != 0xff) display_buffer[row].digit[digit].value = edit_value[digit]; } if (editing_this_row && digit==edit_position) display_buffer[row].digit[digit].underbar = 1; else display_buffer[row].digit[digit].underbar = 0; } } keypad.is_valid = 0; // Consume the keypress }