📄 menu.txt
字号:
AREA ||i._GetItemHeight||, CODE, READONLY, ALIGN=1
_GetItemHeight PROC
;;;257 */
;;;258 static int _GetItemHeight(MENU_Handle hObj, MENU_Obj* pObj, unsigned Index) {
000000 b570 PUSH {r4-r6,lr}
000002 460c MOV r4,r1
;;;259 int ItemHeight;
;;;260 if (pObj->Height && !(pObj->Flags & MENU_SF_VERTICAL)) {
000004 6e89 LDR r1,[r1,#0x68]
000006 4616 MOV r6,r2 ;258
000008 b151 CBZ r1,|L19.32|
00000a f8b4105e LDRH r1,[r4,#0x5e]
00000e 07c9 LSLS r1,r1,#31
000010 d106 BNE |L19.32|
;;;261 ItemHeight = pObj->Height - (_GetEffectSize(hObj, pObj) << 1);
000012 4621 MOV r1,r4
000014 f7fffffe BL _GetEffectSize
000018 6ea1 LDR r1,[r4,#0x68]
00001a eba10040 SUB r0,r1,r0,LSL #1
;;;262 } else {
;;;263 ItemHeight = GUI_GetYDistOfFont(pObj->Props.pFont);
;;;264 if (pObj->Flags & MENU_SF_VERTICAL) {
;;;265 MENU_ITEM* pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index);
;;;266 if (pItem->Flags & MENU_IF_SEPARATOR) {
;;;267 ItemHeight = 3;
;;;268 }
;;;269 }
;;;270 ItemHeight += pObj->Props.aBorder[MENU_BI_TOP] + pObj->Props.aBorder[MENU_BI_BOTTOM];
;;;271 }
;;;272 return ItemHeight;
;;;273 }
00001e bd70 POP {r4-r6,pc}
|L19.32|
000020 6d60 LDR r0,[r4,#0x54] ;263
000022 f7fffffe BL GUI_GetYDistOfFont
000026 4605 MOV r5,r0 ;263
000028 f8b4005e LDRH r0,[r4,#0x5e] ;264
00002c 07c0 LSLS r0,r0,#31 ;264
00002e d008 BEQ |L19.66|
000030 4631 MOV r1,r6 ;265
000032 f1040058 ADD r0,r4,#0x58 ;265
000036 f7fffffe BL GUI_ARRAY_GetpItem
00003a 8880 LDRH r0,[r0,#4] ;266
00003c 0780 LSLS r0,r0,#30 ;266
00003e d500 BPL |L19.66|
000040 2503 MOVS r5,#3 ;267
|L19.66|
000042 f8140f52 LDRB r0,[r4,#0x52]! ;270
000046 7861 LDRB r1,[r4,#1] ;270
000048 4408 ADD r0,r0,r1 ;270
00004a 4428 ADD r0,r0,r5 ;270
00004c bd70 POP {r4-r6,pc}
;;;274
ENDP
AREA ||i._GetItemWidth||, CODE, READONLY, ALIGN=1
_GetItemWidth PROC
;;;237 */
;;;238 static int _GetItemWidth(MENU_Handle hObj, MENU_Obj* pObj, unsigned Index) {
000000 b510 PUSH {r4,lr}
000002 460c MOV r4,r1
;;;239 int ItemWidth;
;;;240 if (pObj->Width && (pObj->Flags & MENU_SF_VERTICAL)) {
000004 6e63 LDR r3,[r4,#0x64]
000006 4611 MOV r1,r2 ;238
000008 b153 CBZ r3,|L20.32|
00000a f8b4305e LDRH r3,[r4,#0x5e]
00000e 07db LSLS r3,r3,#31
000010 d006 BEQ |L20.32|
;;;241 ItemWidth = pObj->Width - (_GetEffectSize(hObj, pObj) << 1);
000012 4621 MOV r1,r4
000014 f7fffffe BL _GetEffectSize
000018 6e61 LDR r1,[r4,#0x64]
00001a eba10040 SUB r0,r1,r0,LSL #1
;;;242 } else {
;;;243 MENU_ITEM* pItem = (MENU_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index);
;;;244 if ((pObj->Flags & MENU_SF_VERTICAL) || !(pItem->Flags & MENU_IF_SEPARATOR)) {
;;;245 ItemWidth = pItem->TextWidth;
;;;246 } else {
;;;247 ItemWidth = 3;
;;;248 }
;;;249 ItemWidth += pObj->Props.aBorder[MENU_BI_LEFT] + pObj->Props.aBorder[MENU_BI_RIGHT];
;;;250 }
;;;251 return ItemWidth;
;;;252 }
00001e bd10 POP {r4,pc}
|L20.32|
000020 f1040058 ADD r0,r4,#0x58 ;243
000024 f7fffffe BL GUI_ARRAY_GetpItem
000028 f8b4105e LDRH r1,[r4,#0x5e] ;244
00002c 07c9 LSLS r1,r1,#31 ;244
00002e d102 BNE |L20.54|
000030 8881 LDRH r1,[r0,#4] ;244
000032 0789 LSLS r1,r1,#30 ;244
000034 d401 BMI |L20.58|
|L20.54|
000036 6880 LDR r0,[r0,#8] ;245
000038 e000 B |L20.60|
|L20.58|
00003a 2003 MOVS r0,#3 ;247
|L20.60|
00003c f8141f50 LDRB r1,[r4,#0x50]! ;249
000040 7862 LDRB r2,[r4,#1] ;249
000042 4411 ADD r1,r1,r2 ;249
000044 4408 ADD r0,r0,r1 ;249
000046 bd10 POP {r4,pc}
;;;253
ENDP
AREA ||i._HandlePID||, CODE, READONLY, ALIGN=1
_HandlePID PROC
;;;658 */
;;;659 static char _HandlePID(MENU_Handle hObj, MENU_Obj* pObj, int x, int y, int Pressed) {
000000 e92d41f0 PUSH {r4-r8,lr}
000004 b086 SUB sp,sp,#0x18
000006 4680 MOV r8,r0
000008 460c MOV r4,r1
00000a 4616 MOV r6,r2
00000c 461f MOV r7,r3
;;;660 GUI_PID_STATE PrevState;
;;;661 char XYInWidget = 0;
;;;662 WM_PID__GetPrevState(&PrevState);
00000e a803 ADD r0,sp,#0xc
000010 9d0c LDR r5,[sp,#0x30]
000012 f7fffffe BL WM_PID__GetPrevState
;;;663 /*
;;;664 * Check if coordinates are inside the widget.
;;;665 */
;;;666 if ((x >= 0) && (y >= 0)) {
000016 2e00 CMP r6,#0
000018 db6f BLT |L21.250|
00001a 2f00 CMP r7,#0
00001c db6d BLT |L21.250|
;;;667 GUI_RECT r;
;;;668 WM__GetClientRectWin(&pObj->Widget.Win, &r);
00001e a901 ADD r1,sp,#4
000020 4620 MOV r0,r4
000022 f7fffffe BL WM__GetClientRectWin
;;;669 if ((x <= r.x1) && (y <= r.y1)) {
000026 f9bd0008 LDRSH r0,[sp,#8]
00002a 42b0 CMP r0,r6
00002c db7a BLT |L21.292|
00002e f9bd000a LDRSH r0,[sp,#0xa]
000032 42b8 CMP r0,r7
000034 db76 BLT |L21.292|
;;;670 XYInWidget = 1;
;;;671 }
;;;672 }
;;;673
;;;674 if (XYInWidget) {
;;;675 int ItemIndex;
;;;676 ItemIndex = _GetItemFromPos(hObj, pObj, x, y);
000036 463b MOV r3,r7
000038 4632 MOV r2,r6
00003a 4621 MOV r1,r4
00003c 4640 MOV r0,r8
00003e f7fffffe BL _GetItemFromPos
000042 1e06 SUBS r6,r0,#0
;;;677 /*
;;;678 * Handle PID when coordinates are inside the widget.
;;;679 */
;;;680 if (ItemIndex >= 0) {
000044 db5a BLT |L21.252|
000046 f1040058 ADD r0,r4,#0x58
;;;681 /*
;;;682 * Coordinates are inside the menu.
;;;683 */
;;;684 if (Pressed == 1) {
00004a 2d01 CMP r5,#1
00004c d133 BNE |L21.182|
;;;685 if (PrevState.Pressed == 0) { /* Clicked */
00004e f89d1014 LDRB r1,[sp,#0x14]
000052 2900 CMP r1,#0
000054 d14b BNE |L21.238|
000056 f8b4105e LDRH r1,[r4,#0x5e]
00005a 0789 LSLS r1,r1,#30
00005c d447 BMI |L21.238|
00005e 4631 MOV r1,r6
000060 f7fffffe BL GUI_ARRAY_GetpItem
000064 8801 LDRH r1,[r0,#0]
000066 2900 CMP r1,#0
000068 d041 BEQ |L21.238|
00006a 8880 LDRH r0,[r0,#4]
00006c 07c0 LSLS r0,r0,#31
00006e d13e BNE |L21.238|
000070 f8b4005e LDRH r0,[r4,#0x5e]
000074 0641 LSLS r1,r0,#25
000076 d40e BMI |L21.150|
000078 f0400040 ORR r0,r0,#0x40
00007c f8a4005e STRH r0,[r4,#0x5e]
000080 4632 MOV r2,r6
000082 4621 MOV r1,r4
000084 4640 MOV r0,r8
000086 f7fffffe BL _OpenSubmenu
00008a 4632 MOV r2,r6
00008c 4621 MOV r1,r4
00008e 4640 MOV r0,r8
000090 f7fffffe BL _SetSelection
000094 e02b B |L21.238|
|L21.150|
000096 0740 LSLS r0,r0,#29
000098 d529 BPL |L21.238|
00009a 6ee0 LDR r0,[r4,#0x6c]
00009c 42b0 CMP r0,r6
00009e d126 BNE |L21.238|
0000a0 4621 MOV r1,r4
0000a2 4640 MOV r0,r8
0000a4 f7fffffe BL _CloseSubmenu
0000a8 f8b4005e LDRH r0,[r4,#0x5e]
0000ac f0200040 BIC r0,r0,#0x40
0000b0 f8a4005e STRH r0,[r4,#0x5e]
0000b4 e01b B |L21.238|
|L21.182|
;;;686 _ActivateMenu(hObj, pObj, ItemIndex);
;;;687 }
;;;688 _SelectItem(hObj, pObj, ItemIndex);
;;;689 } else if ((Pressed == 0) && (PrevState.Pressed == 1)) { /* Released */
0000b6 2d00 CMP r5,#0
0000b8 d118 BNE |L21.236|
0000ba f89d1014 LDRB r1,[sp,#0x14]
0000be 2901 CMP r1,#1
0000c0 d12c BNE |L21.284|
0000c2 4631 MOV r1,r6
0000c4 f7fffffe BL GUI_ARRAY_GetpItem
0000c8 4605 MOV r5,r0
0000ca 8800 LDRH r0,[r0,#0]
0000cc bb30 CBNZ r0,|L21.284|
0000ce 88a8 LDRH r0,[r5,#4]
0000d0 0780 LSLS r0,r0,#30
0000d2 d123 BNE |L21.284|
0000d4 4621 MOV r1,r4
0000d6 4640 MOV r0,r8
0000d8 f7fffffe BL _ClosePopup
0000dc 886b LDRH r3,[r5,#2]
0000de f9b4105c LDRSH r1,[r4,#0x5c]
0000e2 2200 MOVS r2,#0
0000e4 4640 MOV r0,r8
0000e6 f7fffffe BL MENU__SendMenuMessage
0000ea e017 B |L21.284|
|L21.236|
;;;690 _ActivateItem(hObj, pObj, ItemIndex);
;;;691 } else if (Pressed < 0) { /* Mouse moved */
0000ec da16 BGE |L21.284|
|L21.238|
;;;692 if (_ForwardMouseOverMsg(hObj, pObj, x, y) == 0) {
;;;693 _SelectItem(hObj, pObj, ItemIndex);
0000ee 4632 MOV r2,r6
0000f0 4621 MOV r1,r4
0000f2 4640 MOV r0,r8
0000f4 f7fffffe BL _SelectItem
0000f8 e010 B |L21.284|
|L21.250|
0000fa e013 B |L21.292|
|L21.252|
;;;694 } else {
;;;695 _DeselectItem(hObj, pObj);
;;;696 }
;;;697 }
;;;698 } else {
;;;699 /*
;;;700 * Coordinates are outside the menu but inside the widget.
;;;701 */
;;;702 if (Pressed == 1) {
0000fc 2d01 CMP r5,#1
0000fe d107 BNE |L21.272|
;;;703 if (PrevState.Pressed == 0) { /* Clicked */
000100 f89d0014 LDRB r0,[sp,#0x14]
000104 b930 CBNZ r0,|L21.276|
;;;704 /*
;;;705 * User has clicked outside the menu. Close the active submenu.
;;;706 * The widget itself must be closed (if needed) by the owner.
;;;707 */
;;;708 _DeactivateMenu(hObj, pObj);
000106 4621 MOV r1,r4
000108 4640 MOV r0,r8
00010a f7fffffe BL _DeactivateMenu
00010e e001 B |L21.276|
|L21.272|
;;;709 }
;;;710 _DeselectItem(hObj, pObj);
;;;711 } else if (Pressed < 0) { /* Moved out or mouse moved */
000110 2d00 CMP r5,#0
000112 da03 BGE |L21.284|
|L21.276|
;;;712 _DeselectItem(hObj, pObj);
000114 4621 MOV r1,r4
000116 4640 MOV r0,r8
000118 f7fffffe BL _DeselectItem
|L21.284|
;;;713 }
;;;714 }
;;;715 return 0;
00011c 2000 MOVS r0,#0
|L21.286|
;;;716 } else {
;;;717 /*
;;;718 * Handle PID when coordinates are outside the widget.
;;;719 */
;;;720 if ((Pressed == 1) && (PrevState.Pressed == 0)) {
;;;721 /*
;;;722 * User has clicked outside the menu. Close the active submenu.
;;;723 * The widget itself must be closed (if needed) by the owner.
;;;724 */
;;;725 _DeactivateMenu(hObj, pObj);
;;;726 _ClosePopup(hObj, pObj);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -