X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=scherzo.c;h=329884da93764973e0d595265d85dd5e2ac9b061;hb=f6b8f7f23bb8a4a5b30bfde8242578cca90ddacf;hp=77db9bb74b481ff09e48175dc0e4ebfbc7e5e0ab;hpb=4fc25bc641a5360245de29aac56e9450415f38e4;p=scherzo diff --git a/scherzo.c b/scherzo.c index 77db9bb..329884d 100644 --- a/scherzo.c +++ b/scherzo.c @@ -17,9 +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), @@ -33,33 +42,106 @@ on_delete_event_quit (unused (GtkWidget *widget), } static int -on_expose_event_draw (GtkWidget *widget, - unused (GdkEventExpose *event), - unused (gpointer user_data)) +on_expose_event_draw (GtkWidget *widget, + unused (GdkEventExpose *expose), + void * 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; gtk_widget_get_allocation (widget, &allocation); + widget_width = allocation.width; cr = gdk_cairo_create (widget->window); - /* Paint in medium sea green */ - cairo_set_source_rgb (cr, 60/255.0, 179/255.0, 113/255.0); - + /* White background */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); cairo_paint (cr); + + /* Add some padding on the sides and top */ + cairo_translate (cr, pad, (int) scherzo->staff_height / 2); + score_set_staff_height (score, scherzo->staff_height); + score_set_width (score, widget_width - 2 * pad); + + score_draw (score, cr); 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; + scherzo_t scherzo; + score_staff_t *treble; + score_staff_t *bass; gtk_init (&argc, &argv); + scherzo.score = score_create (NULL); + scherzo.staff_height = 48; + score_set_staff_height (scherzo.score, scherzo.staff_height); + + score_add_brace (scherzo.score, 2); + treble = score_add_staff (scherzo.score, SCORE_CLEF_G); + bass = score_add_staff (scherzo.score, SCORE_CLEF_F); + + score_staff_add_note (treble, SCORE_BUILD_NOTE (D, 4, WHOLE)); + score_staff_add_note (treble, SCORE_BUILD_NOTE (E, 4, WHOLE)); + score_staff_add_note (treble, SCORE_BUILD_NOTE (F, 4, WHOLE)); + score_staff_add_note (treble, SCORE_BUILD_NOTE (G, 4, WHOLE)); + score_staff_add_note (treble, SCORE_BUILD_NOTE (A, 4, WHOLE)); + score_staff_add_note (treble, SCORE_BUILD_NOTE (B, 4, WHOLE)); + score_staff_add_note (treble, SCORE_BUILD_NOTE (C, 5, WHOLE)); + score_staff_add_note (treble, SCORE_BUILD_NOTE (D, 5, WHOLE)); + + score_staff_add_note (bass, SCORE_BUILD_NOTE (B, 2, WHOLE)); + score_staff_add_note (bass, SCORE_BUILD_NOTE (C, 3, WHOLE)); + score_staff_add_note (bass, SCORE_BUILD_NOTE (D, 3, WHOLE)); + score_staff_add_note (bass, SCORE_BUILD_NOTE (E, 3, WHOLE)); + score_staff_add_note (bass, SCORE_BUILD_NOTE (F, 3, WHOLE)); + score_staff_add_note (bass, SCORE_BUILD_NOTE (G, 3, WHOLE)); + score_staff_add_note (bass, SCORE_BUILD_NOTE (A, 3, WHOLE)); + score_staff_add_note (bass, SCORE_BUILD_NOTE (B, 3, WHOLE)); + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size (GTK_WINDOW (window), 600, 400); @@ -72,8 +154,12 @@ main (int argc, char *argv[]) gtk_container_add (GTK_CONTAINER (window), drawing_area); g_signal_connect (drawing_area, "expose-event", - G_CALLBACK (on_expose_event_draw), NULL); + G_CALLBACK (on_expose_event_draw), + &scherzo); + g_signal_connect (window, "key-press-event", + G_CALLBACK (on_key_press_event), + &scherzo); gtk_widget_show_all (window);