/* * Demo showing the interaction with a canvas object. * adapted for vocode-o-matic project * */ #define HEIGHT 30 typedef struct { FL_FORM *canvasform; void *vdata; char *cdata; long ldata; FL_OBJECT *canvas[NR_OF_BANDS]; FL_OBJECT *indicator[NR_OF_BANDS]; FL_OBJECT *br; FL_OBJECT *done; } FD_canvasform; extern FD_canvasform * create_form_canvasform(void); static GC canvasGC; int canvas_expose(FL_OBJECT *ob, Window win, int w, int h, XEvent *ev, void *d) { FD_canvasform *ui = d; XFillRectangle(fl_get_display(), win, canvasGC, 0, 0, w, h); fl_addto_browser(ui->br, "Expose"); return 0; } int canvas_key(FL_OBJECT *ob, Window win, int w, int h, XEvent *ev, void *d) { FD_canvasform *ui = d; char buf[128]; sprintf(buf, "KeyPress: keysym=%ld", XKeycodeToKeysym(fl_display,ev->xkey.keycode, 0)); fl_addto_browser(ui->br, buf); return 0; } int canvas_but(FL_OBJECT *ob, Window win, int w, int h, XEvent *ev, void *d) { FD_canvasform *ui = d; char buf[128]; sprintf(buf, "Button%s: %d", ev->type==ButtonPress?"Press":"Release", ev->xbutton.button); fl_addto_browser(ui->br, buf); return 0; } void init_canvas(FD_canvasform *fdui) { int i; for (i = 0; i < NR_OF_BANDS; i++) { fl_add_canvas_handler(fdui->canvas[i], Expose, canvas_expose, fdui); fl_add_canvas_handler(fdui->canvas[i], KeyPress, canvas_key, fdui); fl_add_canvas_handler(fdui->canvas[i], ButtonPress,canvas_but,fdui); fl_add_canvas_handler(fdui->canvas[i], ButtonRelease,canvas_but,fdui); } canvasGC = XCreateGC(fl_get_display(),fl_state[fl_vmode].trailblazer,0,0); XSetForeground(fl_get_display(), canvasGC, fl_get_flcolor(FL_BLACK)); } int canvas_misc(FL_OBJECT *ob, Window win, int w, int h, XEvent *ev, void *d) { FD_canvasform *ui = d; char enter[255]; char leave[255]; int index; sprintf(enter, "enter %s", ob->label); sprintf(leave, "leave %s", ob->label); index=atoi(ob->label); //fprintf(stderr, "Index = %d\n", index); if (ev->xcrossing.type == EnterNotify) { fl_addto_browser(ui->br, enter); fl_set_object_color(ui->indicator[index],FL_BLUE,FL_WHITE); } else { fl_addto_browser(ui->br, leave ); fl_set_object_color(ui->indicator[index],FL_WHITE,FL_BLUE); } return 0; } FD_canvasform *fd_canvasform; int main(int argc, char *argv[]) { int i; fl_set_border_width(-2); fl_initialize(&argc, argv, "FormDemo", 0, 0); fd_canvasform = create_form_canvasform(); /* fill-in form initialization code */ init_canvas(fd_canvasform); fl_show_form(fd_canvasform->canvasform, FL_PLACE_FREE,FL_FULLBORDER,"canvasform"); for (i = 0; i < NR_OF_BANDS; i++) { fl_add_canvas_handler(fd_canvasform->canvas[i], EnterNotify, canvas_misc, fd_canvasform); fl_add_canvas_handler(fd_canvasform->canvas[i], LeaveNotify, canvas_misc, fd_canvasform); } while (fl_do_forms() != fd_canvasform->done) ; return 0; } /*******************/ FD_canvasform *create_form_canvasform(void) { FL_OBJECT *obj; int i; char tmp[255]; FD_canvasform *fdui = (FD_canvasform *) fl_calloc(1, sizeof(*fdui)); fdui->canvasform = fl_bgn_form(FL_NO_BOX, 40 + NR_OF_BANDS * HEIGHT, 450); // Niet noodzakelijk maar zorgt voor een achtergrond obj = fl_add_box(FL_UP_BOX,0,0, 40 + NR_OF_BANDS * HEIGHT, 450,""); for (i = 0; i < NR_OF_BANDS; i++) { sprintf(tmp, "%02d", i); fdui->indicator[i] = obj = fl_add_slider(FL_VERT_NICE_SLIDER, 20 + HEIGHT*i, 40, 20, 130, ""); fl_set_object_color(obj,FL_WHITE,FL_BLUE); //fl_set_object_lcolor(obj,FL_RIGHT_BCOL); fl_set_object_lsize(obj,FL_NORMAL_SIZE); // // Slider will be visible under canvas, canvas will react to events. // fdui->canvas[i] = obj = fl_add_canvas(FL_NORMAL_CANVAS, 20 + HEIGHT*i, 10, 20, 8, tmp); } fdui->br = obj = fl_add_browser(FL_NORMAL_BROWSER,10,180, 200,240,"Browser"); fdui->done = obj = fl_add_button(FL_NORMAL_BUTTON,300,180,90,27,"Done"); fl_end_form(); return fdui; }