Пример #1
0
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);
}
Пример #2
0
/**
 * 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, &current_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
}