mfb_update_events (#27)
* update documentation * Fix typo * Added some examples * changed window names * Minor fix * Added mfb_update_events to all platforms. Checked on Windows, X11 and Wayland
This commit is contained in:
parent
cdaa54f5d6
commit
0257a60419
@ -18,7 +18,7 @@ file(GLOB SrcWayland "src/wayland/*.c")
|
||||
file(GLOB SrcX11 "src/x11/*.c")
|
||||
|
||||
if (NOT MSVC)
|
||||
set (CMAKE_C_FLAGS "-g -Wall -Wextra -pedantic -Wno-switch -Wno-unused-function")
|
||||
set (CMAKE_C_FLAGS "-g -Wall -Wextra -pedantic -Wno-switch -Wno-unused-function -Wno-implicit-fallthrough")
|
||||
set (CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -std=c++11")
|
||||
set (CMAKE_OBJC_FLAGS "${CMAKE_C_FLAGS}")
|
||||
set (CMAKE_OBJCXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
|
@ -17,10 +17,15 @@ extern "C" {
|
||||
struct Window * mfb_open(const char *title, unsigned width, unsigned height);
|
||||
struct Window * mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags);
|
||||
|
||||
// Update the display. Input buffer is assumed to be a 32-bit buffer of the size given in the open call
|
||||
// Will return a negative status if something went wrong or the user want to exit.
|
||||
// Update the display
|
||||
// Input buffer is assumed to be a 32-bit buffer of the size given in the open call
|
||||
// Will return a negative status if something went wrong or the user want to exit
|
||||
// Also updates the window events
|
||||
UpdateState mfb_update(struct Window *window, void *buffer);
|
||||
|
||||
// Only updates the window events
|
||||
UpdateState mfb_update_events(struct Window *window);
|
||||
|
||||
// Close the window
|
||||
void mfb_close(struct Window *window);
|
||||
|
||||
|
@ -345,6 +345,29 @@ UpdateState mfb_update(struct Window *window, void *buffer)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
UpdateState mfb_update_events(struct Window *window)
|
||||
{
|
||||
if(window == 0x0) {
|
||||
return STATE_INVALID_WINDOW;
|
||||
}
|
||||
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
if(window_data->close) {
|
||||
destroy_window_data(window_data);
|
||||
return STATE_EXIT;
|
||||
}
|
||||
|
||||
update_events(window_data);
|
||||
if(window_data->close == false) {
|
||||
SWindowData_OSX *window_data_osx = (SWindowData_OSX *) window_data->specific;
|
||||
[[window_data_osx->window contentView] setNeedsDisplay:YES];
|
||||
}
|
||||
|
||||
return STATE_OK;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool mfb_set_viewport(struct Window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height)
|
||||
{
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
|
@ -718,8 +718,7 @@ mfb_update(struct Window *window, void *buffer)
|
||||
wl_surface_commit(window_data_way->surface);
|
||||
|
||||
while (!done && window_data->close == false) {
|
||||
if (wl_display_dispatch(window_data_way->display) == -1 || wl_display_roundtrip(window_data_way->display) == -1)
|
||||
{
|
||||
if (wl_display_dispatch(window_data_way->display) == -1 || wl_display_roundtrip(window_data_way->display) == -1) {
|
||||
wl_callback_destroy(frame_callback);
|
||||
return STATE_INTERNAL_ERROR;
|
||||
}
|
||||
@ -730,6 +729,32 @@ mfb_update(struct Window *window, void *buffer)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
UpdateState
|
||||
mfb_update_events(struct Window *window)
|
||||
{
|
||||
if(window == 0x0) {
|
||||
return STATE_INVALID_WINDOW;
|
||||
}
|
||||
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
if(window_data->close) {
|
||||
destroy(window_data);
|
||||
return STATE_EXIT;
|
||||
}
|
||||
|
||||
SWindowData_Way *window_data_way = (SWindowData_Way *) window_data->specific;
|
||||
if (!window_data_way->display || wl_display_get_error(window_data_way->display) != 0)
|
||||
return STATE_INTERNAL_ERROR;
|
||||
|
||||
if (wl_display_dispatch(window_data_way->display) == -1 || wl_display_roundtrip(window_data_way->display) == -1) {
|
||||
return STATE_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
return STATE_OK;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
extern short int g_keycodes[512];
|
||||
|
||||
void
|
||||
|
@ -15,8 +15,7 @@ uint32_t translate_mod();
|
||||
Key translate_key(unsigned int wParam, unsigned long lParam);
|
||||
void destroy_window_data(SWindowData *window_data);
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
||||
LRESULT res = 0;
|
||||
|
||||
SWindowData *window_data = (SWindowData *) GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
||||
@ -95,7 +94,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
kCall(char_input_func, wParam);
|
||||
kCall(char_input_func, (unsigned int) wParam);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -358,8 +357,7 @@ struct Window *mfb_open(const char *title, unsigned width, unsigned height) {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
UpdateState mfb_update(struct Window *window, void *buffer)
|
||||
{
|
||||
UpdateState mfb_update(struct Window *window, void *buffer) {
|
||||
MSG msg;
|
||||
|
||||
if (window == 0x0) {
|
||||
@ -382,8 +380,31 @@ UpdateState mfb_update(struct Window *window, void *buffer)
|
||||
InvalidateRect(window_data_win->window, 0x0, TRUE);
|
||||
SendMessage(window_data_win->window, WM_PAINT, 0, 0);
|
||||
|
||||
while (window_data->close == false && PeekMessage(&msg, window_data_win->window, 0, 0, PM_REMOVE))
|
||||
{
|
||||
while (window_data->close == false && PeekMessage(&msg, window_data_win->window, 0, 0, PM_REMOVE)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
return STATE_OK;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
UpdateState mfb_update_events(struct Window *window) {
|
||||
MSG msg;
|
||||
|
||||
if (window == 0x0) {
|
||||
return STATE_INVALID_WINDOW;
|
||||
}
|
||||
|
||||
SWindowData *window_data = (SWindowData *)window;
|
||||
if (window_data->close) {
|
||||
destroy_window_data(window_data);
|
||||
return STATE_EXIT;
|
||||
}
|
||||
|
||||
SWindowData_Win *window_data_win = (SWindowData_Win *) window_data->specific;
|
||||
while (window_data->close == false && PeekMessage(&msg, window_data_win->window, 0, 0, PM_REMOVE)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
@ -403,6 +424,7 @@ void destroy_window_data(SWindowData *window_data) {
|
||||
if (window_data_win->bitmapInfo != 0x0) {
|
||||
free(window_data_win->bitmapInfo);
|
||||
}
|
||||
|
||||
if (window_data_win->window != 0 && window_data_win->hdc != 0) {
|
||||
ReleaseDC(window_data_win->window, window_data_win->hdc);
|
||||
DestroyWindow(window_data_win->window);
|
||||
@ -595,8 +617,7 @@ Key translate_key(unsigned int wParam, unsigned long lParam) {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool mfb_set_viewport(struct Window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height)
|
||||
{
|
||||
bool mfb_set_viewport(struct Window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
|
||||
if (offset_x + width > window_data->window_width) {
|
||||
|
@ -183,8 +183,7 @@ mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
||||
}
|
||||
|
||||
struct Window *
|
||||
mfb_open(const char *title, unsigned width, unsigned height)
|
||||
{
|
||||
mfb_open(const char *title, unsigned width, unsigned height) {
|
||||
return mfb_open_ex(title, width, height, 0);
|
||||
}
|
||||
|
||||
@ -194,8 +193,7 @@ int translate_key(int scancode);
|
||||
int translate_mod(int state);
|
||||
int translate_mod_ex(int key, int state, int is_pressed);
|
||||
|
||||
static void processEvents(SWindowData *window_data)
|
||||
{
|
||||
static void processEvents(SWindowData *window_data) {
|
||||
XEvent event;
|
||||
SWindowData_X11 *window_data_x11 = (SWindowData_X11 *) window_data->specific;
|
||||
|
||||
@ -295,8 +293,7 @@ static void processEvents(SWindowData *window_data)
|
||||
|
||||
void destroy(SWindowData *window_data);
|
||||
|
||||
UpdateState mfb_update(struct Window *window, void *buffer)
|
||||
{
|
||||
UpdateState mfb_update(struct Window *window, void *buffer) {
|
||||
if (window == 0x0) {
|
||||
return STATE_INVALID_WINDOW;
|
||||
}
|
||||
@ -348,8 +345,27 @@ UpdateState mfb_update(struct Window *window, void *buffer)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void destroy(SWindowData *window_data)
|
||||
{
|
||||
UpdateState mfb_update_events(struct Window *window) {
|
||||
if (window == 0x0) {
|
||||
return STATE_INVALID_WINDOW;
|
||||
}
|
||||
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
if (window_data->close) {
|
||||
destroy(window_data);
|
||||
return STATE_EXIT;
|
||||
}
|
||||
|
||||
SWindowData_X11 *window_data_x11 = (SWindowData_X11 *) window_data->specific;
|
||||
XFlush(window_data_x11->display);
|
||||
processEvents(window_data);
|
||||
|
||||
return STATE_OK;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void destroy(SWindowData *window_data) {
|
||||
if (window_data != 0x0) {
|
||||
if (window_data->specific != 0x0) {
|
||||
SWindowData_X11 *window_data_x11 = (SWindowData_X11 *) window_data->specific;
|
||||
@ -631,8 +647,7 @@ int translate_mod_ex(int key, int state, int is_pressed) {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool mfb_set_viewport(struct Window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height)
|
||||
{
|
||||
bool mfb_set_viewport(struct Window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
|
||||
if (offset_x + width > window_data->window_width) {
|
||||
@ -646,5 +661,6 @@ bool mfb_set_viewport(struct Window *window, unsigned offset_x, unsigned offset_
|
||||
window_data->dst_offset_y = offset_y;
|
||||
window_data->dst_width = width;
|
||||
window_data->dst_height = height;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -2,11 +2,12 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define kUnused(var) (void) var;
|
||||
#define kUnused(var) (void) var
|
||||
|
||||
#define WIDTH 800
|
||||
#define HEIGHT 600
|
||||
static unsigned int g_buffer[WIDTH * HEIGHT];
|
||||
static bool g_active = true;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -16,6 +17,7 @@ void active(struct Window *window, bool isActive) {
|
||||
window_title = (const char *) mfb_get_user_data(window);
|
||||
}
|
||||
fprintf(stdout, "%s > active: %d\n", window_title, isActive);
|
||||
g_active = isActive;
|
||||
}
|
||||
|
||||
void resize(struct Window *window, int width, int height) {
|
||||
@ -109,6 +111,8 @@ int main()
|
||||
int i;
|
||||
UpdateState state;
|
||||
|
||||
if(g_active)
|
||||
{
|
||||
for (i = 0; i < WIDTH * HEIGHT; ++i)
|
||||
{
|
||||
noise = seed;
|
||||
@ -123,6 +127,10 @@ int main()
|
||||
}
|
||||
|
||||
state = mfb_update(window, g_buffer);
|
||||
}
|
||||
else {
|
||||
state = mfb_update_events(window);
|
||||
}
|
||||
if (state != STATE_OK) {
|
||||
window = 0x0;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user