mirror of
https://github.com/wailsapp/wails.git
synced 2026-03-14 22:55:48 +01:00
[windows] Main thread dispatcher. Small refactor.
This commit is contained in:
parent
84f37c66ba
commit
1bdbf68ca9
2 changed files with 114 additions and 18 deletions
|
|
@ -2,11 +2,33 @@
|
|||
#include "ffenestri_windows.h"
|
||||
|
||||
int debug = 0;
|
||||
DWORD mainThread;
|
||||
|
||||
typedef void(*dispatchMethod)(void);
|
||||
typedef void(*dispatchMethod1)(void*);
|
||||
typedef void(*dispatchMethod2)(void*,void*);
|
||||
|
||||
typedef struct {
|
||||
void* func;
|
||||
void* args[5];
|
||||
int argc;
|
||||
} dispatchFunction;
|
||||
|
||||
dispatchFunction* NewDispatchFunction(void *func) {
|
||||
dispatchFunction *result = malloc(sizeof(dispatchFunction));
|
||||
result->func = func;
|
||||
result->argc = 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
// dispatch will execute the given `func` pointer
|
||||
void dispatch(dispatchFunction *func) {
|
||||
PostThreadMessage(mainThread, WM_APP, 0, (LPARAM) func);
|
||||
}
|
||||
|
||||
struct Application{
|
||||
// Window specific
|
||||
HWND window;
|
||||
DWORD mainThread;
|
||||
|
||||
// Application
|
||||
const char *title;
|
||||
|
|
@ -52,7 +74,7 @@ struct Application *NewApplication(const char *title, int width, int height, int
|
|||
result->frame = 1;
|
||||
|
||||
// Capture Main Thread
|
||||
result->mainThread = GetCurrentThreadId();
|
||||
mainThread = GetCurrentThreadId();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
@ -128,16 +150,16 @@ void Run(struct Application* app, int argc, char **argv) {
|
|||
|
||||
// Process window resizable
|
||||
DWORD windowStyle = WS_OVERLAPPEDWINDOW;
|
||||
if (app->resizable == 0) {
|
||||
windowStyle &= ~WS_MAXIMIZEBOX;
|
||||
windowStyle &= ~WS_THICKFRAME;
|
||||
}
|
||||
if ( app->frame == 0 ) {
|
||||
windowStyle = WS_POPUP;
|
||||
}
|
||||
|
||||
DWORD dwStyle = windowStyle;
|
||||
if (app->resizable == 0) {
|
||||
dwStyle = windowStyle | WS_MINIMIZEBOX | WS_SYSMENU;
|
||||
}
|
||||
RegisterClassEx(&wc);
|
||||
app->window = CreateWindow("ffenestri", "", dwStyle, CW_USEDEFAULT,
|
||||
app->window = CreateWindow("ffenestri", "", windowStyle, CW_USEDEFAULT,
|
||||
CW_USEDEFAULT, app->width, app->height, NULL, NULL,
|
||||
GetModuleHandle(NULL), NULL);
|
||||
// Set Title
|
||||
|
|
@ -151,7 +173,8 @@ void Run(struct Application* app, int argc, char **argv) {
|
|||
if ( app->startHidden == 1 ) {
|
||||
startVisibility = SW_HIDE;
|
||||
}
|
||||
Center(app);
|
||||
// private center() as we are on main thread
|
||||
center(app);
|
||||
ShowWindow(app->window, startVisibility);
|
||||
UpdateWindow(app->window);
|
||||
SetFocus(app->window);
|
||||
|
|
@ -168,14 +191,21 @@ void Run(struct Application* app, int argc, char **argv) {
|
|||
continue;
|
||||
}
|
||||
if (msg.message == WM_APP) {
|
||||
dispatchFunction *m = (dispatchFunction*) msg.lParam;
|
||||
void *method = m->func;
|
||||
if (m->argc == 1) {
|
||||
((dispatchMethod1)method)(m->args[0]);
|
||||
}
|
||||
if (m->argc == 2) {
|
||||
((dispatchMethod2)method)(m->args[0], m->args[1]);
|
||||
}
|
||||
free(m);
|
||||
} else if (msg.message == WM_QUIT) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void DestroyApplication(struct Application* app) {
|
||||
PostQuitMessage(0);
|
||||
}
|
||||
|
|
@ -189,15 +219,29 @@ void SetBindings(struct Application* app, const char *bindings) {
|
|||
void ExecJS(struct Application* app, const char *script) {
|
||||
}
|
||||
|
||||
void Hide(struct Application* app) {
|
||||
void hide(struct Application* app) {
|
||||
ShowWindow(app->window, SW_HIDE);
|
||||
}
|
||||
|
||||
void Show(struct Application* app) {
|
||||
void Hide(struct Application* app) {
|
||||
dispatchFunction *f = NewDispatchFunction(hide);
|
||||
f->args[0] = app;
|
||||
f->argc = 1;
|
||||
dispatch(f);
|
||||
}
|
||||
|
||||
void show(struct Application* app) {
|
||||
ShowWindow(app->window, SW_SHOW);
|
||||
}
|
||||
|
||||
void Center(struct Application* app) {
|
||||
void Show(struct Application* app) {
|
||||
dispatchFunction *f = NewDispatchFunction(show);
|
||||
f->args[0] = app;
|
||||
f->argc = 1;
|
||||
dispatch(f);
|
||||
}
|
||||
|
||||
void center(struct Application* app) {
|
||||
|
||||
HMONITOR currentMonitor = MonitorFromWindow(app->window, MONITOR_DEFAULTTONEAREST);
|
||||
MONITORINFO info = {0};
|
||||
|
|
@ -221,6 +265,13 @@ void Center(struct Application* app) {
|
|||
SetWindowPos(app->window, HWND_TOP, windowX, windowY, winWidth, winHeight, SWP_NOSIZE);
|
||||
}
|
||||
|
||||
void Center(struct Application* app) {
|
||||
dispatchFunction *f = NewDispatchFunction(center);
|
||||
f->args[0] = app;
|
||||
f->argc = 1;
|
||||
dispatch(f);
|
||||
}
|
||||
|
||||
UINT getWindowPlacement(struct Application* app) {
|
||||
WINDOWPLACEMENT lpwndpl;
|
||||
lpwndpl.length = sizeof(WINDOWPLACEMENT);
|
||||
|
|
@ -236,14 +287,29 @@ int isMaximised(struct Application* app) {
|
|||
return getWindowPlacement(app) == SW_SHOWMAXIMIZED;
|
||||
}
|
||||
|
||||
void Maximise(struct Application* app) {
|
||||
void maximise(struct Application* app) {
|
||||
ShowWindow(app->window, SW_MAXIMIZE);
|
||||
}
|
||||
|
||||
void Unmaximise(struct Application* app) {
|
||||
void Maximise(struct Application* app) {
|
||||
dispatchFunction *f = NewDispatchFunction(maximise);
|
||||
f->args[0] = app;
|
||||
f->argc = 1;
|
||||
dispatch(f);
|
||||
}
|
||||
|
||||
void unmaximise(struct Application* app) {
|
||||
ShowWindow(app->window, SW_RESTORE);
|
||||
}
|
||||
|
||||
void Unmaximise(struct Application* app) {
|
||||
dispatchFunction *f = NewDispatchFunction(unmaximise);
|
||||
f->args[0] = app;
|
||||
f->argc = 1;
|
||||
dispatch(f);
|
||||
}
|
||||
|
||||
|
||||
void ToggleMaximise(struct Application* app) {
|
||||
if(isMaximised(app)) {
|
||||
return Unmaximise(app);
|
||||
|
|
@ -255,14 +321,28 @@ int isMinimised(struct Application* app) {
|
|||
return getWindowPlacement(app) == SW_SHOWMINIMIZED;
|
||||
}
|
||||
|
||||
void Minimise(struct Application* app) {
|
||||
void minimise(struct Application* app) {
|
||||
ShowWindow(app->window, SW_MINIMIZE);
|
||||
}
|
||||
|
||||
void Unminimise(struct Application* app) {
|
||||
void Minimise(struct Application* app) {
|
||||
dispatchFunction *f = NewDispatchFunction(minimise);
|
||||
f->args[0] = app;
|
||||
f->argc = 1;
|
||||
dispatch(f);
|
||||
}
|
||||
|
||||
void unminimise(struct Application* app) {
|
||||
ShowWindow(app->window, SW_RESTORE);
|
||||
}
|
||||
|
||||
void Unminimise(struct Application* app) {
|
||||
dispatchFunction *f = NewDispatchFunction(unminimise);
|
||||
f->args[0] = app;
|
||||
f->argc = 1;
|
||||
dispatch(f);
|
||||
}
|
||||
|
||||
void ToggleMinimise(struct Application* app) {
|
||||
if(isMinimised(app)) {
|
||||
return Unminimise(app);
|
||||
|
|
@ -271,20 +351,34 @@ void ToggleMinimise(struct Application* app) {
|
|||
}
|
||||
|
||||
void SetColour(struct Application* app, int red, int green, int blue, int alpha) {
|
||||
|
||||
}
|
||||
|
||||
void SetSize(struct Application* app, int width, int height) {
|
||||
}
|
||||
void SetPosition(struct Application* app, int x, int y) {
|
||||
}
|
||||
void Quit(struct Application* app) {
|
||||
}
|
||||
void SetTitle(struct Application* app, const char *title) {
|
||||
|
||||
void setTitle(struct Application* app, const char *title) {
|
||||
SetWindowText(app->window, title);
|
||||
}
|
||||
|
||||
void SetTitle(struct Application* app, const char *title) {
|
||||
dispatchFunction *f = NewDispatchFunction(setTitle);
|
||||
f->args[0] = app;
|
||||
f->args[1] = (void*)title;
|
||||
f->argc = 2;
|
||||
dispatch(f);
|
||||
}
|
||||
|
||||
void Fullscreen(struct Application* app) {
|
||||
}
|
||||
|
||||
void UnFullscreen(struct Application* app) {
|
||||
}
|
||||
|
||||
void ToggleFullscreen(struct Application* app) {
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,4 +6,6 @@
|
|||
#include <windows.h>
|
||||
#include <wingdi.h>
|
||||
|
||||
void center(struct Application*);
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue