diff --git a/24_day/bootpack.c b/24_day/bootpack.c index 15044bc..541aa30 100644 --- a/24_day/bootpack.c +++ b/24_day/bootpack.c @@ -42,8 +42,8 @@ void HariMain(void) }; int key_to = 0, key_shift = 0, key_leds = (binfo->leds >> 4) & 7, keycmd_wait = -1; struct CONSOLE *cons; - int j, x, y; - struct SHEET *sht; + int j, x, y, mmx = -1, mmy = -1; + struct SHEET *sht = 0; init_gdtidt(); init_pic(); @@ -267,21 +267,39 @@ void HariMain(void) if (my > binfo->scrny - 1) { my = binfo->scrny - 1; } - + sheet_slide(sht_mouse, mx, my);/* 包含sheet_refresh含sheet_refresh */ - if ((mdec.btn & 0x01) != 0) { /* 按下左键、移动sht_win */ - for (j = shtctl->top - 1; j > 0; j--) { - sht = shtctl->sheets[j]; - x = mx - sht->vx0; - y = my - sht->vy0; - if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) { - if (sht->buf[y * sht->bxsize + x] != sht->col_inv) { - sheet_updown(sht, shtctl->top - 1); - break; + if ((mdec.btn & 0x01) != 0) { /* 按下左键 */ + if (mmx < 0) { + /*如果处于通常模式*/ + /*按照从上到下的顺序寻找鼠标所指向的图层*/ + for (j = shtctl->top - 1; j > 0; j--) { + sht = shtctl->sheets[j]; + x = mx - sht->vx0; + y = my - sht->vy0; + if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) { + if (sht->buf[y * sht->bxsize + x] != sht->col_inv) { + sheet_updown(sht, shtctl->top - 1); + if (3 <= x && x < sht->bxsize - 3 && 3 <= y && y < 21) { + mmx = mx; /*进入窗口移动模式*/ + mmy = my; + } + break; + } } } + } else { + /*如果处于窗口移动模式*/ + x = mx - mmx; /*计算鼠标的移动距离*/ + y = my - mmy; + sheet_slide(sht, sht->vx0 + x, sht->vy0 + y); + mmx = mx; /*更新为移动后的坐标*/ + mmy = my; } + } else { + /*没有按下左键*/ + mmx = -1; /*返回通常模式*/ } }