#include "system.h" #include "image.hpp" #include "palette.hpp" #include "mdlread.hpp" #include "video.hpp" #include "dos.h" #include "gifread.hpp" #include "macs.hpp" #include "mouse.hpp" #include "event.hpp" #include "sprite.hpp" #include "monoprnt.hpp" #include "dprint.hpp" #include #include #include #include #include #include "keys.hpp" #include #include #include #include #include #include #include #include #include #include #undef EGA #include int console_fd; void event_handler::flush_screen() { mouse->mouse_sprite()->x=mouse->drawx(); mouse->mouse_sprite()->y=mouse->drawy(); mouse->mouse_sprite()->get_background(); mouse->mouse_sprite()->draw(); update_dirty(screen); mouse->mouse_sprite()->restore_background(); } int event_handler::get_key_flags() { return 0; } int shift; int fd_ready_to_read(int fd) { struct timeval tv={0,0}; fd_set kbd_set; FD_ZERO(&kbd_set); FD_SET(fd,&kbd_set); select(FD_SETSIZE,&kbd_set,NULL,NULL,&tv); return (FD_ISSET(fd,&kbd_set)); } int key_waiting() { return fd_ready_to_read(console_fd); } int con_translate(int ch) { int up=(!(ch&0x80)),key=ch&0x7f; if (key==42 || key==54) shift=up; switch (key) { case 73 : ch=JK_PAGEUP; break; case 81 : ch=JK_PAGEDOWN; break; case 42 : ch=JK_SHIFT_L; break; case 54 : ch=JK_SHIFT_R; break; case 72 : ch=JK_UP; break; case 80 : ch=JK_DOWN; break; case 82 : ch=JK_INSERT; break; case 75 : ch=JK_LEFT; break; case 77 : ch=JK_RIGHT; break; case 29 : ch=JK_CTRL_L; break; case 56 : ch=JK_ALT_L; break; case 58 : ch=JK_CAPS; break; case 69 : ch=JK_NUM_LOCK; break; case 71 : ch=JK_HOME; break; case 79 : ch=JK_END; break; case 83 : ch=JK_DEL; break; case 57 : ch=JK_SPACE; break; case 1 : ch=JK_ESC; break; case 28 : ch=JK_ENTER; break; case 15 : ch=JK_TAB; break; case 14 : ch=JK_BACKSPACE; break; case 2 : ch=shift ? '!' : '1'; break; case 3 : ch=shift ? '@' : '2'; break; case 4 : ch=shift ? '#' : '3'; break; case 5 : ch=shift ? '$' : '4'; break; case 6 : ch=shift ? '%' : '5'; break; case 7 : ch=shift ? '^' : '6'; break; case 8 : ch=shift ? '&' : '7'; break; case 9 : ch=shift ? '*' : '8'; break; case 10 : ch=shift ? '(' : '9'; break; case 11 : ch=shift ? ')' : '0'; break; case 12 : ch=shift ? '_' : '-'; break; case 13 : ch=shift ? '+' : '='; break; case 41 : ch=shift ? '~' : '`'; break; case 26 : ch=shift ? '{' : '['; break; case 27 : ch=shift ? '}' : ']'; break; case 39 : ch=shift ? ':' : ';'; break; case 40 : ch=shift ? '"' : '\''; break; case 51 : ch=shift ? '<' : ','; break; case 52 : ch=shift ? '>' : '.'; break; case 53 : ch=shift ? '?' : '/'; break; case 43 : ch=shift ? '|' : '\\'; break; case 59 : ch=JK_F1; break; case 60 : ch=JK_F2; break; case 61 : ch=JK_F3; break; case 62 : ch=JK_F4; break; case 63 : ch=JK_F5; break; case 64 : ch=JK_F6; break; case 65 : ch=JK_F7; break; case 66 : ch=JK_F8; break; case 67 : ch=JK_F9; break; case 68 : ch=JK_F10; break; default : switch (key) { case 30 : ch='a'; break; case 48 : ch='b'; break; case 46 : ch='c'; break; case 32 : ch='d'; break; case 18 : ch='e'; break; case 33 : ch='f'; break; case 34 : ch='g'; break; case 35 : ch='h'; break; case 23 : ch='i'; break; case 36 : ch='j'; break; case 37 : ch='k'; break; case 38 : ch='l'; break; case 50 : ch='m'; break; case 49 : ch='n'; break; case 24 : ch='o'; break; case 25 : ch='p'; break; case 16 : ch='q'; break; case 19 : ch='r'; break; case 31 : ch='s'; break; case 20 : ch='t'; break; case 22 : ch='u'; break; case 47 : ch='v'; break; case 17 : ch='w'; break; case 45 : ch='x'; break; case 21 : ch='y'; break; case 44 : ch='z'; break; default : ch=0; break; } if (shift) ch-=('a'-'A'); } return ch; } int event_handler::event_waiting() { int ch; unsigned char c; event *ev; if (ewaiting) return 1; if (key_waiting()) { read(console_fd,&c,1); ch=con_translate(c); ewaiting=1; ev=new event; if (c&0x80) ev->type=EV_KEYRELEASE; else ev->type=EV_KEY; ev->key=ch; events.add_end((linked_node *)ev); last_key=ch; } else if (mhere) { mouse->update(); if (mouse->lastx()!=mouse->x() || mouse->lasty()!=mouse->y() || mouse->last_button()!=mouse->button()) ewaiting=1; } return ewaiting; } void event_handler::get_event(event &ev) { event *ep; while (!ewaiting) event_waiting(); ep=(event *)events.first(); if (ep) { ev=*ep; events.unlink((linked_node *)ep); delete ep; ewaiting=events.first()!=NULL; } else { if (mhere && (mouse->last_button()!=mouse->button())) ev.type=EV_MOUSE_BUTTON; else if (mhere && (mouse->lastx()!=mouse->x() || mouse->lasty()!=mouse->y())) ev.type=EV_MOUSE_MOVE; else ev.type=EV_SPURIOUS; if (ev.type==EV_MOUSE_MOVE) { mouse->mouse_sprite()->x=mouse->x(); mouse->mouse_sprite()->y=mouse->y(); } ewaiting=0; } // note : that the mouse status // should be know even if // other event has occured ev.mouse_move.x=mouse->x(); ev.mouse_move.y=mouse->y(); ev.mouse_button=mouse->button(); } void event_handler::add_redraw(int X1, int Y1, int X2, int Y2, void *Start) { event *ev; ev=new event; ev->type=EV_REDRAW; ev->redraw.x1=X1; ev->redraw.x2=X2; ev->redraw.y1=Y1; ev->redraw.y2=Y2; ev->redraw.start=Start; events.add_end((linked_node *)ev); } int fd,my_console=-1,child_pid; void die() { close(console_fd); kill(child_pid,SIGUSR1); } event_handler::~event_handler() { die(); } int key_fifo(); event_handler::event_handler(image *screen, palette *pal) { CHECK(screen && pal); mouse=new JCMouse(screen,pal); mhere=mouse->exsist(); last_keystat=get_key_flags(); ewaiting=0; last_key=-1; console_fd=key_fifo(); atexit(die); } int key_fifo() // returns the fd linked to the keydriver { int fd; FILE *fp; fp=popen("keydrv","r"); if (fp) fscanf(fp,"%d",&child_pid); // the keydrv prints out it's fork pid if (!fp || !child_pid) { close_graphics(); printf("Could not find keydrv, please put it in your path\n"); exit(1); } pclose(fp); // read it, so we can kill it later do { usleep(10000); } while (access("/tmp/jckey-driver",R_OK)); fd=open("/tmp/jckey-driver",O_RDONLY); return fd; }