X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=scherzo.c;h=f6669edc3fda5194149cd72d88883c963b5cc076;hb=e8131140bc963d8f19e4d8691a6b9447bff94534;hp=fbb23f0ed34da8efa4df50f9309258ca6c4840d7;hpb=66812a216aa78f33ddff8753dd62f8450ef3220a;p=scherzo diff --git a/scherzo.c b/scherzo.c index fbb23f0..f6669ed 100644 --- a/scherzo.c +++ b/scherzo.c @@ -17,11 +17,18 @@ */ #include +#include #include "score.h" #define unused(foo) foo __attribute__((unused)) +typedef struct scherzo +{ + score_t *score; + int staff_height; +} scherzo_t; + static int on_delete_event_quit (unused (GtkWidget *widget), unused (GdkEvent *event), @@ -35,15 +42,16 @@ on_delete_event_quit (unused (GtkWidget *widget), } static int -on_expose_event_draw (GtkWidget *widget, - unused (GdkEventExpose *event), +on_expose_event_draw (GtkWidget *widget, + unused (GdkEventExpose *expose), void * user_data) { - score_t *score = user_data; + scherzo_t *scherzo = user_data; + score_t *score = scherzo->score; cairo_t *cr; GtkAllocation allocation; static const int pad = 10; - int widget_width, staff_width; + int widget_width; gtk_widget_get_allocation (widget, &allocation); widget_width = allocation.width; @@ -56,7 +64,7 @@ on_expose_event_draw (GtkWidget *widget, /* Add some padding on the left/right */ cairo_translate (cr, pad, pad); - + score_set_staff_height (score, scherzo->staff_height); score_set_width (score, widget_width - 2 * pad); score_draw (score, cr); @@ -64,16 +72,51 @@ on_expose_event_draw (GtkWidget *widget, return TRUE; } +static int +on_key_press_event (GtkWidget *widget, + GdkEventKey *key, + void *user_data) +{ + scherzo_t *scherzo = user_data; + + switch (key->keyval) { + case GDK_KEY_plus: + case GDK_KEY_KP_Add: + case GDK_KEY_equal: + case GDK_KEY_KP_Equal: + scherzo->staff_height += 4; + gtk_widget_queue_draw (widget); + return TRUE; + break; + case GDK_KEY_minus: + case GDK_KEY_KP_Subtract: + scherzo->staff_height -= 4; + gtk_widget_queue_draw (widget); + return TRUE; + break; + case GDK_KEY_q: + case GDK_KEY_Q: + case GDK_KEY_Escape: + gtk_main_quit (); + return FALSE; + } + + /* Allow the event to propagate to other handlers. */ + return FALSE; +} + int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *drawing_area; - score_t score; + scherzo_t scherzo; gtk_init (&argc, &argv); - score_init (&score); + scherzo.score = score_create (NULL); + scherzo.staff_height = 24; + score_set_staff_height (scherzo.score, scherzo.staff_height); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); @@ -88,7 +131,11 @@ main (int argc, char *argv[]) g_signal_connect (drawing_area, "expose-event", G_CALLBACK (on_expose_event_draw), - &score); + &scherzo); + + g_signal_connect (window, "key-press-event", + G_CALLBACK (on_key_press_event), + &scherzo); gtk_widget_show_all (window);