/* --------------------------------------------------------------------- * TerminalVScrollHook * Terminal scroll bar mouse hook * --------------------------------------------------------------------- */ static void TerminalVScrollHook(void* w, int sbcode, int pos) { CUIWINDOW* win = (CUIWINDOW*) w; CUIRECT rc; int sbpos, range; CUI_USE_ARG(pos); WindowGetClientRect(win, &rc); sbpos = WindowGetVScrollPos(win); range = WindowGetVScrollRange(win); switch(sbcode) { case SB_LINEUP: if (sbpos > 0) { WindowSetVScrollPos(win, sbpos - 1); WindowInvalidate(win); } break; case SB_LINEDOWN: if (sbpos < range) { WindowSetVScrollPos(win, sbpos + 1); WindowInvalidate(win); } break; case SB_PAGEUP: if (sbpos > 0) { sbpos -= (rc.H - 1); sbpos = (sbpos < 0) ? 0 : sbpos; WindowSetVScrollPos(win, sbpos); WindowInvalidate(win); } break; case SB_PAGEDOWN: if (sbpos < range) { sbpos += (rc.H - 1); sbpos = (sbpos > range) ? range : sbpos; WindowSetVScrollPos(win, sbpos); WindowInvalidate(win); } break; case SB_THUMBTRACK: WindowInvalidate(win); break; } }
/* --------------------------------------------------------------------- * CbDropdownCalcPos * Recalculate Listbox position * --------------------------------------------------------------------- */ static void CbDropdownCalcPos(CUIWINDOW* win) { CUIRECT rc; COMBOBOXDATA* data = (COMBOBOXDATA*) win->InstData; int range; int pos; if (!data) return; if (win->IsCreated) { WindowGetClientRect(win, &rc); range = data->NumItems - rc.H; if (range < 0) { WindowSetVScrollRange(win, 0); WindowSetVScrollPos(win, 0); } else { WindowSetVScrollRange(win, range); pos = WindowGetVScrollPos(win); if (data->SelIndex < 0) { WindowSetVScrollPos(win, 0); } else if (data->SelIndex - pos >= rc.H) { WindowSetVScrollPos(win, data->SelIndex - rc.H + 1); } else if (data->SelIndex - pos < 0) { WindowSetVScrollPos(win, data->SelIndex); } } } }
/* --------------------------------------------------------------------- * TerminalKeyHook * Handle EVENT_KEY events * --------------------------------------------------------------------- */ static int TerminalKeyHook(void* w, int key) { CUIWINDOW* win = (CUIWINDOW*) w; TERMINALDATA* data = (TERMINALDATA*) win->InstData; CUIRECT rc; int yrange; int yscroll; if (!data) return FALSE; WindowGetClientRect(win, &rc); yscroll = WindowGetVScrollPos(win); yrange = WindowGetVScrollRange(win); if (win->IsEnabled) { /* if the key is processed by the custom callback hook, we are over and done with it, else processing continues */ if (data->PreKeyHook) { if (data->PreKeyHook(data->PreKeyTarget, win, key)) { return TRUE; } } switch(key) { case KEY_DOWN: if (yscroll < yrange) { WindowSetVScrollPos(win, yscroll + 1); WindowInvalidate(win); TerminalCursorOnOff(win); } return TRUE; case KEY_UP: if (yscroll > 0) { WindowSetVScrollPos(win, yscroll - 1); WindowInvalidate(win); TerminalCursorOnOff(win); } return TRUE; case KEY_NPAGE: if (yscroll < yrange) { yscroll += (rc.H - 1); if (yscroll > yrange) { yscroll = yrange; } WindowSetVScrollPos(win, yscroll); WindowInvalidate(win); TerminalCursorOnOff(win); } return TRUE; case KEY_PPAGE: if (yscroll > 0) { yscroll -= (rc.H - 1); if (yscroll < 0) { yscroll = 0; } WindowSetVScrollPos(win, yscroll); WindowInvalidate(win); TerminalCursorOnOff(win); } return TRUE; case KEY_HOME: if (yscroll > 0) { WindowSetVScrollPos(win, 0); WindowInvalidate(win); TerminalCursorOnOff(win); } return TRUE; case KEY_END: if (yscroll < yrange) { WindowSetVScrollPos(win, yrange); WindowInvalidate(win); TerminalCursorOnOff(win); } return TRUE; default: if (data->CoProc) { if ((key >= KEY_SPACE) && (key <= 255)) { wchar_t c = (wchar_t) key; TerminalCoWrite(data->CoProc, &c, 1); return TRUE; } else if (key == KEY_RETURN) { TerminalCoWrite(data->CoProc, _T("\n"), 1); return TRUE; } } if (data->PostKeyHook) { if (data->PostKeyHook(data->PostKeyTarget, win, key)) { return TRUE; } } } } return FALSE; }