2017-06-28 1 views
0

Also entwerfe ich ein virtuelles Nummernblock mit Lichtung. Es funktioniert jetzt, aber ich wollte die Tasten, um Buchstaben in einer T9-Art zu drucken, aber ich kann nicht herausfinden, wie man es tickt ... bitte helfen Sie. mein Code so weit ist:Wie Timer in Tastensignale auf GTK hinzufügen?

#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); 
} 

und so weiter für den Rest der Tasten

Antwort

0

(Ich wollte dies als Kommentar setzen, aber leider habe ich nicht 50 Ruf)

Bitte klären Sie Ihre Frage.

Ich wollte die Tasten, um Buchstaben in einer T9-Mode zu drucken, aber ich kann nicht herausfinden, wie man es Zeit.

was bedeutet das wirklich? auch, vielleicht können Sie einen Link zu labtest.glade geben Datei


Edit:

Ok, so dass Sie struct timespec verwenden, können Sie so etwas für Ihre button2 haben:

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); 
} 

können Sie gerne MAX_DELAY, ändern, und es ist der Code für timespec_subtract und 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; 
} 

alles, was Sie also brauchen, ist zu prüfen, ob tatsächlich Verzögerung größer als MAX_DELAY

+0

Text-auf-Nummer in dem Sinne, wenn ich die Taste 2 zweimal drücken Ich sollte A bekommen, wenn ich es dreimal drücke, sollte ich 3 und so weiter bekommen –