5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 19:31:20 +08:00

Feature: WindowToggleMaximise (#1159)

* [windows] Add WindowToggleMaximise

* Add mac support

* Update docs

* [linux] Toggle Maximise
This commit is contained in:
Lea Anthony 2022-02-18 20:28:16 +11:00 committed by GitHub
parent 6e8d65e3aa
commit f059c35d9e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 134 additions and 28 deletions

View File

@ -30,6 +30,7 @@ void Fullscreen(void* ctx);
void UnFullscreen(void* ctx);
void Minimise(void* ctx);
void UnMinimise(void* ctx);
void ToggleMaximise(void* ctx);
void Maximise(void* ctx);
void UnMaximise(void* ctx);
void Hide(void* ctx);

View File

@ -156,6 +156,13 @@ void Maximise(void* inctx) {
);
}
void ToggleMaximise(void* inctx) {
WailsContext *ctx = (__bridge WailsContext*) inctx;
ON_MAIN_THREAD(
[ctx ToggleMaximise];
);
}
const char* GetSize(void *inctx) {
WailsContext *ctx = (__bridge WailsContext*) inctx;
NSRect frame = [ctx.mainWindow frame];

View File

@ -67,6 +67,7 @@
- (void) Minimise;
- (void) UnMinimise;
- (void) Maximise;
- (void) ToggleMaximise;
- (void) UnMaximise;
- (void) SetRGBA:(int)r :(int)g :(int)b :(int)a;
- (void) HideMouse;

View File

@ -322,11 +322,6 @@
return (mask & NSWindowStyleMaskFullScreen) == NSWindowStyleMaskFullScreen;
}
- (bool) isMaximised {
long mask = [self.mainWindow styleMask];
return (mask & NSWindowStyleMaskFullScreen) == NSWindowStyleMaskFullScreen;
}
// Fullscreen sets the main window to be fullscreen
- (void) Fullscreen {
if( ! [self isFullScreen] ) {
@ -366,6 +361,10 @@
}
}
- (void) ToggleMaximise {
[self.mainWindow zoom:nil];
}
- (void) UnMaximise {
if ([self.mainWindow isZoomed]) {
[self.mainWindow zoom:nil];

View File

@ -181,6 +181,9 @@ func (f *Frontend) WindowHide() {
func (f *Frontend) WindowMaximise() {
f.mainWindow.Maximise()
}
func (f *Frontend) WindowToggleMaximise() {
f.mainWindow.ToggleMaximise()
}
func (f *Frontend) WindowUnmaximise() {
f.mainWindow.UnMaximise()
}

View File

@ -154,6 +154,9 @@ func (w *Window) SetTitle(title string) {
func (w *Window) Maximise() {
C.Maximise(w.context)
}
func (w *Window) ToggleMaximise() {
C.ToggleMaximise(w.context)
}
func (w *Window) UnMaximise() {
C.UnMaximise(w.context)

View File

@ -173,6 +173,9 @@ func (f *Frontend) WindowHide() {
func (f *Frontend) WindowMaximise() {
f.mainWindow.Maximise()
}
func (f *Frontend) WindowToggleMaximise() {
f.mainWindow.ToggleMaximise()
}
func (f *Frontend) WindowUnmaximise() {
f.mainWindow.UnMaximise()
}

View File

@ -80,6 +80,13 @@ int IsFullscreen(GtkWidget *widget) {
return state & GDK_WINDOW_STATE_FULLSCREEN == GDK_WINDOW_STATE_FULLSCREEN;
}
int IsMaximised(GtkWidget *widget) {
GdkWindow *gdkwindow = gtk_widget_get_window(widget);
GdkWindowState state = gdk_window_get_state(GDK_WINDOW(gdkwindow));
return state & GDK_WINDOW_STATE_MAXIMIZED;
}
extern void processMessage(char*);
static void sendMessageToBackend(WebKitUserContentManager *contentManager,
@ -673,6 +680,11 @@ func (w *Window) IsFullScreen() bool {
return false
}
func (w *Window) IsMaximised() bool {
result := C.IsMaximised(w.asGTKWidget())
return result > 0
}
func (w *Window) SetRGBA(r uint8, g uint8, b uint8, a uint8) {
data := C.RGBAOptions{
r: C.uchar(r),
@ -813,3 +825,11 @@ func (w *Window) MessageDialog(dialogOptions frontend.MessageDialogOptions) {
}
C.ExecuteOnMainThread(C.messageDialog, C.gpointer(&data))
}
func (w *Window) ToggleMaximise() {
if w.IsMaximised() {
w.UnMaximise()
} else {
w.Maximise()
}
}

View File

@ -199,6 +199,18 @@ func (f *Frontend) WindowMaximise() {
f.frontendOptions.WindowStartState = options.Maximised
}
}
func (f *Frontend) WindowToggleMaximise() {
runtime.LockOSThread()
if !f.hasStarted {
return
}
if f.mainWindow.IsMaximised() {
f.WindowUnmaximise()
} else {
f.WindowMaximise()
}
}
func (f *Frontend) WindowUnmaximise() {
runtime.LockOSThread()
f.mainWindow.Restore()

View File

@ -207,6 +207,11 @@ func (w *Window) WndProc(msg uint32, wparam, lparam uintptr) uintptr {
return w.Form.WndProc(msg, wparam, lparam)
}
func (w *Window) IsMaximised() bool {
style := uint32(w32.GetWindowLong(w.Handle(), w32.GWL_STYLE))
return style&w32.WS_MAXIMIZE != 0
}
// TODO this should be put into the winc if we are happy with this solution.
var (
modkernel32 = syscall.NewLazyDLL("dwmapi.dll")

View File

@ -187,6 +187,10 @@ func (d *DevWebServer) WindowMaximise() {
d.desktopFrontend.WindowMaximise()
}
func (d *DevWebServer) WindowToggleMaximise() {
d.desktopFrontend.WindowToggleMaximise()
}
func (d *DevWebServer) WindowUnmaximise() {
d.desktopFrontend.WindowUnmaximise()
}

View File

@ -55,6 +55,8 @@ func (d *Dispatcher) processWindowMessage(message string, sender frontend.Fronte
go sender.WindowSetRGBA(&rgba)
case 'M':
go sender.WindowMaximise()
case 't':
go sender.WindowToggleMaximise()
case 'U':
go sender.WindowUnmaximise()
case 'm':

View File

@ -72,6 +72,7 @@ type Frontend interface {
WindowShow()
WindowHide()
WindowCenter()
WindowToggleMaximise()
WindowMaximise()
WindowUnmaximise()
WindowMinimise()

View File

@ -146,6 +146,15 @@ export function WindowMaximise() {
window.WailsInvoke('WM');
}
/**
* Toggle the Maximise of the Window
*
* @export
*/
export function WindowToggleMaximise() {
window.WailsInvoke('Wt');
}
/**
* Unmaximise the Window
*

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -65,6 +65,8 @@ export interface runtime {
WindowMaximise(): void;
WindowToggleMaximise(): void;
WindowUnmaximise(): void;
WindowMinimise(): void;

View File

@ -1 +1 @@
(()=>{var d=Object.defineProperty;var m=n=>d(n,"__esModule",{value:!0});var t=(n,i)=>{m(n);for(var o in i)d(n,o,{get:i[o],enumerable:!0})};var e={};t(e,{LogDebug:()=>c,LogError:()=>x,LogFatal:()=>s,LogInfo:()=>W,LogTrace:()=>p,LogWarning:()=>f});function p(n){window.runtime.LogTrace(n)}function c(n){window.runtime.LogDebug(n)}function W(n){window.runtime.LogInfo(n)}function f(n){window.runtime.LogWarning(n)}function x(n){window.runtime.LogError(n)}function s(n){window.runtime.LogFatal(n)}var w={};t(w,{EventsEmit:()=>g,EventsOn:()=>a,EventsOnMultiple:()=>l,EventsOnce:()=>S});function l(n,i,o){window.runtime.EventsOnMultiple(n,i,o)}function a(n,i){OnMultiple(n,i,-1)}function S(n,i){OnMultiple(n,i,1)}function g(n){let i=[n].slice.call(arguments);return window.runtime.EventsEmit.apply(null,i)}var r={};t(r,{WindowCenter:()=>M,WindowFullscreen:()=>v,WindowGetPosition:()=>B,WindowGetSize:()=>O,WindowHide:()=>P,WindowMaximise:()=>b,WindowMinimise:()=>A,WindowReload:()=>L,WindowSetMaxSize:()=>F,WindowSetMinSize:()=>G,WindowSetPosition:()=>R,WindowSetRGBA:()=>D,WindowSetSize:()=>U,WindowSetTitle:()=>E,WindowShow:()=>T,WindowUnFullscreen:()=>z,WindowUnmaximise:()=>h,WindowUnminimise:()=>C});function L(){window.runtime.WindowReload()}function M(){window.runtime.WindowCenter()}function E(n){window.runtime.WindowSetTitle(n)}function v(){window.runtime.WindowFullscreen()}function z(){window.runtime.WindowUnFullscreen()}function O(){window.runtime.WindowGetSize()}function U(n,i){window.runtime.WindowSetSize(n,i)}function F(n,i){window.runtime.WindowSetMaxSize(n,i)}function G(n,i){window.runtime.WindowSetMinSize(n,i)}function R(n,i){window.runtime.WindowSetPosition(n,i)}function B(){window.runtime.WindowGetPosition()}function P(){window.runtime.WindowHide()}function T(){window.runtime.WindowShow()}function b(){window.runtime.WindowMaximise()}function h(){window.runtime.WindowUnmaximise()}function A(){window.runtime.WindowMinimise()}function C(){window.runtime.WindowUnminimise()}function D(n){window.runtime.WindowSetRGBA(n)}var u={};t(u,{BrowserOpenURL:()=>H});function H(n){window.runtime.BrowserOpenURL(n)}function I(){window.runtime.Quit()}var y={...e,...w,...r,...u,Quit:I};})();
(()=>{var d=Object.defineProperty;var m=n=>d(n,"__esModule",{value:!0});var e=(n,i)=>{m(n);for(var o in i)d(n,o,{get:i[o],enumerable:!0})};var t={};e(t,{LogDebug:()=>W,LogError:()=>f,LogFatal:()=>s,LogInfo:()=>c,LogTrace:()=>p,LogWarning:()=>x});function p(n){window.runtime.LogTrace(n)}function W(n){window.runtime.LogDebug(n)}function c(n){window.runtime.LogInfo(n)}function x(n){window.runtime.LogWarning(n)}function f(n){window.runtime.LogError(n)}function s(n){window.runtime.LogFatal(n)}var w={};e(w,{EventsEmit:()=>S,EventsOn:()=>a,EventsOnMultiple:()=>l,EventsOnce:()=>g});function l(n,i,o){window.runtime.EventsOnMultiple(n,i,o)}function a(n,i){OnMultiple(n,i,-1)}function g(n,i){OnMultiple(n,i,1)}function S(n){let i=[n].slice.call(arguments);return window.runtime.EventsEmit.apply(null,i)}var r={};e(r,{WindowCenter:()=>M,WindowFullscreen:()=>v,WindowGetPosition:()=>T,WindowGetSize:()=>O,WindowHide:()=>B,WindowMaximise:()=>b,WindowMinimise:()=>C,WindowReload:()=>L,WindowSetMaxSize:()=>F,WindowSetMinSize:()=>G,WindowSetPosition:()=>R,WindowSetRGBA:()=>H,WindowSetSize:()=>U,WindowSetTitle:()=>E,WindowShow:()=>P,WindowToggleMaximise:()=>h,WindowUnFullscreen:()=>z,WindowUnmaximise:()=>A,WindowUnminimise:()=>D});function L(){window.runtime.WindowReload()}function M(){window.runtime.WindowCenter()}function E(n){window.runtime.WindowSetTitle(n)}function v(){window.runtime.WindowFullscreen()}function z(){window.runtime.WindowUnFullscreen()}function O(){window.runtime.WindowGetSize()}function U(n,i){window.runtime.WindowSetSize(n,i)}function F(n,i){window.runtime.WindowSetMaxSize(n,i)}function G(n,i){window.runtime.WindowSetMinSize(n,i)}function R(n,i){window.runtime.WindowSetPosition(n,i)}function T(){window.runtime.WindowGetPosition()}function B(){window.runtime.WindowHide()}function P(){window.runtime.WindowShow()}function b(){window.runtime.WindowMaximise()}function h(){window.runtime.WindowToggleMaximise()}function A(){window.runtime.WindowUnmaximise()}function C(){window.runtime.WindowMinimise()}function D(){window.runtime.WindowUnminimise()}function H(n){window.runtime.WindowSetRGBA(n)}var u={};e(u,{BrowserOpenURL:()=>I});function I(n){window.runtime.BrowserOpenURL(n)}function Q(){window.runtime.Quit()}var j={...t,...w,...r,...u,Quit:Q};})();

View File

@ -149,6 +149,15 @@ export function WindowMaximise() {
window.runtime.WindowMaximise();
}
/**
* Toggle the Maximise of the Window
*
* @export
*/
export function WindowToggleMaximise() {
window.runtime.WindowToggleMaximise();
}
/**
* Unmaximise the Window
*

View File

@ -88,6 +88,12 @@ func WindowMaximise(ctx context.Context) {
appFrontend.WindowMaximise()
}
// WindowToggleMaximise the window
func WindowToggleMaximise(ctx context.Context) {
appFrontend := getFrontend(ctx)
appFrontend.WindowToggleMaximise()
}
// WindowUnmaximise the window
func WindowUnmaximise(ctx context.Context) {
appFrontend := getFrontend(ctx)

View File

@ -119,6 +119,13 @@ JS Signature: `WindowUnmaximise()`
Restores the window to the dimensions and position prior to maximising.
### WindowToggleMaximise
Go Signature: `WindowToggleMaximise(ctx context.Context)`
JS Signature: `WindowToggleMaximise()`
Toggles between Maximised and UnMaximised.
### WindowMinimise
Go Signature: `WindowMinimise(ctx context.Context)`