繁体   English   中英

如何在gtk的按钮信号中添加计时器?

[英]How to add timer in button signals on gtk?

所以我正在设计一个带有空地的虚拟小键盘。 现在可以使用了,但是我希望按钮能以t9格式打印字母,但我不知道该如何计时...请帮助。 到目前为止,我的代码是:

 #include <gtk/gtk.h>
       #include <string.h>
       GtkWidget *g_entry1;

       int main(int argc, char *argv[])
       {
           GtkBuilder      *builder; 
           GtkWidget       *window;

           gtk_init(&argc, &argv);

           builder = gtk_builder_new();
           gtk_builder_add_from_file (builder, "labtest.glade", NULL);

           window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
           gtk_builder_connect_signals(builder, NULL);
           g_entry1 = GTK_WIDGET(gtk_builder_get_object(builder,"entry1"));

       g_object_unref(builder);

    gtk_widget_show(window);                
    gtk_main();

    return 0;
}


void on_btn1_clicked()
{
    gchar *num;
    char num_arr[20];
    num = gtk_entry_get_text(GTK_ENTRY(g_entry1));
strcpy(num_arr,num);
    strcat(num_arr,"1");
    gtk_entry_set_text(GTK_ENTRY(g_entry1), num_arr);
}

void on_btn2_clicked()
{
gchar *num;

    char num_arr[20];
    num = gtk_entry_get_text(GTK_ENTRY(g_entry1));
strcpy(num_arr,num);
    strcat(num_arr,"2");
    gtk_entry_set_text(GTK_ENTRY(g_entry1), num_arr);
}

void on_btn3_clicked()
{
gchar *num;

    char num_arr[20];
    num = gtk_entry_get_text(GTK_ENTRY(g_entry1));
strcpy(num_arr,num);
    strcat(num_arr,"3");
    gtk_entry_set_text(GTK_ENTRY(g_entry1), num_arr);
}
void on_btn4_clicked()
{
gchar *num;
    char num_arr[20];
    num = gtk_entry_get_text(GTK_ENTRY(g_entry1));
strcpy(num_arr,num);
    strcat(num_arr,"4");
    gtk_entry_set_text(GTK_ENTRY(g_entry1), num_arr);
}

其余的按钮等等

(我想以此作为评论,但可惜我没有50的声誉

请您澄清您的问题。

我希望按钮以t9方式打印字母,但我不知道如何计时。

到底是什么意思 另外,也许您可​​以提供指向labtest.glade文件的链接


编辑:

好的,因此您可以使用struct timespec ,您的button2可能会有类似的内容:

const gchar btn2_input[4] = { '2', 'A', 'B', 'C' };
struct timespec last_time_clicked;

#define MAX_DELAY 0.5f

void on_btn2_clicked() {
  struct timespec actual_time;
  float delay;
  const gchar *o_text;
  gchar *n_text;
  GString *s_text;
  static int i = 0;
  gssize text_len;

  clock_gettime(CLOCK_MONOTONIC, &actual_time);
  timespec_subtract(&last_time_clicked, &actual_time, &last_time_clicked);
  delay = timespec_to_float(&last_time_clicked);
  last_time_clicked = actual_time;

  o_text = gtk_entry_get_text(GTK_ENTRY(g_entry1));
  s_text = g_string_new(o_text);
  text_len = s_text->len;

  if(delay > MAX_DELAY)
    i = 0;
  else {
    text_len--;
    i = (i + 1) % 4;
  }

  s_text = g_string_overwrite_len(s_text, text_len, btn2_input + i, 1);

  n_text = g_string_free (s_text, FALSE);
  gtk_entry_set_text(GTK_ENTRY(g_entry1), n_text);
  g_free(n_text);
}

您可能想更改MAX_DELAY ,并且有timespec_subtracttimespec_to_float的代码:

void timespec_normalize(struct timespec *t) {
  int n;
  const int sn = 1000000000;

  n = t->tv_nsec / sn;
  t->tv_sec += n;
  t->tv_nsec -= n * sn;

  return;
}

int timespec_subtract(struct timespec *r, struct timespec *x,
              struct timespec *y) {

  timespec_normalize(x);
  timespec_normalize(y);

  if(x->tv_nsec < y->tv_nsec) {
    x->tv_sec--;
    x->tv_nsec += 1000000000;
  }

  r->tv_sec = x->tv_sec - y->tv_sec;
  r->tv_nsec = x->tv_nsec - y->tv_nsec;

  return 0;
}

float timespec_to_float(struct timespec *t) {
  return (float)(t->tv_sec) + (float)(t->tv_nsec) / 1000000000.0f;
}

因此,您所需要做的就是检查实际延迟是否大于MAX_DELAY

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM