Files
cthulhu/internal/atspi/adapter_menu_states_native.go

40 lines
1.2 KiB
Go

// Copyright (c) 2026 Storm Dragon
// Authors: Storm Dragon, Angus Kola
// SPDX-License-Identifier: GPL-3.0-or-later
package atspi
/*
#include "adapter_native.h"
*/
import "C"
// A hiding submenu can return focus only from its most recently focused
// direct item. Queries and the returned reference belong to the GLib owner;
// the callback releases the reference after the ordinary foreground gates.
func (adapter *Adapter) returned_menu_item(event *C.AtspiEvent, eventType string, origin ObjectID) *C.AtspiAccessible {
if eventType != ShowingStateEvent || event.detail1 != 0 || len(adapter.nativeFocus) == 0 {
return nil
}
role := C.atspi_accessible_get_role(event.source, nil)
if role != C.ATSPI_ROLE_MENU && role != C.ATSPI_ROLE_POPUP_MENU {
return nil
}
current := adapter.nativeFocus[len(adapter.nativeFocus)-1].source
switch C.atspi_accessible_get_role(current, nil) {
case C.ATSPI_ROLE_MENU_ITEM, C.ATSPI_ROLE_CHECK_MENU_ITEM, C.ATSPI_ROLE_RADIO_MENU_ITEM:
default:
return nil
}
parent := C.atspi_accessible_get_parent(current, nil)
if parent == nil {
return nil
}
match := nativeObjectID(parent) == origin
C.g_object_unref(C.gpointer(parent))
if !match {
return nil
}
return C.cthulhu_returned_menu_item(event.source)
}