diff --git a/v3/pkg/application/linux_purego.go b/v3/pkg/application/linux_purego.go index 6cc7830b4..e0303afff 100644 --- a/v3/pkg/application/linux_purego.go +++ b/v3/pkg/application/linux_purego.go @@ -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 == "" {