5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 19:50:15 +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 UnFullscreen(void* ctx);
void Minimise(void* ctx); void Minimise(void* ctx);
void UnMinimise(void* ctx); void UnMinimise(void* ctx);
void ToggleMaximise(void* ctx);
void Maximise(void* ctx); void Maximise(void* ctx);
void UnMaximise(void* ctx); void UnMaximise(void* ctx);
void Hide(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) { const char* GetSize(void *inctx) {
WailsContext *ctx = (__bridge WailsContext*) inctx; WailsContext *ctx = (__bridge WailsContext*) inctx;
NSRect frame = [ctx.mainWindow frame]; NSRect frame = [ctx.mainWindow frame];

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -80,6 +80,13 @@ int IsFullscreen(GtkWidget *widget) {
return state & GDK_WINDOW_STATE_FULLSCREEN == GDK_WINDOW_STATE_FULLSCREEN; 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*); extern void processMessage(char*);
static void sendMessageToBackend(WebKitUserContentManager *contentManager, static void sendMessageToBackend(WebKitUserContentManager *contentManager,
@ -673,6 +680,11 @@ func (w *Window) IsFullScreen() bool {
return false 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) { func (w *Window) SetRGBA(r uint8, g uint8, b uint8, a uint8) {
data := C.RGBAOptions{ data := C.RGBAOptions{
r: C.uchar(r), r: C.uchar(r),
@ -813,3 +825,11 @@ func (w *Window) MessageDialog(dialogOptions frontend.MessageDialogOptions) {
} }
C.ExecuteOnMainThread(C.messageDialog, C.gpointer(&data)) 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 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() { func (f *Frontend) WindowUnmaximise() {
runtime.LockOSThread() runtime.LockOSThread()
f.mainWindow.Restore() 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) 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. // TODO this should be put into the winc if we are happy with this solution.
var ( var (
modkernel32 = syscall.NewLazyDLL("dwmapi.dll") modkernel32 = syscall.NewLazyDLL("dwmapi.dll")

View File

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

View File

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

View File

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

View File

@ -146,6 +146,15 @@ export function WindowMaximise() {
window.WailsInvoke('WM'); window.WailsInvoke('WM');
} }
/**
* Toggle the Maximise of the Window
*
* @export
*/
export function WindowToggleMaximise() {
window.WailsInvoke('Wt');
}
/** /**
* Unmaximise the Window * 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; WindowMaximise(): void;
WindowToggleMaximise(): void;
WindowUnmaximise(): void; WindowUnmaximise(): void;
WindowMinimise(): 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(); window.runtime.WindowMaximise();
} }
/**
* Toggle the Maximise of the Window
*
* @export
*/
export function WindowToggleMaximise() {
window.runtime.WindowToggleMaximise();
}
/** /**
* Unmaximise the Window * Unmaximise the Window
* *

View File

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

View File

@ -119,6 +119,13 @@ JS Signature: `WindowUnmaximise()`
Restores the window to the dimensions and position prior to maximising. 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 ### WindowMinimise
Go Signature: `WindowMinimise(ctx context.Context)` Go Signature: `WindowMinimise(ctx context.Context)`