Files
player/Project/Src/MyWin/MyWinCore/mywin_msg.c

825 lines
24 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "mywin_inc.h"
2025-07-06 18:46:13 +08:00
// <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>0<EFBFBD><30><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʧ<EFBFBD><CAA7>
int WIN_StorTouchStruct(WIN_TouchStruct *t) {
static int press = 0;
// <20><><EFBFBD>л<EFBFBD>û<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
if (WIN_GetWinStruct()->touchQueue.data == 0)
return -1;
if (WIN_GetWinStruct()->keyShield == 1)
return -2;
// <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((press != t->pressNum) || t->pressNum) {
press = t->pressNum;
if (QUEUE_In(&WIN_GetWinStruct()->touchQueue, t) == 1)
return -3;
else
return 0;
}
return -4;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʧ<EFBFBD><CAA7>
int WIN_StorKeyStruct(WIN_KeyStruct *k) {
static int press = 0;
// <20><><EFBFBD>л<EFBFBD>û<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
if (WIN_GetWinStruct()->keyQueue.data == 0)
return -1;
if (WIN_GetWinStruct()->keyShield == 1)
return -2;
// <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD>һ<EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD><EFBFBD><EFBFBD>Ϣ
if ((press != k->state) || k->state) {
press = k->state;
if (QUEUE_In(&WIN_GetWinStruct()->keyQueue, k) == 1)
return -1;
else
return 0;
}
return -1;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>հ<EFBFBD><D5B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void WIN_ClearKeyQueue(void) {
WIN_KeyStruct k = {0};
while (QUEUE_Out(&WIN_GetWinStruct()->keyQueue, &k)) {
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void WIN_ClearTouchQueue(void) {
WIN_KeyStruct k = {0};
while (QUEUE_Out(&WIN_GetWinStruct()->touchQueue, &k)) {
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>
void WIN_KeyShieldOn(void) { WIN_GetWinStruct()->keyShield = 1; }
// <20><><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>
void WIN_KeyShieldOff(void) { WIN_GetWinStruct()->keyShield = 0; }
// Ĭ<>ϵ<EFBFBD><CFB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void WIN_DefaultMsgLoop(WIN_WindowStruct *win, WIN_MsgStruct *msg) {
switch (msg->msg) {
case WIN_MSG_PAINT:
WIN_DefaultPaint(win);
break;
case WIN_MSG_INIT:
break;
case WIN_MSG_KEY:
// if (win!= WIN_GetBaseWindow())
// win->deleteWindow(win);
break;
case WIN_MSG_TOUCH:
// if (win != WIN_GetBaseWindow())
// win->deleteWindow(win);
break;
case WIN_MSG_CHID:
break;
case WIN_MSG_DELETE:
break;
case WIN_MSG_MOVE:
break;
case WIN_MSG_EXTMSG:
break;
default:
break;
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20>޸Ĵ<DEB8><C4B4>ڵ<EFBFBD><DAB5><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void *WIN_SetMsgCallBack(WIN_WindowStruct *win,
void (*msgLoop)(struct _WIN_WindowStruct *win,
WIN_MsgStruct *msg)) {
void *ret = win->msgLoop;
win->msgLoop = msgLoop;
return ret;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD>
void *WIN_SetMsgLoopCallBack(WIN_WindowStruct *win,
void (*msgLoop)(struct _WIN_WindowStruct *win,
WIN_MsgStruct *msg)) {
void *ret = 0;
if (win) {
ret = win->msgLoop;
win->msgLoop = msgLoop;
} else {
ret = WIN_GetBaseWindow()->msgLoop;
WIN_GetBaseWindow()->msgLoop = msgLoop;
}
return ret;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><EFBFBD>ⲿ<EFBFBD><E2B2BF>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EEB6AF><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>0<EFBFBD><30><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʧ<EFBFBD><CAA7>
int WIN_StorExtMsg(void *msgData, int size) {
int ret = -1;
WIN_MsgStruct msg = {0};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>
if (WIN_GetWinStruct()->BlockWin[0]) {
msg.msg = WIN_MSG_EXTMSG;
msg.data.p = mymalloc(size);
mymemcpy(msg.data.p, msgData, size);
ret = WIN_SendMsg(0, WIN_GetWinStruct()->BlockWin[0], &msg);
}
return ret;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF>Ϣ<EFBFBD><CFA2>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int WIN_WinStorExtMsg(WIN_WindowStruct *win, void *msgData, int size) {
int ret = -1;
WIN_MsgStruct msg = {0};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>
if (win) {
msg.msg = WIN_MSG_EXTMSG;
msg.data.p = mymalloc(size);
mymemcpy(msg.data.p, msgData, size);
ret = WIN_SendMsg(0, win, &msg);
}
return ret;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int WIN_SendMsg(WIN_WindowStruct *win, WIN_WindowStruct *dscWin,
WIN_MsgStruct *msg) {
int ret = -1;
if (win)
msg->srcWin = win;
if (dscWin) // Ŀ<><EFBFBD><EAB4B0>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵĴ<D9B5><C4B4>ڷ<EFBFBD><DAB7><EFBFBD>Ϣ
if (dscWin->memFree)
ret = -1;
else
ret = QUEUE_In(&dscWin->winMsgQueue, msg);
}
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
if (ret != 0) {
// <20>ͷ<EFBFBD><CDB7><EFBFBD>Щ<EFBFBD><D0A9>Ϣ<EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
switch (msg->msg) {
case WIN_MSG_KEY:
case WIN_MSG_TOUCH:
case WIN_MSG_EXTMSG:
case WIN_MSG_MOVE:
myfree(msg->data.p);
break;
}
}
return ret;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int WIN_SendMsgToPrent(WIN_WindowStruct *win, u32 type, u32 data) {
WIN_MsgStruct msg1 = {0};
msg1.msg = WIN_MSG_CHID;
msg1.data.v = type;
msg1.data2.v = data;
return WIN_SendMsg(win, win->baseWin, &msg1);
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
void WIN_ClearMsgQueue(WIN_WindowStruct *win) {
WIN_MsgStruct msg = {0};
while (QUEUE_Out(&win->winMsgQueue, &msg)) {
switch (msg.msg) {
// <20>ͷŹ<CDB7><C5B9><EFBFBD><EFBFBD><EFBFBD>Ϣʱ<CFA2><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
case WIN_MSG_KEY:
case WIN_MSG_TOUCH:
case WIN_MSG_EXTMSG:
case WIN_MSG_MOVE:
myfree(msg.data.p);
break;
}
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ϣ
WIN_MsgStruct *WIN_CheckMsg(WIN_WindowStruct *win, u32 msgType) {
WIN_MsgStruct *msg = 0;
QUEUE_CheckStart(&win->winMsgQueue);
while (msg = QUEUE_Check(&win->winMsgQueue), msg) {
if (msg->msg == msgType) {
return msg;
}
}
return 0;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>Ͱ<EFBFBD><CDB0><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ͬʱ<CDAC><CAB1><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void WIN_SendKeyMsg(WIN_WindowStruct *win, WIN_KeyStruct *k) {
WIN_MsgStruct msg = {0};
if (win->keyShield == 0) {
msg.msg = WIN_MSG_KEY;
// Ҫ<><D2AA>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>һֱ<D2BB><D6B1>Ч,<2C><>Ϣ<EFBFBD><CFA2>ȡ<EFBFBD><C8A1>Ҫfree<65><65><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
msg.data.p = mymalloc(sizeof(WIN_KeyStruct));
mymemcpy(msg.data.p, k, sizeof(WIN_KeyStruct));
WIN_SendMsg(0, win, &msg);
}
if ((win->baseWin) && (win->baseWin != WIN_GetBaseWindow()) &&
(win->intercept == 0)) {
WIN_SendKeyMsg(win->baseWin, k);
} else if (win->baseWin) {
// <20><><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (WIN_GetWinStruct()->BlockWinNum == 0)
WIN_SendKeyMsg(WIN_GetBaseWindow(), k);
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ͬʱ<CDAC><CAB1><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵĸ<DAB5><C4B8><EFBFBD><EFBFBD><EFBFBD>
void WIN_SendTouchMsg(WIN_WindowStruct *win, int lcd_x, int lcd_y) {
WIN_TouchStruct t = {0};
WIN_MsgStruct msg = {0};
if (win->keyShield == 0) {
msg.msg = WIN_MSG_TOUCH;
// Ҫ<><D2AA>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>һֱ<D2BB><D6B1>Ч,<2C><>Ϣ<EFBFBD><CFA2>ȡ<EFBFBD><C8A1>Ҫfree<65><65><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
msg.data.p = mymalloc(sizeof(WIN_TouchStruct));
int x, y, xs, ys;
WIN_GetWinPosOnLcd(win, &x, &y, &xs,
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
t.x[0] = lcd_x - x;
t.y[0] = lcd_y - y;
mymemcpy(msg.data.p, &t, sizeof(WIN_TouchStruct));
WIN_SendMsg(0, win, &msg);
}
if ((win->baseWin) && (win->intercept == 0)) {
WIN_SendTouchMsg(win->baseWin, lcd_x, lcd_y);
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ͬʱ<CDAC><CAB1><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void WIN_SendTouchMove(WIN_WindowStruct *win, int move_x, int move_y) {
WIN_MoveStruct m = {0};
WIN_MsgStruct msg = {0};
if (win->keyShield == 0) {
msg.msg = WIN_MSG_MOVE;
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
m.moveType = MOVE_DATA_MOVED;
m.x_move = move_x;
m.y_move = move_y;
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
WIN_SendMsg(0, win, &msg);
}
if ((win->baseWin) && (win->intercept == 0)) {
WIN_SendTouchMove(win->baseWin, move_x, move_y);
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><EFBFBD><E3B2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
int WIN_TouchMsgBroad(WIN_WindowStruct *base) {
int have_msg = 0; // <20><><EFBFBD><EFBFBD>ֵ
WIN_TouchStruct t = {0};
WIN_KeyStruct k = {0};
WIN_MoveStruct m = {0};
WIN_MsgStruct msg = {0};
WIN_MsgBroadStruct *broad = &WIN_GetWinStruct()->msgBroad;
while (QUEUE_Out(&WIN_GetWinStruct()->touchQueue, &t) == 1) {
have_msg = 1;
// <20>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
broad->win = WIN_FindTopWinByPos(base, t.x[0], t.y[0]);
// while(broad->win&&broad->win->keyShield)
//broad->win=broad->win->baseWin;
if (broad->win) {
// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ζ<EFBFBD><CEB6>ǰ<EFBFBD><C7B0>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²ų<C2B2><C5B3><EFBFBD>
if (broad->t_old.pressNum && t.pressNum) {
if (broad->win_old != broad->win) {
// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵĴ<DAB5><C4B4><EFBFBD>
// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵĴ<DAB5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (broad->win_old) {
int x, y, xs, ys;
msg.msg = WIN_MSG_MOVE;
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
m.moveType = MOVE_DATA_MOVEOUT;
WIN_GetWinPosOnLcd(broad->win_old, &x, &y, &xs,
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m.x_move = t.x[0] - x;
m.y_move = t.y[0] - y;
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
WIN_SendMsg(0, broad->win_old, &msg);
msg.msg = WIN_MSG_MOVE;
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
m.moveType = MOVE_DATA_MOVEIN;
WIN_GetWinPosOnLcd(broad->win, &x, &y, &xs,
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m.x_move = t.x[0] - x;
m.y_move = t.y[0] - y;
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
WIN_SendMsg(0, broad->win, &msg);
broad->Touch_long = WIN_LONGTOUCH_CHECK; // <20>Ѿ<EFBFBD><D1BE>ƶ<EFBFBD><C6B6>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ټ<EFBFBD><D9BC><EFBFBD><E2B3A4>
} else {
// <20>ɿ<EFBFBD><C9BF><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>ĵ<EFBFBD>һ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD>
}
broad->win_old = broad->win;
} // if (win_old!=win)
WIN_WindowStruct *win_move = 0;
if (win_move = WIN_FindPrent(broad->win_old, broad->win),
win_move != 0) {
// <20><><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>ֵû<D6B5><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ
if (POS_RoundPix(1, broad->t_old.x[0], broad->t_old.y[0], t.x[0],
t.y[0]) != 0) {
// <20><>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
WIN_SendTouchMove(win_move, t.x[0] - broad->t_old.x[0],
t.y[0] - broad->t_old.y[0]);
broad->Touch_long =
WIN_LONGTOUCH_CHECK + 10; // <20>Ѿ<EFBFBD><D1BE>ƶ<EFBFBD><C6B6>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ټ<EFBFBD><D9BC><EFBFBD><E2B3A4>
} else {
// <20><><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ƶ<EFBFBD>,<2C><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
if (broad->Touch_long < WIN_LONGTOUCH_CHECK) {
broad->Touch_long++;
if (broad->Touch_long >= WIN_LONGTOUCH_CHECK) {
// <20><><EFBFBD><EFBFBD>һ<EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD>Ϣ
msg.msg = WIN_MSG_MOVE;
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
m.moveType = MOVE_DATA_LONG;
int x, y, xs, ys;
WIN_GetWinPosOnLcd(
broad->win, &x, &y, &xs,
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m.x_move = t.x[0] - x;
m.y_move = t.y[0] - y;
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
WIN_SendMsg(0, broad->win_old, &msg);
}
}
}
} // if (win_move=WIN_FindPrent(win_old,win),win_move!=0)
} // if (t_old.pressNum&&t.pressNum)
else {
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (broad->Touch_long && (broad->Touch_long < WIN_LONGTOUCH_CHECK)) {
// <20><><EFBFBD>Ͷ̰<CDB6><CCB0><EFBFBD>Ϣ
msg.msg = WIN_MSG_MOVE;
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
m.moveType = MOVE_DATA_SHORT;
int x, y, xs, ys;
WIN_GetWinPosOnLcd(broad->win, &x, &y, &xs,
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m.x_move = t.x[0] - x;
m.y_move = t.y[0] - y;
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
WIN_SendMsg(0, broad->win_old, &msg);
}
// <20><>Ļ<EFBFBD>ɿ<EFBFBD><C9BF>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⸴λ
broad->Touch_long = 0;
// <20><>Ļ<EFBFBD>ɿ<EFBFBD><C9BF>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ڼ们<DABC><E4BBAC><EFBFBD><EFBFBD>λ
broad->win_old = 0;
if (t.pressNum == 0) {
// <20><>Ļ<EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD>
msg.msg = WIN_MSG_MOVE;
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
m.moveType = MOVE_DATA_TOUCHOUT;
int x, y, xs, ys;
WIN_GetWinPosOnLcd(broad->win, &x, &y, &xs,
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m.x_move = t.x[0] - x;
m.y_move = t.y[0] - y;
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
WIN_SendMsg(0, broad->win, &msg);
} else {
// <20>ɿ<EFBFBD><C9BF><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>ĵ<EFBFBD>һ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD>
msg.msg = WIN_MSG_MOVE;
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
m.moveType = MOVE_DATA_TOUCHIN;
int x, y, xs, ys;
WIN_GetWinPosOnLcd(broad->win, &x, &y, &xs,
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m.x_move = t.x[0] - x;
m.y_move = t.y[0] - y;
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
WIN_SendMsg(0, broad->win, &msg);
}
}
broad->t_old.x[0] = t.x[0];
broad->t_old.y[0] = t.y[0];
broad->t_old.pressNum = t.pressNum;
// <20><><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD>Ϣ
WIN_SendTouchMsg(broad->win, t.x[0], t.y[0]);
} // if (win)
else {
if (broad->t_old.pressNum == 0 && t.pressNum) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
msg.msg = WIN_MSG_MOVE;
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
m.moveType = MOVE_DATA_OUTSIDE;
m.x_move = 0;
m.y_move = 0;
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
WIN_SendMsg(0, base, &msg);
}
broad->t_old.x[0] = t.x[0];
broad->t_old.y[0] = t.y[0];
broad->t_old.pressNum = t.pressNum;
}
} // while (QUEUE_Out (&g_win_touchQueue,&t)==1)
return have_msg;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><EFBFBD><E3B2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
int WIN_KeyMsgBroad(WIN_WindowStruct *base) {
int have_msg = 0; // <20><><EFBFBD><EFBFBD>ֵ
WIN_TouchStruct t = {0};
WIN_KeyStruct k = {0};
WIN_MoveStruct m = {0};
WIN_MsgStruct msg = {0};
WIN_MsgBroadStruct *broad = &WIN_GetWinStruct()->msgBroad;
while (QUEUE_Out(&WIN_GetWinStruct()->keyQueue, &k) == 1) {
have_msg = 1;
WIN_WindowStruct *win_key = 0;
if (win_key = WIN_FindTopWin(base), win_key != 0) {
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD>
if ((broad->k_old.key == k.key) && k.key) {
// <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>µ<EFBFBD>
if (k.state) {
if (broad->Key_long < WIN_LONGTOUCH_CHECK) {
broad->Key_long++;
if (broad->Key_long >= WIN_LONGTOUCH_CHECK) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
k.longPress |= k.key;
k.shortPress = 0;
k.firstPress = 0;
k.unPress = 0;
WIN_SendKeyMsg(win_key, &k);
} else {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
k.longPress = 0;
k.shortPress = 0;
k.firstPress = 0;
k.unPress = 0;
WIN_SendKeyMsg(win_key, &k);
}
} else {
// <20>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD>
broad->Key_long++;
if (broad->Key_long % WIN_LONGTOUCH_CHECK == 0) {
k.longPressNum = broad->Key_long / WIN_LONGTOUCH_CHECK;
if (k.longPressNum != broad->k_old.longPressNum) {
// <20>ٴδ<D9B4><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
broad->k_old.longPressNum = k.longPressNum;
k.longPress |= k.key;
k.shortPress = 0;
k.firstPress = 0;
k.unPress = 0;
WIN_SendKeyMsg(win_key, &k);
}
}
}
} // if (k.state)
else {
// <20><><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0>±<EFBFBD>Ϊ<EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (broad->Key_long < WIN_LONGTOUCH_CHECK) {
// <20>̰<EFBFBD>
k.shortPress |= k.key;
k.longPress = 0;
k.firstPress = 0;
k.unPress = 0;
WIN_SendKeyMsg(win_key, &k);
} else {
// <20>ɿ<EFBFBD><C9BF>˰<EFBFBD><CBB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
broad->k_old.longPressNum = 0;
}
k.unPress = k.key;
k.firstPress = 0;
k.longPress = 0;
k.shortPress = 0;
WIN_SendKeyMsg(win_key, &k);
broad->Key_long = 0;
k.key = 0;
}
} // if ((k_old.key==k.key)&&k.key)
else if ((broad->k_old.state == 0) && (k.state)) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD>
broad->Key_long = 0;
k.firstPress = k.key;
k.longPress = 0;
k.shortPress = 0;
WIN_SendKeyMsg(win_key, &k);
}
broad->k_old.key = k.key;
broad->k_old.state = k.state;
} // if (win_key =WIN_FindTopWin(win),win_key!=0)
}
return have_msg;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><EFBFBD><E3B2A5><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD>Ϣ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD>0
int WIN_MsgBroad(WIN_WindowStruct *base) {
return WIN_KeyMsgBroad(base) | WIN_TouchMsgBroad(base);
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int WIN_Working(WIN_WindowStruct *win) {
WIN_MoveStruct *m = 0;
RECT_Struct r = {0};
int run = 0; // <20><><EFBFBD><EFBFBD>Ϊ1<CEAA><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣû<CFA2><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20>Լ<EFBFBD><D4BC>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>Ϣ
WIN_MsgStruct msg = {0};
win->msgLoopEnter++;
WIN_WindowStruct *winCurrent_old = WIN_GetWinStruct()->winCurrent;
WIN_GetWinStruct()->winCurrent = win;
void *msgData = 0;
while (QUEUE_Out(&win->winMsgQueue, &msg)) {
run = 1;
// <20>ȸ<EFBFBD><C8B8><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>Ȼ<EFBFBD><C8BB><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>Ϣָ<CFA2><EFBFBD><EBA3AC>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD><EFBFBD>ִ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ұָ<D2B0><D6B8>
msgData = msg.data.p;
switch (msg.msg) {
// <20><>Щ<EFBFBD><D0A9><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>Ϣ<EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>֮ǰҪ<C7B0><D2AA><EFBFBD><EFBFBD><EFBFBD>úû<C3BA><C3BB><EFBFBD>
case WIN_MSG_PAINT:
mymemcpy(&r, &win->invaldRect, sizeof(RECT_Struct));
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>Ҫ<EFBFBD>ػ<EFBFBD>
if (win->invald == 0)
continue;
// ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD><C3B5>Ӵ<EFBFBD><D3B4><EFBFBD>ҲҪ<D2B2>ػ<EFBFBD>
for (int i = win->chidWinNum; i > 0; i--) {
// <20>ж<EFBFBD><D0B6><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڵ<EFBFBD>
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RECT_Struct ret = {0};
RECT_Struct r1 = {0};
r1.x = win->chidWin[i - 1]->x;
r1.y = win->chidWin[i - 1]->y;
r1.x_size = win->chidWin[i - 1]->x_size;
r1.y_size = win->chidWin[i - 1]->y_size;
if (POS_RectIntersection(&ret, &r1, &r)) {
ret.x -= win->chidWin[i - 1]->x;
ret.y -= win->chidWin[i - 1]->y; // <20><>ȥ<EFBFBD><C8A5><EFBFBD>ڶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>꣬2020.2.26
WIN_SetInvalidRect(win->chidWin[i - 1], ret.x, ret.y, ret.x_size,
ret.y_size);
if (POS_RectSub(&r, &r, &r1) == 0) {
// <20>ػ<EFBFBD><D8BB><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD>
break;
}
}
}
// <20><><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ػ<EFBFBD>
WIN_TopWinPaint(win);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>־
win->invald = 0;
// <20><>Ҫ<EFBFBD>ػ<EFBFBD><D8BB>Ĵ<EFBFBD><C4B4><EFBFBD>-1
if (WIN_GetWinStruct()->numOfWindowToPrint)
WIN_GetWinStruct()->numOfWindowToPrint--;
else
while (1)
; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>λ<EFBFBD><CEBB>
// <20><>ͼ<EFBFBD><CDBC><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (r.x_size <= 0 || r.y_size <= 0)
continue;
// <20><><EFBFBD>û<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
WIN_EnterPaint(win);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
WIN_SetWinInvalidRect(win, &r);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD>
WIN_GetWinStruct()->lcd->enterLayerBuff();
break; // case WIN_MSG_PAINT:
} // switch (msg.msg)
// <20><><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD>
win->msgLoop(win, &msg);
switch (msg.msg) {
// <20><>Щ<EFBFBD><D0A9><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>Ϣ<EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>ʱʹ<CAB1><CAB9><EFBFBD><EFBFBD>malloc<6F><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷŵ<CDB7>
case WIN_MSG_KEY:
case WIN_MSG_TOUCH:
case WIN_MSG_EXTMSG:
myfree(msgData);
break;
case WIN_MSG_MOVE:
m = msg.data.p;
switch (m->moveType) {
// <20>ѵ<EFBFBD><D1B5><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
case MOVE_DATA_TOUCHIN:
if (win->baseWin) {
if (win != win->baseWin->chidWin[win->baseWin->chidWinNum - 1]) {
// <20><><EFBFBD>Ƕ<EFBFBD><C7B6>˴<EFBFBD><CBB4>ڣ<EFBFBD><DAA3>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (WIN_SetChidWinTop(win->baseWin, win) == 0)
WIN_SetInvalid(win);
}
}
break;
}
myfree(msgData);
break; // case WIN_MSG_MOVE:
// <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ɣ<EFBFBD>ˢ<EFBFBD><CBA2><EFBFBD><EFBFBD>Ļ
case WIN_MSG_PAINT:
if (WIN_GetWinStruct()->numOfWindowToPrint == 0) // LCD_ExitLayerBuff();
WIN_GetWinStruct()->lcd->exitLayerBuff();
break;
// <20><>Щ<EFBFBD><D0A9><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>Ϣ<EFBFBD><CFA2>Ҫ<EFBFBD><D2AA><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
case WIN_MSG_DELETE:
if (win->baseWin) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ػ<EFBFBD>
// WIN_SetInvalidRect(win->baseWin,win->x,win->y,win->x_size,win->y_size);
} // if (win->baseWin)
break;
} // switch (msg.msg)
} // while (QUEUE_Out (&win->winMsgQueue,&msg))
// Ȼ<><C8BB><EFBFBD>Ӵ<EFBFBD><D3B4>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ϣ
for (int i = 0; i < win->chidWinNum; i++) {
run |= WIN_Working(win->chidWin[i]);
}
WIN_GetWinStruct()->winCurrent = winCurrent_old;
if (win->msgLoopEnter)
win->msgLoopEnter--;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((win->msgLoopEnter == 0) && (win->memFree)) {
win->memFree(win);
}
return run;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>
void WIN_Delay(int ms) {
WIN_GetWinStruct()->delay_ms = ms;
WIN_Delay_ms(WIN_GetWinStruct()->delay_ms);
if (WIN_GetWinStruct()->runCallBack)
WIN_GetWinStruct()->runCallBack();
WIN_TimerWork();
while (WIN_MsgBroad(WIN_GetBaseWindow()))
;
while (WIN_Working(WIN_GetBaseWindow()))
;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int WIN_RunBlock(WIN_WindowStruct *win) {
WIN_WindowStruct *win_save = win;
// <20>Ƿ񳬳<C7B7><F1B3ACB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD>ײ<EFBFBD><D7B2><EFBFBD>
if (WIN_GetWinStruct()->BlockWinNum >= WIN_BLOCK_MAXNUM) {
win->deleteWindow(win);
return -1;
}
// <20><><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB>ջ
for (int i = WIN_GetWinStruct()->BlockWinNum; i > 0; i--) {
WIN_GetWinStruct()->BlockWin[i] = WIN_GetWinStruct()->BlockWin[i - 1];
}
WIN_GetWinStruct()->BlockWin[0] = win;
WIN_GetWinStruct()->BlockWinNum++;
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
while (WIN_GetWinStruct()->BlockWin[0] == win_save) {
WIN_Delay_ms(WIN_GetWinStruct()->delay_ms);
if (WIN_GetWinStruct()->runCallBack)
WIN_GetWinStruct()->runCallBack();
WIN_TimerWork();
while (WIN_MsgBroad(WIN_GetWinStruct()->BlockWin[0]))
;
// WIN_Working (WIN_GetBaseWindow());
while (WIN_Working(WIN_GetBaseWindow()))
;
}
// <20><><EFBFBD>ش<EFBFBD><D8B4>ڵķ<DAB5><C4B7><EFBFBD>ֵ
return WIN_GetWinStruct()->BlockWinReturn;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч
void WIN_SetInvalid(WIN_WindowStruct *win) {
WIN_SetInvalidRect(win, 0, 0, win->x_size, win->y_size);
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB6A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч
void WIN_SetInvalidWhenTop(WIN_WindowStruct *win) {
WIN_SetInvalidRectWhenTop(win, 0, 0, win->x_size, win->y_size);
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20>Ѵ<EFBFBD><D1B4><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч,<2C>Դ<EFBFBD><D4B4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<CEAA><D4AD>
void WIN_SetInvalidRect(WIN_WindowStruct *win, int x, int y, int x_size,
int y_size) {
RECT_Struct *r;
if (win->memFree)
return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵĴ<D9B5><C4B4>ڷ<EFBFBD><DAB7><EFBFBD>Ϣ
// <20><><EFBFBD><EFBFBD>paint<6E><74>Ϣ
WIN_MsgStruct msg = {0};
msg.msg = WIN_MSG_PAINT;
r = mymalloc(sizeof(RECT_Struct));
WIN_GetWinPosOnLcd(win, &r->x, &r->y, &r->x_size, &r->y_size);
RECT_Struct r_win = {0};
r_win.x = r->x;
r_win.y = r->y;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ڴ<EFBFBD><DAB4>ڷ<EFBFBD>Χ<EFBFBD><CEA7>
WIN_WindowStruct *t = win;
RECT_Struct r_now = {0};
do {
WIN_GetWinPosOnLcd(t, &r_now.x, &r_now.y, &r_now.x_size, &r_now.y_size);
POS_RectIntersection(r, r, &r_now);
t = t->baseWin;
} while (t);
r->x -= r_win.x;
r->y -= r_win.y;
RECT_Struct r_in = {0};
r_in.x = x;
r_in.y = y;
r_in.x_size = x_size;
r_in.y_size = y_size;
POS_RectIntersection(r, r, &r_in);
if (win->invald == 0) {
WIN_SendMsg(0, win, &msg);
mymemcpy(&win->invaldRect, r, sizeof(RECT_Struct));
win->invald = 1;
WIN_GetWinStruct()->numOfWindowToPrint++; // <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ƵĴ<C6B5><C4B4>ڼ<EFBFBD>1
} else {
POS_RectContain(&win->invaldRect, &win->invaldRect, r);
}
myfree(r);
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB6A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч
void WIN_SetInvalidRectWhenTop(WIN_WindowStruct *win, int x, int y, int x_size,
int y_size) {
if (WIN_FindBlock(win) == 0) {
WIN_SetInvalidRect(win, x, y, x_size, y_size);
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
void WIN_Move(WIN_WindowStruct *win, int x_move, int y_move) {
2025-06-27 00:32:57 +08:00
2025-07-06 18:46:13 +08:00
RECT_Struct r1 = {0};
RECT_Struct r2 = {0};
r1.x = win->x;
r1.y = win->y;
r1.x_size = win->x_size;
r1.y_size = win->y_size;
mymemcpy(&r2, &r1, sizeof(RECT_Struct));
win->x += x_move;
win->y += y_move;
r2.x = win->x;
r2.y = win->y;
2025-06-27 00:32:57 +08:00
2025-07-06 18:46:13 +08:00
POS_RectContain(&r1, &r1, &r2);
2025-06-27 00:32:57 +08:00
2025-07-06 18:46:13 +08:00
if (win->baseWin)
WIN_SetInvalidRect(win->baseWin, r1.x, r1.y, r1.x_size, r1.y_size);
2025-06-27 00:32:57 +08:00
2025-07-06 18:46:13 +08:00
// WIN_SetInvalid(win);
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void WIN_SetPos(WIN_WindowStruct *win, int x, int y) {
RECT_Struct r1 = {0};
RECT_Struct r2 = {0};
r1.x = win->x;
r1.y = win->y;
r1.x_size = win->x_size;
r1.y_size = win->y_size;
mymemcpy(&r2, &r1, sizeof(RECT_Struct));
win->x = x;
win->y = y;
r2.x = win->x;
r2.y = win->y;
POS_RectContain(&r1, &r1, &r2);
if (win->baseWin)
WIN_SetInvalidRect(win->baseWin, r1.x, r1.y, r1.x_size, r1.y_size);
// WIN_SetInvalid(win);
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>ô<EFBFBD><C3B4>ڳߴ<DAB3>
void WIN_SetSize(WIN_WindowStruct *win, int x_size, int y_size) {
RECT_Struct r1 = {0};
RECT_Struct r2 = {0};
r1.x = win->x;
r1.y = win->y;
r1.x_size = win->x_size;
r1.y_size = win->y_size;
mymemcpy(&r2, &r1, sizeof(RECT_Struct));
win->x_size = x_size;
win->y_size = y_size;
r2.x_size = win->x_size;
r2.y_size = win->y_size;
POS_RectContain(&r1, &r1, &r2);
if (win->baseWin)
WIN_SetInvalidRect(win->baseWin, r1.x, r1.y, r1.x_size, r1.y_size);
// WIN_SetInvalid(win);
2025-06-27 00:32:57 +08:00
}