📄 wm.txt
字号:
;;;996 }
000006 4770 BX lr
;;;997
ENDP
|L9.8|
DCD GUI_Context
AREA ||i.WM_Init||, CODE, READONLY, ALIGN=2
WM_Init PROC
;;;1694 */
;;;1695 void WM_Init(void) {
000000 b53e PUSH {r1-r5,lr}
;;;1696 if (!_IsInited) {
000002 4c16 LDR r4,|L10.92|
000004 78a0 LDRB r0,[r4,#2] ; _IsInited
000006 2800 CMP r0,#0
000008 d127 BNE |L10.90|
;;;1697 NextDrawWin = WM__FirstWin = WM_HWIN_NULL;
00000a 8120 STRH r0,[r4,#8]
;;;1698 GUI_Context.WM__pUserClipRect = NULL;
00000c 4914 LDR r1,|L10.96|
00000e 82a0 STRH r0,[r4,#0x14] ;1697
;;;1699 WM__NumWindows = WM__NumInvalidWindows =0;
000010 6388 STR r0,[r1,#0x38] ; GUI_Context
000012 80e0 STRH r0,[r4,#6]
000014 80a0 STRH r0,[r4,#4]
;;;1700 /* Make sure we have at least one window. This greatly simplifies the
;;;1701 drawing routines as they do not have to check if the window is valid.
;;;1702 */
;;;1703 #if GUI_NUM_LAYERS == 1
;;;1704 WM__ahDesktopWin[0] = WM_CreateWindow(0, 0, GUI_XMAX, GUI_YMAX, WM_CF_SHOW, cbBackWin, 0);
000016 4a13 LDR r2,|L10.100|
000018 2102 MOVS r1,#2
00001a e9cd1200 STRD r1,r2,[sp,#0]
00001e f64072ff MOV r2,#0xfff
000022 9002 STR r0,[sp,#8]
000024 4613 MOV r3,r2
000026 4601 MOV r1,r0
000028 f7fffffe BL WM_CreateWindow
00002c f104050a ADD r5,r4,#0xa
000030 8028 STRH r0,[r5,#0]
;;;1705 WM__aBkColor[0] = GUI_INVALID_COLOR;
000032 f06f4170 MVN r1,#0xf0000000
000036 f104021c ADD r2,r4,#0x1c
;;;1706 WM_InvalidateWindow(WM__ahDesktopWin[0]); /* Required because a desktop window has no parent. */
00003a 6011 STR r1,[r2,#0] ; WM__aBkColor
00003c f7fffffe BL WM_InvalidateWindow
;;;1707 #else
;;;1708 {
;;;1709 int i;
;;;1710 for (i = 0; i < GUI_NUM_LAYERS; i++) {
;;;1711 WM__ahDesktopWin[i] = WM_CreateWindowAsChild(0, 0, GUI_XMAX, GUI_YMAX, WM_UNATTACHED, WM_CF_SHOW, cbBackWin, 0);
;;;1712 WM__aBkColor[i] = GUI_INVALID_COLOR;
;;;1713 WM_InvalidateWindow(WM__ahDesktopWin[i]); /* Required because a desktop window has no parent. */
;;;1714 }
;;;1715 }
;;;1716 #endif
;;;1717 /* Register the critical handles ... Note: This could be moved into the module setting the Window handle */
;;;1718 WM__AddCriticalHandle(&WM__CHWinModal);
000040 4809 LDR r0,|L10.104|
000042 f7fffffe BL WM__AddCriticalHandle
;;;1719 WM__AddCriticalHandle(&WM__CHWinLast);
000046 4809 LDR r0,|L10.108|
000048 f7fffffe BL WM__AddCriticalHandle
;;;1720
;;;1721 WM_SelectWindow(WM__ahDesktopWin[0]);
00004c f9b50000 LDRSH r0,[r5,#0] ; WM__ahDesktopWin
000050 f7fffffe BL WM_SelectWindow
000054 2001 MOVS r0,#1
000056 7020 STRB r0,[r4,#0]
;;;1722 WM_Activate();
;;;1723 _IsInited =1;
000058 70a0 STRB r0,[r4,#2]
|L10.90|
;;;1724 }
;;;1725 }
00005a bd3e POP {r1-r5,pc}
;;;1726
ENDP
|L10.92|
DCD ||.data||
|L10.96|
DCD GUI_Context
|L10.100|
DCD cbBackWin
|L10.104|
DCD WM__CHWinModal
|L10.108|
DCD WM__CHWinLast
AREA ||i.WM_InvalidateArea||, CODE, READONLY, ALIGN=2
WM_InvalidateArea PROC
;;;781 */
;;;782 void WM_InvalidateArea(const GUI_RECT* pRect) {
000000 b570 PUSH {r4-r6,lr}
000002 4605 MOV r5,r0
;;;783 WM_HWIN hWin;
;;;784 WM_LOCK();
;;;785 /* Iterate over all windows */
;;;786 for (hWin = WM__FirstWin; hWin; hWin = WM_H2P(hWin)->hNextLin) {
000004 4807 LDR r0,|L11.36|
000006 f9b04008 LDRSH r4,[r0,#8] ; WM__FirstWin
00000a e008 B |L11.30|
|L11.12|
;;;787 _Invalidate1Abs(hWin, pRect);
00000c 4629 MOV r1,r5
00000e 4620 MOV r0,r4
000010 f7fffffe BL _Invalidate1Abs
000014 4620 MOV r0,r4 ;786
000016 f7fffffe BL GUI_ALLOC_h2p
00001a f9b04014 LDRSH r4,[r0,#0x14] ;786
|L11.30|
00001e 2c00 CMP r4,#0 ;786
000020 d1f4 BNE |L11.12|
;;;788 }
;;;789 WM_UNLOCK();
;;;790 }
000022 bd70 POP {r4-r6,pc}
;;;791
ENDP
|L11.36|
DCD ||.data||
AREA ||i.WM_InvalidateRect||, CODE, READONLY, ALIGN=1
WM_InvalidateRect PROC
;;;735 */
;;;736 void WM_InvalidateRect(WM_HWIN hWin, const GUI_RECT*pRect) {
000000 e92d41ff PUSH {r0-r8,lr}
000004 0006 MOVS r6,r0
000006 460f MOV r7,r1
;;;737 GUI_RECT r;
;;;738 WM_Obj* pWin;
;;;739 int Status;
;;;740 if (hWin) {
000008 d026 BEQ |L12.88|
;;;741 WM_LOCK();
;;;742 pWin = WM_H2P(hWin);
00000a 4630 MOV r0,r6
00000c f7fffffe BL GUI_ALLOC_h2p
;;;743 Status = pWin->Status;
000010 8b85 LDRH r5,[r0,#0x1c]
000012 4604 MOV r4,r0 ;742
;;;744 if (Status & WM_SF_ISVIS) {
000014 07a8 LSLS r0,r5,#30
000016 d51f BPL |L12.88|
;;;745 r = pWin->Rect;
000018 e9d40100 LDRD r0,r1,[r4,#0]
;;;746 if (pRect) {
00001c e9cd0102 STRD r0,r1,[sp,#8]
000020 b167 CBZ r7,|L12.60|
;;;747 GUI_RECT rPara;
;;;748 rPara = *pRect;
000022 2208 MOVS r2,#8
000024 4639 MOV r1,r7
000026 4668 MOV r0,sp
000028 f7fffffe BL __aeabi_memcpy
;;;749 WM__Client2Screen(pWin, &rPara);
00002c 4669 MOV r1,sp
00002e 4620 MOV r0,r4
000030 f7fffffe BL WM__Client2Screen
;;;750 GUI__IntersectRect(&r, &rPara);
000034 4669 MOV r1,sp
000036 a802 ADD r0,sp,#8
000038 f7fffffe BL GUI__IntersectRect
|L12.60|
;;;751 }
;;;752 if (WM__ClipAtParentBorders(&r, hWin)) { /* Optimization that saves invalidation if window area is not visible ... Not required */
00003c 4631 MOV r1,r6
00003e a802 ADD r0,sp,#8
000040 f7fffffe BL WM__ClipAtParentBorders
000044 2800 CMP r0,#0
000046 d007 BEQ |L12.88|
;;;753 if ((Status & (WM_SF_HASTRANS | WM_SF_CONST_OUTLINE)) == WM_SF_HASTRANS) {
000048 f6400001 MOV r0,#0x801
00004c 4005 ANDS r5,r5,r0
00004e 2d01 CMP r5,#1
000050 d104 BNE |L12.92|
000052 a802 ADD r0,sp,#8
000054 f7fffffe BL WM_InvalidateArea
|L12.88|
;;;754 WM__InvalidateAreaBelow(&r, hWin); /* Can be optimized to spare windows above */
;;;755 } else {
;;;756 _Invalidate1Abs(hWin, &r);
;;;757 }
;;;758 }
;;;759 }
;;;760 WM_UNLOCK();
;;;761 }
;;;762 }
000058 e8bd81ff POP {r0-r8,pc}
|L12.92|
00005c a902 ADD r1,sp,#8 ;756
00005e 4630 MOV r0,r6 ;756
000060 f7fffffe BL _Invalidate1Abs
000064 e7f8 B |L12.88|
;;;763
ENDP
AREA ||i.WM_InvalidateWindow||, CODE, READONLY, ALIGN=1
WM_InvalidateWindow PROC
;;;769 */
;;;770 void WM_InvalidateWindow(WM_HWIN hWin) {
000000 2100 MOVS r1,#0
;;;771 WM_InvalidateRect(hWin, NULL);
000002 f7ffbffe B.W WM_InvalidateRect
;;;772 }
;;;773
ENDP
AREA ||i.WM_SelectWindow||, CODE, READONLY, ALIGN=2
WM_SelectWindow PROC
;;;958 */
;;;959 WM_HWIN WM_SelectWindow(WM_HWIN hWin) {
000000 b570 PUSH {r4-r6,lr}
;;;960 WM_HWIN hWinPrev;
;;;961 WM_Obj* pObj;
;;;962
;;;963 WM_ASSERT_NOT_IN_PAINT();
;;;964 WM_LOCK();
;;;965 hWinPrev = GUI_Context.hAWin;
000002 4c0a LDR r4,|L14.44|
000004 f9b4603c LDRSH r6,[r4,#0x3c] ; GUI_Context
;;;966 if (hWin == 0) {
000008 b910 CBNZ r0,|L14.16|
;;;967 hWin = WM__FirstWin;
00000a 4809 LDR r0,|L14.48|
00000c f9b00008 LDRSH r0,[r0,#8] ; WM__FirstWin
|L14.16|
;;;968 }
;;;969 /* Select new window */
;;;970 GUI_Context.hAWin = hWin;
000010 87a0 STRH r0,[r4,#0x3c]
;;;971 #if GUI_NUM_LAYERS > 1
;;;972 {
;;;973 WM_HWIN hTop;
;;;974 int LayerIndex;
;;;975 hTop = _GetTopLevelWindow(hWin);
;;;976 LayerIndex = _DesktopHandle2Index(hTop);
;;;977 if (LayerIndex >= 0) {
;;;978 GUI_SelectLayer(LayerIndex);
;;;979 }
;;;980 }
;;;981 #endif
;;;982 pObj = WM_H2P(hWin);
000012 f7fffffe BL GUI_ALLOC_h2p
000016 4605 MOV r5,r0
;;;983 LCD_SetClipRectMax(); /* Drawing operations will clip ... If WM is deactivated, allow all */
000018 f7fffffe BL LCD_SetClipRectMax
;;;984 GUI_Context.xOff = pObj->Rect.x0;
00001c f9b50000 LDRSH r0,[r5,#0]
;;;985 GUI_Context.yOff = pObj->Rect.y0;
000020 6420 STR r0,[r4,#0x40] ; GUI_Context
000022 f9b50002 LDRSH r0,[r5,#2]
;;;986 WM_UNLOCK();
;;;987 return hWinPrev;
000026 6460 STR r0,[r4,#0x44] ; GUI_Context
000028 4630 MOV r0,r6
;;;988 }
00002a bd70 POP {r4-r6,pc}
;;;989
ENDP
|L14.44|
DCD GUI_Context
|L14.48|
DCD ||.data||
AREA ||i.WM_SendMessage||, CODE, READONLY, ALIGN=1
WM_SendMessage PROC
;;;676 */
;;;677 void WM_SendMessage(WM_HWIN hWin, WM_MESSAGE* pMsg) {
000000 b570 PUSH {r4-r6,lr}
000002 0004 MOVS r4,r0
000004 460d MOV r5,r1
;;;678 if (hWin) {
000006 d00b BEQ |L15.32|
;;;679 WM_Obj* pWin;
;;;680 WM_LOCK();
;;;681 pWin = WM_H2P(hWin);
000008 4620 MOV r0,r4
00000a f7fffffe BL GUI_ALLOC_h2p
;;;682 if (pWin->cb != NULL) {
00000e 6901 LDR r1,[r0,#0x10]
000010 2900 CMP r1,#0
000012 d005 BEQ |L15.32|
;;;683 pMsg->hWin = hWin;
000014 80ac STRH r4,[r5,#4]
;;;684 (*pWin->cb)(pMsg);
000016 6901 LDR r1,[r0,#0x10]
000018 4628 MOV r0,r5
00001a e8bd4070 POP {r4-r6,lr}
00001e 4708 BX r1
|L15.32|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -