LRESULT CALLBACK viewproc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int oldx = 0; static int oldy = 0; int x = (signed short) LOWORD(lParam); int y = (signed short) HIWORD(lParam); switch (message) { case WM_SIZE: if (wParam == SIZE_MINIMIZED) return 0; if (wParam == SIZE_MAXIMIZED) gapp.shrinkwrap = 0; pdfapp_onresize(&gapp, LOWORD(lParam), HIWORD(lParam)); break; /* Paint events are low priority and automagically catenated * so we don't need to do any fancy waiting to defer repainting. */ case WM_PAINT: { //puts("WM_PAINT"); PAINTSTRUCT ps; hdc = BeginPaint(hwnd, &ps); winblit(); hdc = NULL; EndPaint(hwnd, &ps); pdfapp_postblit(&gapp); return 0; } case WM_ERASEBKGND: return 1; // well, we don't need to erase to redraw cleanly /* Mouse events */ case WM_LBUTTONDOWN: SetFocus(hwndview); oldx = x; oldy = y; handlemouse(x, y, 1, 1); return 0; case WM_MBUTTONDOWN: SetFocus(hwndview); oldx = x; oldy = y; handlemouse(x, y, 2, 1); return 0; case WM_RBUTTONDOWN: SetFocus(hwndview); oldx = x; oldy = y; handlemouse(x, y, 3, 1); return 0; case WM_LBUTTONUP: oldx = x; oldy = y; handlemouse(x, y, 1, -1); return 0; case WM_MBUTTONUP: oldx = x; oldy = y; handlemouse(x, y, 2, -1); return 0; case WM_RBUTTONUP: oldx = x; oldy = y; handlemouse(x, y, 3, -1); return 0; case WM_MOUSEMOVE: oldx = x; oldy = y; handlemouse(x, y, 0, 0); return 0; /* Mouse wheel */ case WM_MOUSEWHEEL: if ((signed short)HIWORD(wParam) > 0) handlekey(LOWORD(wParam) & MK_SHIFT ? '+' : 'k'); else handlekey(LOWORD(wParam) & MK_SHIFT ? '-' : 'j'); return 0; /* Timer */ case WM_TIMER: if (wParam == OUR_TIMER_ID && timer_pending && gapp.presentation_mode) { timer_pending = 0; handlekey(VK_RIGHT + 256); handlemouse(oldx, oldy, 0, 0); /* update cursor */ return 0; } break; /* Keyboard events */ case WM_KEYDOWN: /* only handle special keys */ switch (wParam) { case VK_F1: case VK_LEFT: case VK_UP: case VK_PRIOR: case VK_RIGHT: case VK_DOWN: case VK_NEXT: case VK_ESCAPE: handlekey(wParam + 256); handlemouse(oldx, oldy, 0, 0); /* update cursor */ return 0; } return 1; /* unicode encoded chars, including escape, backspace etc... */ case WM_CHAR: if (wParam < 256) { handlekey(wParam); handlemouse(oldx, oldy, 0, 0); /* update cursor */ } return 0; } fflush(stdout); /* Pass on unhandled events to Windows */ return DefWindowProc(hwnd, message, wParam, lParam); }
int TextInput( int x, int y, const char *prompt, int maxlen, int fieldlen, VString *strres, void (*handlekey)( int key, VString &s, int &pos ) ) { int res = 0; int insert = 1; VString str = *strres; VString tmp; int ch; ScrollPos scroll; scroll.set_min_max( 0, str_len( str ) ); scroll.set_pagesize( fieldlen ); scroll.go( str_len(str) ); int show = 1; int firsthit = 1; int opage = -1; con_cshow(); while(1) { if (opage != scroll.page()) show = 1; if (show) { str_copy( tmp, str, scroll.page(), scroll.pagesize() ); str_pad( tmp, -scroll.pagesize() ); tmp = " " + tmp + " "; if ( scroll.page() > 0 ) str_set_ch( tmp, 0, '<' ); if ( scroll.page()+scroll.pagesize() < str_len(str) ) str_set_ch( tmp, str_len(tmp)-1, '>' ); con_out(x, y, tmp, firsthit ? EditStrFH : EditStrBF ); show = 0; opage = scroll.page(); } con_xy( x + scroll.pos() - scroll.page() + 1 , y ); ch = con_getch(); if( ch >= 32 && ch <= 255 && ch != KEY_BACKSPACE && str_len(str) < maxlen - 1 ) { if (firsthit) { str = ""; scroll.go(0); firsthit = 0; } if (!insert) str_del( str, scroll.pos(), 1 ); str_ins_ch( str, scroll.pos(), ch ); scroll.set_min_max( 0, str_len( str ) ); scroll.go( scroll.pos() ); scroll.down(); show = 1; }; if (firsthit) { show = 1; firsthit = 0; } if( ch == 27 ) { res = 0; break; } else if( ch == 13 ) { *strres = str; res = 1; break; } else if( ch == KEY_CTRL_U ) { scroll.go(0); str = ""; show = 1; } else if( (ch == KEY_BACKSPACE || ch == 8 ) && (scroll.pos() > 0) ) { scroll.up(); str_del( str, scroll.pos(), 1 ); show = 1; } else if ( ch == KEY_IC ) insert = !insert; else if ( ch == KEY_LEFT ) scroll.up(); else if ( ch == KEY_RIGHT ) scroll.down(); else /* if ( ch == KEY_PPAGE ) scroll.ppage(); else if ( ch == KEY_NPAGE ) scroll.npage(); else */ if ( ch == KEY_HOME || ch == KEY_CTRL_A ) scroll.go(0); else if ( ch == KEY_END || ch == KEY_CTRL_E ) scroll.go(str_len(str)); else if ( ( ch == KEY_DC || ch == KEY_CTRL_D ) && scroll.pos() < str_len(str) ) { str_del( str, scroll.pos(), 1 ); show = 1; } else if ( handlekey ) { int npos = scroll.pos(); handlekey( ch, str, npos ); scroll.set_min_max( 0, str_len( str ) ); scroll.go( scroll.pos() ); if (scroll.pos() != npos) scroll.go( npos ); show = 1; } scroll.set_min_max( 0, str_len( str ) ); scroll.go( scroll.pos() ); } con_chide(); return res; }