GTK Button - Funktion ausführen solange der Button gedrückt wird



  • Ich hab mal ne Frage:
    Wenn ich mit

    g_signal_connect (m1xplus, "clicked", G_CALLBACK(m1xfplus), NULL);
    

    einen Button connecte, und ihn dan anklicke, wir die Funktion 'm1xfplus' EINMAL ausgeführt. Nun möchte ich aber das die Funktion solange immer und immerwieder ausgeführt wird, solange der Button gedrückt bleibt.

    Wie gehts das?

    Gruß Tom



  • So was??

    #include <gtk/gtk.h>
    typedef struct 
    {
      gboolean  finish;
      GtkWidget *window;
    } WorkFields;
    
    static gboolean
    time_handler(WorkFields *work)
    {
      if ((work->window == NULL) || (work->finish)) return FALSE; // Stop g_timeout
    
      g_print("working...\n");
      return TRUE; // Continue g_timeout
    }
    
    void button_pressed(GtkWidget *widget, WorkFields *work)
    {
      g_print("pressed\n");
      work->finish = FALSE;
      g_timeout_add(1000, (GSourceFunc) time_handler, work); // call every second
      return;
    }
    void button_released(GtkWidget *widget, WorkFields *work)
    {
      g_print("released\n");
      work->finish = TRUE;
      return;
    }
    
    int main( int argc, char *argv[])
    {
      GtkWidget *fixed;
      GtkWidget *button;
      WorkFields *work;
      // Allocate storage
      work = g_slice_new (WorkFields);
    
      gtk_init(&argc, &argv);
    
      work->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title(GTK_WINDOW(work->window), "GtkButton");
      gtk_window_set_default_size(GTK_WINDOW(work->window), 230, 150);
      gtk_window_set_position(GTK_WINDOW(work->window), GTK_WIN_POS_CENTER);
    
      fixed = gtk_fixed_new();
      gtk_container_add(GTK_CONTAINER(work->window), fixed);
    
      button = gtk_button_new_with_label("Press");
      gtk_fixed_put(GTK_FIXED(fixed), button, 50, 50);
      gtk_widget_set_size_request(button, 80, 35);
    
      g_signal_connect(G_OBJECT(button), "pressed", 
          G_CALLBACK(button_pressed), work);
    
      g_signal_connect(G_OBJECT(button), "released", 
          G_CALLBACK(button_released), work);
    
      g_signal_connect(G_OBJECT(work->window), "destroy", 
          G_CALLBACK(gtk_main_quit), NULL);
    
      gtk_widget_show_all(work->window);
    
      gtk_main();
      // Free alocated storage
      g_slice_free (WorkFields, work);
    
      return 0;
    }
    

Anmelden zum Antworten