forked from joejulian/gio
app: add app.ID exposed to the platform.
Allow app ID to be set by linger flag -X gioui.org/app.ID=%s so that wayland
can group windows, search for ${gioui.org/app.ID}.desktop file and display
application name. e.g. /usr/share/applications/${gioui.org/app.ID}.desktop
~/.local/share/applications/${appID}.desktop.
ID is set by the gogio tool or manually with the -X linker flag.
Signed-off-by: Marko Kungla <marko.kungla@gmail.com>
This commit is contained in:
+19
@@ -4,6 +4,7 @@ package app
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -14,11 +15,29 @@ import (
|
|||||||
// Set with the go linker flag -X.
|
// Set with the go linker flag -X.
|
||||||
var extraArgs string
|
var extraArgs string
|
||||||
|
|
||||||
|
// ID is the app id exposed to the platform.
|
||||||
|
//
|
||||||
|
// On Android ID is the package property of AndroidManifest.xml,
|
||||||
|
// on iOS ID is the CFBundleIdentifier of the app Info.plist,
|
||||||
|
// on Wayland it is the toplevel app_id,
|
||||||
|
// on X11 it is the X11 XClassHint
|
||||||
|
//
|
||||||
|
// ID is set by the gogio tool or manually with the -X linker flag. For example,
|
||||||
|
//
|
||||||
|
// go build -ldflags="-X 'gioui.org/app.ID=org.gioui.example.Kitchen'" .
|
||||||
|
//
|
||||||
|
// Note that ID is treated as a constant, and that changing it at runtime
|
||||||
|
// is not supported. Default value of ID is filepath.Base(os.Args[0]).
|
||||||
|
var ID = ""
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
if extraArgs != "" {
|
if extraArgs != "" {
|
||||||
args := strings.Split(extraArgs, "|")
|
args := strings.Split(extraArgs, "|")
|
||||||
os.Args = append(os.Args, args...)
|
os.Args = append(os.Args, args...)
|
||||||
}
|
}
|
||||||
|
if ID == "" {
|
||||||
|
ID = filepath.Base(os.Args[0])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DataDir returns a path to use for application-specific
|
// DataDir returns a path to use for application-specific
|
||||||
|
|||||||
@@ -374,6 +374,11 @@ func (d *wlDisplay) createNativeWindow(options []Option) (*window, error) {
|
|||||||
w.destroy()
|
w.destroy()
|
||||||
return nil, errors.New("wayland: xdg_surface_get_toplevel failed")
|
return nil, errors.New("wayland: xdg_surface_get_toplevel failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
id := C.CString(ID)
|
||||||
|
defer C.free(unsafe.Pointer(id))
|
||||||
|
C.xdg_toplevel_set_app_id(w.topLvl, id)
|
||||||
|
|
||||||
cursorTheme := C.CString(os.Getenv("XCURSOR_THEME"))
|
cursorTheme := C.CString(os.Getenv("XCURSOR_THEME"))
|
||||||
defer C.free(unsafe.Pointer(cursorTheme))
|
defer C.free(unsafe.Pointer(cursorTheme))
|
||||||
cursorSize := 32
|
cursorSize := 32
|
||||||
|
|||||||
+1
-3
@@ -30,8 +30,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -793,7 +791,7 @@ func newX11Window(gioWin *callbacks, options []Option) error {
|
|||||||
hints.flags = C.InputHint
|
hints.flags = C.InputHint
|
||||||
C.XSetWMHints(dpy, win, &hints)
|
C.XSetWMHints(dpy, win, &hints)
|
||||||
|
|
||||||
name := C.CString(filepath.Base(os.Args[0]))
|
name := C.CString(ID)
|
||||||
defer C.free(unsafe.Pointer(name))
|
defer C.free(unsafe.Pointer(name))
|
||||||
wmhints := C.XClassHint{name, name}
|
wmhints := C.XClassHint{name, name}
|
||||||
C.XSetClassHint(dpy, win, &wmhints)
|
C.XSetClassHint(dpy, win, &wmhints)
|
||||||
|
|||||||
Reference in New Issue
Block a user