クロスプラットフォーム デスクトップ アプリケーションを最大化 (フルスクリーンではない)


macOSの「フルスクリーン」(および一部のLinux)がなければ、苦労することはありません.

Golang と Lorca を使用して、しばらくの間解決策を実現しました.それにもかかわらず、それは cgo を使用します.

package main

import (
    "fmt"
    "log"

    /*
        #cgo darwin LDFLAGS: -framework CoreGraphics

        #if defined(__APPLE__)
        #include <CoreGraphics/CGDisplayConfiguration.h>
        int display_width() {
        return CGDisplayPixelsWide(CGMainDisplayID());
        }
        int display_height() {
        return CGDisplayPixelsHigh(CGMainDisplayID());
        }
        #else
        int display_width() {
        return 0;
        }
        int display_height() {
        return 0;
        }
        #endif
    */
    "C"

    "github.com/zserge/lorca"
)

func main() {
    if lorca.LocateChrome() == "" {
        lorca.PromptDownload()
        log.Fatal(fmt.Errorf("cannot open outside Chrome desktop application"))
    } else {
        width := int(C.display_width())
        height := int(C.display_height())

        if width == 0 || height == 0 {
            width = 1024
            height = 768
        }

        w, err := lorca.New("https://example.com", "", width, height)
        if err != nil {
            log.Fatal(err)
        }

        defer w.Close()

        // This does nothing in macOS, BTW.
        w.SetBounds(lorca.Bounds{
            WindowState: lorca.WindowStateMaximized,
        })

        <-w.Done()
    }
}


次に、 xgo を使用して、すべての主要なプラットフォーム用にクロスコンパイルできます.

BRANCH=${<BRANCH_NAME>:-"master"}
REPO=<REPO_NAME>

$(go env GOPATH)/bin/xgo \
  -ldflags="-H windowsgui" \
  -branch=BRANCH \
  -targets=windows/* \
  REPO

if [[ $(go env GOOS) == 'darwin' ]]; then
  go build "${PWD##*/}.app"
  $(go env GOPATH)/bin/xgo \
    -branch=BRANCH \
    -targets=linux/* \
    REPO
else
  $(go env GOPATH)/bin/xgo \
    -branch=BRANCH \
    -targets=linux/*,darwin/amd64 \
    REPO

  rm *-darwin*.app
  for f in *-darwin*; do mv "$f" "$f.app"; done
fi


疑問はまだ残っています. Lorca、Chrome DevTools Protocol、または組み込みの最大化を備えたその他のフレームワークを使用していない場合はどうすればよいですか? (ところで、Electron には最大化機能が組み込まれていますが、webview/webview と Neutralino.js には最大化機能がありません...)
cgo におおよその答えがあります.

import (
    "runtime"

    /*
       #cgo darwin LDFLAGS: -framework CoreGraphics
       #cgo linux pkg-config: x11

       #if defined(__APPLE__)
       #include <CoreGraphics/CGDisplayConfiguration.h>
       int display_width() {
        return CGDisplayPixelsWide(CGMainDisplayID());
       }
       int display_height() {
        return CGDisplayPixelsHigh(CGMainDisplayID());
       }
       #elif defined(_WIN32)
       #include <wtypes.h>
       int display_width() {
        RECT desktop;
        const HWND hDesktop = GetDesktopWindow();
        GetWindowRect(hDesktop, &desktop);
        return desktop.right;
       }
       int display_height() {
        RECT desktop;
        const HWND hDesktop = GetDesktopWindow();
        GetWindowRect(hDesktop, &desktop);
        return desktop.bottom;
       }
       #else
       #include <X11/Xlib.h>
       int display_width() {
        Display* d = XOpenDisplay(NULL);
        Screen*  s = DefaultScreenOfDisplay(d);
        return s->width;
       }
       int display_height() {
        Display* d = XOpenDisplay(NULL);
        Screen*  s = DefaultScreenOfDisplay(d);
        return s->height;
       }
       #endif
    */
    "C"
)

func getFullscreenSize() (int, int) {
    width := int(C.display_width())
    height := int(C.display_height())

    // Current method of getting screen size in linux and windows makes it fall offscreen
    if runtime.GOOS == "linux" || runtime.GOOS == "windows" {
        width = width - 50
        height = height - 100
    }

    if width == 0 || height == 0 {
        width = 1024
        height = 768
    }

    return width, height
}


Windows と Linux ではフルスクリーンではありません.また、Linux 用にコンパイルする場合、xgo は使用できません.代わりに Docker を使用します.

ARG ARCH=""
FROM ${ARCH}debian
RUN apt-get update
RUN apt-get install -y --no-install-recommends build-essential 
RUN apt-get install -y xorg-dev
RUN apt-get install -y golang git


と、

for arch in amd64 i386
  do
    docker build --build-arg ARCH=$arch/ -t ${PWD##*/}-$arch .
  done

for arch in amd64 i386
  do
    docker run --rm -v \
      "$PWD":/usr/app \
      -w /usr/app \
      ${PWD##*/}-$arch \
      go build -o "${PWD##*/}-$arch"
  done


ところで、私は docker xbuild を見つけました.