@@ -64,10 +64,11 @@ static Uint8 cur_type; static Uint8 gsizes[16]; static Picture*cur_pic; static Picture*spare_page; +static sqlite3_stmt**macro[26]; static void fn_valid_name(sqlite3_context*cxt,int argc,sqlite3_value**argv) { const char*s=sqlite3_value_text(*argv); if(!s || !*s || s[strspn(s,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-0123456789")]) { sqlite3_result_error(cxt,"Invalid name",-1); @@ -158,10 +159,23 @@ .xNext=vt_graph_next, .xOpen=vt_graph_open, .xRowid=vt_graph_rowid, .xUpdate=vt_graph_update, }; + +static void*load_macros_1(xrm_db*db,void*usr,int loose,xrm_quark q) { + const char*txt; + if(qQ_Z) return 0; + if(!(db=xrm_sub(db,loose,q)) || !(txt=xrm_get(db))) return 0; + if(sqlite3_prepare_v3(userdb,txt,-1,SQLITE_PREPARE_PERSISTENT,macro+(q-Q_A),0)) fatal("Error in macro: %s\n%s\n",txt,sqlite3_errmsg(userdb)); + return 0; +} + +static void*load_macros(xrm_db*db,void*usr) { + xrm_enumerate(db,load_macros_1,0); + return 0; +} static int load_picture_file(void) { sqlite3_stmt*st=0; FILE*fp; char*nam; @@ -910,10 +924,41 @@ } goto redraw; } break; case SDL_KEYDOWN: + if((ev.key.keysym.mod&(KMOD_ALT|KMOD_META)) && ev.key.keysym.sym>=SDLK_a && ev.key.keysym.sym<=SDLK_z) { + sqlite3_stmt*st=macro[ev.key.keysym.sym-SDLK_a]; + if(!st) goto redraw; + sqlite3_reset(st); + sqlite3_bind_int(st,sqlite3_bind_parameter_index(st,"$cc"),cc); + sqlite3_bind_int(st,sqlite3_bind_parameter_index(st,"$xx"),xx); + sqlite3_bind_int(st,sqlite3_bind_parameter_index(st,"$yy"),yy); + sqlite3_bind_int(st,sqlite3_bind_parameter_index(st,"$mx"),m.x); + sqlite3_bind_int(st,sqlite3_bind_parameter_index(st,"$my"),m.y); + sqlite3_bind_int(st,sqlite3_bind_parameter_index(st,"$mw"),m.w); + sqlite3_bind_int(st,sqlite3_bind_parameter_index(st,"$mh"),m.h); + while((i=sqlite3_step(st))==SQLITE_ROW) { + for(j=0;j