Direct mode (#23)
* update documentation * Fix typo * Added some examples * changed window names * Minor fix * renamed callback setters (added _set_) Direct / Poll Mode for asking events: bool mfb_is_window_active(struct Window *window); unsigned mfb_get_window_width(struct Window *window); unsigned mfb_get_window_height(struct Window *window); int mfb_get_mouse_x(struct Window *window); // Last mouse pos X int mfb_get_mouse_y(struct Window *window); // Last mouse pos Y float mfb_get_mouse_scrool_x(struct Window *window); // Mouse wheel X as a sum. When you call this function it resets. float mfb_get_mouse_scrool_y(struct Window *window); // Mouse wheel Y as a sum. When you call this function it resets. const uint8_t * mfb_get_mouse_button_buffer(struct Window *window); // One byte for every button. Press (1), Release 0. const uint8_t * mfb_get_key_buffer(struct Window *window); // One byte for every key. Press (1), Release 0. * Minor fixes * Fixes related to mouse poll * Minor fix on Win64
This commit is contained in:

committed by
Daniel Collin

parent
25a440f822
commit
cdaa54f5d6
@ -19,7 +19,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LRESULT res = 0;
|
||||
|
||||
SWindowData *window_data = (SWindowData *) GetWindowLongPtr(hWnd, GWL_USERDATA);
|
||||
SWindowData *window_data = (SWindowData *) GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
||||
SWindowData_Win *window_data_win = 0x0;
|
||||
if(window_data != 0x0) {
|
||||
window_data_win = (SWindowData_Win *) window_data->specific;
|
||||
@ -70,14 +70,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
case WM_SYSKEYUP:
|
||||
{
|
||||
if(window_data) {
|
||||
Key kb_key = translate_key((unsigned int)wParam, (unsigned long)lParam);
|
||||
Key key_code = translate_key((unsigned int)wParam, (unsigned long)lParam);
|
||||
int is_pressed = !((lParam >> 31) & 1);
|
||||
window_data->mod_keys = translate_mod();
|
||||
|
||||
if (kb_key == KB_KEY_UNKNOWN)
|
||||
if (key_code == KB_KEY_UNKNOWN)
|
||||
return FALSE;
|
||||
|
||||
kCall(keyboard_func, kb_key, window_data->mod_keys, is_pressed);
|
||||
window_data->key_status[key_code] = is_pressed;
|
||||
kCall(keyboard_func, key_code, window_data->mod_keys, is_pressed);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -169,7 +170,9 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
tme.hwndTrack = hWnd;
|
||||
TrackMouseEvent(&tme);
|
||||
}
|
||||
kCall(mouse_move_func, ((int)(short)LOWORD(lParam)), ((int)(short)HIWORD(lParam)));
|
||||
window_data->mouse_pos_x = (int)(short) LOWORD(lParam);
|
||||
window_data->mouse_pos_y = (int)(short) HIWORD(lParam);
|
||||
kCall(mouse_move_func, window_data->mouse_pos_x, window_data->mouse_pos_y);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -194,12 +197,14 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
case WM_SETFOCUS:
|
||||
if(window_data) {
|
||||
window_data->is_active = true;
|
||||
kCall(active_func, true);
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_KILLFOCUS:
|
||||
if(window_data) {
|
||||
window_data->is_active = false;
|
||||
kCall(active_func, false);
|
||||
}
|
||||
break;
|
||||
@ -215,7 +220,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct Window *mfb_open_ex(const char *title, int width, int height, int flags) {
|
||||
struct Window *mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags) {
|
||||
RECT rect = { 0 };
|
||||
int x, y;
|
||||
|
||||
@ -241,7 +246,7 @@ struct Window *mfb_open_ex(const char *title, int width, int height, int flags)
|
||||
rect.bottom = GetSystemMetrics(SM_CYSCREEN);
|
||||
s_window_style = WS_POPUP & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU);
|
||||
|
||||
DEVMODE settings;
|
||||
DEVMODE settings = { 0 };
|
||||
EnumDisplaySettings(0, 0, &settings);
|
||||
settings.dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
|
||||
settings.dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
|
||||
@ -275,7 +280,7 @@ struct Window *mfb_open_ex(const char *title, int width, int height, int flags)
|
||||
rect.right += rect.left;
|
||||
rect.left = 0;
|
||||
}
|
||||
if (rect.bottom > height) {
|
||||
if (rect.bottom > (LONG) height) {
|
||||
height -= (rect.bottom - height);
|
||||
rect.bottom += (rect.bottom - height);
|
||||
rect.top = 0;
|
||||
@ -342,18 +347,18 @@ struct Window *mfb_open_ex(const char *title, int width, int height, int flags)
|
||||
|
||||
window_data_win->hdc = GetDC(window_data_win->window);
|
||||
|
||||
mfb_keyboard_callback((struct Window *) window_data, keyboard_default);
|
||||
mfb_set_keyboard_callback((struct Window *) window_data, keyboard_default);
|
||||
|
||||
return (struct Window *) window_data;
|
||||
}
|
||||
|
||||
struct Window *mfb_open(const char *title, int width, int height) {
|
||||
struct Window *mfb_open(const char *title, unsigned width, unsigned height) {
|
||||
return mfb_open_ex(title, width, height, 0);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
UpdateState mfb_update(struct Window *window, void* buffer)
|
||||
UpdateState mfb_update(struct Window *window, void *buffer)
|
||||
{
|
||||
MSG msg;
|
||||
|
||||
@ -432,135 +437,135 @@ uint32_t translate_mod() {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
extern short int keycodes[512];
|
||||
extern short int g_keycodes[512];
|
||||
|
||||
void init_keycodes() {
|
||||
|
||||
// Clear keys
|
||||
for (size_t i = 0; i < sizeof(keycodes) / sizeof(keycodes[0]); ++i)
|
||||
keycodes[i] = 0;
|
||||
for (size_t i = 0; i < sizeof(g_keycodes) / sizeof(g_keycodes[0]); ++i)
|
||||
g_keycodes[i] = 0;
|
||||
|
||||
keycodes[0x00B] = KB_KEY_0;
|
||||
keycodes[0x002] = KB_KEY_1;
|
||||
keycodes[0x003] = KB_KEY_2;
|
||||
keycodes[0x004] = KB_KEY_3;
|
||||
keycodes[0x005] = KB_KEY_4;
|
||||
keycodes[0x006] = KB_KEY_5;
|
||||
keycodes[0x007] = KB_KEY_6;
|
||||
keycodes[0x008] = KB_KEY_7;
|
||||
keycodes[0x009] = KB_KEY_8;
|
||||
keycodes[0x00A] = KB_KEY_9;
|
||||
keycodes[0x01E] = KB_KEY_A;
|
||||
keycodes[0x030] = KB_KEY_B;
|
||||
keycodes[0x02E] = KB_KEY_C;
|
||||
keycodes[0x020] = KB_KEY_D;
|
||||
keycodes[0x012] = KB_KEY_E;
|
||||
keycodes[0x021] = KB_KEY_F;
|
||||
keycodes[0x022] = KB_KEY_G;
|
||||
keycodes[0x023] = KB_KEY_H;
|
||||
keycodes[0x017] = KB_KEY_I;
|
||||
keycodes[0x024] = KB_KEY_J;
|
||||
keycodes[0x025] = KB_KEY_K;
|
||||
keycodes[0x026] = KB_KEY_L;
|
||||
keycodes[0x032] = KB_KEY_M;
|
||||
keycodes[0x031] = KB_KEY_N;
|
||||
keycodes[0x018] = KB_KEY_O;
|
||||
keycodes[0x019] = KB_KEY_P;
|
||||
keycodes[0x010] = KB_KEY_Q;
|
||||
keycodes[0x013] = KB_KEY_R;
|
||||
keycodes[0x01F] = KB_KEY_S;
|
||||
keycodes[0x014] = KB_KEY_T;
|
||||
keycodes[0x016] = KB_KEY_U;
|
||||
keycodes[0x02F] = KB_KEY_V;
|
||||
keycodes[0x011] = KB_KEY_W;
|
||||
keycodes[0x02D] = KB_KEY_X;
|
||||
keycodes[0x015] = KB_KEY_Y;
|
||||
keycodes[0x02C] = KB_KEY_Z;
|
||||
g_keycodes[0x00B] = KB_KEY_0;
|
||||
g_keycodes[0x002] = KB_KEY_1;
|
||||
g_keycodes[0x003] = KB_KEY_2;
|
||||
g_keycodes[0x004] = KB_KEY_3;
|
||||
g_keycodes[0x005] = KB_KEY_4;
|
||||
g_keycodes[0x006] = KB_KEY_5;
|
||||
g_keycodes[0x007] = KB_KEY_6;
|
||||
g_keycodes[0x008] = KB_KEY_7;
|
||||
g_keycodes[0x009] = KB_KEY_8;
|
||||
g_keycodes[0x00A] = KB_KEY_9;
|
||||
g_keycodes[0x01E] = KB_KEY_A;
|
||||
g_keycodes[0x030] = KB_KEY_B;
|
||||
g_keycodes[0x02E] = KB_KEY_C;
|
||||
g_keycodes[0x020] = KB_KEY_D;
|
||||
g_keycodes[0x012] = KB_KEY_E;
|
||||
g_keycodes[0x021] = KB_KEY_F;
|
||||
g_keycodes[0x022] = KB_KEY_G;
|
||||
g_keycodes[0x023] = KB_KEY_H;
|
||||
g_keycodes[0x017] = KB_KEY_I;
|
||||
g_keycodes[0x024] = KB_KEY_J;
|
||||
g_keycodes[0x025] = KB_KEY_K;
|
||||
g_keycodes[0x026] = KB_KEY_L;
|
||||
g_keycodes[0x032] = KB_KEY_M;
|
||||
g_keycodes[0x031] = KB_KEY_N;
|
||||
g_keycodes[0x018] = KB_KEY_O;
|
||||
g_keycodes[0x019] = KB_KEY_P;
|
||||
g_keycodes[0x010] = KB_KEY_Q;
|
||||
g_keycodes[0x013] = KB_KEY_R;
|
||||
g_keycodes[0x01F] = KB_KEY_S;
|
||||
g_keycodes[0x014] = KB_KEY_T;
|
||||
g_keycodes[0x016] = KB_KEY_U;
|
||||
g_keycodes[0x02F] = KB_KEY_V;
|
||||
g_keycodes[0x011] = KB_KEY_W;
|
||||
g_keycodes[0x02D] = KB_KEY_X;
|
||||
g_keycodes[0x015] = KB_KEY_Y;
|
||||
g_keycodes[0x02C] = KB_KEY_Z;
|
||||
|
||||
keycodes[0x028] = KB_KEY_APOSTROPHE;
|
||||
keycodes[0x02B] = KB_KEY_BACKSLASH;
|
||||
keycodes[0x033] = KB_KEY_COMMA;
|
||||
keycodes[0x00D] = KB_KEY_EQUAL;
|
||||
keycodes[0x029] = KB_KEY_GRAVE_ACCENT;
|
||||
keycodes[0x01A] = KB_KEY_LEFT_BRACKET;
|
||||
keycodes[0x00C] = KB_KEY_MINUS;
|
||||
keycodes[0x034] = KB_KEY_PERIOD;
|
||||
keycodes[0x01B] = KB_KEY_RIGHT_BRACKET;
|
||||
keycodes[0x027] = KB_KEY_SEMICOLON;
|
||||
keycodes[0x035] = KB_KEY_SLASH;
|
||||
keycodes[0x056] = KB_KEY_WORLD_2;
|
||||
g_keycodes[0x028] = KB_KEY_APOSTROPHE;
|
||||
g_keycodes[0x02B] = KB_KEY_BACKSLASH;
|
||||
g_keycodes[0x033] = KB_KEY_COMMA;
|
||||
g_keycodes[0x00D] = KB_KEY_EQUAL;
|
||||
g_keycodes[0x029] = KB_KEY_GRAVE_ACCENT;
|
||||
g_keycodes[0x01A] = KB_KEY_LEFT_BRACKET;
|
||||
g_keycodes[0x00C] = KB_KEY_MINUS;
|
||||
g_keycodes[0x034] = KB_KEY_PERIOD;
|
||||
g_keycodes[0x01B] = KB_KEY_RIGHT_BRACKET;
|
||||
g_keycodes[0x027] = KB_KEY_SEMICOLON;
|
||||
g_keycodes[0x035] = KB_KEY_SLASH;
|
||||
g_keycodes[0x056] = KB_KEY_WORLD_2;
|
||||
|
||||
keycodes[0x00E] = KB_KEY_BACKSPACE;
|
||||
keycodes[0x153] = KB_KEY_DELETE;
|
||||
keycodes[0x14F] = KB_KEY_END;
|
||||
keycodes[0x01C] = KB_KEY_ENTER;
|
||||
keycodes[0x001] = KB_KEY_ESCAPE;
|
||||
keycodes[0x147] = KB_KEY_HOME;
|
||||
keycodes[0x152] = KB_KEY_INSERT;
|
||||
keycodes[0x15D] = KB_KEY_MENU;
|
||||
keycodes[0x151] = KB_KEY_PAGE_DOWN;
|
||||
keycodes[0x149] = KB_KEY_PAGE_UP;
|
||||
keycodes[0x045] = KB_KEY_PAUSE;
|
||||
keycodes[0x146] = KB_KEY_PAUSE;
|
||||
keycodes[0x039] = KB_KEY_SPACE;
|
||||
keycodes[0x00F] = KB_KEY_TAB;
|
||||
keycodes[0x03A] = KB_KEY_CAPS_LOCK;
|
||||
keycodes[0x145] = KB_KEY_NUM_LOCK;
|
||||
keycodes[0x046] = KB_KEY_SCROLL_LOCK;
|
||||
keycodes[0x03B] = KB_KEY_F1;
|
||||
keycodes[0x03C] = KB_KEY_F2;
|
||||
keycodes[0x03D] = KB_KEY_F3;
|
||||
keycodes[0x03E] = KB_KEY_F4;
|
||||
keycodes[0x03F] = KB_KEY_F5;
|
||||
keycodes[0x040] = KB_KEY_F6;
|
||||
keycodes[0x041] = KB_KEY_F7;
|
||||
keycodes[0x042] = KB_KEY_F8;
|
||||
keycodes[0x043] = KB_KEY_F9;
|
||||
keycodes[0x044] = KB_KEY_F10;
|
||||
keycodes[0x057] = KB_KEY_F11;
|
||||
keycodes[0x058] = KB_KEY_F12;
|
||||
keycodes[0x064] = KB_KEY_F13;
|
||||
keycodes[0x065] = KB_KEY_F14;
|
||||
keycodes[0x066] = KB_KEY_F15;
|
||||
keycodes[0x067] = KB_KEY_F16;
|
||||
keycodes[0x068] = KB_KEY_F17;
|
||||
keycodes[0x069] = KB_KEY_F18;
|
||||
keycodes[0x06A] = KB_KEY_F19;
|
||||
keycodes[0x06B] = KB_KEY_F20;
|
||||
keycodes[0x06C] = KB_KEY_F21;
|
||||
keycodes[0x06D] = KB_KEY_F22;
|
||||
keycodes[0x06E] = KB_KEY_F23;
|
||||
keycodes[0x076] = KB_KEY_F24;
|
||||
keycodes[0x038] = KB_KEY_LEFT_ALT;
|
||||
keycodes[0x01D] = KB_KEY_LEFT_CONTROL;
|
||||
keycodes[0x02A] = KB_KEY_LEFT_SHIFT;
|
||||
keycodes[0x15B] = KB_KEY_LEFT_SUPER;
|
||||
keycodes[0x137] = KB_KEY_PRINT_SCREEN;
|
||||
keycodes[0x138] = KB_KEY_RIGHT_ALT;
|
||||
keycodes[0x11D] = KB_KEY_RIGHT_CONTROL;
|
||||
keycodes[0x036] = KB_KEY_RIGHT_SHIFT;
|
||||
keycodes[0x15C] = KB_KEY_RIGHT_SUPER;
|
||||
keycodes[0x150] = KB_KEY_DOWN;
|
||||
keycodes[0x14B] = KB_KEY_LEFT;
|
||||
keycodes[0x14D] = KB_KEY_RIGHT;
|
||||
keycodes[0x148] = KB_KEY_UP;
|
||||
g_keycodes[0x00E] = KB_KEY_BACKSPACE;
|
||||
g_keycodes[0x153] = KB_KEY_DELETE;
|
||||
g_keycodes[0x14F] = KB_KEY_END;
|
||||
g_keycodes[0x01C] = KB_KEY_ENTER;
|
||||
g_keycodes[0x001] = KB_KEY_ESCAPE;
|
||||
g_keycodes[0x147] = KB_KEY_HOME;
|
||||
g_keycodes[0x152] = KB_KEY_INSERT;
|
||||
g_keycodes[0x15D] = KB_KEY_MENU;
|
||||
g_keycodes[0x151] = KB_KEY_PAGE_DOWN;
|
||||
g_keycodes[0x149] = KB_KEY_PAGE_UP;
|
||||
g_keycodes[0x045] = KB_KEY_PAUSE;
|
||||
g_keycodes[0x146] = KB_KEY_PAUSE;
|
||||
g_keycodes[0x039] = KB_KEY_SPACE;
|
||||
g_keycodes[0x00F] = KB_KEY_TAB;
|
||||
g_keycodes[0x03A] = KB_KEY_CAPS_LOCK;
|
||||
g_keycodes[0x145] = KB_KEY_NUM_LOCK;
|
||||
g_keycodes[0x046] = KB_KEY_SCROLL_LOCK;
|
||||
g_keycodes[0x03B] = KB_KEY_F1;
|
||||
g_keycodes[0x03C] = KB_KEY_F2;
|
||||
g_keycodes[0x03D] = KB_KEY_F3;
|
||||
g_keycodes[0x03E] = KB_KEY_F4;
|
||||
g_keycodes[0x03F] = KB_KEY_F5;
|
||||
g_keycodes[0x040] = KB_KEY_F6;
|
||||
g_keycodes[0x041] = KB_KEY_F7;
|
||||
g_keycodes[0x042] = KB_KEY_F8;
|
||||
g_keycodes[0x043] = KB_KEY_F9;
|
||||
g_keycodes[0x044] = KB_KEY_F10;
|
||||
g_keycodes[0x057] = KB_KEY_F11;
|
||||
g_keycodes[0x058] = KB_KEY_F12;
|
||||
g_keycodes[0x064] = KB_KEY_F13;
|
||||
g_keycodes[0x065] = KB_KEY_F14;
|
||||
g_keycodes[0x066] = KB_KEY_F15;
|
||||
g_keycodes[0x067] = KB_KEY_F16;
|
||||
g_keycodes[0x068] = KB_KEY_F17;
|
||||
g_keycodes[0x069] = KB_KEY_F18;
|
||||
g_keycodes[0x06A] = KB_KEY_F19;
|
||||
g_keycodes[0x06B] = KB_KEY_F20;
|
||||
g_keycodes[0x06C] = KB_KEY_F21;
|
||||
g_keycodes[0x06D] = KB_KEY_F22;
|
||||
g_keycodes[0x06E] = KB_KEY_F23;
|
||||
g_keycodes[0x076] = KB_KEY_F24;
|
||||
g_keycodes[0x038] = KB_KEY_LEFT_ALT;
|
||||
g_keycodes[0x01D] = KB_KEY_LEFT_CONTROL;
|
||||
g_keycodes[0x02A] = KB_KEY_LEFT_SHIFT;
|
||||
g_keycodes[0x15B] = KB_KEY_LEFT_SUPER;
|
||||
g_keycodes[0x137] = KB_KEY_PRINT_SCREEN;
|
||||
g_keycodes[0x138] = KB_KEY_RIGHT_ALT;
|
||||
g_keycodes[0x11D] = KB_KEY_RIGHT_CONTROL;
|
||||
g_keycodes[0x036] = KB_KEY_RIGHT_SHIFT;
|
||||
g_keycodes[0x15C] = KB_KEY_RIGHT_SUPER;
|
||||
g_keycodes[0x150] = KB_KEY_DOWN;
|
||||
g_keycodes[0x14B] = KB_KEY_LEFT;
|
||||
g_keycodes[0x14D] = KB_KEY_RIGHT;
|
||||
g_keycodes[0x148] = KB_KEY_UP;
|
||||
|
||||
keycodes[0x052] = KB_KEY_KP_0;
|
||||
keycodes[0x04F] = KB_KEY_KP_1;
|
||||
keycodes[0x050] = KB_KEY_KP_2;
|
||||
keycodes[0x051] = KB_KEY_KP_3;
|
||||
keycodes[0x04B] = KB_KEY_KP_4;
|
||||
keycodes[0x04C] = KB_KEY_KP_5;
|
||||
keycodes[0x04D] = KB_KEY_KP_6;
|
||||
keycodes[0x047] = KB_KEY_KP_7;
|
||||
keycodes[0x048] = KB_KEY_KP_8;
|
||||
keycodes[0x049] = KB_KEY_KP_9;
|
||||
keycodes[0x04E] = KB_KEY_KP_ADD;
|
||||
keycodes[0x053] = KB_KEY_KP_DECIMAL;
|
||||
keycodes[0x135] = KB_KEY_KP_DIVIDE;
|
||||
keycodes[0x11C] = KB_KEY_KP_ENTER;
|
||||
keycodes[0x037] = KB_KEY_KP_MULTIPLY;
|
||||
keycodes[0x04A] = KB_KEY_KP_SUBTRACT;
|
||||
g_keycodes[0x052] = KB_KEY_KP_0;
|
||||
g_keycodes[0x04F] = KB_KEY_KP_1;
|
||||
g_keycodes[0x050] = KB_KEY_KP_2;
|
||||
g_keycodes[0x051] = KB_KEY_KP_3;
|
||||
g_keycodes[0x04B] = KB_KEY_KP_4;
|
||||
g_keycodes[0x04C] = KB_KEY_KP_5;
|
||||
g_keycodes[0x04D] = KB_KEY_KP_6;
|
||||
g_keycodes[0x047] = KB_KEY_KP_7;
|
||||
g_keycodes[0x048] = KB_KEY_KP_8;
|
||||
g_keycodes[0x049] = KB_KEY_KP_9;
|
||||
g_keycodes[0x04E] = KB_KEY_KP_ADD;
|
||||
g_keycodes[0x053] = KB_KEY_KP_DECIMAL;
|
||||
g_keycodes[0x135] = KB_KEY_KP_DIVIDE;
|
||||
g_keycodes[0x11C] = KB_KEY_KP_ENTER;
|
||||
g_keycodes[0x037] = KB_KEY_KP_MULTIPLY;
|
||||
g_keycodes[0x04A] = KB_KEY_KP_SUBTRACT;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -585,7 +590,7 @@ Key translate_key(unsigned int wParam, unsigned long lParam) {
|
||||
if (wParam == VK_PROCESSKEY)
|
||||
return KB_KEY_UNKNOWN;
|
||||
|
||||
return (Key) keycodes[HIWORD(lParam) & 0x1FF];
|
||||
return (Key) g_keycodes[HIWORD(lParam) & 0x1FF];
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
Reference in New Issue
Block a user