neko/internal/desktop/filechooser.go
2021-01-18 22:01:11 +01:00

111 lines
2.3 KiB
Go

package desktop
import (
"time"
"os/exec"
)
var (
file_chooser_dialog_open = false
)
func (manager *DesktopManagerCtx) fileChooserDialogStart() {
if manager.IsFileChooserDialogOpen() {
manager.CloseFileChooserDialog()
}
manager.OnWindowCreated(func(window uint32, name string, role string) {
if role != "GtkFileChooserDialog" {
return
}
// TODO: Implement, call event.
file_chooser_dialog_open = true
manager.logger.Debug().
Uint32("window", window).
Msg("GtkFileChooserDialog has been opened")
})
manager.OnWindowConfigured(func(window uint32, name string, role string) {
if role != "GtkFileChooserDialog" {
return
}
go func(){
// TOOD: Refactor.
manager.PutWindowBelow(window)
// Because first dialog is not put properly to background
time.Sleep(500 * time.Millisecond)
manager.PutWindowBelow(window)
}()
manager.logger.Debug().
Uint32("window", window).
Msg("GtkFileChooserDialog has been put below main window")
})
}
func (manager *DesktopManagerCtx) HandleFileChooserDialog(uri string) error {
mu.Lock()
defer mu.Unlock()
// TOOD: Use native API.
cmd := exec.Command(
"xdotool",
"search", "--name", "Open", "windowfocus",
"sleep", "0.2",
"key", "--clearmodifiers", "ctrl+l",
"type", "--args", "1", uri + "//",
"key", "--clearmodifiers", "Return",
"sleep", "1",
"key", "--clearmodifiers", "Down",
"key", "--clearmodifiers", "ctrl+a",
"key", "--clearmodifiers", "Return",
"sleep", "0.3",
)
// TODO: Implement, call event.
file_chooser_dialog_open = false
_, err := cmd.Output()
return err
}
func (manager *DesktopManagerCtx) CloseFileChooserDialog() bool {
for i := 0; i < 5; i++ {
// TOOD: Use native API.
mu.Lock()
exec.Command(
"xdotool",
"search", "--name", "Open", "windowfocus",
"sleep", "0.2",
"key", "--clearmodifiers", "alt+F4",
).Output()
mu.Unlock()
if !manager.IsFileChooserDialogOpen() {
// TODO: Implement, call event.
file_chooser_dialog_open = false
return true
}
}
return false
}
func (manager *DesktopManagerCtx) IsFileChooserDialogOpen() bool {
mu.Lock()
defer mu.Unlock()
// TOOD: Use native API.
cmd := exec.Command(
"xdotool",
"search", "--name", "Open", "windowfocus",
)
_, err := cmd.Output()
return err == nil
}