40 lines
1.2 KiB
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)
|
|
}
|