internal/ui: make a separate package to hide a console

Updates #2896
This commit is contained in:
Hajime Hoshi 2024-01-28 22:37:50 +09:00
parent 373e61d054
commit 6736bb56ec
4 changed files with 5 additions and 73 deletions

1
go.mod
View File

@ -3,6 +3,7 @@ module github.com/hajimehoshi/ebiten/v2
go 1.18 go 1.18
require ( require (
github.com/ebitengine/hideconsole v0.1.0
github.com/ebitengine/oto/v3 v3.2.0-alpha.3 github.com/ebitengine/oto/v3 v3.2.0-alpha.3
github.com/ebitengine/purego v0.6.0-alpha.4.0.20240127153756-e7ad88ddfffe github.com/ebitengine/purego v0.6.0-alpha.4.0.20240127153756-e7ad88ddfffe
github.com/go-text/typesetting v0.1.1-0.20231231232151-8d81c02dc157 github.com/go-text/typesetting v0.1.1-0.20231231232151-8d81c02dc157

2
go.sum
View File

@ -1,3 +1,5 @@
github.com/ebitengine/hideconsole v0.1.0 h1:pNW5M6xbD+icVaTg+vUl9ZsPTV3BopSTjEWEQitM1WI=
github.com/ebitengine/hideconsole v0.1.0/go.mod h1:hTTBTvVYWKBuxPr7peweneWdkUwEuHuB3C1R/ielR1A=
github.com/ebitengine/oto/v3 v3.2.0-alpha.3 h1:gDsHiEBKofH9scQ7rf+3jE1XOutgB0KvTkvP74LaRH4= github.com/ebitengine/oto/v3 v3.2.0-alpha.3 h1:gDsHiEBKofH9scQ7rf+3jE1XOutgB0KvTkvP74LaRH4=
github.com/ebitengine/oto/v3 v3.2.0-alpha.3/go.mod h1:JtMbxJHZBDXfS8BmVYwzWk9Z6r7jsjwsHzOuZrEkfs4= github.com/ebitengine/oto/v3 v3.2.0-alpha.3/go.mod h1:JtMbxJHZBDXfS8BmVYwzWk9Z6r7jsjwsHzOuZrEkfs4=
github.com/ebitengine/purego v0.6.0-alpha.4.0.20240127153756-e7ad88ddfffe h1:bac7sG+vDG+mBmjElwI0p1a2L09rxkY8xcmv5QEFyGA= github.com/ebitengine/purego v0.6.0-alpha.4.0.20240127153756-e7ad88ddfffe h1:bac7sG+vDG+mBmjElwI0p1a2L09rxkY8xcmv5QEFyGA=

View File

@ -1,73 +0,0 @@
// Copyright 2017 The Ebiten Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package ui
import (
"fmt"
"golang.org/x/sys/windows"
)
var (
kernel32 = windows.NewLazySystemDLL("kernel32.dll")
procFreeConsoleWindow = kernel32.NewProc("FreeConsole")
procGetConsoleWindow = kernel32.NewProc("GetConsoleWindow")
)
func freeConsole() error {
r, _, e := procFreeConsoleWindow.Call()
if int32(r) == 0 {
if e != nil && e != windows.ERROR_SUCCESS {
return fmt.Errorf("ui: FreeConsole failed: %w", e)
}
return fmt.Errorf("ui: FreeConsole returned 0")
}
return nil
}
func getConsoleWindow() windows.HWND {
r, _, _ := procGetConsoleWindow.Call()
return windows.HWND(r)
}
// hideConsoleWindow will hide the console window that is showing when
// compiling on Windows without specifying the '-ldflags "-Hwindowsgui"' flag.
func hideConsoleWindow() {
// In Xbox, GetWindowThreadProcessId might not exist.
if user32.NewProc("GetWindowThreadProcessId").Find() != nil {
return
}
pid := windows.GetCurrentProcessId()
// Get the process ID of the console's creator.
var cpid uint32
if _, err := windows.GetWindowThreadProcessId(getConsoleWindow(), &cpid); err != nil {
// Even if closing the console fails, this is not harmful.
// Ignore error.
return
}
if pid == cpid {
// The current process created its own console. Hide this.
// Ignore error.
_ = freeConsole()
}
}
func init() {
hideConsoleWindow()
}

View File

@ -20,6 +20,8 @@ import (
"sync" "sync"
"sync/atomic" "sync/atomic"
_ "github.com/ebitengine/hideconsole"
"github.com/hajimehoshi/ebiten/v2/internal/atlas" "github.com/hajimehoshi/ebiten/v2/internal/atlas"
"github.com/hajimehoshi/ebiten/v2/internal/mipmap" "github.com/hajimehoshi/ebiten/v2/internal/mipmap"
"github.com/hajimehoshi/ebiten/v2/internal/thread" "github.com/hajimehoshi/ebiten/v2/internal/thread"