[英]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_subtract
和timespec_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.