/// <summary> /// Detect keyboard hit, no wait /// </summary> /// <returns>The key pressed or -1 if not(ASC-II not guaranteed, platform specific).</returns> int kb_hit() { #if defined(_WIN32) if (_kbhit()) return _getch(); else return -1; #elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__)) //set_conio_terminal_mode(); struct timeval tv = { 0L, 0L }; fd_set fds; FD_ZERO(&fds); FD_SET(0, &fds); if (select(1, &fds, NULL, NULL, &tv)) { return get_last_key(); } else { return -1; } #else return -1; // unsupported OS #endif }
int Atari_Keyboard(void) { int keycode; prockb(); keycode = get_last_key(); return keycode; }
void pong(void) { enable_computer = 1; paddle_touch_id[L] = -1; paddle_touch_id[R] = -1; // middle line fb_add_rect(0, fb_height/2 - 1, fb_width, 1, WHITE); score[L] = fb_add_text(0, fb_height/2 - SIZE_EXTRA*16 - 20, WHITE, SIZE_EXTRA, "0"); score[R] = fb_add_text(0, fb_height/2 + 20, WHITE, SIZE_EXTRA, "0"); paddles[L] = fb_add_rect(100, PADDLE_Y, PADDLE_W, PADDLE_H, WHITE); paddles[R] = fb_add_rect(100, fb_height-PADDLE_Y-PADDLE_H, PADDLE_W, PADDLE_H, WHITE); ball = fb_add_rect(0, 0, BALL_W, BALL_W, WHITE); pong_spawn_ball(rand()%2); pong_calc_movement(); add_touch_handler(&pong_touch_handler, NULL); int step = 0; volatile int run = 1; while(run) { switch(get_last_key()) { case KEY_POWER: run = 0; break; case KEY_VOLUMEUP: ball_speed += 5; pong_spawn_ball(rand()%2); pong_calc_movement(); step = 0; break; case KEY_VOLUMEDOWN: if(ball_speed > 5) ball_speed -= 5; pong_spawn_ball(rand()%2); pong_calc_movement(); step = 0; break; } step = pong_do_movement(step); fb_draw(); usleep(1000); } rm_touch_handler(&pong_touch_handler, NULL); list_clear(&movement_steps, &free); }
int wait_for_key(void) { int res = -1; while(res == -1) { res = get_last_key(); usleep(10000); } return res; }
void pong(void) { enable_computer = 1; paddle_touch_id[L] = -1; paddle_touch_id[R] = -1; score_val[L] = 0; score_val[R] = 0; fb_set_background(BLACK); fb_text_proto *p = fb_text_create(0, 0, GRAYISH, SIZE_SMALL, "Press power button to go back"); p->style = STYLE_ITALIC; fb_text *help = fb_text_finalize(p); help->y = fb_height/2 - help->h*1.5; center_text(help, 0, -1, fb_width, -1); // middle line fb_add_rect(0, fb_height/2 - 1, fb_width, 1, WHITE); score[L] = fb_add_text(0, 0, WHITE, SIZE_EXTRA, "0"); score[L]->y = fb_height/2 - score[L]->h - 20*DPI_MUL; score[R] = fb_add_text(0, fb_height/2 + 20*DPI_MUL, WHITE, SIZE_EXTRA, "0"); paddles[L] = fb_add_rect(100, PADDLE_Y, PADDLE_W, PADDLE_H, WHITE); paddles[R] = fb_add_rect(100, fb_height-PADDLE_Y-PADDLE_H, PADDLE_W, PADDLE_H, WHITE); ball = fb_add_rect(0, 0, BALL_W, BALL_W, WHITE); pong_spawn_ball(rand()%2); pong_calc_movement(); add_touch_handler(&pong_touch_handler, NULL); int step = 0; volatile int run = 1; while(run) { switch(get_last_key()) { case KEY_POWER: run = 0; break; case KEY_VOLUMEUP: ball_speed += 5; pong_spawn_ball(rand()%2); pong_calc_movement(); step = 0; break; case KEY_VOLUMEDOWN: if(ball_speed > 5) ball_speed -= 5; pong_spawn_ball(rand()%2); pong_calc_movement(); step = 0; break; } step = pong_do_movement(step); fb_request_draw(); usleep(16000); } rm_touch_handler(&pong_touch_handler, NULL); list_clear(&movement_steps, &free); }
/******************************************************************************* * * FUNCTION: ChildWndProc(HWND, unsigned, WORD, LONG) * * PURPOSE: Processes messages for the child windows. * * WM_COMMAND - process the application menu * WM_PAINT - Paint the main window * WM_DESTROY - post a quit message and return * */ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: g_pChildWnd = HeapAlloc(GetProcessHeap(), 0, sizeof(ChildWnd)); if (!g_pChildWnd) return 0; LoadStringW(hInst, IDS_REGISTRY_ROOT_NAME, g_pChildWnd->szPath, MAX_PATH); g_pChildWnd->nSplitPos = 250; g_pChildWnd->hWnd = hWnd; g_pChildWnd->hTreeWnd = CreateTreeView(hWnd, g_pChildWnd->szPath, TREE_WINDOW); g_pChildWnd->hListWnd = CreateListView(hWnd, LIST_WINDOW/*, g_pChildWnd->szPath*/); g_pChildWnd->nFocusPanel = 1; SetFocus(g_pChildWnd->hTreeWnd); get_last_key(g_pChildWnd->hTreeWnd); break; case WM_COMMAND: if (!_CmdWndProc(hWnd, message, wParam, lParam)) { goto def; } break; case WM_PAINT: OnPaint(hWnd); return 0; case WM_SETCURSOR: if (LOWORD(lParam) == HTCLIENT) { POINT pt; GetCursorPos(&pt); ScreenToClient(hWnd, &pt); if (pt.x>=g_pChildWnd->nSplitPos-SPLIT_WIDTH/2 && pt.x<g_pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) { SetCursor(LoadCursorW(0, (LPCWSTR)IDC_SIZEWE)); return TRUE; } } goto def; case WM_DESTROY: set_last_key(g_pChildWnd->hTreeWnd); HeapFree(GetProcessHeap(), 0, g_pChildWnd); g_pChildWnd = NULL; PostQuitMessage(0); break; case WM_LBUTTONDOWN: { RECT rt; int x = (short)LOWORD(lParam); GetClientRect(hWnd, &rt); if (x>=g_pChildWnd->nSplitPos-SPLIT_WIDTH/2 && x<g_pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) { last_split = g_pChildWnd->nSplitPos; draw_splitbar(hWnd, last_split); SetCapture(hWnd); } break; } /* WM_RBUTTONDOWN sets the splitbar the same way as WM_LBUTTONUP */ case WM_LBUTTONUP: case WM_RBUTTONDOWN: if (GetCapture() == hWnd) { finish_splitbar(hWnd, LOWORD(lParam)); } break; case WM_CAPTURECHANGED: if (GetCapture()==hWnd && last_split>=0) draw_splitbar(hWnd, last_split); break; case WM_KEYDOWN: if (wParam == VK_ESCAPE) if (GetCapture() == hWnd) { RECT rt; draw_splitbar(hWnd, last_split); GetClientRect(hWnd, &rt); ResizeWnd(rt.right, rt.bottom); last_split = -1; ReleaseCapture(); SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW)); } break; case WM_MOUSEMOVE: if (GetCapture() == hWnd) { RECT rt; int x = LOWORD(lParam); HDC hdc = GetDC(hWnd); GetClientRect(hWnd, &rt); rt.left = last_split-SPLIT_WIDTH/2; rt.right = last_split+SPLIT_WIDTH/2+1; InvertRect(hdc, &rt); last_split = x; rt.left = x-SPLIT_WIDTH/2; rt.right = x+SPLIT_WIDTH/2+1; InvertRect(hdc, &rt); ReleaseDC(hWnd, hdc); } break; case WM_SETFOCUS: if (g_pChildWnd != NULL) { SetFocus(g_pChildWnd->nFocusPanel? g_pChildWnd->hListWnd: g_pChildWnd->hTreeWnd); } break; case WM_TIMER: break; case WM_NOTIFY: if (((int)wParam == TREE_WINDOW) && (g_pChildWnd != NULL)) { switch (((LPNMHDR)lParam)->code) { case TVN_ITEMEXPANDINGW: return !OnTreeExpanding(g_pChildWnd->hTreeWnd, (NMTREEVIEWW*)lParam); case TVN_SELCHANGEDW: OnTreeSelectionChanged(g_pChildWnd->hTreeWnd, g_pChildWnd->hListWnd, ((NMTREEVIEWW *)lParam)->itemNew.hItem, TRUE); break; case NM_SETFOCUS: g_pChildWnd->nFocusPanel = 0; break; case NM_RCLICK: { POINT pt; GetCursorPos(&pt); TrackPopupMenu(GetSubMenu(hPopupMenus, PM_NEW), TPM_RIGHTBUTTON, pt.x, pt.y, 0, hFrameWnd, NULL); break; } case TVN_BEGINLABELEDITW: { HKEY hRootKey; LPWSTR path = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); if (!path || !*path) return 1; return 0; } case TVN_ENDLABELEDITW: { HKEY hRootKey; LPNMTVDISPINFOW dispInfo = (LPNMTVDISPINFOW)lParam; LPWSTR path = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); BOOL res = RenameKey(hWnd, hRootKey, path, dispInfo->item.pszText); if (res) { TVITEMEXW item; LPWSTR fullPath = GetPathFullPath(g_pChildWnd->hTreeWnd, dispInfo->item.pszText); item.mask = TVIF_HANDLE | TVIF_TEXT; item.hItem = (HTREEITEM)SendMessageW(g_pChildWnd->hTreeWnd, TVM_GETNEXTITEM, TVGN_CARET, 0); item.pszText = dispInfo->item.pszText; SendMessageW( g_pChildWnd->hTreeWnd, TVM_SETITEMW, 0, (LPARAM)&item ); SendMessageW(hStatusBar, SB_SETTEXTW, 0, (LPARAM)fullPath); HeapFree(GetProcessHeap(), 0, fullPath); } HeapFree(GetProcessHeap(), 0, path); return res; } default: return 0; /* goto def; */ } } else if (((int)wParam == LIST_WINDOW) && (g_pChildWnd != NULL)) { if (((LPNMHDR)lParam)->code == NM_SETFOCUS) { g_pChildWnd->nFocusPanel = 1; } else if (!SendMessageW(g_pChildWnd->hListWnd, WM_NOTIFY_REFLECT, wParam, lParam)) { goto def; } } break; case WM_SIZE: if (wParam != SIZE_MINIMIZED && g_pChildWnd != NULL) { ResizeWnd(LOWORD(lParam), HIWORD(lParam)); } /* fall through */ default: def: return DefWindowProcW(hWnd, message, wParam, lParam); } return 0; }