Changes related to dpi.
Introduced new function mfb_get_monitor_scale Deprecated function mfb_get_monitor_dpi
This commit is contained in:
parent
17df5633cd
commit
fa8bf266f0
@ -232,6 +232,8 @@ int mfb_get_mouse_x(struct mfb_window *window); // L
|
||||
int mfb_get_mouse_y(struct mfb_window *window); // Last mouse pos Y
|
||||
|
||||
// Not working on Linux (X11 nor Wayland)
|
||||
void mfb_get_monitor_scale(struct mfb_window *window, float *scale_x, float *scale_y)
|
||||
// [Deprecated] Use mfb_get_monitor_scale instead
|
||||
void mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y)
|
||||
```
|
||||
|
||||
|
@ -39,7 +39,10 @@ void * mfb_get_user_data(struct mfb_window *window);
|
||||
bool mfb_set_viewport(struct mfb_window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height);
|
||||
|
||||
// DPI
|
||||
// [Deprecated]: Probably a better name will be mfb_get_monitor_scale
|
||||
void mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y);
|
||||
// Use this instead
|
||||
void mfb_get_monitor_scale(struct mfb_window *window, float *scale_x, float *scale_y);
|
||||
|
||||
// Callbacks
|
||||
void mfb_set_active_callback(struct mfb_window *window, mfb_active_func callback);
|
||||
|
@ -13,7 +13,7 @@ mfb_open(const char *title, unsigned width, unsigned height) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
mfb_update_state
|
||||
mfb_update_state
|
||||
mfb_update(struct mfb_window *window, void *buffer) {
|
||||
if (window == 0x0) {
|
||||
return STATE_INVALID_WINDOW;
|
||||
@ -25,7 +25,7 @@ mfb_update(struct mfb_window *window, void *buffer) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
void
|
||||
mfb_set_active_callback(struct mfb_window *window, mfb_active_func callback) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -34,7 +34,7 @@ mfb_set_active_callback(struct mfb_window *window, mfb_active_func callback) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
void
|
||||
mfb_set_resize_callback(struct mfb_window *window, mfb_resize_func callback) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -43,7 +43,7 @@ mfb_set_resize_callback(struct mfb_window *window, mfb_resize_func callback) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
void
|
||||
mfb_set_keyboard_callback(struct mfb_window *window, mfb_keyboard_func callback) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -52,7 +52,7 @@ mfb_set_keyboard_callback(struct mfb_window *window, mfb_keyboard_func callback)
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
void
|
||||
mfb_set_char_input_callback(struct mfb_window *window, mfb_char_input_func callback) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -61,7 +61,7 @@ mfb_set_char_input_callback(struct mfb_window *window, mfb_char_input_func callb
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
void
|
||||
mfb_set_mouse_button_callback(struct mfb_window *window, mfb_mouse_button_func callback) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -70,7 +70,7 @@ mfb_set_mouse_button_callback(struct mfb_window *window, mfb_mouse_button_func c
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
void
|
||||
mfb_set_mouse_move_callback(struct mfb_window *window, mfb_mouse_move_func callback) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -79,7 +79,7 @@ mfb_set_mouse_move_callback(struct mfb_window *window, mfb_mouse_move_func callb
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
void
|
||||
mfb_set_mouse_scroll_callback(struct mfb_window *window, mfb_mouse_scroll_func callback) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -88,7 +88,7 @@ mfb_set_mouse_scroll_callback(struct mfb_window *window, mfb_mouse_scroll_func c
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
void
|
||||
mfb_set_user_data(struct mfb_window *window, void *user_data) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -107,8 +107,15 @@ mfb_get_user_data(struct mfb_window *window) {
|
||||
return 0x0;
|
||||
}
|
||||
|
||||
// [Deprecated]
|
||||
//-------------------------------------
|
||||
void
|
||||
void
|
||||
mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y) {
|
||||
mfb_get_monitor_scale(window, dpi_x, dpi_y);
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
mfb_close(struct mfb_window *window) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -117,7 +124,7 @@ mfb_close(struct mfb_window *window) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
void
|
||||
keyboard_default(struct mfb_window *window, mfb_key key, mfb_key_mod mod, bool isPressed) {
|
||||
kUnused(mod);
|
||||
kUnused(isPressed);
|
||||
@ -128,7 +135,7 @@ keyboard_default(struct mfb_window *window, mfb_key key, mfb_key_mod mod, bool i
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
bool
|
||||
bool
|
||||
mfb_is_window_active(struct mfb_window *window) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -138,7 +145,7 @@ mfb_is_window_active(struct mfb_window *window) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
unsigned
|
||||
unsigned
|
||||
mfb_get_window_width(struct mfb_window *window) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -148,7 +155,7 @@ mfb_get_window_width(struct mfb_window *window) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
unsigned
|
||||
unsigned
|
||||
mfb_get_window_height(struct mfb_window *window) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -158,7 +165,7 @@ mfb_get_window_height(struct mfb_window *window) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
int
|
||||
int
|
||||
mfb_get_mouse_x(struct mfb_window *window) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -168,7 +175,7 @@ mfb_get_mouse_x(struct mfb_window *window) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
int
|
||||
int
|
||||
mfb_get_mouse_y(struct mfb_window *window) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -178,7 +185,7 @@ mfb_get_mouse_y(struct mfb_window *window) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
float
|
||||
float
|
||||
mfb_get_mouse_scroll_x(struct mfb_window *window) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -188,7 +195,7 @@ mfb_get_mouse_scroll_x(struct mfb_window *window) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
float
|
||||
float
|
||||
mfb_get_mouse_scroll_y(struct mfb_window *window) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -198,7 +205,7 @@ mfb_get_mouse_scroll_y(struct mfb_window *window) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
const uint8_t *
|
||||
const uint8_t *
|
||||
mfb_get_mouse_button_buffer(struct mfb_window *window) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -208,7 +215,7 @@ mfb_get_mouse_button_buffer(struct mfb_window *window) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
const uint8_t *
|
||||
const uint8_t *
|
||||
mfb_get_key_buffer(struct mfb_window *window) {
|
||||
if(window != 0x0) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -218,7 +225,7 @@ mfb_get_key_buffer(struct mfb_window *window) {
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
const char *
|
||||
const char *
|
||||
mfb_get_key_name(mfb_key key) {
|
||||
|
||||
switch (key)
|
||||
@ -586,6 +593,6 @@ mfb_get_key_name(mfb_key key) {
|
||||
case KB_KEY_UNKNOWN:
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
|
||||
return "Unknown";
|
||||
}
|
||||
|
@ -250,23 +250,23 @@ mfb_timer_init() {
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y) {
|
||||
mfb_get_monitor_scale(struct mfb_window *window, float *scale_x, float *scale_y) {
|
||||
(void) window;
|
||||
float scale = 1.0f;
|
||||
|
||||
scale = [[UIScreen mainScreen] scale];
|
||||
|
||||
if (dpi_x) {
|
||||
*dpi_x = scale;
|
||||
if(*dpi_x == 0) {
|
||||
*dpi_x = 1;
|
||||
|
||||
if (scale_x) {
|
||||
*scale_x = scale;
|
||||
if(*scale_x == 0) {
|
||||
*scale_x = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (dpi_y) {
|
||||
*dpi_y = scale;
|
||||
if (*dpi_y == 0) {
|
||||
*dpi_y = 1;
|
||||
if (scale_y) {
|
||||
*scale_y = scale;
|
||||
if (*scale_y == 0) {
|
||||
*scale_y = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -161,7 +161,7 @@ mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
||||
|
||||
window_data->is_initialized = true;
|
||||
return (struct mfb_window *) window_data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
@ -175,7 +175,7 @@ destroy_window_data(SWindowData *window_data) {
|
||||
if(window_data_osx != 0x0) {
|
||||
OSXWindow *window = window_data_osx->window;
|
||||
[window performClose:nil];
|
||||
|
||||
|
||||
// Flush events!
|
||||
NSEvent* event;
|
||||
do {
|
||||
@ -198,7 +198,7 @@ destroy_window_data(SWindowData *window_data) {
|
||||
window_data->draw_buffer = 0x0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
memset(window_data, 0, sizeof(SWindowData));
|
||||
free(window_data);
|
||||
}
|
||||
@ -247,7 +247,7 @@ mfb_update_ex(struct mfb_window *window, void *buffer, unsigned width, unsigned
|
||||
|
||||
[window_data_osx->viewController resizeTextures];
|
||||
}
|
||||
|
||||
|
||||
memcpy(window_data->draw_buffer, buffer, window_data->buffer_stride * window_data->buffer_height);
|
||||
#else
|
||||
if(window_data->buffer_width != width || window_data->buffer_height != height) {
|
||||
@ -255,7 +255,7 @@ mfb_update_ex(struct mfb_window *window, void *buffer, unsigned width, unsigned
|
||||
window_data->buffer_stride = width * 4;
|
||||
window_data->buffer_height = height;
|
||||
}
|
||||
|
||||
|
||||
window_data->draw_buffer = buffer;
|
||||
#endif
|
||||
|
||||
@ -553,7 +553,7 @@ mfb_timer_init() {
|
||||
|
||||
//-------------------------------------
|
||||
void
|
||||
mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y) {
|
||||
mfb_get_monitor_scale(struct mfb_window *window, float *scale_x, float *scale_y) {
|
||||
float scale = 1.0f;
|
||||
|
||||
if(window != 0x0) {
|
||||
@ -565,19 +565,18 @@ mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y) {
|
||||
else {
|
||||
scale = [[NSScreen mainScreen] backingScaleFactor];
|
||||
}
|
||||
|
||||
if (dpi_x) {
|
||||
*dpi_x = scale;
|
||||
if(*dpi_x == 0) {
|
||||
*dpi_x = 1;
|
||||
|
||||
if (scale_x) {
|
||||
*scale_x = scale;
|
||||
if(*scale_x == 0) {
|
||||
*scale_x = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (dpi_y) {
|
||||
*dpi_y = scale;
|
||||
if (*dpi_y == 0) {
|
||||
*dpi_y = 1;
|
||||
if (scale_y) {
|
||||
*scale_y = scale;
|
||||
if (*scale_y == 0) {
|
||||
*scale_y = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -22,8 +22,8 @@
|
||||
|
||||
void init_keycodes();
|
||||
|
||||
static void
|
||||
destroy_window_data(SWindowData *window_data)
|
||||
static void
|
||||
destroy_window_data(SWindowData *window_data)
|
||||
{
|
||||
if(window_data == 0x0)
|
||||
return;
|
||||
@ -38,12 +38,12 @@ destroy_window_data(SWindowData *window_data)
|
||||
free(window_data);
|
||||
}
|
||||
|
||||
static void
|
||||
static void
|
||||
destroy(SWindowData *window_data)
|
||||
{
|
||||
if(window_data == 0x0)
|
||||
return;
|
||||
|
||||
|
||||
SWindowData_Way *window_data_way = (SWindowData_Way *) window_data->specific;
|
||||
if (window_data_way == 0x0 || window_data_way->display == 0x0) {
|
||||
destroy_window_data(window_data);
|
||||
@ -79,7 +79,7 @@ destroy(SWindowData *window_data)
|
||||
close(window_data_way->fd);
|
||||
}
|
||||
|
||||
// This event provides a file descriptor to the client which can be memory-mapped
|
||||
// This event provides a file descriptor to the client which can be memory-mapped
|
||||
// to provide a keyboard mapping description.
|
||||
// format: keymap format
|
||||
// fd: keymap file descriptor
|
||||
@ -98,7 +98,7 @@ keyboard_keymap(void *data, struct wl_keyboard *keyboard, uint32_t format, int f
|
||||
// serial: serial number of the enter event
|
||||
// surface: surface gaining keyboard focus
|
||||
// keys: the currently pressed keys
|
||||
static void
|
||||
static void
|
||||
keyboard_enter(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface, struct wl_array *keys)
|
||||
{
|
||||
kUnused(keyboard);
|
||||
@ -114,7 +114,7 @@ keyboard_enter(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct
|
||||
// The leave notification is sent before the enter notification for the new focus.
|
||||
// serial: serial number of the leave event
|
||||
// surface: surface that lost keyboard focus
|
||||
static void
|
||||
static void
|
||||
keyboard_leave(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface)
|
||||
{
|
||||
kUnused(keyboard);
|
||||
@ -126,13 +126,13 @@ keyboard_leave(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct
|
||||
kCall(active_func, false);
|
||||
}
|
||||
|
||||
// A key was pressed or released. The time argument is a timestamp with
|
||||
// A key was pressed or released. The time argument is a timestamp with
|
||||
// millisecond granularity, with an undefined base.
|
||||
// serial: serial number of the key event
|
||||
// time: timestamp with millisecond granularity
|
||||
// key: key that produced the event
|
||||
// state: physical state of the key
|
||||
static void
|
||||
static void
|
||||
keyboard_key(void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t time, uint32_t key, uint32_t state)
|
||||
{
|
||||
kUnused(keyboard);
|
||||
@ -183,14 +183,14 @@ keyboard_key(void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t
|
||||
}
|
||||
}
|
||||
|
||||
// Notifies clients that the modifier and/or group state has changed,
|
||||
// Notifies clients that the modifier and/or group state has changed,
|
||||
// and it should update its local state.
|
||||
// serial: serial number of the modifiers event
|
||||
// mods_depressed: depressed modifiers
|
||||
// mods_latched: latched modifiers
|
||||
// mods_locked: locked modifiers
|
||||
// group: keyboard layout
|
||||
static void
|
||||
static void
|
||||
keyboard_modifiers(void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group)
|
||||
{
|
||||
kUnused(data);
|
||||
@ -206,7 +206,7 @@ keyboard_modifiers(void *data, struct wl_keyboard *keyboard, uint32_t serial, ui
|
||||
// Informs the client about the keyboard's repeat rate and delay.
|
||||
// rate: the rate of repeating keys in characters per second
|
||||
// delay: delay in milliseconds since key down until repeating starts
|
||||
static void
|
||||
static void
|
||||
keyboard_repeat_info(void *data, struct wl_keyboard *keyboard, int32_t rate, int32_t delay)
|
||||
{
|
||||
kUnused(data);
|
||||
@ -215,7 +215,7 @@ keyboard_repeat_info(void *data, struct wl_keyboard *keyboard, int32_t rate, int
|
||||
kUnused(delay);
|
||||
}
|
||||
|
||||
static const struct
|
||||
static const struct
|
||||
wl_keyboard_listener keyboard_listener = {
|
||||
.keymap = keyboard_keymap,
|
||||
.enter = keyboard_enter,
|
||||
@ -278,7 +278,7 @@ pointer_leave(void *data, struct wl_pointer *pointer, uint32_t serial, struct wl
|
||||
//fprintf(stderr, "Pointer left surface %p\n", surface);
|
||||
}
|
||||
|
||||
// Notification of pointer location change.
|
||||
// Notification of pointer location change.
|
||||
//
|
||||
// The arguments sx and sy are the location relative to the focused surface.
|
||||
//
|
||||
@ -329,19 +329,19 @@ pointer_button(void *data, struct wl_pointer *pointer, uint32_t serial, uint32_t
|
||||
}
|
||||
|
||||
// Scroll and other axis notifications.
|
||||
//
|
||||
//
|
||||
// For scroll events (vertical and horizontal scroll axes), the
|
||||
// value parameter is the length of a vector along the specified
|
||||
// axis in a coordinate space identical to those of motion events,
|
||||
// representing a relative movement along the specified axis.
|
||||
//
|
||||
//
|
||||
// For devices that support movements non-parallel to axes multiple
|
||||
// axis events will be emitted.
|
||||
//
|
||||
//
|
||||
// When applicable, for example for touch pads, the server can
|
||||
// choose to emit scroll events where the motion vector is
|
||||
// equivalent to a motion event vector.
|
||||
//
|
||||
//
|
||||
// When applicable, a client can transform its content relative to
|
||||
// the scroll distance.
|
||||
//
|
||||
@ -365,20 +365,20 @@ pointer_axis(void *data, struct wl_pointer *pointer, uint32_t time, uint32_t axi
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
static void
|
||||
frame(void *data, struct wl_pointer *pointer) {
|
||||
kUnused(data);
|
||||
kUnused(pointer);
|
||||
}
|
||||
|
||||
static void
|
||||
static void
|
||||
axis_source(void *data, struct wl_pointer *pointer, uint32_t axis_source) {
|
||||
kUnused(data);
|
||||
kUnused(pointer);
|
||||
kUnused(axis_source);
|
||||
}
|
||||
|
||||
static void
|
||||
static void
|
||||
axis_stop(void *data, struct wl_pointer *pointer, uint32_t time, uint32_t axis) {
|
||||
kUnused(data);
|
||||
kUnused(pointer);
|
||||
@ -386,7 +386,7 @@ axis_stop(void *data, struct wl_pointer *pointer, uint32_t time, uint32_t axis)
|
||||
kUnused(axis);
|
||||
}
|
||||
|
||||
static void
|
||||
static void
|
||||
axis_discrete(void *data, struct wl_pointer *pointer, uint32_t axis, int32_t discrete) {
|
||||
kUnused(data);
|
||||
kUnused(pointer);
|
||||
@ -394,7 +394,7 @@ axis_discrete(void *data, struct wl_pointer *pointer, uint32_t axis, int32_t dis
|
||||
kUnused(discrete);
|
||||
}
|
||||
|
||||
static const struct
|
||||
static const struct
|
||||
wl_pointer_listener pointer_listener = {
|
||||
.enter = pointer_enter,
|
||||
.leave = pointer_leave,
|
||||
@ -409,7 +409,7 @@ wl_pointer_listener pointer_listener = {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static void
|
||||
static void
|
||||
seat_capabilities(void *data, struct wl_seat *seat, enum wl_seat_capability caps)
|
||||
{
|
||||
kUnused(data);
|
||||
@ -427,28 +427,28 @@ seat_capabilities(void *data, struct wl_seat *seat, enum wl_seat_capability caps
|
||||
window_data_way->keyboard = 0x0;
|
||||
}
|
||||
|
||||
if ((caps & WL_SEAT_CAPABILITY_POINTER) && !window_data_way->pointer)
|
||||
if ((caps & WL_SEAT_CAPABILITY_POINTER) && !window_data_way->pointer)
|
||||
{
|
||||
window_data_way->pointer = wl_seat_get_pointer(seat);
|
||||
wl_pointer_add_listener(window_data_way->pointer, &pointer_listener, window_data);
|
||||
}
|
||||
else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && window_data_way->pointer)
|
||||
}
|
||||
else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && window_data_way->pointer)
|
||||
{
|
||||
wl_pointer_destroy(window_data_way->pointer);
|
||||
window_data_way->pointer = 0x0;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
static void
|
||||
seat_name(void *data, struct wl_seat *seat, const char *name) {
|
||||
kUnused(data);
|
||||
kUnused(seat);
|
||||
printf("Seat '%s'n", name);
|
||||
}
|
||||
|
||||
static const struct
|
||||
static const struct
|
||||
wl_seat_listener seat_listener = {
|
||||
.capabilities = seat_capabilities,
|
||||
.capabilities = seat_capabilities,
|
||||
.name = 0x0,
|
||||
};
|
||||
|
||||
@ -460,7 +460,7 @@ wl_seat_listener seat_listener = {
|
||||
// for buffers. Known formats include argb8888 and xrgb8888.
|
||||
//
|
||||
// format: buffer pixel format
|
||||
static void
|
||||
static void
|
||||
shm_format(void *data, struct wl_shm *shm, uint32_t format)
|
||||
{
|
||||
kUnused(shm);
|
||||
@ -472,7 +472,7 @@ shm_format(void *data, struct wl_shm *shm, uint32_t format)
|
||||
switch (format)
|
||||
{
|
||||
// We could do RGBA, but that would not be what is expected from minifb...
|
||||
// case WL_SHM_FORMAT_ARGB8888:
|
||||
// case WL_SHM_FORMAT_ARGB8888:
|
||||
case WL_SHM_FORMAT_XRGB8888:
|
||||
window_data_way->shm_format = format;
|
||||
break;
|
||||
@ -483,14 +483,14 @@ shm_format(void *data, struct wl_shm *shm, uint32_t format)
|
||||
}
|
||||
}
|
||||
|
||||
static const struct
|
||||
static const struct
|
||||
wl_shm_listener shm_listener = {
|
||||
.format = shm_format
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static void
|
||||
static void
|
||||
registry_global(void *data, struct wl_registry *registry, uint32_t id, char const *iface, uint32_t version)
|
||||
{
|
||||
kUnused(version);
|
||||
@ -524,9 +524,9 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id, char cons
|
||||
}
|
||||
}
|
||||
|
||||
static const struct
|
||||
static const struct
|
||||
wl_registry_listener registry_listener = {
|
||||
.global = registry_global,
|
||||
.global = registry_global,
|
||||
.global_remove = 0x0,
|
||||
};
|
||||
|
||||
@ -562,7 +562,7 @@ static const struct wl_shell_surface_listener shell_surface_listener = {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct mfb_window *
|
||||
struct mfb_window *
|
||||
mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
||||
{
|
||||
SWindowData *window_data = (SWindowData *) malloc(sizeof(SWindowData));
|
||||
@ -592,7 +592,7 @@ mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
||||
|
||||
init_keycodes();
|
||||
|
||||
if (wl_display_dispatch(window_data_way->display) == -1 ||
|
||||
if (wl_display_dispatch(window_data_way->display) == -1 ||
|
||||
wl_display_roundtrip(window_data_way->display) == -1) {
|
||||
return 0x0;
|
||||
}
|
||||
@ -631,7 +631,7 @@ mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
||||
calc_dst_factor(window_data, width, height);
|
||||
|
||||
window_data_way->shm_pool = wl_shm_create_pool(window_data_way->shm, window_data_way->fd, length);
|
||||
window_data->draw_buffer = wl_shm_pool_create_buffer(window_data_way->shm_pool, 0,
|
||||
window_data->draw_buffer = wl_shm_pool_create_buffer(window_data_way->shm_pool, 0,
|
||||
window_data->buffer_width, window_data->buffer_height,
|
||||
window_data->buffer_stride, window_data_way->shm_format);
|
||||
|
||||
@ -680,7 +680,7 @@ out:
|
||||
// Notify the client when the related request is done.
|
||||
//
|
||||
// callback_data: request-specific data for the callback
|
||||
static void
|
||||
static void
|
||||
frame_done(void *data, struct wl_callback *callback, uint32_t cookie)
|
||||
{
|
||||
kUnused(cookie);
|
||||
@ -689,14 +689,14 @@ frame_done(void *data, struct wl_callback *callback, uint32_t cookie)
|
||||
*(uint32_t *)data = 1;
|
||||
}
|
||||
|
||||
static const struct
|
||||
static const struct
|
||||
wl_callback_listener frame_listener = {
|
||||
.done = frame_done,
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
mfb_update_state
|
||||
mfb_update_state
|
||||
mfb_update_ex(struct mfb_window *window, void *buffer, unsigned width, unsigned height)
|
||||
{
|
||||
uint32_t done = 0;
|
||||
@ -744,11 +744,11 @@ mfb_update_ex(struct mfb_window *window, void *buffer, unsigned width, unsigned
|
||||
resize_dst(window_data, width, height);
|
||||
|
||||
wl_buffer_destroy(window_data->draw_buffer);
|
||||
window_data->draw_buffer = wl_shm_pool_create_buffer(window_data_way->shm_pool, 0,
|
||||
window_data->draw_buffer = wl_shm_pool_create_buffer(window_data_way->shm_pool, 0,
|
||||
window_data->buffer_width, window_data->buffer_height,
|
||||
window_data->buffer_stride, window_data_way->shm_format);
|
||||
}
|
||||
|
||||
|
||||
// update shm buffer
|
||||
memcpy(window_data_way->shm_ptr, buffer, window_data->buffer_stride * window_data->buffer_height);
|
||||
|
||||
@ -773,7 +773,7 @@ mfb_update_ex(struct mfb_window *window, void *buffer, unsigned width, unsigned
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
mfb_update_state
|
||||
mfb_update_state
|
||||
mfb_update_events(struct mfb_window *window)
|
||||
{
|
||||
if(window == 0x0) {
|
||||
@ -801,7 +801,7 @@ mfb_update_events(struct mfb_window *window)
|
||||
|
||||
extern double g_time_for_frame;
|
||||
|
||||
bool
|
||||
bool
|
||||
mfb_wait_sync(struct mfb_window *window) {
|
||||
if(window == 0x0) {
|
||||
return false;
|
||||
@ -820,7 +820,7 @@ mfb_wait_sync(struct mfb_window *window) {
|
||||
if (wl_display_dispatch_pending(window_data_way->display) == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if(window_data->close) {
|
||||
destroy_window_data(window_data);
|
||||
return false;
|
||||
@ -846,11 +846,11 @@ mfb_wait_sync(struct mfb_window *window) {
|
||||
|
||||
extern short int g_keycodes[512];
|
||||
|
||||
void
|
||||
void
|
||||
init_keycodes(void)
|
||||
{
|
||||
// Clear keys
|
||||
for (size_t i = 0; i < sizeof(g_keycodes) / sizeof(g_keycodes[0]); ++i)
|
||||
for (size_t i = 0; i < sizeof(g_keycodes) / sizeof(g_keycodes[0]); ++i)
|
||||
g_keycodes[i] = 0;
|
||||
|
||||
g_keycodes[KEY_GRAVE] = KB_KEY_GRAVE_ACCENT;
|
||||
@ -974,7 +974,7 @@ init_keycodes(void)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool
|
||||
bool
|
||||
mfb_set_viewport(struct mfb_window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height) {
|
||||
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
@ -999,7 +999,7 @@ mfb_set_viewport(struct mfb_window *window, unsigned offset_x, unsigned offset_y
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void
|
||||
mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y) {
|
||||
mfb_get_monitor_scale(struct mfb_window *window, float *scale_x, float *scale_y) {
|
||||
float x = 96.0, y = 96.0;
|
||||
|
||||
if(window != 0x0) {
|
||||
@ -1009,17 +1009,17 @@ mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y) {
|
||||
// I cannot find a way to get dpi under VirtualBox
|
||||
}
|
||||
|
||||
if (dpi_x) {
|
||||
*dpi_x = x / 96.0f;
|
||||
if(*dpi_x == 0) {
|
||||
*dpi_x = 1.0f;
|
||||
if (scale_x) {
|
||||
*scale_x = x / 96.0f;
|
||||
if(*scale_x == 0) {
|
||||
*scale_x = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
if (dpi_y) {
|
||||
*dpi_y = y / 96.0f;
|
||||
if (*dpi_y == 0) {
|
||||
*dpi_y = 1.0f;
|
||||
if (scale_y) {
|
||||
*scale_y = y / 96.0f;
|
||||
if (*scale_y == 0) {
|
||||
*scale_y = 1.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,11 +5,8 @@
|
||||
#if defined(USE_OPENGL_API)
|
||||
#include "gl/MiniFB_GL.h"
|
||||
#endif
|
||||
#if defined(_DEBUG) || defined(DEBUG)
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Copied (and modified) from Windows Kit 10 to avoid setting _WIN32_WINNT to a higher version
|
||||
@ -35,10 +32,14 @@ typedef enum mfb_MONITOR_DPI_TYPE {
|
||||
// user32.dll
|
||||
typedef BOOL(WINAPI *PFN_SetProcessDPIAware)(void);
|
||||
typedef BOOL(WINAPI *PFN_SetProcessDpiAwarenessContext)(HANDLE);
|
||||
typedef UINT(WINAPI *PFN_GetDpiForWindow)(HWND);
|
||||
typedef BOOL(WINAPI *PFN_EnableNonClientDpiScaling)(HWND);
|
||||
|
||||
HMODULE mfb_user32_dll = 0x0;
|
||||
PFN_SetProcessDPIAware mfb_SetProcessDPIAware = 0x0;
|
||||
PFN_SetProcessDpiAwarenessContext mfb_SetProcessDpiAwarenessContext = 0x0;
|
||||
PFN_GetDpiForWindow mfb_GetDpiForWindow = 0x0;
|
||||
PFN_EnableNonClientDpiScaling mfb_EnableNonClientDpiScaling = 0x0;
|
||||
|
||||
// shcore.dll
|
||||
typedef HRESULT(WINAPI *PFN_SetProcessDpiAwareness)(mfb_PROCESS_DPI_AWARENESS);
|
||||
@ -56,6 +57,8 @@ load_functions() {
|
||||
if (mfb_user32_dll != 0x0) {
|
||||
mfb_SetProcessDPIAware = (PFN_SetProcessDPIAware) GetProcAddress(mfb_user32_dll, "SetProcessDPIAware");
|
||||
mfb_SetProcessDpiAwarenessContext = (PFN_SetProcessDpiAwarenessContext) GetProcAddress(mfb_user32_dll, "SetProcessDpiAwarenessContext");
|
||||
mfb_GetDpiForWindow = (PFN_GetDpiForWindow) GetProcAddress(mfb_user32_dll, "GetDpiForWindow");
|
||||
mfb_EnableNonClientDpiScaling = (PFN_EnableNonClientDpiScaling) GetProcAddress(mfb_user32_dll, "EnableNonClientDpiScaling");
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,23 +71,56 @@ load_functions() {
|
||||
}
|
||||
}
|
||||
|
||||
//--
|
||||
// NOT Thread safe. Just convenient (Don't do this at home guys)
|
||||
char *
|
||||
GetErrorMessage() {
|
||||
static char buffer[256];
|
||||
|
||||
buffer[0] = 0;
|
||||
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL, // Not used with FORMAT_MESSAGE_FROM_SYSTEM
|
||||
GetLastError(),
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
buffer,
|
||||
sizeof(buffer),
|
||||
NULL);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
//--
|
||||
void
|
||||
dpi_aware() {
|
||||
if (mfb_SetProcessDpiAwarenessContext != 0x0) {
|
||||
mfb_SetProcessDpiAwarenessContext(mfb_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
||||
if(mfb_SetProcessDpiAwarenessContext(mfb_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) == false) {
|
||||
uint32_t error = GetLastError();
|
||||
if(error == ERROR_INVALID_PARAMETER) {
|
||||
error = NO_ERROR;
|
||||
if(mfb_SetProcessDpiAwarenessContext(mfb_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE) == false) {
|
||||
error = GetLastError();
|
||||
}
|
||||
}
|
||||
if(error != NO_ERROR) {
|
||||
fprintf(stderr, "Error (SetProcessDpiAwarenessContext): %s\n", GetErrorMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (mfb_SetProcessDpiAwareness != 0x0) {
|
||||
mfb_SetProcessDpiAwareness(mfb_PROCESS_PER_MONITOR_DPI_AWARE);
|
||||
if(mfb_SetProcessDpiAwareness(mfb_PROCESS_PER_MONITOR_DPI_AWARE) != S_OK) {
|
||||
fprintf(stderr, "Error (SetProcessDpiAwareness): %s\n", GetErrorMessage());
|
||||
}
|
||||
}
|
||||
else if (mfb_SetProcessDPIAware != 0x0) {
|
||||
mfb_SetProcessDPIAware();
|
||||
if(mfb_SetProcessDPIAware() == false) {
|
||||
fprintf(stderr, "Error (SetProcessDPIAware): %s\n", GetErrorMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--
|
||||
void
|
||||
get_monitor_dpi(HWND hWnd, float *dpi_x, float *dpi_y) {
|
||||
get_monitor_scale(HWND hWnd, float *scale_x, float *scale_y) {
|
||||
UINT x, y;
|
||||
|
||||
if(mfb_GetDpiForMonitor != 0x0) {
|
||||
@ -98,17 +134,17 @@ get_monitor_dpi(HWND hWnd, float *dpi_x, float *dpi_y) {
|
||||
ReleaseDC(NULL, dc);
|
||||
}
|
||||
|
||||
if (dpi_x) {
|
||||
*dpi_x = x / (float) USER_DEFAULT_SCREEN_DPI;
|
||||
if(*dpi_x == 0) {
|
||||
*dpi_x = 1;
|
||||
if (scale_x) {
|
||||
*scale_x = x / (float) USER_DEFAULT_SCREEN_DPI;
|
||||
if(*scale_x == 0) {
|
||||
*scale_x = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (dpi_y) {
|
||||
*dpi_y = y / (float) USER_DEFAULT_SCREEN_DPI;
|
||||
if (*dpi_y == 0) {
|
||||
*dpi_y = 1;
|
||||
if (scale_y) {
|
||||
*scale_y = y / (float) USER_DEFAULT_SCREEN_DPI;
|
||||
if (*scale_y == 0) {
|
||||
*scale_y = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -116,7 +152,7 @@ get_monitor_dpi(HWND hWnd, float *dpi_x, float *dpi_y) {
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void
|
||||
mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y) {
|
||||
mfb_get_monitor_scale(struct mfb_window *window, float *scale_x, float *scale_y) {
|
||||
HWND hWnd = 0x0;
|
||||
|
||||
if(window != 0x0) {
|
||||
@ -124,7 +160,7 @@ mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y) {
|
||||
SWindowData_Win *window_data_win = (SWindowData_Win *) window_data->specific;
|
||||
hWnd = window_data_win->window;
|
||||
}
|
||||
get_monitor_dpi(hWnd, dpi_x, dpi_y);
|
||||
get_monitor_scale(hWnd, scale_x, scale_y);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -151,6 +187,31 @@ WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_NCCREATE:
|
||||
{
|
||||
if(mfb_EnableNonClientDpiScaling)
|
||||
mfb_EnableNonClientDpiScaling(hWnd);
|
||||
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);;
|
||||
}
|
||||
|
||||
// TODO
|
||||
//case 0x02E4://WM_GETDPISCALEDSIZE:
|
||||
//{
|
||||
// SIZE* size = (SIZE*) lParam;
|
||||
// WORD dpi = LOWORD(wParam);
|
||||
// return true;
|
||||
// break;
|
||||
//}
|
||||
|
||||
// TODO
|
||||
//case WM_DPICHANGED:
|
||||
//{
|
||||
// const float xscale = HIWORD(wParam);
|
||||
// const float yscale = LOWORD(wParam);
|
||||
// break;
|
||||
//}
|
||||
|
||||
#if !defined(USE_OPENGL_API)
|
||||
case WM_PAINT:
|
||||
{
|
||||
@ -292,14 +353,14 @@ WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
||||
|
||||
case WM_SIZE:
|
||||
if (window_data) {
|
||||
float scaleX, scaleY;
|
||||
float scale_x, scale_y;
|
||||
uint32_t width, height;
|
||||
|
||||
if(wParam == SIZE_MINIMIZED) {
|
||||
return res;
|
||||
}
|
||||
|
||||
get_monitor_dpi(hWnd, &scaleX, &scaleY);
|
||||
get_monitor_scale(hWnd, &scale_x, &scale_y);
|
||||
window_data->window_width = LOWORD(lParam);
|
||||
window_data->window_height = HIWORD(lParam);
|
||||
resize_dst(window_data, window_data->window_width, window_data->window_height);
|
||||
@ -310,8 +371,8 @@ WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
||||
resize_GL(window_data);
|
||||
#endif
|
||||
if(window_data->window_width != 0 && window_data->window_height != 0) {
|
||||
width = (uint32_t) (window_data->window_width / scaleX);
|
||||
height = (uint32_t) (window_data->window_height / scaleY);
|
||||
width = (uint32_t) (window_data->window_width / scale_x);
|
||||
height = (uint32_t) (window_data->window_height / scale_y);
|
||||
kCall(resize_func, width, height);
|
||||
}
|
||||
}
|
||||
@ -417,11 +478,12 @@ mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
||||
}
|
||||
}
|
||||
else if (!(flags & WF_FULLSCREEN)) {
|
||||
float dpi_x, dpi_y;
|
||||
get_monitor_dpi(0, &dpi_x, &dpi_y);
|
||||
float scale_x, scale_y;
|
||||
|
||||
rect.right = (LONG) (width * dpi_x);
|
||||
rect.bottom = (LONG) (height * dpi_y);
|
||||
get_monitor_scale(0, &scale_x, &scale_y);
|
||||
|
||||
rect.right = (LONG) (width * scale_x);
|
||||
rect.bottom = (LONG) (height * scale_y);
|
||||
|
||||
AdjustWindowRect(&rect, s_window_style, 0);
|
||||
|
||||
@ -847,7 +909,7 @@ bool
|
||||
mfb_set_viewport(struct mfb_window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
SWindowData_Win *window_data_win = 0x0;
|
||||
float scaleX, scaleY;
|
||||
float scale_x, scale_y;
|
||||
|
||||
if(window_data == 0x0) {
|
||||
return false;
|
||||
@ -862,12 +924,12 @@ mfb_set_viewport(struct mfb_window *window, unsigned offset_x, unsigned offset_y
|
||||
|
||||
window_data_win = (SWindowData_Win *) window_data->specific;
|
||||
|
||||
get_monitor_dpi(window_data_win->window, &scaleX, &scaleY);
|
||||
window_data->dst_offset_x = (uint32_t) (offset_x * scaleX);
|
||||
window_data->dst_offset_y = (uint32_t) (offset_y * scaleY);
|
||||
get_monitor_scale(window_data_win->window, &scale_x, &scale_y);
|
||||
window_data->dst_offset_x = (uint32_t) (offset_x * scale_x);
|
||||
window_data->dst_offset_y = (uint32_t) (offset_y * scale_y);
|
||||
|
||||
window_data->dst_width = (uint32_t) (width * scaleX);
|
||||
window_data->dst_height = (uint32_t) (height * scaleY);
|
||||
window_data->dst_width = (uint32_t) (width * scale_x);
|
||||
window_data->dst_height = (uint32_t) (height * scale_y);
|
||||
|
||||
calc_dst_factor(window_data, window_data->window_width, window_data->window_height);
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
||||
|
||||
void init_keycodes(SWindowData_X11 *window_data_x11);
|
||||
|
||||
extern void
|
||||
extern void
|
||||
stretch_image(uint32_t *srcImage, uint32_t srcX, uint32_t srcY, uint32_t srcWidth, uint32_t srcHeight, uint32_t srcPitch,
|
||||
uint32_t *dstImage, uint32_t dstX, uint32_t dstY, uint32_t dstWidth, uint32_t dstHeight, uint32_t dstPitch);
|
||||
|
||||
@ -60,7 +60,7 @@ mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
||||
free(window_data_x11);
|
||||
return 0x0;
|
||||
}
|
||||
|
||||
|
||||
init_keycodes(window_data_x11);
|
||||
|
||||
window_data_x11->screen = DefaultScreen(window_data_x11->display);
|
||||
@ -79,7 +79,7 @@ mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
XFree(formats);
|
||||
|
||||
// We only support 32-bit right now
|
||||
@ -120,23 +120,23 @@ mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
||||
}
|
||||
|
||||
window_data_x11->window = XCreateWindow(
|
||||
window_data_x11->display,
|
||||
defaultRootWindow,
|
||||
posX, posY,
|
||||
windowWidth, windowHeight,
|
||||
0,
|
||||
depth,
|
||||
window_data_x11->display,
|
||||
defaultRootWindow,
|
||||
posX, posY,
|
||||
windowWidth, windowHeight,
|
||||
0,
|
||||
depth,
|
||||
InputOutput,
|
||||
visual,
|
||||
visual,
|
||||
CWBackPixel | CWBorderPixel | CWBackingStore,
|
||||
&windowAttributes);
|
||||
if (!window_data_x11->window)
|
||||
return 0x0;
|
||||
|
||||
XSelectInput(window_data_x11->display, window_data_x11->window,
|
||||
KeyPressMask | KeyReleaseMask
|
||||
| ButtonPressMask | ButtonReleaseMask | PointerMotionMask
|
||||
| StructureNotifyMask | ExposureMask
|
||||
XSelectInput(window_data_x11->display, window_data_x11->window,
|
||||
KeyPressMask | KeyReleaseMask
|
||||
| ButtonPressMask | ButtonReleaseMask | PointerMotionMask
|
||||
| StructureNotifyMask | ExposureMask
|
||||
| FocusChangeMask
|
||||
| EnterWindowMask | LeaveWindowMask
|
||||
);
|
||||
@ -219,11 +219,11 @@ int translate_key(int scancode);
|
||||
int translate_mod(int state);
|
||||
int translate_mod_ex(int key, int state, int is_pressed);
|
||||
|
||||
static void
|
||||
static void
|
||||
processEvent(SWindowData *window_data, XEvent *event) {
|
||||
switch (event->type) {
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
case KeyRelease:
|
||||
{
|
||||
mfb_key key_code = (mfb_key) translate_key(event->xkey.keycode);
|
||||
int is_pressed = (event->type == KeyPress);
|
||||
@ -274,10 +274,10 @@ processEvent(SWindowData *window_data, XEvent *event) {
|
||||
kCall(mouse_move_func, event->xmotion.x, event->xmotion.y);
|
||||
break;
|
||||
|
||||
case ConfigureNotify:
|
||||
case ConfigureNotify:
|
||||
{
|
||||
window_data->window_width = event->xconfigure.width;
|
||||
window_data->window_height = event->xconfigure.height;
|
||||
window_data->window_height = event->xconfigure.height;
|
||||
resize_dst(window_data, event->xconfigure.width, event->xconfigure.height);
|
||||
|
||||
#if defined(USE_OPENGL_API)
|
||||
@ -292,7 +292,7 @@ processEvent(SWindowData *window_data, XEvent *event) {
|
||||
window_data_x11->image_scaler_height = 0;
|
||||
}
|
||||
XClearWindow(window_data_x11->display, window_data_x11->window);
|
||||
#endif
|
||||
#endif
|
||||
kCall(resize_func, window_data->window_width, window_data->window_height);
|
||||
}
|
||||
break;
|
||||
@ -318,7 +318,7 @@ processEvent(SWindowData *window_data, XEvent *event) {
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
static void
|
||||
processEvents(SWindowData *window_data) {
|
||||
XEvent event;
|
||||
SWindowData_X11 *window_data_x11 = (SWindowData_X11 *) window_data->specific;
|
||||
@ -333,7 +333,7 @@ processEvents(SWindowData *window_data) {
|
||||
|
||||
void destroy_window_data(SWindowData *window_data);
|
||||
|
||||
mfb_update_state
|
||||
mfb_update_state
|
||||
mfb_update_ex(struct mfb_window *window, void *buffer, unsigned width, unsigned height) {
|
||||
if (window == 0x0) {
|
||||
return STATE_INVALID_WINDOW;
|
||||
@ -387,7 +387,7 @@ mfb_update_ex(struct mfb_window *window, void *buffer, unsigned width, unsigned
|
||||
}
|
||||
|
||||
if (window_data_x11->image_scaler != 0x0) {
|
||||
stretch_image((uint32_t *) buffer, 0, 0, window_data->buffer_width, window_data->buffer_height, window_data->buffer_width,
|
||||
stretch_image((uint32_t *) buffer, 0, 0, window_data->buffer_width, window_data->buffer_height, window_data->buffer_width,
|
||||
(uint32_t *) window_data_x11->image_buffer, 0, 0, window_data->dst_width, window_data->dst_height, window_data->dst_width);
|
||||
window_data_x11->image_scaler->data = (char *) window_data_x11->image_buffer;
|
||||
XPutImage(window_data_x11->display, window_data_x11->window, window_data_x11->gc, window_data_x11->image_scaler, 0, 0, window_data->dst_offset_x, window_data->dst_offset_y, window_data->dst_width, window_data->dst_height);
|
||||
@ -405,13 +405,13 @@ mfb_update_ex(struct mfb_window *window, void *buffer, unsigned width, unsigned
|
||||
#endif
|
||||
|
||||
processEvents(window_data);
|
||||
|
||||
|
||||
return STATE_OK;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
mfb_update_state
|
||||
mfb_update_state
|
||||
mfb_update_events(struct mfb_window *window) {
|
||||
if (window == 0x0) {
|
||||
return STATE_INVALID_WINDOW;
|
||||
@ -426,7 +426,7 @@ mfb_update_events(struct mfb_window *window) {
|
||||
SWindowData_X11 *window_data_x11 = (SWindowData_X11 *) window_data->specific;
|
||||
XFlush(window_data_x11->display);
|
||||
processEvents(window_data);
|
||||
|
||||
|
||||
return STATE_OK;
|
||||
}
|
||||
|
||||
@ -434,7 +434,7 @@ mfb_update_events(struct mfb_window *window) {
|
||||
|
||||
extern double g_time_for_frame;
|
||||
|
||||
bool
|
||||
bool
|
||||
mfb_wait_sync(struct mfb_window *window) {
|
||||
if (window == 0x0) {
|
||||
return STATE_INVALID_WINDOW;
|
||||
@ -456,7 +456,7 @@ mfb_wait_sync(struct mfb_window *window) {
|
||||
XNextEvent(window_data_x11->display, &event);
|
||||
processEvent(window_data, &event);
|
||||
}
|
||||
|
||||
|
||||
if(window_data->close) {
|
||||
destroy_window_data(window_data);
|
||||
return false;
|
||||
@ -474,19 +474,19 @@ mfb_wait_sync(struct mfb_window *window) {
|
||||
usleep(millis * 1000);
|
||||
//sched_yield();
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void
|
||||
void
|
||||
destroy_window_data(SWindowData *window_data) {
|
||||
if (window_data != 0x0) {
|
||||
if (window_data->specific != 0x0) {
|
||||
SWindowData_X11 *window_data_x11 = (SWindowData_X11 *) window_data->specific;
|
||||
|
||||
#if defined(USE_OPENGL_API)
|
||||
#if defined(USE_OPENGL_API)
|
||||
destroy_GL_context(window_data);
|
||||
#else
|
||||
if (window_data_x11->image != 0x0) {
|
||||
@ -495,7 +495,7 @@ destroy_window_data(SWindowData *window_data) {
|
||||
XDestroyWindow(window_data_x11->display, window_data_x11->window);
|
||||
XCloseDisplay(window_data_x11->display);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
mfb_timer_destroy(window_data_x11->timer);
|
||||
memset(window_data_x11, 0, sizeof(SWindowData_X11));
|
||||
@ -510,7 +510,7 @@ destroy_window_data(SWindowData *window_data) {
|
||||
|
||||
extern short int g_keycodes[512];
|
||||
|
||||
static int
|
||||
static int
|
||||
translateKeyCodeB(int keySym) {
|
||||
|
||||
switch (keySym)
|
||||
@ -674,13 +674,13 @@ static int translateKeyCodeA(int keySym) {
|
||||
return KB_KEY_UNKNOWN;
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
init_keycodes(SWindowData_X11 *window_data_x11) {
|
||||
size_t i;
|
||||
int keySym;
|
||||
|
||||
// Clear keys
|
||||
for (i = 0; i < sizeof(g_keycodes) / sizeof(g_keycodes[0]); ++i)
|
||||
for (i = 0; i < sizeof(g_keycodes) / sizeof(g_keycodes[0]); ++i)
|
||||
g_keycodes[i] = KB_KEY_UNKNOWN;
|
||||
|
||||
// Valid key code range is [8,255], according to the Xlib manual
|
||||
@ -697,7 +697,7 @@ init_keycodes(SWindowData_X11 *window_data_x11) {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int
|
||||
int
|
||||
translate_key(int scancode) {
|
||||
if (scancode < 0 || scancode > 255)
|
||||
return KB_KEY_UNKNOWN;
|
||||
@ -707,7 +707,7 @@ translate_key(int scancode) {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int
|
||||
int
|
||||
translate_mod(int state) {
|
||||
int mod_keys = 0;
|
||||
|
||||
@ -729,7 +729,7 @@ translate_mod(int state) {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int
|
||||
int
|
||||
translate_mod_ex(int key, int state, int is_pressed) {
|
||||
int mod_keys = 0;
|
||||
|
||||
@ -775,7 +775,7 @@ translate_mod_ex(int key, int state, int is_pressed) {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool
|
||||
bool
|
||||
mfb_set_viewport(struct mfb_window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height) {
|
||||
SWindowData *window_data = (SWindowData *) window;
|
||||
|
||||
@ -791,14 +791,14 @@ mfb_set_viewport(struct mfb_window *window, unsigned offset_x, unsigned offset_y
|
||||
window_data->dst_width = width;
|
||||
window_data->dst_height = height;
|
||||
calc_dst_factor(window_data, window_data->window_width, window_data->window_height);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void
|
||||
mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y) {
|
||||
mfb_get_monitor_scale(struct mfb_window *window, float *scale_x, float *scale_y) {
|
||||
float x = 96.0, y = 96.0;
|
||||
|
||||
if(window != 0x0) {
|
||||
@ -812,17 +812,17 @@ mfb_get_monitor_dpi(struct mfb_window *window, float *dpi_x, float *dpi_y) {
|
||||
// All returning invalid values or 0
|
||||
}
|
||||
|
||||
if (dpi_x) {
|
||||
*dpi_x = x / 96.0f;
|
||||
if(*dpi_x == 0) {
|
||||
*dpi_x = 1.0f;
|
||||
if (scale_x) {
|
||||
*scale_x = x / 96.0f;
|
||||
if(*scale_x == 0) {
|
||||
*scale_x = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
if (dpi_y) {
|
||||
*dpi_y = y / 96.0f;
|
||||
if (*dpi_y == 0) {
|
||||
*dpi_y = 1.0f;
|
||||
if (scale_y) {
|
||||
*scale_y = y / 96.0f;
|
||||
if (*scale_y == 0) {
|
||||
*scale_y = 1.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ resize(struct mfb_window *window, int width, int height) {
|
||||
dis ^= 0x01;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mfb_update_state state = mfb_update_ex(g_window, g_buffer, g_width, g_height);
|
||||
if (state != STATE_OK) {
|
||||
free(g_buffer);
|
||||
@ -89,9 +89,9 @@ resize(struct mfb_window *window, int width, int height) {
|
||||
// Override point for customization after application launch.
|
||||
kUnused(application);
|
||||
kUnused(launchOptions);
|
||||
|
||||
|
||||
if(g_window == 0x0) {
|
||||
mfb_get_monitor_dpi(0x0, &g_scale, 0x0);
|
||||
mfb_get_monitor_scale(0x0, &g_scale, 0x0);
|
||||
//g_scale = [UIScreen mainScreen].scale;
|
||||
g_width = [UIScreen mainScreen].bounds.size.width * g_scale;
|
||||
g_height = [UIScreen mainScreen].bounds.size.height * g_scale;
|
||||
@ -135,7 +135,7 @@ resize(struct mfb_window *window, int width, int height) {
|
||||
- (void)applicationDidBecomeActive:(UIApplication *)application {
|
||||
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
|
||||
kUnused(application);
|
||||
|
||||
|
||||
mDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(OnUpdateFrame)];
|
||||
[mDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
|
||||
}
|
||||
@ -144,7 +144,7 @@ resize(struct mfb_window *window, int width, int height) {
|
||||
- (void)applicationWillTerminate:(UIApplication *)application {
|
||||
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
|
||||
kUnused(application);
|
||||
|
||||
|
||||
[mDisplayLink invalidate];
|
||||
mfb_close(g_window);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user