GTK/mpv embed: fix locale, add CSS theme, drag-and-drop support
This commit is contained in:
parent
03b6804a9e
commit
aba4d14f57
|
|
@ -13,6 +13,28 @@ import (
|
||||||
"github.com/gotk3/gotk3/gtk"
|
"github.com/gotk3/gotk3/gtk"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const appCSS = `
|
||||||
|
* {
|
||||||
|
font-family: "Noto Sans", "Cantarell", "Sans";
|
||||||
|
color: #E1EEFF;
|
||||||
|
}
|
||||||
|
window, GtkDrawingArea, box {
|
||||||
|
background-color: #0B0F1A;
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
background: #171C2A;
|
||||||
|
color: #E1EEFF;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 4px 8px;
|
||||||
|
}
|
||||||
|
button:hover {
|
||||||
|
background: #24314A;
|
||||||
|
}
|
||||||
|
label {
|
||||||
|
color: #E1EEFF;
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
type pane struct {
|
type pane struct {
|
||||||
area *gtk.DrawingArea
|
area *gtk.DrawingArea
|
||||||
mpv *mpvembed.Client
|
mpv *mpvembed.Client
|
||||||
|
|
@ -42,6 +64,12 @@ func main() {
|
||||||
grid.Attach(left.area, 0, 1, 1, 1)
|
grid.Attach(left.area, 0, 1, 1, 1)
|
||||||
grid.Attach(right.area, 1, 1, 1, 1)
|
grid.Attach(right.area, 1, 1, 1, 1)
|
||||||
|
|
||||||
|
applyCSS()
|
||||||
|
preferDark()
|
||||||
|
|
||||||
|
setupDragDest(left, win)
|
||||||
|
setupDragDest(right, win)
|
||||||
|
|
||||||
win.Connect("destroy", func() {
|
win.Connect("destroy", func() {
|
||||||
if left.mpv != nil {
|
if left.mpv != nil {
|
||||||
left.mpv.Destroy()
|
left.mpv.Destroy()
|
||||||
|
|
@ -215,3 +243,55 @@ func getWindowID(w *gdk.Window) uint64 {
|
||||||
func gdkWindowGetXID(w *gdk.Window) uint {
|
func gdkWindowGetXID(w *gdk.Window) uint {
|
||||||
return uint(w.GetXID())
|
return uint(w.GetXID())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func applyCSS() {
|
||||||
|
provider, err := gtk.CssProviderNew()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := provider.LoadFromData(appCSS); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
screen, err := gdk.ScreenGetDefault()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
gtk.AddProviderForScreen(screen, provider, gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
|
||||||
|
}
|
||||||
|
|
||||||
|
func preferDark() {
|
||||||
|
if settings, err := gtk.SettingsGetDefault(); err == nil && settings != nil {
|
||||||
|
_ = settings.SetProperty("gtk-application-prefer-dark-theme", true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupDragDest(p *pane, win *gtk.Window) {
|
||||||
|
// Accept URI drops
|
||||||
|
targets := []gtk.TargetEntry{
|
||||||
|
{Target: "text/uri-list", Flags: uint(0), Info: uint(0)},
|
||||||
|
}
|
||||||
|
p.area.DragDestSet(gtk.DEST_DEFAULT_ALL, targets, gdk.ACTION_COPY)
|
||||||
|
p.area.Connect("drag-data-received", func(_ *gtk.DrawingArea, ctx *gdk.DragContext, x, y int, data *gtk.SelectionData, info uint, t uint32) {
|
||||||
|
uris := data.GetURIs()
|
||||||
|
if len(uris) == 0 {
|
||||||
|
ctx.Finish(false, false, t)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Take first URI
|
||||||
|
if path := uriToPath(uris[0]); path != "" {
|
||||||
|
loadIntoPane(p, path)
|
||||||
|
}
|
||||||
|
ctx.Finish(true, false, t)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func uriToPath(u string) string {
|
||||||
|
if u == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
// text/uri-list format: file:///path or path\n
|
||||||
|
if len(u) >= 7 && u[:7] == "file://" {
|
||||||
|
u = u[7:]
|
||||||
|
}
|
||||||
|
return u
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ package mpvembed
|
||||||
#cgo pkg-config: mpv
|
#cgo pkg-config: mpv
|
||||||
#include <mpv/client.h>
|
#include <mpv/client.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
static inline const char* mpv_errstr(int err) { return mpv_error_string(err); }
|
static inline const char* mpv_errstr(int err) { return mpv_error_string(err); }
|
||||||
*/
|
*/
|
||||||
|
|
@ -21,6 +22,8 @@ type Client struct {
|
||||||
|
|
||||||
// New creates a new mpv client.
|
// New creates a new mpv client.
|
||||||
func New() (*Client, error) {
|
func New() (*Client, error) {
|
||||||
|
// Ensure numeric locale is C to satisfy mpv.
|
||||||
|
C.setlocale(C.int(C.LC_NUMERIC), C.CString("C"))
|
||||||
h := C.mpv_create()
|
h := C.mpv_create()
|
||||||
if h == nil {
|
if h == nil {
|
||||||
return nil, errors.New("mpv_create returned nil")
|
return nil, errors.New("mpv_create returned nil")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user