static void km_set(int region,keydef_t *def,int k1,int k2) { kmlist_t *list,*next; int n; km.mode=KM_none; if (def!=(void *)-1) { if (def==NULL|| def->kdm!=KDM_macro) { inkey_wait("キーボードマクロエラー km_set"); return; } list=km_seek(def->funcNo); if (list==NULL) { inkey_wait("キーボードマクロエラー km_set NULL"); return; } free(list->buf); list->buf=mem_alloc(km.x*sizeof(int)); list->n=km.x; memcpy(list->buf,km.buf,km.x*sizeof(int)); system_msg("KeyMacro をセットしました。"); return; } list=mem_alloc(sizeof(kmlist_t)); list->buf=mem_alloc(km.x*sizeof(int)); list->n=km.x; memcpy(list->buf,km.buf,km.x*sizeof(int)); list->next=NULL; system_msg("KeyMacroをセットしました。"); n=0; if (km.list==NULL) km.list=list; else { next=km.list; while(next->next!=NULL) { ++n; next=next->next; } next->next=list; } keydef_set(region,KDM_macro,n,k1,k2); }
void system_msg( const char *title, const char *msg, ... ) { va_list arguments; va_start( arguments, msg ); system_msg( title, msg, arguments ); va_end( arguments ); }
//Funkcja dodaje waidomoœæ do kolejki //Zwraca: 0 jeœli powodzenie. 1 jeœli nie przepe³nienie uint8_t system_msgPut(uint8_t msg) { uint8_t in = (system_msg.indexIn + 1) % ELEMS(system_msg.quene); if(in != system_msg.indexOut) { system_msg.quene[system_msg.indexIn] = msg; system_msg.indexIn = in; return 0; } return 1; //Funkcja pobiera wiadomoœæ z kolejki. //Zwraca: 0 jeœli brak danych, lub kod wiadomoœci uint8_t system_msgGet(void) { if(system_msg.indexIn == system_msg.indexOut) return 0; uint8_t msg = system_msg.quene[system_msg.indexOut]; system_msg.indexOut = (system_msg.indexOut + 1) % ELEMS(system_msg.quene); return msg; } uint8_t system_msgWaitFor(void) { uint8_t msg; while(0 == (msg = system_msg())) {}; return msg; }
void inkey_wait(const char *buffer) { term_bell(); if (buffer!=NULL) system_msg(buffer); term_inkey(); }
int keysel(const char *s,const char *t) { int c; system_msg(s); do { c = term_inkey(); } while (strchr(t,c)==NULL); return tolower(c); }
static void main_shutdown_handler( void ) { if (*halt_message) system_msg( "Fatal Error", halt_message ); }
void system_err( const char *title, const char *error, va_list arguments ) { system_msg( title, error, arguments ); }
int get_keyf(int region) { int key1,key2; keydef_t *def; if (region>=MAX_region) return -1; if (km.mode==KM_set) system_msg("KeyMacro設定中"); if (km.mode==KM_do) system_msg("KeyMacro起動中"); key1=km_getkey(); if (key1!=-1) { term_csr_flush(); return key1; } if (region==0) CursorMove(); key1=term_inkey(); key2=-1; def=keydef_get(region, key1, key2); //fprintf(stderr,"%08p: %04x %08x\n",def, key1, key2); if (def!=(void *)-1) { if (def==NULL) { if (key1>0x100 || (iscntrl(key1) && key1!='\t' && key1<0x80)) def=(void *)-1; else key1|=KF_normalcode; } } else { putDoubleKey(key1); if (region==0) CursorMove(); key2=term_inkey(); delDoubleKey(); def=keydef_get(region, key1, key2); } /* 通常の有効なキー */ if (def!=NULL&& def!=(void *)-1&& def->kdm==KDM_func) { key1=def->funcNo; keydef_args=def->args; def=NULL; } if (def==NULL) { km_addkey(key1); return key1; } /* マクロ登録中 */ if (km.mode==KM_set) { km_set(region,def,key1,key2); return -1; } /* 無効なキー */ if (def==(void *)-1) return -1; /* マクロ起動 */ km_macro(def); return -1; }