chore(gdb): add LVGroup wrapper with focus tracking and dump group command

This commit is contained in:
Benign X
2026-03-06 11:30:27 +08:00
committed by VIFEX
parent 435b8c7b51
commit 79c626c585
8 changed files with 120 additions and 1 deletions

View File

@@ -40,6 +40,7 @@ from .lvgl import (
LVFsDrv,
LVIndev,
INDEV_TYPE_NAMES,
LVGroup,
)
from . import cmds as cmds
@@ -83,4 +84,5 @@ __all__ = [
"LVFsDrv",
"LVIndev",
"INDEV_TYPE_NAMES",
"LVGroup",
]

View File

@@ -1,6 +1,6 @@
import gdb
from .core import DumpObj, DumpIndev
from .core import DumpObj, DumpIndev, DumpGroup
from .display import DumpDisplayBuf
from .draw import InfoDrawUnit, DumpDrawTask
from .misc import (
@@ -39,6 +39,7 @@ DumpTimer()
DumpImageDecoder()
DumpFsDrv()
DumpIndev()
DumpGroup()
DumpDrawTask()
# Infos

View File

@@ -1,7 +1,9 @@
from .lv_obj import DumpObj
from .lv_indev import DumpIndev
from .lv_group import DumpGroup
__all__ = [
"DumpObj",
"DumpIndev",
"DumpGroup",
]

View File

@@ -0,0 +1,16 @@
import gdb
from lvglgdb.lvgl import curr_inst
from lvglgdb.lvgl.core.lv_group import LVGroup
class DumpGroup(gdb.Command):
"""dump all focus groups"""
def __init__(self):
super(DumpGroup, self).__init__(
"dump group", gdb.COMMAND_USER, gdb.COMPLETE_EXPRESSION
)
def invoke(self, args, from_tty):
LVGroup.print_entries(curr_inst().groups())

View File

@@ -6,6 +6,7 @@ from .core import (
dump_obj_styles,
LVIndev,
INDEV_TYPE_NAMES,
LVGroup,
)
from .display import LVDisplay
from .draw import (
@@ -94,4 +95,5 @@ __all__ = [
"LVFsDrv",
"LVIndev",
"INDEV_TYPE_NAMES",
"LVGroup",
]

View File

@@ -1,6 +1,7 @@
from .lv_obj import LVObject, ObjStyle, dump_obj_info, dump_obj_styles
from .lv_global import curr_inst
from .lv_indev import LVIndev, INDEV_TYPE_NAMES
from .lv_group import LVGroup
__all__ = [
"LVObject",
@@ -10,4 +11,5 @@ __all__ = [
"dump_obj_styles",
"LVIndev",
"INDEV_TYPE_NAMES",
"LVGroup",
]

View File

@@ -73,6 +73,12 @@ class LVGL:
for timer in LVList(self.lv_global.timer_state.timer_ll, "lv_timer_t"):
yield LVTimer(timer)
def groups(self):
from .lv_group import LVGroup
for group in LVList(self.lv_global.group_ll, "lv_group_t"):
yield LVGroup(group)
def indevs(self):
from .lv_indev import LVIndev

View File

@@ -0,0 +1,88 @@
from prettytable import PrettyTable
from lvglgdb.value import Value, ValueInput
from ..misc.lv_ll import LVList
class LVGroup(Value):
"""LVGL focus group wrapper"""
def __init__(self, group: ValueInput):
super().__init__(Value.normalize(group, "lv_group_t"))
@property
def frozen(self) -> bool:
return bool(int(self.super_value("frozen")))
@property
def editing(self) -> bool:
return bool(int(self.super_value("editing")))
@property
def wrap(self) -> bool:
return bool(int(self.super_value("wrap")))
@property
def obj_focus(self) -> Value:
focus_pp = self.super_value("obj_focus")
if not int(focus_pp):
return None
return focus_pp.dereference()
@property
def focus_cb(self) -> Value:
return self.super_value("focus_cb")
@property
def edge_cb(self) -> Value:
return self.super_value("edge_cb")
@property
def user_data(self) -> Value:
return self.super_value("user_data")
@property
def refocus_policy(self) -> bool:
return bool(int(self.super_value("refocus_policy")))
@property
def obj_count(self) -> int:
return LVList(self.obj_ll, "lv_obj_t").len
def __iter__(self):
from .lv_obj import LVObject
for obj_ptr in LVList(self.obj_ll, "lv_obj_t"):
yield LVObject(obj_ptr)
@staticmethod
def print_entries(groups):
"""Print focus groups as a PrettyTable."""
table = PrettyTable()
table.field_names = ["#", "objects", "frozen", "editing", "wrap", "focused"]
table.align = "l"
for i, group in enumerate(groups):
focus = group.obj_focus
if focus:
from .lv_obj import LVObject
focus_obj = LVObject(focus)
focus_str = f"{focus_obj.class_name}@{int(focus):x}"
else:
focus_str = "(none)"
table.add_row(
[
i,
group.obj_count,
group.frozen,
group.editing,
group.wrap,
focus_str,
]
)
if not table.rows:
print("No focus groups.")
else:
print(table)