#!/usr/local/bin/cz -- use b num margins = 40 int font_ref = 200 num effect_duration = 1 boolean step_by_step = 1 boolean effects = 0 num delay = 0, delay_demo = 0, delay_page = 0 cstr demos_dir = "." boolean loop = 0 boolean smooth = 1 int smooth_steps = 15 int smooth_dur = 0.25 def smooth_delay smooth_dur / smooth_steps num x_expose_delay = 0.2 boolean echo_lines = 1 num old_y, old_font_size, old_height boolean start_of_page = 1 int page = 0 def usage() usage("slides_file [start_page]") Main(): Atexit(kill_demo_child) paint_handle_events = 0 int start_page = 0 if *Getenv("quick") step_by_step = 0 if *Getenv("nofx") effects = 0 if *Getenv("nosmooth") smooth = 0 demos_dir = Getenv("demos", demos_dir) delay = atof(Getenv("delay", "0")) delay_demo = atof(Getenv("delay_demo", "0")) delay_page = atof(Getenv("delay_page", "0")) eachp(d, delay_demo, delay_page, delay) if !*d *d = delay ? delay * 4 : time_forever if *Getenv("loop") loop = 0 args(cstr, slides_file) getargs(int, start_page) dirbasename(slides_file, dir, base) Chdir(dir) slides_file = base space() # space(800, 600) gprint_anchor(-1, 1) csleep(smooth_delay) new(lines, vec, cstr, 16) repeat vec_clear(lines) tofree_block() F_in(slides_file): warn("%d", page) show_slides(lines, start_page) if !loop break gr_done = 1 show_slides(vec *lines, int start_page) Eachline(l): boolean show = page >= start_page boolean end_of_page = *l == ' ' if echo_lines: say(l) if *l == '!' if show run_demo(l+1) eif cstr_begins_with(l, "-w_2 && x-h_2+1 && y time+effect_duration: break # LIBB # LIBB already # #boolean gr_do_delay_done #gr_do_delay(num dt) # gr_do_delay_done = 0 # thunk old_handler = key_handler_default # key_handler_default = thunk(gr_do_delay_handler) # if dt == time_forever # while !gr_do_delay_done ## warn("gr_do_delay forever looping calling handle_events: veclen(gr_need_delay_callbacks) = %d", veclen(gr_need_delay_callbacks)) # int n = handle_events(1) ## warn(" %d", n) # else # num t = rtime() # num t1 = t + dt # while t < t1 && !gr_do_delay_done # if events_queued(0) || veclen(gr_need_delay_callbacks) || can_read(x11_fd, t1-t) ## warn("gr_do_delay %f looping calling handle_events", dt) # handle_events(0) # t = rtime() # key_handler_default = old_handler # #void *gr_do_delay_handler(void *obj, void *a0, void *event) # use(obj, a0) # gr_event *e = event # if e->type == KeyPress: # gr_do_delay_done = 1 # return thunk_yes # #int handle_events(boolean wait_for_event) # int n = gr_call_need_delay_callbacks() # while !gr_done && handle_event_maybe(wait_for_event) # ++n # wait_for_event = 0 # return n # #int events_queued(boolean wait_for_event) ## return XEventsQueued(display, QueuedAfterReading) ## warn("events_queued: wait_for_event = %d", wait_for_event) ## int n = XEventsQueued(display, wait_for_event||can_read(x11_fd) ? QueuedAfterReading : QueuedAlready) # int n = XEventsQueued(display, QueuedAlready) ## warn(" n = %d", n) # if !n: ## warn(" selecting...") # num timeout = wait_for_event && !veclen(gr_need_delay_callbacks) ? time_forever : 0 # gr_flush() # if can_read(x11_fd, timeout): ## warn(" reading...") # n = XEventsQueued(display, QueuedAfterReading) ## warn(" n = %d", n) # return n # # is can_read necessary? # #boolean handle_event_maybe(boolean wait_for_event) # int n = events_queued(wait_for_event) # if n # handle_event() # else # gr_flush() # return n