5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-06 02:29:25 +08:00

[v3 linux] lower signal memory usage

- drop the gtkSignalHandlers map entirely (wasn't used)
- use 'uint' for mapping signal IDs to MenuItem
- store and retrieve the menuitem identifier to/from the menu item widget
This commit is contained in:
Travis McLane 2023-10-10 12:38:10 -05:00
parent 3d88bf8795
commit 263e1b527a
2 changed files with 19 additions and 13 deletions

View File

@ -153,14 +153,12 @@ var (
) )
var ( var (
gtkSignalHandlers map[*C.GtkWidget]C.gulong gtkSignalToMenuItem map[uint]*MenuItem
gtkSignalToMenuItem map[*C.GtkWidget]*MenuItem
mainThreadId *C.GThread mainThreadId *C.GThread
) )
func init() { func init() {
gtkSignalHandlers = map[*C.GtkWidget]C.gulong{} gtkSignalToMenuItem = map[uint]*MenuItem{}
gtkSignalToMenuItem = map[*C.GtkWidget]*MenuItem{}
mainThreadId = C.g_thread_self() mainThreadId = C.g_thread_self()
fmt.Println("init mainthread=", mainThreadId) fmt.Println("init mainthread=", mainThreadId)
@ -324,12 +322,14 @@ func menuGetRadioGroup(item *linuxMenuItem) *GSList {
//export handleClick //export handleClick
func handleClick(idPtr unsafe.Pointer) { func handleClick(idPtr unsafe.Pointer) {
id := (*C.GtkWidget)(idPtr) ident := C.CString("id")
defer C.free(unsafe.Pointer(ident))
value := C.g_object_get_data((*C.GObject)(idPtr), ident)
id := uint(*(*C.uint)(value))
item, ok := gtkSignalToMenuItem[id] item, ok := gtkSignalToMenuItem[id]
if !ok { if !ok {
return return
} }
switch item.itemType { switch item.itemType {
case text, checkbox: case text, checkbox:
menuItemClicked <- item.id menuItemClicked <- item.id
@ -341,10 +341,9 @@ func handleClick(idPtr unsafe.Pointer) {
} }
} }
func attachMenuHandler(item *MenuItem) { func attachMenuHandler(item *MenuItem) uint {
signal := C.CString("activate") signal := C.CString("activate")
defer C.free(unsafe.Pointer(signal)) defer C.free(unsafe.Pointer(signal))
impl := (item.impl).(*linuxMenuItem) impl := (item.impl).(*linuxMenuItem)
widget := impl.native widget := impl.native
flags := C.GConnectFlags(0) flags := C.GConnectFlags(0)
@ -355,10 +354,17 @@ func attachMenuHandler(item *MenuItem) {
C.gpointer(widget), C.gpointer(widget),
flags) flags)
id := (*C.GtkWidget)(widget) id := C.uint(item.id)
gtkSignalToMenuItem[id] = item ident := C.CString("id")
gtkSignalHandlers[id] = handlerId defer C.free(unsafe.Pointer(ident))
impl.handlerId = uint(handlerId) C.g_object_set_data(
(*C.GObject)(widget),
ident,
C.gpointer(&id),
)
gtkSignalToMenuItem[item.id] = item
return uint(handlerId)
} }
// menuItem // menuItem

View File

@ -69,7 +69,7 @@ func (m *linuxMenu) processMenu(menu *Menu) {
} }
func (m *linuxMenu) attachHandler(item *MenuItem) { func (m *linuxMenu) attachHandler(item *MenuItem) {
attachMenuHandler(item) (item.impl).(*linuxMenuItem).handlerId = attachMenuHandler(item)
} }
func (m *linuxMenu) addSubMenuToItem(menu *Menu, item *MenuItem) { func (m *linuxMenu) addSubMenuToItem(menu *Menu, item *MenuItem) {