Working win32 API implementation with mouse
(no keyboard yet)
This commit is contained in:
parent
aa73e76e67
commit
9ac4267468
@ -171,6 +171,7 @@ enum ERROR_CODES
|
|||||||
ERROR_MISSING_DIRECTORY, ///< Unable to return to the original "current directory" on program exit
|
ERROR_MISSING_DIRECTORY, ///< Unable to return to the original "current directory" on program exit
|
||||||
ERROR_INI_CORRUPTED, ///< File gfx2.ini couldn't be parsed
|
ERROR_INI_CORRUPTED, ///< File gfx2.ini couldn't be parsed
|
||||||
ERROR_SAVING_INI, ///< Error while writing gfx2.ini
|
ERROR_SAVING_INI, ///< Error while writing gfx2.ini
|
||||||
|
ERROR_INIT, ///< Program initialization error
|
||||||
ERROR_SORRY_SORRY_SORRY ///< (Page allocation error that shouldn't ever happen, now)
|
ERROR_SORRY_SORRY_SORRY ///< (Page allocation error that shouldn't ever happen, now)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -402,6 +402,8 @@ try_again:
|
|||||||
{
|
{
|
||||||
#if defined(USE_SDL) || defined(USE_SDL2)
|
#if defined(USE_SDL) || defined(USE_SDL2)
|
||||||
Set_mode_SDL(&width, &height,fullscreen);
|
Set_mode_SDL(&width, &height,fullscreen);
|
||||||
|
#else
|
||||||
|
GFX2_Set_mode(&width, &height, fullscreen);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
39
src/input.c
39
src/input.c
@ -393,6 +393,7 @@ int Handle_mouse_release(SDL_MouseButtonEvent event)
|
|||||||
|
|
||||||
// Keyboard management
|
// Keyboard management
|
||||||
|
|
||||||
|
#if defined(USE_SDL) || defined(USE_SDL2)
|
||||||
int Handle_key_press(SDL_KeyboardEvent event)
|
int Handle_key_press(SDL_KeyboardEvent event)
|
||||||
{
|
{
|
||||||
//Appui sur une touche du clavier
|
//Appui sur une touche du clavier
|
||||||
@ -612,6 +613,7 @@ int Handle_key_release(SDL_KeyboardEvent event)
|
|||||||
}
|
}
|
||||||
return Release_control(released_key, modifier);
|
return Release_control(released_key, modifier);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Joystick management
|
// Joystick management
|
||||||
@ -876,6 +878,10 @@ int Directional_acceleration(int msec)
|
|||||||
return 1+(msec-initial_delay+linear_factor)/linear_factor+(msec-initial_delay)*(msec-initial_delay)/accel_factor;
|
return 1+(msec-initial_delay+linear_factor)/linear_factor+(msec-initial_delay)*(msec-initial_delay)/accel_factor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WIN32) && !defined(USE_SDL) && !defined(USE_SDL2)
|
||||||
|
int user_feedback_required = 0; // Flag qui indique si on doit arrêter de traiter les évènements ou si on peut enchainer
|
||||||
|
#endif
|
||||||
|
|
||||||
// Main input handling function
|
// Main input handling function
|
||||||
|
|
||||||
int Get_input(int sleep_time)
|
int Get_input(int sleep_time)
|
||||||
@ -1125,6 +1131,39 @@ int Get_input(int sleep_time)
|
|||||||
// Nothing significant happened
|
// Nothing significant happened
|
||||||
if (sleep_time)
|
if (sleep_time)
|
||||||
SDL_Delay(sleep_time);
|
SDL_Delay(sleep_time);
|
||||||
|
#elif defined(WIN32)
|
||||||
|
MSG msg;
|
||||||
|
|
||||||
|
user_feedback_required = 0;
|
||||||
|
Key_ANSI = 0;
|
||||||
|
Key_UNICODE = 0;
|
||||||
|
Key = 0;
|
||||||
|
Mouse_moved=0;
|
||||||
|
Input_new_mouse_X = Mouse_X;
|
||||||
|
Input_new_mouse_Y = Mouse_Y;
|
||||||
|
Input_new_mouse_K = Mouse_K;
|
||||||
|
|
||||||
|
Color_cycling();
|
||||||
|
// Commit any pending screen update.
|
||||||
|
// This is done in this function because it's called after reading
|
||||||
|
// some user input.
|
||||||
|
Flush_update();
|
||||||
|
|
||||||
|
while (!user_feedback_required && PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the cursor was moved since last update,
|
||||||
|
// it was erased, so we need to redraw it (with the preview brush)
|
||||||
|
if (Mouse_moved)
|
||||||
|
{
|
||||||
|
Compute_paintbrush_coordinates();
|
||||||
|
Display_cursor();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (user_feedback_required)
|
||||||
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -51,6 +51,8 @@ void Adjust_mouse_sensitivity(word fullscreen);
|
|||||||
|
|
||||||
void Set_mouse_position(void);
|
void Set_mouse_position(void);
|
||||||
|
|
||||||
|
int Move_cursor_with_constraints(void);
|
||||||
|
|
||||||
///
|
///
|
||||||
/// This holds the ID of the GUI control that the mouse
|
/// This holds the ID of the GUI control that the mouse
|
||||||
/// is manipulating. The input system will reset it to zero
|
/// is manipulating. The input system will reset it to zero
|
||||||
|
|||||||
@ -807,4 +807,8 @@ word Key_for_scancode(word scancode)
|
|||||||
{
|
{
|
||||||
return scancode;
|
return scancode;
|
||||||
}
|
}
|
||||||
|
word Get_Key_modifiers(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
21
src/main.c
21
src/main.c
@ -1153,9 +1153,30 @@ void Program_shutdown(void)
|
|||||||
|
|
||||||
|
|
||||||
// -------------------------- Procédure principale ---------------------------
|
// -------------------------- Procédure principale ---------------------------
|
||||||
|
#if defined(WIN32) && !defined(USE_SDL) && !defined(USE_SDL2)
|
||||||
|
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
|
||||||
|
#else
|
||||||
int main(int argc,char * argv[])
|
int main(int argc,char * argv[])
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
|
#if defined(WIN32) && !defined(USE_SDL) && !defined(USE_SDL2)
|
||||||
|
TCHAR ModuleFileName[MAX_PATH];
|
||||||
|
TCHAR ModuleShortFileName[MAX_PATH];
|
||||||
|
int i;
|
||||||
|
int argc = 0;
|
||||||
|
char arg_buffer[4096];
|
||||||
|
char * argv[16] = {NULL};
|
||||||
|
|
||||||
|
Init_Win32(hInstance, hPrevInstance);
|
||||||
|
GetModuleFileName(NULL, ModuleFileName, MAX_PATH);
|
||||||
|
GetShortPathName(ModuleFileName, ModuleShortFileName, MAX_PATH);
|
||||||
|
argv[argc++] = arg_buffer;
|
||||||
|
for (i = 0; i < sizeof(arg_buffer); i++) {
|
||||||
|
arg_buffer[i] = (char)ModuleShortFileName[i];
|
||||||
|
if (arg_buffer[i] == 0) break;
|
||||||
|
}
|
||||||
|
// TODO : parse command line
|
||||||
|
#endif
|
||||||
if(!Init_program(argc,argv))
|
if(!Init_program(argc,argv))
|
||||||
{
|
{
|
||||||
Program_shutdown();
|
Program_shutdown();
|
||||||
|
|||||||
@ -32,6 +32,12 @@
|
|||||||
#include "struct.h"
|
#include "struct.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
|
||||||
|
#if defined(WIN32) && !defined(USE_SDL) && !defined(USE_SDL2)
|
||||||
|
int Init_Win32(HINSTANCE hInstance, HINSTANCE hPrevInstance);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void GFX2_Set_mode(int *width, int *height, int fullscreen);
|
||||||
|
|
||||||
byte Get_Screen_pixel(int x, int y);
|
byte Get_Screen_pixel(int x, int y);
|
||||||
|
|
||||||
void Set_Screen_pixel(int x, int y, byte value);
|
void Set_Screen_pixel(int x, int y, byte value);
|
||||||
|
|||||||
@ -20,28 +20,235 @@
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Grafx2; if not, see <http://www.gnu.org/licenses/>
|
along with Grafx2; if not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
|
#define snprintf _snprintf
|
||||||
|
#endif
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
|
#include "errors.h"
|
||||||
|
#include "windows.h"
|
||||||
|
#include "input.h"
|
||||||
|
|
||||||
|
extern int user_feedback_required;
|
||||||
|
extern word Input_new_mouse_X;
|
||||||
|
extern word Input_new_mouse_Y;
|
||||||
|
extern byte Input_new_mouse_K;
|
||||||
|
|
||||||
|
static HBITMAP Windows_DIB = NULL;
|
||||||
|
static void *Windows_Screen = NULL;
|
||||||
|
static int Windows_DIB_width = 0;
|
||||||
|
static int Windows_DIB_height = 0;
|
||||||
|
static HWND Win32_hwnd = NULL;
|
||||||
|
|
||||||
|
static void Win32_Repaint(HWND hwnd)
|
||||||
|
{
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
HDC dc;
|
||||||
|
HDC dc2;
|
||||||
|
HBITMAP old_bmp;
|
||||||
|
RECT rect;
|
||||||
|
|
||||||
|
if (!GetUpdateRect(hwnd, &rect, FALSE)) return;
|
||||||
|
dc = BeginPaint(hwnd, &ps);
|
||||||
|
dc2 = CreateCompatibleDC(dc);
|
||||||
|
old_bmp = (HBITMAP)SelectObject(dc2, Windows_DIB);
|
||||||
|
BitBlt(dc, 0, 0, Windows_DIB_width, Windows_DIB_height,
|
||||||
|
dc2, 0, 0,
|
||||||
|
SRCCOPY);
|
||||||
|
SelectObject(dc2, old_bmp);
|
||||||
|
DeleteDC(dc2);
|
||||||
|
EndPaint(hwnd, &ps);
|
||||||
|
}
|
||||||
|
|
||||||
|
static LRESULT CALLBACK Win32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
switch(uMsg)
|
||||||
|
{
|
||||||
|
case WM_CREATE:
|
||||||
|
break;
|
||||||
|
case WM_CLOSE:
|
||||||
|
Quit_is_required = 1;
|
||||||
|
break;
|
||||||
|
case WM_PAINT:
|
||||||
|
Win32_Repaint(hwnd);
|
||||||
|
return 0;
|
||||||
|
case WM_SETCURSOR:
|
||||||
|
if (LOWORD(lParam) == HTCLIENT)
|
||||||
|
{
|
||||||
|
SetCursor(NULL);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_MOUSELEAVE:
|
||||||
|
//ShowCursor(TRUE);
|
||||||
|
return 0;
|
||||||
|
//case WM_MOUSEENTER:
|
||||||
|
//ShowCursor(FALSE);
|
||||||
|
//return 0;
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
//Hide_cursor();
|
||||||
|
Input_new_mouse_X = (LOWORD(lParam))/Pixel_width;
|
||||||
|
Input_new_mouse_Y = (HIWORD(lParam))/Pixel_height;
|
||||||
|
//Display_cursor();
|
||||||
|
Move_cursor_with_constraints();
|
||||||
|
user_feedback_required = 1;
|
||||||
|
return 0;
|
||||||
|
case WM_LBUTTONDOWN:
|
||||||
|
Input_new_mouse_K |= 1;
|
||||||
|
Move_cursor_with_constraints();
|
||||||
|
user_feedback_required = 1;
|
||||||
|
return 0;
|
||||||
|
case WM_LBUTTONUP:
|
||||||
|
Input_new_mouse_K &= ~1;
|
||||||
|
Move_cursor_with_constraints();
|
||||||
|
user_feedback_required = 1;
|
||||||
|
return 0;
|
||||||
|
// WM_LBUTTONDBLCLK
|
||||||
|
case WM_RBUTTONDOWN:
|
||||||
|
Input_new_mouse_K |= 2;
|
||||||
|
Move_cursor_with_constraints();
|
||||||
|
user_feedback_required = 1;
|
||||||
|
return 0;
|
||||||
|
case WM_RBUTTONUP:
|
||||||
|
Input_new_mouse_K &= ~2;
|
||||||
|
Move_cursor_with_constraints();
|
||||||
|
user_feedback_required = 1;
|
||||||
|
return 0;
|
||||||
|
// WM_RBUTTONDBLCLK
|
||||||
|
case WM_MBUTTONDOWN:
|
||||||
|
//case WM_MBUTTONUP:
|
||||||
|
Key = KEY_MOUSEMIDDLE|Get_Key_modifiers();
|
||||||
|
return 0;
|
||||||
|
// WM_MBUTTONDBLCLK
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
char msg[256];
|
||||||
|
snprintf(msg, sizeof(msg), "unknown Message : 0x%x", uMsg);
|
||||||
|
Warning(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DefWindowProc(hwnd, uMsg, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Init_Win32(HINSTANCE hInstance, HINSTANCE hPrevInstance)
|
||||||
|
{
|
||||||
|
WNDCLASS wc;
|
||||||
|
//HINSTANCE hInstance;
|
||||||
|
|
||||||
|
//hInstance = GetModuleHandle(NULL);
|
||||||
|
|
||||||
|
wc.style = 0;
|
||||||
|
wc.lpfnWndProc = Win32_WindowProc;
|
||||||
|
wc.cbClsExtra = 0;
|
||||||
|
wc.cbWndExtra = 0;
|
||||||
|
wc.hInstance = hInstance;
|
||||||
|
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(100));
|
||||||
|
wc.hCursor = NULL;
|
||||||
|
wc.hbrBackground = 0;
|
||||||
|
wc.lpszMenuName = NULL;
|
||||||
|
wc.lpszClassName = TEXT("grafx2");
|
||||||
|
if (!RegisterClass(&wc)) {
|
||||||
|
Warning("RegisterClass failed\n");
|
||||||
|
Error(ERROR_INIT);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1; // OK
|
||||||
|
}
|
||||||
|
|
||||||
|
static int Video_AllocateDib(int width, int height)
|
||||||
|
{
|
||||||
|
BITMAPINFO *bi;
|
||||||
|
HDC dc;
|
||||||
|
|
||||||
|
if (Windows_DIB != NULL) {
|
||||||
|
DeleteObject(Windows_DIB);
|
||||||
|
Windows_DIB = NULL;
|
||||||
|
Windows_Screen = NULL;
|
||||||
|
}
|
||||||
|
bi = (BITMAPINFO*)_alloca(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);
|
||||||
|
memset(bi, 0, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);
|
||||||
|
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||||
|
bi->bmiHeader.biWidth = width;
|
||||||
|
bi->bmiHeader.biHeight = -height;
|
||||||
|
bi->bmiHeader.biPlanes = 1;
|
||||||
|
bi->bmiHeader.biBitCount = 8;
|
||||||
|
bi->bmiHeader.biCompression = BI_RGB;
|
||||||
|
|
||||||
|
dc = GetDC(NULL);
|
||||||
|
Windows_DIB = CreateDIBSection(dc, bi, DIB_RGB_COLORS, &Windows_Screen, NULL, 0);
|
||||||
|
if (Windows_DIB == NULL) {
|
||||||
|
Warning("CreateDIBSection failed");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ReleaseDC(NULL, dc);
|
||||||
|
Windows_DIB_width = width;
|
||||||
|
Windows_DIB_height = height;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Win32_CreateWindow(int width, int height, int fullscreen)
|
||||||
|
{
|
||||||
|
DWORD style;
|
||||||
|
|
||||||
|
style = WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU;
|
||||||
|
/* allow window to be resized */
|
||||||
|
style |= WS_THICKFRAME;
|
||||||
|
|
||||||
|
Win32_hwnd = CreateWindow(TEXT("grafx2"), TEXT("grafx2"), style, CW_USEDEFAULT, CW_USEDEFAULT,
|
||||||
|
width, height, NULL, NULL,
|
||||||
|
GetModuleHandle(NULL), NULL);
|
||||||
|
if (Win32_hwnd == NULL) {
|
||||||
|
Error(ERROR_INIT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ShowWindow(Win32_hwnd, SW_SHOWNORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GFX2_Set_mode(int *width, int *height, int fullscreen)
|
||||||
|
{
|
||||||
|
Video_AllocateDib(*width, *height);
|
||||||
|
Win32_CreateWindow(*width, *height, fullscreen);
|
||||||
|
}
|
||||||
|
|
||||||
byte Get_Screen_pixel(int x, int y)
|
byte Get_Screen_pixel(int x, int y)
|
||||||
{
|
{
|
||||||
return 0;
|
if (Windows_Screen == NULL) return 0;
|
||||||
|
return *((byte *)Windows_Screen + x + y * Windows_DIB_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Set_Screen_pixel(int x, int y, byte value)
|
void Set_Screen_pixel(int x, int y, byte value)
|
||||||
{
|
{
|
||||||
|
if (Windows_Screen == NULL) return;
|
||||||
|
*((byte *)Windows_Screen + x + y * Windows_DIB_width) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte* Get_Screen_pixel_ptr(int x, int y)
|
byte* Get_Screen_pixel_ptr(int x, int y)
|
||||||
{
|
{
|
||||||
return NULL;
|
if (Windows_Screen == NULL) return NULL;
|
||||||
|
return (byte *)Windows_Screen + x + y * Windows_DIB_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Screen_FillRect(int x, int y, int w, int h, byte color)
|
void Screen_FillRect(int x, int y, int w, int h, byte color)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
byte * ptr;
|
||||||
|
|
||||||
|
for (i = 0; i < h; i++) {
|
||||||
|
ptr = Get_Screen_pixel_ptr(x, y + i);
|
||||||
|
memset(ptr, color, w);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Update_rect(short x, short y, unsigned short width, unsigned short height)
|
void Update_rect(short x, short y, unsigned short width, unsigned short height)
|
||||||
{
|
{
|
||||||
|
RECT rect;
|
||||||
|
rect.left = x;
|
||||||
|
rect.top = y;
|
||||||
|
rect.right = x + width;
|
||||||
|
rect.bottom = y + height;
|
||||||
|
InvalidateRect(Win32_hwnd, &rect, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Flush_update(void)
|
void Flush_update(void)
|
||||||
@ -54,7 +261,26 @@ void Update_status_line(short char_pos, short width)
|
|||||||
|
|
||||||
int SetPalette(const T_Components * colors, int firstcolor, int ncolors)
|
int SetPalette(const T_Components * colors, int firstcolor, int ncolors)
|
||||||
{
|
{
|
||||||
return 0;
|
int i;
|
||||||
|
RGBQUAD rgb[256];
|
||||||
|
HDC dc;
|
||||||
|
HDC dc2;
|
||||||
|
HBITMAP old_bmp;
|
||||||
|
|
||||||
|
for (i = 0; i < ncolors; i++) {
|
||||||
|
rgb[i].rgbRed = colors[i].R;
|
||||||
|
rgb[i].rgbGreen = colors[i].G;
|
||||||
|
rgb[i].rgbBlue = colors[i].B;
|
||||||
|
}
|
||||||
|
|
||||||
|
dc = GetDC(Win32_hwnd);
|
||||||
|
dc2 = CreateCompatibleDC(dc);
|
||||||
|
old_bmp = SelectObject(dc2, Windows_DIB);
|
||||||
|
SetDIBColorTable(dc2, firstcolor, ncolors, rgb);
|
||||||
|
SelectObject(dc2, old_bmp);
|
||||||
|
DeleteDC(dc2);
|
||||||
|
ReleaseDC(Win32_hwnd, dc);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Clear_border(byte color)
|
void Clear_border(byte color)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user