-
-
Save Rapptz/fef5a9119e3814b3ee69 to your computer and use it in GitHub Desktop.
Command line stuff I used forever ago
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef COMMAND_PROMPT_FUNCTIONS_HPP | |
#define COMMAND_PROMPT_FUNCTIONS_HPP | |
#ifndef CMD_WINDOWS | |
#define CMD_WINDOWS defined(_WIN32) || defined(__WIN32__) || defined (_WIN64) | |
#endif | |
#ifndef CMD_LINUX | |
#define CMD_LINUX defined(__linux__) || defined(__linux) || defined(linux) | |
#endif | |
#if CMD_WINDOWS | |
#ifndef NOMINMAX | |
#define NOMINMAX | |
#endif //NOMINMAX | |
#include <windows.h> | |
#define BLACK 0 | |
#define BLUE 1 | |
#define GREEN 2 | |
#define AQUA 3 | |
#define RED 4 | |
#define PURPLE 5 | |
#define YELLOW 6 | |
#define WHITE 7 | |
#define GRAY 8 | |
#define LIGHTBLUE 9 | |
#define LIGHTGREEN 10 | |
#define LIGHTAQUA 11 | |
#define LIGHTRED 12 | |
#define LIGHTPURPLE 13 | |
#define LIGHTYELLOW 14 | |
#define BRIGHTWHITE 15 | |
//End windows | |
#elif CMD_LINUX | |
#include <cstdio> | |
#define RESET 0 | |
#define BRIGHT 1 | |
#define DIM 2 | |
#define UNDERLINE 3 | |
#define BLINK 4 | |
#define REVERSE 7 | |
#define HIDDEN 8 | |
#define BLACK 0 | |
#define RED 1 | |
#define GREEN 2 | |
#define YELLOW 3 | |
#define BLUE 4 | |
#define MAGENTA 5 | |
#define CYAN 6 | |
#define WHITE 7 | |
//End linux | |
#endif | |
namespace cmd { | |
inline void text_color(int fg,int bg = 0,int attr = 0) { | |
#if CMD_LINUX | |
char command[15]; | |
sprintf(command,"\033[%d;%d;%dm",attr,fg + 30,bg + 40); | |
printf("%s",command); | |
#elif CMD_WINDOWS | |
HANDLE myConsole = GetStdHandle(STD_OUTPUT_HANDLE); | |
SetConsoleTextAttribute(myConsole,(fg+bg*16)); | |
#endif // windows and linux | |
} | |
inline void clear() { | |
#if CMD_WINDOWS | |
COORD topLeft = { 0,0 }; | |
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE); | |
CONSOLE_SCREEN_BUFFER_INFO screen; | |
DWORD written; | |
GetConsoleScreenBufferInfo(console,&screen); | |
FillConsoleOutputCharacterA( | |
console,' ',screen.dwSize.X * screen.dwSize.Y,topLeft,&written | |
); | |
FillConsoleOutputAttribute( | |
console,FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE, | |
screen.dwSize.X * screen.dwSize.Y,topLeft,&written | |
); | |
SetConsoleCursorPosition(console,topLeft); | |
//End of windows | |
#elif CMD_LINUX | |
printf("\x1B[2J\x1B[H"); | |
//End of linux | |
#endif | |
} | |
enum class Key | |
{ | |
Unknown = -1, | |
A = 0, | |
B, | |
C, | |
D, | |
E, | |
F, | |
G, | |
H, | |
I, | |
J, | |
K, | |
L, | |
M, | |
N, | |
O, | |
P, | |
Q, | |
R, | |
S, | |
T, | |
U, | |
V, | |
W, | |
X, | |
Y, | |
Z, | |
Num0, | |
Num1, | |
Num2, | |
Num3, | |
Num4, | |
Num5, | |
Num6, | |
Num7, | |
Num8, | |
Num9, | |
Escape, | |
LControl, | |
LShift, | |
LAlt, | |
LSystem, | |
RControl, | |
RShift, | |
RAlt, | |
RSystem, | |
Menu, | |
LBracket, | |
RBracket, | |
SemiColon, | |
Comma, | |
Period, | |
Quote, | |
Slash, | |
BackSlash, | |
Tilde, | |
Equal, | |
Dash, | |
Space, | |
Return, | |
BackSpace, | |
Tab, | |
PageUp, | |
PageDown, | |
End, | |
Home, | |
Insert, | |
Delete, | |
Add, | |
Subtract, | |
Multiply, | |
Divide, | |
Left, | |
Right, | |
Up, | |
Down, | |
Numpad0, | |
Numpad1, | |
Numpad2, | |
Numpad3, | |
Numpad4, | |
Numpad5, | |
Numpad6, | |
Numpad7, | |
Numpad8, | |
Numpad9, | |
F1, | |
F2, | |
F3, | |
F4, | |
F5, | |
F6, | |
F7, | |
F8, | |
F9, | |
F10, | |
F11, | |
F12, | |
F13, | |
F14, | |
F15, | |
Pause | |
}; | |
inline bool is_key_pressed(Key key) { | |
#if CMD_WINDOWS | |
int vkey = 0; | |
switch (key) | |
{ | |
case Key::A: vkey = 'A'; break; | |
case Key::B: vkey = 'B'; break; | |
case Key::C: vkey = 'C'; break; | |
case Key::D: vkey = 'D'; break; | |
case Key::E: vkey = 'E'; break; | |
case Key::F: vkey = 'F'; break; | |
case Key::G: vkey = 'G'; break; | |
case Key::H: vkey = 'H'; break; | |
case Key::I: vkey = 'I'; break; | |
case Key::J: vkey = 'J'; break; | |
case Key::K: vkey = 'K'; break; | |
case Key::L: vkey = 'L'; break; | |
case Key::M: vkey = 'M'; break; | |
case Key::N: vkey = 'N'; break; | |
case Key::O: vkey = 'O'; break; | |
case Key::P: vkey = 'P'; break; | |
case Key::Q: vkey = 'Q'; break; | |
case Key::R: vkey = 'R'; break; | |
case Key::S: vkey = 'S'; break; | |
case Key::T: vkey = 'T'; break; | |
case Key::U: vkey = 'U'; break; | |
case Key::V: vkey = 'V'; break; | |
case Key::W: vkey = 'W'; break; | |
case Key::X: vkey = 'X'; break; | |
case Key::Y: vkey = 'Y'; break; | |
case Key::Z: vkey = 'Z'; break; | |
case Key::Num0: vkey = '0'; break; | |
case Key::Num1: vkey = '1'; break; | |
case Key::Num2: vkey = '2'; break; | |
case Key::Num3: vkey = '3'; break; | |
case Key::Num4: vkey = '4'; break; | |
case Key::Num5: vkey = '5'; break; | |
case Key::Num6: vkey = '6'; break; | |
case Key::Num7: vkey = '7'; break; | |
case Key::Num8: vkey = '8'; break; | |
case Key::Num9: vkey = '9'; break; | |
case Key::Escape: vkey = VK_ESCAPE; break; | |
case Key::LControl: vkey = VK_LCONTROL; break; | |
case Key::LShift: vkey = VK_LSHIFT; break; | |
case Key::LAlt: vkey = VK_LMENU; break; | |
case Key::LSystem: vkey = VK_LWIN; break; | |
case Key::RControl: vkey = VK_RCONTROL; break; | |
case Key::RShift: vkey = VK_RSHIFT; break; | |
case Key::RAlt: vkey = VK_RMENU; break; | |
case Key::RSystem: vkey = VK_RWIN; break; | |
case Key::Menu: vkey = VK_APPS; break; | |
case Key::LBracket: vkey = VK_OEM_4; break; | |
case Key::RBracket: vkey = VK_OEM_6; break; | |
case Key::SemiColon: vkey = VK_OEM_1; break; | |
case Key::Comma: vkey = VK_OEM_COMMA; break; | |
case Key::Period: vkey = VK_OEM_PERIOD; break; | |
case Key::Quote: vkey = VK_OEM_7; break; | |
case Key::Slash: vkey = VK_OEM_2; break; | |
case Key::BackSlash: vkey = VK_OEM_5; break; | |
case Key::Tilde: vkey = VK_OEM_3; break; | |
case Key::Equal: vkey = VK_OEM_PLUS; break; | |
case Key::Dash: vkey = VK_OEM_MINUS; break; | |
case Key::Space: vkey = VK_SPACE; break; | |
case Key::Return: vkey = VK_RETURN; break; | |
case Key::BackSpace: vkey = VK_BACK; break; | |
case Key::Tab: vkey = VK_TAB; break; | |
case Key::PageUp: vkey = VK_PRIOR; break; | |
case Key::PageDown: vkey = VK_NEXT; break; | |
case Key::End: vkey = VK_END; break; | |
case Key::Home: vkey = VK_HOME; break; | |
case Key::Insert: vkey = VK_INSERT; break; | |
case Key::Delete: vkey = VK_DELETE; break; | |
case Key::Add: vkey = VK_ADD; break; | |
case Key::Subtract: vkey = VK_SUBTRACT; break; | |
case Key::Multiply: vkey = VK_MULTIPLY; break; | |
case Key::Divide: vkey = VK_DIVIDE; break; | |
case Key::Left: vkey = VK_LEFT; break; | |
case Key::Right: vkey = VK_RIGHT; break; | |
case Key::Up: vkey = VK_UP; break; | |
case Key::Down: vkey = VK_DOWN; break; | |
case Key::Numpad0: vkey = VK_NUMPAD0; break; | |
case Key::Numpad1: vkey = VK_NUMPAD1; break; | |
case Key::Numpad2: vkey = VK_NUMPAD2; break; | |
case Key::Numpad3: vkey = VK_NUMPAD3; break; | |
case Key::Numpad4: vkey = VK_NUMPAD4; break; | |
case Key::Numpad5: vkey = VK_NUMPAD5; break; | |
case Key::Numpad6: vkey = VK_NUMPAD6; break; | |
case Key::Numpad7: vkey = VK_NUMPAD7; break; | |
case Key::Numpad8: vkey = VK_NUMPAD8; break; | |
case Key::Numpad9: vkey = VK_NUMPAD9; break; | |
case Key::F1: vkey = VK_F1; break; | |
case Key::F2: vkey = VK_F2; break; | |
case Key::F3: vkey = VK_F3; break; | |
case Key::F4: vkey = VK_F4; break; | |
case Key::F5: vkey = VK_F5; break; | |
case Key::F6: vkey = VK_F6; break; | |
case Key::F7: vkey = VK_F7; break; | |
case Key::F8: vkey = VK_F8; break; | |
case Key::F9: vkey = VK_F9; break; | |
case Key::F10: vkey = VK_F10; break; | |
case Key::F11: vkey = VK_F11; break; | |
case Key::F12: vkey = VK_F12; break; | |
case Key::F13: vkey = VK_F13; break; | |
case Key::F14: vkey = VK_F14; break; | |
case Key::F15: vkey = VK_F16; break; | |
case Key::Pause: vkey = VK_PAUSE; break; | |
default: vkey = 0; break; | |
} | |
return (GetAsyncKeyState(vkey) & 0x8000) != 0; | |
#elif CMD_LINUX | |
#error ... | |
#endif | |
} | |
namespace { | |
bool state = false; | |
} // anon | |
inline bool is_key_held(Key key) { | |
bool pressed = is_key_pressed(key); | |
bool held = false; | |
//Key is pressed | |
if(pressed && !state) { | |
held = false; | |
} | |
//Key is held down | |
if(pressed && state) { | |
held = true; | |
} | |
//Key is released | |
if(!pressed && state) { | |
held = false; | |
} | |
state = pressed; | |
return held; | |
} | |
inline bool is_key_released(Key key) { | |
bool pressed = is_key_pressed(key); | |
bool released = false; | |
//Key is pressed | |
if(pressed && !state) { | |
released = false; | |
} | |
//Key is held down | |
if(pressed && state) { | |
released = false; | |
} | |
//Key is released | |
if(!pressed && state) { | |
released = true; | |
} | |
state = pressed; | |
return released; | |
} | |
inline bool is_key_pressed_once(Key key) { | |
bool pressed = is_key_pressed(key); | |
bool once = false; | |
//Key is pressed | |
if(pressed && !state) { | |
once = true; | |
} | |
//Key is held down | |
if(pressed && state) { | |
once = false; | |
} | |
//Key is released | |
if(!pressed && state) { | |
once = false; | |
} | |
state = pressed; | |
return once; | |
} | |
} //namespace cmd | |
#endif //COMMAND_PROMPT_FUNCTIONS_HPP |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment