Blame platform-demos/C/samples/spinner.c

Packit 1470ea
#include <gtk/gtk.h>
Packit 1470ea
 
Packit 1470ea
Packit 1470ea
Packit 1470ea
 /*Global variable used to indicate active state of the
Packit 1470ea
spinner. TRUE = active, FALSE = not-active. This is because 
Packit 1470ea
there isn't a current function for C that does this for us*/
Packit 1470ea
gboolean active;  
Packit 1470ea
 
Packit 1470ea
Packit 1470ea
Packit 1470ea
/*This is the callback function. It is a handler function 
Packit 1470ea
which reacts to the signal. In this case, it will cause the 
Packit 1470ea
spinner to start and stop according to how many times the user 
Packit 1470ea
presses the spacebar.*/ 
Packit 1470ea
static gboolean
Packit 1470ea
key_pressed_event (GtkWidget *widget,
Packit 1470ea
                   GdkEvent  *event,
Packit 1470ea
                   gpointer   user_data)
Packit 1470ea
{
Packit 1470ea
  GtkWidget *spinner = user_data;
Packit 1470ea
  guint keyval;
Packit 1470ea
  
Packit 1470ea
  /*Extracts the keyval from an event. And stores it in the  variable 
Packit 1470ea
  "keyval" (we give the function the address). In this case, the 
Packit 1470ea
  event is GdkEventKey, a key press event*/
Packit 1470ea
  gdk_event_get_keyval (event, &keyval);  
Packit 1470ea
Packit 1470ea
  /*Grabbing the boolean value from the spinner*/
Packit 1470ea
  g_object_get (GTK_SPINNER (spinner), "active", &active, NULL);
Packit 1470ea
  
Packit 1470ea
  if (keyval == GDK_KEY_space) {
Packit 1470ea
     if (active) {
Packit 1470ea
         gtk_spinner_stop (GTK_SPINNER (spinner));
Packit 1470ea
     }
Packit 1470ea
     else {
Packit 1470ea
         gtk_spinner_start (GTK_SPINNER (spinner));
Packit 1470ea
     } 
Packit 1470ea
  }
Packit 1470ea
  
Packit 1470ea
return TRUE;
Packit 1470ea
}
Packit 1470ea
 
Packit 1470ea
Packit 1470ea
Packit 1470ea
static void
Packit 1470ea
activate (GtkApplication *app,
Packit 1470ea
          gpointer        user_data)
Packit 1470ea
{
Packit 1470ea
  GtkWidget *window;
Packit 1470ea
  GtkWidget *spinner;
Packit 1470ea
 
Packit 1470ea
  /*Create a window with a title, border width and a default size*/
Packit 1470ea
  window = gtk_application_window_new (app);
Packit 1470ea
 
Packit 1470ea
  gtk_window_set_title (GTK_WINDOW (window), "Spinner Example");
Packit 1470ea
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
Packit 1470ea
  gtk_container_set_border_width (GTK_CONTAINER(window), 30);
Packit 1470ea
 
Packit 1470ea
  /*Create a spinner, with extra horizontal and vertical space*/
Packit 1470ea
  spinner = gtk_spinner_new ();
Packit 1470ea
  gtk_spinner_start (GTK_SPINNER (spinner));
Packit 1470ea
  
Packit 1470ea
  gtk_container_add (GTK_CONTAINER (window), spinner);
Packit 1470ea
 
Packit 1470ea
  /*Connecting the key-press-event signal to the callback*/
Packit 1470ea
  g_signal_connect (GTK_WINDOW (window), "key-press-event", 
Packit 1470ea
                    G_CALLBACK (key_pressed_event), spinner);
Packit 1470ea
 
Packit 1470ea
  gtk_widget_show_all (window);
Packit 1470ea
}
Packit 1470ea
 
Packit 1470ea
Packit 1470ea
Packit 1470ea
Packit 1470ea
int
Packit 1470ea
main (int argc, char **argv)
Packit 1470ea
{
Packit 1470ea
  GtkApplication *app;
Packit 1470ea
  int status;
Packit 1470ea
 
Packit 1470ea
  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
Packit 1470ea
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
Packit 1470ea
  status = g_application_run (G_APPLICATION (app), argc, argv);
Packit 1470ea
  g_object_unref (app);
Packit 1470ea
 
Packit 1470ea
  return status;
Packit 1470ea
}