mirror of
https://github.com/wailsapp/wails.git
synced 2026-03-14 14:45:49 +01:00
[linux v3] purego: updates
- file/directory chooser dialog logic - add name + css so that menu isn't transparent
This commit is contained in:
parent
ed58949d24
commit
6141e5a8ce
1 changed files with 102 additions and 85 deletions
|
|
@ -139,60 +139,70 @@ var (
|
|||
gtkCheckMenuItemNewWithLabel func(string) pointer
|
||||
gtkCheckMenuItemSetActive func(pointer, int)
|
||||
gtkContainerAdd func(pointer, pointer)
|
||||
gtkCSSProviderLoadFromData func(pointer, string, int, pointer)
|
||||
gtkCSSProviderNew func() pointer
|
||||
gtkDialogAddButton func(pointer, string, int)
|
||||
gtkDialogGetContentArea func(pointer) pointer
|
||||
gtkDialogRun func(pointer) int
|
||||
gtkDialogSetDefaultResponse func(pointer, int)
|
||||
gtkDragDestSet func(pointer, uint, pointer, uint, uint)
|
||||
gtkFileChooserAddFilter func(pointer, pointer)
|
||||
gtkFileChooserDialogNew func(string, pointer, int, string, int, string, int, pointer) pointer
|
||||
gtkFileChooserGetFilenames func(pointer) *GSList
|
||||
gtkFileChooserSetCreateFolders func(pointer, int)
|
||||
gtkFileChooserSetAction func(pointer, int)
|
||||
gtkFileChooserSetCreateFolders func(pointer, bool)
|
||||
gtkFileChooserSetCurrentFolder func(pointer, string)
|
||||
gtkFileChooserSetSelectMultiple func(pointer, int)
|
||||
gtkFileChooserSetShowHidden func(pointer, int)
|
||||
|
||||
gtkImageNewFromPixbuf func(pointer) pointer
|
||||
gtkMenuBarNew func() pointer
|
||||
gtkMenuItemNewWithLabel func(string) pointer
|
||||
gtkMenuItemSetLabel func(pointer, string)
|
||||
gtkMenuItemSetSubmenu func(pointer, pointer)
|
||||
gtkMenuNew func() pointer
|
||||
gtkMenuShellAppend func(pointer, pointer)
|
||||
gtkMessageDialogNew func(pointer, int, int, int, string) pointer
|
||||
gtkRadioMenuItemGetGroup func(pointer) GSListPointer
|
||||
gtkRadioMenuItemNewWithLabel func(GSListPointer, string) pointer
|
||||
gtkSeparatorMenuItemNew func() pointer
|
||||
gtkTargetEntryFree func(pointer)
|
||||
gtkTargetEntryNew func(string, int, uint) pointer
|
||||
gtkWidgetDestroy func(pointer)
|
||||
gtkWidgetGetDisplay func(pointer) pointer
|
||||
gtkWidgetGetWindow func(pointer) pointer
|
||||
gtkWidgetGetScreen func(pointer) pointer
|
||||
gtkWidgetHide func(pointer)
|
||||
gtkWidgetIsVisible func(pointer) bool
|
||||
gtkWidgetShow func(pointer)
|
||||
gtkWidgetShowAll func(pointer)
|
||||
gtkWidgetSetAppPaintable func(pointer, int)
|
||||
gtkWidgetSetSensitive func(pointer, int)
|
||||
gtkWidgetSetToolTipText func(pointer, string)
|
||||
gtkWidgetSetVisual func(pointer, pointer)
|
||||
gtkWindowClose func(pointer)
|
||||
gtkWindowFullScreen func(pointer)
|
||||
gtkWindowGetPosition func(pointer, *int, *int) bool
|
||||
gtkWindowGetSize func(pointer, *int, *int)
|
||||
gtkWindowKeepAbove func(pointer, bool)
|
||||
gtkWindowMaximize func(pointer)
|
||||
gtkWindowMinimize func(pointer)
|
||||
gtkWindowMove func(pointer, int, int)
|
||||
gtkWindowPresent func(pointer)
|
||||
gtkWindowResize func(pointer, int, int)
|
||||
gtkWindowSetDecorated func(pointer, int)
|
||||
gtkWindowSetGeometryHints func(pointer, pointer, pointer, int)
|
||||
gtkWindowSetKeepAbove func(pointer, bool)
|
||||
gtkWindowSetResizable func(pointer, bool)
|
||||
gtkWindowSetTitle func(pointer, string)
|
||||
gtkWindowUnfullscreen func(pointer)
|
||||
gtkWindowUnmaximize func(pointer)
|
||||
gtkFileChooserSetSelectMultiple func(pointer, bool)
|
||||
gtkFileChooserSetShowHidden func(pointer, bool)
|
||||
gtkFileFilterAddPattern func(pointer, string)
|
||||
gtkFileFilterNew func() pointer
|
||||
gtkFileFilterSetName func(pointer, string)
|
||||
gtkImageNewFromPixbuf func(pointer) pointer
|
||||
gtkMenuBarNew func() pointer
|
||||
gtkMenuItemNewWithLabel func(string) pointer
|
||||
gtkMenuItemSetLabel func(pointer, string)
|
||||
gtkMenuItemSetSubmenu func(pointer, pointer)
|
||||
gtkMenuNew func() pointer
|
||||
gtkMenuShellAppend func(pointer, pointer)
|
||||
gtkMessageDialogNew func(pointer, int, int, int, string) pointer
|
||||
gtkRadioMenuItemGetGroup func(pointer) GSListPointer
|
||||
gtkRadioMenuItemNewWithLabel func(GSListPointer, string) pointer
|
||||
gtkSeparatorMenuItemNew func() pointer
|
||||
gtkStyleContextAddProvider func(pointer, pointer, int)
|
||||
gtkTargetEntryFree func(pointer)
|
||||
gtkTargetEntryNew func(string, int, uint) pointer
|
||||
gtkWidgetDestroy func(pointer)
|
||||
gtkWidgetGetDisplay func(pointer) pointer
|
||||
gtkWidgetGetScreen func(pointer) pointer
|
||||
gtkWidgetGetStyleContext func(pointer) pointer
|
||||
gtkWidgetGetWindow func(pointer) pointer
|
||||
gtkWidgetHide func(pointer)
|
||||
gtkWidgetIsVisible func(pointer) bool
|
||||
gtkWidgetShow func(pointer)
|
||||
gtkWidgetShowAll func(pointer)
|
||||
gtkWidgetSetAppPaintable func(pointer, int)
|
||||
gtkWidgetSetName func(pointer, string)
|
||||
gtkWidgetSetSensitive func(pointer, int)
|
||||
gtkWidgetSetToolTipText func(pointer, string)
|
||||
gtkWidgetSetVisual func(pointer, pointer)
|
||||
gtkWindowClose func(pointer)
|
||||
gtkWindowFullScreen func(pointer)
|
||||
gtkWindowGetPosition func(pointer, *int, *int) bool
|
||||
gtkWindowGetSize func(pointer, *int, *int)
|
||||
gtkWindowHasToplevelFocus func(pointer) int
|
||||
gtkWindowKeepAbove func(pointer, bool)
|
||||
gtkWindowMaximize func(pointer)
|
||||
gtkWindowMinimize func(pointer)
|
||||
gtkWindowMove func(pointer, int, int)
|
||||
gtkWindowPresent func(pointer)
|
||||
gtkWindowResize func(pointer, int, int)
|
||||
gtkWindowSetDecorated func(pointer, int)
|
||||
gtkWindowSetGeometryHints func(pointer, pointer, pointer, int)
|
||||
gtkWindowSetKeepAbove func(pointer, bool)
|
||||
gtkWindowSetResizable func(pointer, bool)
|
||||
gtkWindowSetTitle func(pointer, string)
|
||||
gtkWindowUnfullscreen func(pointer)
|
||||
gtkWindowUnmaximize func(pointer)
|
||||
|
||||
// webkit
|
||||
webkitNewWithUserContentManager func(pointer) pointer
|
||||
|
|
@ -282,17 +292,23 @@ func init() {
|
|||
purego.RegisterLibFunc(>kCheckMenuItemNewWithLabel, gtk, "gtk_check_menu_item_new_with_label")
|
||||
purego.RegisterLibFunc(>kCheckMenuItemSetActive, gtk, "gtk_check_menu_item_set_active")
|
||||
purego.RegisterLibFunc(>kContainerAdd, gtk, "gtk_container_add")
|
||||
purego.RegisterLibFunc(>kCSSProviderLoadFromData, gtk, "gtk_css_provider_load_from_data")
|
||||
purego.RegisterLibFunc(>kDialogAddButton, gtk, "gtk_dialog_add_button")
|
||||
purego.RegisterLibFunc(>kDialogGetContentArea, gtk, "gtk_dialog_get_content_area")
|
||||
purego.RegisterLibFunc(>kDialogRun, gtk, "gtk_dialog_run")
|
||||
purego.RegisterLibFunc(>kDialogSetDefaultResponse, gtk, "gtk_dialog_set_default_response")
|
||||
purego.RegisterLibFunc(>kDragDestSet, gtk, "gtk_drag_dest_set")
|
||||
purego.RegisterLibFunc(>kFileChooserAddFilter, gtk, "gtk_file_chooser_add_filter")
|
||||
purego.RegisterLibFunc(>kFileChooserDialogNew, gtk, "gtk_file_chooser_dialog_new")
|
||||
purego.RegisterLibFunc(>kFileChooserGetFilenames, gtk, "gtk_file_chooser_get_filenames")
|
||||
purego.RegisterLibFunc(>kFileChooserSetAction, gtk, "gtk_file_chooser_set_action")
|
||||
purego.RegisterLibFunc(>kFileChooserSetCreateFolders, gtk, "gtk_file_chooser_set_create_folders")
|
||||
purego.RegisterLibFunc(>kFileChooserSetCurrentFolder, gtk, "gtk_file_chooser_set_current_folder")
|
||||
purego.RegisterLibFunc(>kFileChooserSetSelectMultiple, gtk, "gtk_file_chooser_set_select_multiple")
|
||||
purego.RegisterLibFunc(>kFileChooserSetShowHidden, gtk, "gtk_file_chooser_set_show_hidden")
|
||||
purego.RegisterLibFunc(>kFileFilterAddPattern, gtk, "gtk_file_filter_add_pattern")
|
||||
purego.RegisterLibFunc(>kFileFilterNew, gtk, "gtk_file_filter_new")
|
||||
purego.RegisterLibFunc(>kFileFilterSetName, gtk, "gtk_file_filter_set_name")
|
||||
purego.RegisterLibFunc(>kImageNewFromPixbuf, gtk, "gtk_image_new_from_pixbuf")
|
||||
purego.RegisterLibFunc(>kMenuItemSetLabel, gtk, "gtk_menu_item_set_label")
|
||||
purego.RegisterLibFunc(>kMenuBarNew, gtk, "gtk_menu_bar_new")
|
||||
|
|
@ -304,15 +320,18 @@ func init() {
|
|||
purego.RegisterLibFunc(>kRadioMenuItemGetGroup, gtk, "gtk_radio_menu_item_get_group")
|
||||
purego.RegisterLibFunc(>kRadioMenuItemNewWithLabel, gtk, "gtk_radio_menu_item_new_with_label")
|
||||
purego.RegisterLibFunc(>kSeparatorMenuItemNew, gtk, "gtk_separator_menu_item_new")
|
||||
purego.RegisterLibFunc(>kStyleContextAddProvider, gtk, "gtk_style_context_add_provider")
|
||||
purego.RegisterLibFunc(>kTargetEntryFree, gtk, "gtk_target_entry_free")
|
||||
purego.RegisterLibFunc(>kTargetEntryNew, gtk, "gtk_target_entry_new")
|
||||
purego.RegisterLibFunc(>kWidgetDestroy, gtk, "gtk_widget_destroy")
|
||||
purego.RegisterLibFunc(>kWidgetGetDisplay, gtk, "gtk_widget_get_display")
|
||||
purego.RegisterLibFunc(>kWidgetGetScreen, gtk, "gtk_widget_get_screen")
|
||||
purego.RegisterLibFunc(>kWidgetGetStyleContext, gtk, "gtk_widget_get_style_context")
|
||||
purego.RegisterLibFunc(>kWidgetGetWindow, gtk, "gtk_widget_get_window")
|
||||
purego.RegisterLibFunc(>kWidgetHide, gtk, "gtk_widget_hide")
|
||||
purego.RegisterLibFunc(>kWidgetIsVisible, gtk, "gtk_widget_is_visible")
|
||||
purego.RegisterLibFunc(>kWidgetSetAppPaintable, gtk, "gtk_widget_set_app_paintable")
|
||||
purego.RegisterLibFunc(>kWidgetSetName, gtk, "gtk_widget_set_name")
|
||||
purego.RegisterLibFunc(>kWidgetSetSensitive, gtk, "gtk_widget_set_sensitive")
|
||||
purego.RegisterLibFunc(>kWidgetSetToolTipText, gtk, "gtk_widget_set_tooltip_text")
|
||||
purego.RegisterLibFunc(>kWidgetSetVisual, gtk, "gtk_widget_set_visual")
|
||||
|
|
@ -326,6 +345,7 @@ func init() {
|
|||
purego.RegisterLibFunc(>kWindowMove, gtk, "gtk_window_move")
|
||||
purego.RegisterLibFunc(>kWindowPresent, gtk, "gtk_window_present")
|
||||
//purego.RegisterLibFunc(>kWindowPresent, gtk, "gtk_window_unminimize") // gtk4
|
||||
purego.RegisterLibFunc(>kWindowHasToplevelFocus, gtk, "gtk_window_has_toplevel_focus")
|
||||
purego.RegisterLibFunc(>kWindowMinimize, gtk, "gtk_window_iconify") // gtk3
|
||||
// purego.RegisterLibFunc(>kWindowMinimize, gtk, "gtk_window_minimize") // gtk4
|
||||
purego.RegisterLibFunc(>kWindowResize, gtk, "gtk_window_resize")
|
||||
|
|
@ -359,8 +379,6 @@ func init() {
|
|||
|
||||
// mainthread stuff
|
||||
func dispatchOnMainThread(id uint) {
|
||||
fmt.Println("dispatchOnMainThread", gThreadSelf())
|
||||
|
||||
gIdleAdd(purego.NewCallback(func(pointer) int {
|
||||
executeOnMainThread(id)
|
||||
return GSourceRemove
|
||||
|
|
@ -746,6 +764,10 @@ func windowHide(window pointer) {
|
|||
gtkWidgetHide(window)
|
||||
}
|
||||
|
||||
func windowIsFocused(window pointer) bool {
|
||||
return gtkWindowHasToplevelFocus(window) == 1
|
||||
}
|
||||
|
||||
func windowIsFullscreen(window pointer) bool {
|
||||
gdkwindow := gtkWidgetGetWindow(window)
|
||||
state := gdkWindowGetState(gdkwindow)
|
||||
|
|
@ -783,6 +805,7 @@ func windowNew(application pointer, menu pointer, windowId uint, gpuPolicy int)
|
|||
webview := windowNewWebview(windowId, gpuPolicy)
|
||||
vbox := gtkBoxNew(GtkOrientationVertical, 0)
|
||||
gtkContainerAdd(window, vbox)
|
||||
gtkWidgetSetName(vbox, "webview-box")
|
||||
|
||||
if menu != 0 {
|
||||
gtkBoxPackStart(vbox, menu, 0, 0, 0)
|
||||
|
|
@ -839,6 +862,8 @@ func windowShow(window pointer) {
|
|||
}
|
||||
|
||||
func windowSetBackgroundColour(vbox, webview pointer, colour RGBA) {
|
||||
const GtkStyleProviderPriorityUser = 800
|
||||
|
||||
// FIXME: Use a struct!
|
||||
rgba := make([]byte, 4*8) // C.sizeof_GdkRGBA == 32
|
||||
rgbaPointer := pointer(unsafe.Pointer(&rgba[0]))
|
||||
|
|
@ -854,18 +879,16 @@ func windowSetBackgroundColour(vbox, webview pointer, colour RGBA) {
|
|||
}
|
||||
webkitWebViewSetBackgroundColor(pointer(webview), rgbaPointer)
|
||||
|
||||
/*
|
||||
colour.Alpha = 255
|
||||
cssStr := C.CString(fmt.Sprintf("#webview-box {background-color: rgba(%d, %d, %d, %1.1f);}", colour.Red, colour.Green, colour.Blue, float32(colour.Alpha)/255.0))
|
||||
provider := C.gtk_css_provider_new()
|
||||
C.gtk_style_context_add_provider(
|
||||
C.gtk_widget_get_style_context((*C.GtkWidget)(vbox)),
|
||||
(*C.GtkStyleProvider)(unsafe.Pointer(provider)),
|
||||
C.GTK_STYLE_PROVIDER_PRIORITY_USER)
|
||||
C.g_object_unref(C.gpointer(provider))
|
||||
C.gtk_css_provider_load_from_data(provider, cssStr, -1, nil)
|
||||
C.free(unsafe.Pointer(cssStr))
|
||||
*/
|
||||
colour.Alpha = 255
|
||||
css := fmt.Sprintf("#webview-box {background-color: rgba(%d, %d, %d, %1.1f);}", colour.Red, colour.Green, colour.Blue, float32(colour.Alpha)/255.0)
|
||||
provider := gtkCSSProviderNew()
|
||||
defer gObjectUnref(provider)
|
||||
gtkStyleContextAddProvider(
|
||||
gtkWidgetGetStyleContext(vbox),
|
||||
provider,
|
||||
GtkStyleProviderPriorityUser,
|
||||
)
|
||||
gtkCSSProviderLoadFromData(provider, css, -1, 0)
|
||||
}
|
||||
|
||||
func windowSetGeometryHints(window pointer, minWidth, minHeight, maxWidth, maxHeight int) {
|
||||
|
|
@ -1006,23 +1029,19 @@ func runChooserDialog(window pointer, allowMultiple, createFolders, showHidden b
|
|||
GtkResponseAccept,
|
||||
0)
|
||||
|
||||
gtkFileChooserSetAction(fc, action)
|
||||
|
||||
gtkFilters := []pointer{}
|
||||
for _, filter := range filters {
|
||||
// TODO: Process and add filters
|
||||
// gtk_file_chooser_add_filter(fc, thisFilter)
|
||||
fmt.Println("filter", filter)
|
||||
}
|
||||
|
||||
if allowMultiple {
|
||||
gtkFileChooserSetSelectMultiple(fc, 1)
|
||||
}
|
||||
|
||||
if createFolders {
|
||||
gtkFileChooserSetCreateFolders(fc, 1)
|
||||
}
|
||||
|
||||
if showHidden {
|
||||
gtkFileChooserSetShowHidden(fc, 1)
|
||||
f := gtkFileFilterNew()
|
||||
gtkFileFilterSetName(f, filter.DisplayName)
|
||||
gtkFileFilterAddPattern(f, filter.Pattern)
|
||||
gtkFileChooserAddFilter(fc, f)
|
||||
gtkFilters = append(gtkFilters, f)
|
||||
}
|
||||
gtkFileChooserSetSelectMultiple(fc, allowMultiple)
|
||||
gtkFileChooserSetCreateFolders(fc, createFolders)
|
||||
gtkFileChooserSetShowHidden(fc, showHidden)
|
||||
|
||||
if currentFolder != "" {
|
||||
gtkFileChooserSetCurrentFolder(fc, currentFolder)
|
||||
|
|
@ -1050,8 +1069,7 @@ func runChooserDialog(window pointer, allowMultiple, createFolders, showHidden b
|
|||
iter := filenames
|
||||
count := 0
|
||||
for {
|
||||
selection := buildStringAndFree(iter.data)
|
||||
selections = append(selections, selection)
|
||||
selections = append(selections, buildStringAndFree(iter.data))
|
||||
iter = iter.next
|
||||
if iter == nil || count == 1024 {
|
||||
break
|
||||
|
|
@ -1065,13 +1083,13 @@ func runChooserDialog(window pointer, allowMultiple, createFolders, showHidden b
|
|||
|
||||
// dialog related
|
||||
func runOpenFileDialog(dialog *OpenFileDialogStruct) ([]string, error) {
|
||||
GtkFileChooserActionOpen := 0
|
||||
// GtkFileChooserActionSave := 1
|
||||
// GtkFileChooserActionSelectFolder := 2
|
||||
// GtkFileChooserActionCreateFolder := 3
|
||||
const GtkFileChooserActionOpen = 0
|
||||
|
||||
// (dialog.window.impl).(*linuxWebviewWindow).window // FIXME: dialog.window == nil!
|
||||
window := pointer(0)
|
||||
if dialog.window != nil {
|
||||
window = (dialog.window.impl).(*linuxWebviewWindow).window
|
||||
}
|
||||
|
||||
buttonText := dialog.buttonText
|
||||
if buttonText == "" {
|
||||
buttonText = "_Open"
|
||||
|
|
@ -1151,9 +1169,8 @@ func runQuestionDialog(parent pointer, options *MessageDialog) int {
|
|||
}
|
||||
|
||||
func runSaveFileDialog(dialog *SaveFileDialogStruct) (string, error) {
|
||||
GtkFileChooserActionSave := 1
|
||||
// GtkFileChooserActionSelectFolder := 2
|
||||
// GtkFileChooserActionCreateFolder := 3
|
||||
const GtkFileChooserActionSave = 1
|
||||
|
||||
window := pointer(0)
|
||||
buttonText := dialog.buttonText
|
||||
if buttonText == "" {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue