forked from KolibriOS/kolibrios
gui/mouse.inc:
+ new file for GUI-related mouse events handling (old mouse.inc renamed) gui/button.inc and gui/window.inc: * refactoring in regards of new mouse.inc: * obsolete code eliminated * old'n'ugly `check_buttons` and `checkwindows` removed * events handlers added gui/window.inc: * moved GUI-related syscalls and auxilary functions from kernel.asm * removed registers cross-ordering from syscall 67 (window move/resize) + more comments added known bugs include: 1. apps using syscall 67 (kfar etc.) may not redraw their old screen area leaving ghost images 2. possibility of mouse cursor artefacts may have increased (this *really* has to be reworked) git-svn-id: svn://kolibrios.org@1391 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -1,250 +1,701 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
||||
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$Revision$
|
||||
|
||||
|
||||
iglobal
|
||||
|
||||
align 4
|
||||
mousepointer:
|
||||
db 0x00,0x00,0x00,0x74,0x74,0x74,0x6e,0x6e,0x6e,0x6f
|
||||
db 0x6f,0x6f,0x71,0x71,0x71,0x75,0x75,0x75,0x79,0x79
|
||||
db 0x79,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63
|
||||
db 0x66,0x66,0x66,0x6c,0x6c,0x6c,0x72,0x72,0x72,0x78
|
||||
db 0x78,0x78,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0
|
||||
db 0xc0,0xc0,0x00,0x00,0x00,0x54,0x54,0x54,0x57,0x57
|
||||
db 0x57,0x5f,0x5f,0x5f,0x68,0x68,0x68,0x71,0x71,0x71
|
||||
db 0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0x00,0x00,0x00,0x47,0x47,0x47,0x50
|
||||
db 0x50,0x50,0x5b,0x5b,0x5b,0x67,0x67,0x67,0x70,0x70
|
||||
db 0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0xff,0xff,0xff,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x3f,0x3f,0x3f
|
||||
db 0x4b,0x4b,0x4b,0x59,0x59,0x59,0x66,0x66,0x66,0x70
|
||||
db 0x70,0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e,0x7e
|
||||
db 0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x3a,0x3a
|
||||
db 0x3a,0x49,0x49,0x49,0x59,0x59,0x59,0x66,0x66,0x66
|
||||
db 0x70,0x70,0x70,0x77,0x77,0x77,0x7c,0x7c,0x7c,0x7e
|
||||
db 0x7e,0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x39
|
||||
db 0x39,0x39,0x49,0x49,0x49,0x59,0x59,0x59,0x66,0x66
|
||||
db 0x66,0x71,0x71,0x71,0x78,0x78,0x78,0x7c,0x7c,0x7c
|
||||
db 0x7e,0x7e,0x7e,0x80,0x80,0x80,0x80,0x80,0x80,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
||||
db 0x39,0x39,0x39,0x4a,0x4a,0x4a,0x5a,0x5a,0x5a,0x68
|
||||
db 0x68,0x68,0x72,0x72,0x72,0x79,0x79,0x79,0x7d,0x7d
|
||||
db 0x7d,0x7f,0x7f,0x7f,0x80,0x80,0x80,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00
|
||||
db 0x00,0x3c,0x3c,0x3c,0x4e,0x4e,0x4e,0x5e,0x5e,0x5e
|
||||
db 0x6b,0x6b,0x6b,0x75,0x75,0x75,0x7a,0x7a,0x7a,0x7e
|
||||
db 0x7e,0x7e,0x80,0x80,0x80,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00
|
||||
db 0x00,0x00,0x43,0x43,0x43,0x55,0x55,0x55,0x64,0x64
|
||||
db 0x64,0x70,0x70,0x70,0x78,0x78,0x78,0x7d,0x7d,0x7d
|
||||
db 0x80,0x80,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xc0
|
||||
db 0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x4e,0x4e,0x4e,0x5f,0x5f,0x5f,0x6d
|
||||
db 0x6d,0x6d,0x76,0x76,0x76,0x7c,0x7c,0x7c,0x80,0x80
|
||||
db 0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
||||
db 0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x14
|
||||
db 0x14,0x14,0x1b,0x1b,0x1b,0x29,0x29,0x29,0x3a,0x3a
|
||||
db 0x3a,0x4c,0x4c,0x4c,0x5d,0x5d,0x5d,0x6c,0x6c,0x6c
|
||||
db 0x75,0x75,0x75,0x7b,0x7b,0x7b,0x80,0x80,0x80,0xc0
|
||||
db 0xc0,0xc0,0x00,0x00,0x00,0x2f,0x2f,0x2f,0x80,0x80
|
||||
db 0x80,0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00
|
||||
db 0x21,0x21,0x21,0x2e,0x2e,0x2e,0x40,0x40,0x40,0x52
|
||||
db 0x52,0x52,0x62,0x62,0x62,0x6f,0x6f,0x6f,0x77,0x77
|
||||
db 0x77,0x7c,0x7c,0x7c,0x80,0x80,0x80,0x00,0x00,0x00
|
||||
db 0x47,0x47,0x47,0x3b,0x3b,0x3b,0x80,0x80,0x80,0xff
|
||||
db 0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x25,0x25
|
||||
db 0x25,0x30,0x30,0x30,0x42,0x42,0x42,0x54,0x54,0x54
|
||||
db 0x64,0x64,0x64,0x70,0x70,0x70,0x78,0x78,0x78,0x7d
|
||||
db 0x7d,0x7d,0x00,0x00,0x00,0x62,0x62,0x62,0x52,0x52
|
||||
db 0x52,0x4a,0x4a,0x4a,0x43,0x43,0x43,0x80,0x80,0x80
|
||||
db 0xff,0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x33
|
||||
db 0x33,0x33,0x42,0x42,0x42,0x54,0x54,0x54,0x64,0x64
|
||||
db 0x64,0x71,0x71,0x71,0x79,0x79,0x79,0x7d,0x7d,0x7d
|
||||
db 0x72,0x72,0x72,0x6b,0x6b,0x6b,0x5f,0x5f,0x5f,0x5a
|
||||
db 0x5a,0x5a,0x54,0x54,0x54,0x80,0x80,0x80,0xff,0xff
|
||||
db 0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x35,0x35,0x35
|
||||
db 0x41,0x41,0x41,0x53,0x53,0x53,0x63,0x63,0x63,0x70
|
||||
db 0x70,0x70,0x78,0x78,0x78,0x7d,0x7d,0x7d,0x77,0x77
|
||||
db 0x77,0x73,0x73,0x73,0x6c,0x6c,0x6c,0x68,0x68,0x68
|
||||
db 0x62,0x62,0x62,0x5a,0x5a,0x5a,0x80,0x80,0x80,0xff
|
||||
db 0xff,0xff,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x41,0x41
|
||||
db 0x41,0x52,0x52,0x52,0x62,0x62,0x62,0x6f,0x6f,0x6f
|
||||
db 0x78,0x78,0x78,0x7d,0x7d,0x7d,0x7b,0x7b,0x7b,0x79
|
||||
db 0x79,0x79,0x74,0x74,0x74,0x72,0x72,0x72,0x6e,0x6e
|
||||
db 0x6e,0x66,0x66,0x66,0x80,0x80,0x80,0xc0,0xc0,0xc0
|
||||
db 0xc0,0xc0,0xc0,0x00,0x00,0x00,0x44,0x44,0x44,0x52
|
||||
db 0x52,0x52,0x62,0x62,0x62,0x6e,0x6e,0x6e,0x77,0x77
|
||||
db 0x77,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x7c,0x7c,0x7c
|
||||
db 0x7a,0x7a,0x7a,0x79,0x79,0x79,0x75,0x75,0x75,0x6f
|
||||
db 0x6f,0x6f,0x65,0x65,0x65,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x48,0x48,0x48,0x4b,0x4b,0x4b,0x56,0x56,0x56
|
||||
db 0x65,0x65,0x65,0x70,0x70,0x70,0x78,0x78,0x78,0x7d
|
||||
db 0x7d,0x7d,0x80,0x80,0x80,0x7f,0x7f,0x7f,0x7e,0x7e
|
||||
db 0x7e,0x7d,0x7d,0x7d,0x7a,0x7a,0x7a,0x76,0x76,0x76
|
||||
db 0x6f,0x6f,0x6f,0x65,0x65,0x65,0x5c,0x5c,0x5c,0x56
|
||||
db 0x56,0x56,0x58,0x58,0x58,0x60,0x60,0x60,0x6b,0x6b
|
||||
db 0x6b,0x73,0x73,0x73,0x7a,0x7a,0x7a,0x7d,0x7d,0x7d
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7f
|
||||
db 0x7f,0x7f,0x7d,0x7d,0x7d,0x7a,0x7a,0x7a,0x76,0x76
|
||||
db 0x76,0x70,0x70,0x70,0x6a,0x6a,0x6a,0x66,0x66,0x66
|
||||
db 0x66,0x66,0x66,0x6c,0x6c,0x6c,0x72,0x72,0x72,0x78
|
||||
db 0x78,0x78,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7b,0x7b,0x7b,0x77
|
||||
db 0x77,0x77,0x73,0x73,0x73,0x71,0x71,0x71,0x71,0x71
|
||||
db 0x71,0x74,0x74,0x74,0x78,0x78,0x78,0x7b,0x7b,0x7b
|
||||
db 0x7d,0x7d,0x7d,0x7f,0x7f,0x7f,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7c,0x7c,0x7c
|
||||
db 0x7a,0x7a,0x7a,0x78,0x78,0x78,0x78,0x78,0x78,0x7a
|
||||
db 0x7a,0x7a,0x7c,0x7c,0x7c,0x7e,0x7e,0x7e,0x7f,0x7f
|
||||
db 0x7f,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80,0x7f,0x7f,0x7f,0x7e,0x7e,0x7e,0x7e,0x7e
|
||||
db 0x7e,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7e,0x7e,0x7e
|
||||
db 0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x80,0x80,0x80,0x80
|
||||
db 0x80,0x80
|
||||
|
||||
mousepointer1:
|
||||
db 0xff,0xff,0xff,0x06,0x06,0x06,0x0a,0x0a
|
||||
db 0x0a,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0x19,0x19,0x19,0x16
|
||||
db 0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2e,0x2e,0x2e
|
||||
db 0x23,0x23,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x3f
|
||||
db 0x3f,0x29,0x29,0x29,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x47
|
||||
db 0x47,0x47,0x2c,0x2c,0x2c,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0x48,0x48,0x48,0x2c,0x2c,0x2c,0x16,0x16,0x16,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x16,0x16,0x16
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0x48,0x48,0x48,0x2c,0x2c,0x2c,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0x47,0x47,0x47,0x29,0x29,0x29
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0x40,0x40,0x40,0x23,0x23
|
||||
db 0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xaa,0xaa,0xaa,0x9f,0x9f,0x9f,0x8c,0x8c,0x8c
|
||||
db 0x70,0x70,0x70,0x4f,0x4f,0x4f,0x30,0x30,0x30,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8f,0x8f,0x8f
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0x9c,0x9c,0x9c,0x87,0x87,0x87,0x6c,0x6c
|
||||
db 0x6c,0x4f,0x4f,0x4f,0x32,0x32,0x32,0x19,0x19,0x19
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0x69,0x69,0x69,0x84,0x84,0x84,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0x92,0x92,0x92,0x79,0x79,0x79,0x59,0x59,0x59,0x3c
|
||||
db 0x3c,0x3c,0x24,0x24,0x24,0x11,0x11,0x11,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x37,0x37,0x37
|
||||
db 0x5d,0x5d,0x5d,0x70,0x70,0x70,0x76,0x76,0x76,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0xff,0x75,0x75,0x75,0x51,0x51,0x51,0x31,0x31,0x31
|
||||
db 0x19,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x16,0x16,0x16,0x2d,0x2d,0x2d,0x49,0x49
|
||||
db 0x49,0x53,0x53,0x53,0x54,0x54,0x54,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x78
|
||||
db 0x78,0x78,0x54,0x54,0x54,0x30,0x30,0x30,0x16,0x16
|
||||
db 0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x0f,0x0f,0x0f,0x1f,0x1f,0x1f,0x30,0x30,0x30,0x33
|
||||
db 0x33,0x33,0x33,0x33,0x33,0x3b,0x3b,0x3b,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
db 0x62,0x62,0x62,0x3b,0x3b,0x3b,0x1c,0x1c,0x1c,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08
|
||||
db 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x24,0x24,0x24,0xff,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6e,0x6e
|
||||
db 0x6e,0x48,0x48,0x48,0x25,0x25,0x25,0x0e,0x0e,0x0e
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x00
|
||||
db 0x00,0x00,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x29,0x29,0x29,0xff,0xff,0xff
|
||||
db 0xff,0xff,0xff,0x7c,0x7c,0x7c,0x71,0x71,0x71,0x50
|
||||
db 0x50,0x50,0x2b,0x2b,0x2b,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x02,0x02,0x02,0x04,0x04,0x04,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x36,0x36,0x36,0x56,0x56
|
||||
db 0x56,0x69,0x69,0x69,0x64,0x64,0x64,0x4a,0x4a,0x4a
|
||||
db 0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x05,0x05,0x05
|
||||
db 0x00,0x00,0x00,0x21,0x21,0x21,0x39,0x39,0x39,0x49
|
||||
db 0x49,0x49,0x48,0x48,0x48,0x35,0x35,0x35,0x1d,0x1d
|
||||
db 0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x27,0x27,0x27
|
||||
db 0x27,0x27,0x27,0x1d,0x1d,0x1d,0x0f,0x0f,0x0f,0x06
|
||||
db 0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
db 0x00,0x00,0x00,0x00
|
||||
|
||||
endg
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2010. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$Revision: -1 $
|
||||
|
||||
include 'mousepointer.inc'
|
||||
|
||||
;==============================================================================
|
||||
;///// public functions ///////////////////////////////////////////////////////
|
||||
;==============================================================================
|
||||
|
||||
mouse.LEFT_BUTTON_FLAG = 0001b
|
||||
mouse.RIGHT_BUTTON_FLAG = 0010b
|
||||
mouse.MIDDLE_BUTTON_FLAG = 0100b
|
||||
|
||||
mouse.BUTTONS_MASK = \
|
||||
mouse.LEFT_BUTTON_FLAG or \
|
||||
mouse.RIGHT_BUTTON_FLAG or \
|
||||
mouse.MIDDLE_BUTTON_FLAG
|
||||
|
||||
mouse.WINDOW_RESIZE_N_FLAG = 000001b
|
||||
mouse.WINDOW_RESIZE_W_FLAG = 000010b
|
||||
mouse.WINDOW_RESIZE_S_FLAG = 000100b
|
||||
mouse.WINDOW_RESIZE_E_FLAG = 001000b
|
||||
mouse.WINDOW_MOVE_FLAG = 010000b
|
||||
|
||||
mouse.WINDOW_RESIZE_SW_FLAG = \
|
||||
mouse.WINDOW_RESIZE_S_FLAG or \
|
||||
mouse.WINDOW_RESIZE_W_FLAG
|
||||
mouse.WINDOW_RESIZE_SE_FLAG = \
|
||||
mouse.WINDOW_RESIZE_S_FLAG or \
|
||||
mouse.WINDOW_RESIZE_E_FLAG
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse_check_events: ;//////////////////////////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? Check if mouse buttons state or cursor position has changed and call
|
||||
;? appropriate handlers
|
||||
;------------------------------------------------------------------------------
|
||||
push eax ebx
|
||||
|
||||
mov al, [BTN_DOWN]
|
||||
mov bl, [mouse.state.buttons]
|
||||
and al, mouse.BUTTONS_MASK
|
||||
mov cl, al
|
||||
xchg cl, [mouse.state.buttons]
|
||||
xor bl, al
|
||||
push eax ebx
|
||||
|
||||
; did any mouse button changed its state?
|
||||
or bl, bl
|
||||
jz .check_position
|
||||
|
||||
; yes it did, is that the first button of all pressed down?
|
||||
or cl, cl
|
||||
jnz .check_buttons_released
|
||||
|
||||
; yes it is, activate window user is pointing at, if needed
|
||||
call mouse._.activate_sys_window_under_cursor
|
||||
|
||||
; NOTE: this code wouldn't be necessary if we knew window did
|
||||
; already redraw itself after call above
|
||||
or eax, eax
|
||||
jz @f
|
||||
|
||||
and [mouse.state.buttons], 0
|
||||
jmp .exit
|
||||
|
||||
; is there any system button under cursor?
|
||||
@@: call mouse._.find_sys_button_under_cursor
|
||||
or eax, eax
|
||||
jz .check_buttons_released
|
||||
|
||||
; yes there is, activate it and exit
|
||||
mov [mouse.active_sys_button.pbid], eax
|
||||
mov [mouse.active_sys_button.coord], ebx
|
||||
mov cl, [mouse.state.buttons]
|
||||
mov [mouse.active_sys_button.buttons], cl
|
||||
call sys_button_activate_handler
|
||||
jmp .exit
|
||||
|
||||
.check_buttons_released:
|
||||
cmp [mouse.state.buttons], 0
|
||||
jnz .buttons_changed
|
||||
|
||||
; did we press some button earlier?
|
||||
cmp [mouse.active_sys_button.pbid], 0
|
||||
je .buttons_changed
|
||||
|
||||
; yes we did, deactivate it
|
||||
xor eax, eax
|
||||
xchg eax, [mouse.active_sys_button.pbid]
|
||||
mov ebx, [mouse.active_sys_button.coord]
|
||||
mov cl, [mouse.active_sys_button.buttons]
|
||||
push eax ebx
|
||||
call sys_button_deactivate_handler
|
||||
pop edx ecx
|
||||
|
||||
; is the button under cursor the one we deactivated?
|
||||
call mouse._.find_sys_button_under_cursor
|
||||
cmp eax, ecx
|
||||
jne .exit
|
||||
cmp ebx, edx
|
||||
jne .exit
|
||||
|
||||
; yes it is, perform associated action
|
||||
mov cl, [mouse.active_sys_button.buttons]
|
||||
call sys_button_perform_handler
|
||||
jmp .exit
|
||||
|
||||
.buttons_changed:
|
||||
test byte[esp], mouse.LEFT_BUTTON_FLAG
|
||||
jz @f
|
||||
mov eax, [esp + 4]
|
||||
call .call_left_button_handler
|
||||
|
||||
@@: test byte[esp], mouse.RIGHT_BUTTON_FLAG
|
||||
jz @f
|
||||
mov eax, [esp + 4]
|
||||
call .call_right_button_handler
|
||||
|
||||
@@: test byte[esp], mouse.MIDDLE_BUTTON_FLAG
|
||||
jz .check_position
|
||||
mov eax, [esp + 4]
|
||||
call .call_middle_button_handler
|
||||
|
||||
.check_position:
|
||||
movzx eax, word[MOUSE_X]
|
||||
movzx ebx, word[MOUSE_Y]
|
||||
cmp eax, [mouse.state.pos.x]
|
||||
jne .position_changed
|
||||
cmp ebx, [mouse.state.pos.y]
|
||||
je .exit
|
||||
|
||||
.position_changed:
|
||||
xchg eax, [mouse.state.pos.x]
|
||||
xchg ebx, [mouse.state.pos.y]
|
||||
|
||||
call mouse._.move_handler
|
||||
|
||||
.exit:
|
||||
add esp, 8
|
||||
pop ebx eax
|
||||
ret
|
||||
|
||||
.call_left_button_handler:
|
||||
test eax, mouse.LEFT_BUTTON_FLAG
|
||||
jnz mouse._.left_button_press_handler
|
||||
jmp mouse._.left_button_release_handler
|
||||
|
||||
.call_right_button_handler:
|
||||
test eax, mouse.RIGHT_BUTTON_FLAG
|
||||
jnz mouse._.right_button_press_handler
|
||||
jmp mouse._.right_button_release_handler
|
||||
|
||||
.call_middle_button_handler:
|
||||
test eax, mouse.MIDDLE_BUTTON_FLAG
|
||||
jnz mouse._.middle_button_press_handler
|
||||
jmp mouse._.middle_button_release_handler
|
||||
|
||||
;==============================================================================
|
||||
;///// private functions //////////////////////////////////////////////////////
|
||||
;==============================================================================
|
||||
|
||||
uglobal
|
||||
mouse.state:
|
||||
.pos POINT
|
||||
.buttons db ?
|
||||
|
||||
; NOTE: since there's no unique and lifetime-constant button identifiers,
|
||||
; we're using two dwords to identify each of them:
|
||||
; * pbid - process slot (high 8 bits) and button id (low 24 bits) pack
|
||||
; * coord - left (high 16 bits) and top (low 16 bits) coordinates pack
|
||||
align 4
|
||||
mouse.active_sys_button:
|
||||
.pbid dd ?
|
||||
.coord dd ?
|
||||
.buttons db ?
|
||||
|
||||
align 4
|
||||
mouse.active_sys_window:
|
||||
.pslot dd ?
|
||||
.old_box BOX
|
||||
.new_box BOX
|
||||
.delta POINT
|
||||
.last_ticks dd ?
|
||||
.action db ?
|
||||
endg
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse._.left_button_press_handler: ;///////////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? Called when left mouse button has been pressed down
|
||||
;------------------------------------------------------------------------------
|
||||
test [mouse.state.buttons], not mouse.LEFT_BUTTON_FLAG
|
||||
jnz .exit
|
||||
|
||||
call mouse._.find_sys_window_under_cursor
|
||||
call mouse._.check_sys_window_actions
|
||||
mov [mouse.active_sys_window.action], al
|
||||
or eax, eax
|
||||
jz .exit
|
||||
|
||||
xchg eax, edx
|
||||
test dl, mouse.WINDOW_MOVE_FLAG
|
||||
jz @f
|
||||
|
||||
mov eax, [timer_ticks]
|
||||
mov ebx, eax
|
||||
xchg ebx, [mouse.active_sys_window.last_ticks]
|
||||
sub eax, ebx
|
||||
cmp eax, 50
|
||||
jg @f
|
||||
|
||||
mov [mouse.active_sys_window.last_ticks], 0
|
||||
call sys_window_maximize_handler
|
||||
jmp .exit
|
||||
|
||||
@@: test [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED
|
||||
jnz .exit
|
||||
mov [mouse.active_sys_window.pslot], esi
|
||||
lea eax, [edi + WDATA.box]
|
||||
mov ebx, mouse.active_sys_window.old_box
|
||||
mov ecx, BOX.sizeof
|
||||
call memmove
|
||||
mov ebx, mouse.active_sys_window.new_box
|
||||
call memmove
|
||||
test edx, mouse.WINDOW_MOVE_FLAG
|
||||
jz @f
|
||||
|
||||
call .calculate_n_delta
|
||||
call .calculate_w_delta
|
||||
jmp .call_window_handler
|
||||
|
||||
@@: test dl, mouse.WINDOW_RESIZE_W_FLAG
|
||||
jz @f
|
||||
call .calculate_w_delta
|
||||
|
||||
@@: test dl, mouse.WINDOW_RESIZE_S_FLAG
|
||||
jz @f
|
||||
call .calculate_s_delta
|
||||
|
||||
@@: test dl, mouse.WINDOW_RESIZE_E_FLAG
|
||||
jz .call_window_handler
|
||||
call .calculate_e_delta
|
||||
|
||||
.call_window_handler:
|
||||
mov eax, mouse.active_sys_window.old_box
|
||||
call sys_window_start_moving_handler
|
||||
|
||||
.exit:
|
||||
ret
|
||||
|
||||
.calculate_n_delta:
|
||||
mov eax, [mouse.state.pos.y]
|
||||
sub eax, [mouse.active_sys_window.old_box.top]
|
||||
mov [mouse.active_sys_window.delta.y], eax
|
||||
ret
|
||||
|
||||
.calculate_w_delta:
|
||||
mov eax, [mouse.state.pos.x]
|
||||
sub eax, [mouse.active_sys_window.old_box.left]
|
||||
mov [mouse.active_sys_window.delta.x], eax
|
||||
ret
|
||||
|
||||
.calculate_s_delta:
|
||||
mov eax, [mouse.active_sys_window.old_box.top]
|
||||
add eax, [mouse.active_sys_window.old_box.height]
|
||||
sub eax, [mouse.state.pos.y]
|
||||
mov [mouse.active_sys_window.delta.y], eax
|
||||
ret
|
||||
|
||||
.calculate_e_delta:
|
||||
mov eax, [mouse.active_sys_window.old_box.left]
|
||||
add eax, [mouse.active_sys_window.old_box.width]
|
||||
sub eax, [mouse.state.pos.x]
|
||||
mov [mouse.active_sys_window.delta.x], eax
|
||||
ret
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse._.left_button_release_handler: ;/////////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? Called when left mouse button has been released
|
||||
;------------------------------------------------------------------------------
|
||||
xor esi, esi
|
||||
xchg esi, [mouse.active_sys_window.pslot]
|
||||
or esi, esi
|
||||
jz .exit
|
||||
|
||||
mov eax, esi
|
||||
shl eax, 5
|
||||
add eax, window_data + WDATA.box
|
||||
mov ebx, mouse.active_sys_window.old_box
|
||||
mov ecx, BOX.sizeof
|
||||
call memmove
|
||||
|
||||
mov eax, mouse.active_sys_window.old_box
|
||||
mov ebx, mouse.active_sys_window.new_box
|
||||
call sys_window_end_moving_handler
|
||||
|
||||
.exit:
|
||||
ret
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse._.right_button_press_handler: ;//////////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? Called when right mouse button has been pressed down
|
||||
;------------------------------------------------------------------------------
|
||||
test [mouse.state.buttons], not mouse.RIGHT_BUTTON_FLAG
|
||||
jnz .exit
|
||||
|
||||
call mouse._.find_sys_window_under_cursor
|
||||
call mouse._.check_sys_window_actions
|
||||
test al, mouse.WINDOW_MOVE_FLAG
|
||||
jz .exit
|
||||
|
||||
call sys_window_rollup_handler
|
||||
|
||||
.exit:
|
||||
ret
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse._.right_button_release_handler: ;////////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? Called when right mouse button has been released
|
||||
;------------------------------------------------------------------------------
|
||||
ret
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse._.middle_button_press_handler: ;/////////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? Called when middle mouse button has been pressed down
|
||||
;------------------------------------------------------------------------------
|
||||
ret
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse._.middle_button_release_handler: ;///////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? Called when middle mouse button has been released
|
||||
;------------------------------------------------------------------------------
|
||||
ret
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse._.move_handler: ;////////////////////////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? Called when cursor has been moved
|
||||
;------------------------------------------------------------------------------
|
||||
;> eax = old x coord
|
||||
;> ebx = old y coord
|
||||
;------------------------------------------------------------------------------
|
||||
cmp [mouse.active_sys_button.pbid], 0
|
||||
jnz .exit
|
||||
|
||||
mov esi, [mouse.active_sys_window.pslot]
|
||||
or esi, esi
|
||||
jz .exit
|
||||
|
||||
mov eax, mouse.active_sys_window.new_box
|
||||
mov ebx, mouse.active_sys_window.old_box
|
||||
mov ecx, BOX.sizeof
|
||||
call memmove
|
||||
|
||||
mov dl, [mouse.active_sys_window.action]
|
||||
test dl, mouse.WINDOW_MOVE_FLAG
|
||||
jz .check_resize_w
|
||||
|
||||
mov eax, [mouse.state.pos.x]
|
||||
sub eax, [mouse.active_sys_window.delta.x]
|
||||
mov [mouse.active_sys_window.new_box.left], eax
|
||||
mov eax, [mouse.state.pos.y]
|
||||
sub eax, [mouse.active_sys_window.delta.y]
|
||||
mov [mouse.active_sys_window.new_box.top], eax
|
||||
|
||||
mov eax, [mouse.active_sys_window.new_box.left]
|
||||
or eax, eax
|
||||
jge @f
|
||||
xor eax, eax
|
||||
mov [mouse.active_sys_window.new_box.left], eax
|
||||
@@: add eax, [mouse.active_sys_window.new_box.width]
|
||||
cmp eax, [Screen_Max_X]
|
||||
jl @f
|
||||
sub eax, [Screen_Max_X]
|
||||
sub [mouse.active_sys_window.new_box.left], eax
|
||||
@@: mov eax, [mouse.active_sys_window.new_box.top]
|
||||
or eax, eax
|
||||
jge @f
|
||||
xor eax, eax
|
||||
mov [mouse.active_sys_window.new_box.top], eax
|
||||
@@: add eax, [mouse.active_sys_window.new_box.height]
|
||||
cmp eax, [Screen_Max_Y]
|
||||
jle .call_window_handler
|
||||
sub eax, [Screen_Max_Y]
|
||||
sub [mouse.active_sys_window.new_box.top], eax
|
||||
jmp .call_window_handler
|
||||
|
||||
.check_resize_w:
|
||||
test dl, mouse.WINDOW_RESIZE_W_FLAG
|
||||
jz .check_resize_s
|
||||
|
||||
mov eax, [mouse.state.pos.x]
|
||||
sub eax, [mouse.active_sys_window.delta.x]
|
||||
mov [mouse.active_sys_window.new_box.left], eax
|
||||
sub eax, [mouse.active_sys_window.old_box.left]
|
||||
sub [mouse.active_sys_window.new_box.width], eax
|
||||
|
||||
mov eax, [mouse.active_sys_window.new_box.width]
|
||||
sub eax, 127
|
||||
jge @f
|
||||
add [mouse.active_sys_window.new_box.left], eax
|
||||
mov [mouse.active_sys_window.new_box.width], 127
|
||||
@@: mov eax, [mouse.active_sys_window.new_box.left]
|
||||
or eax, eax
|
||||
jge .check_resize_s
|
||||
add [mouse.active_sys_window.new_box.width], eax
|
||||
xor eax, eax
|
||||
mov [mouse.active_sys_window.new_box.left], eax
|
||||
|
||||
.check_resize_s:
|
||||
test dl, mouse.WINDOW_RESIZE_S_FLAG
|
||||
jz .check_resize_e
|
||||
|
||||
mov eax, [mouse.state.pos.y]
|
||||
add eax, [mouse.active_sys_window.delta.y]
|
||||
sub eax, [mouse.active_sys_window.old_box.top]
|
||||
mov [mouse.active_sys_window.new_box.height], eax
|
||||
|
||||
push eax
|
||||
mov edi, esi
|
||||
shl edi, 5
|
||||
add edi, window_data
|
||||
call window._.get_rolledup_height
|
||||
mov ecx, eax
|
||||
pop eax
|
||||
mov eax, [mouse.active_sys_window.new_box.height]
|
||||
cmp eax, ecx
|
||||
jge @f
|
||||
mov eax, ecx
|
||||
mov [mouse.active_sys_window.new_box.height], eax
|
||||
@@: add eax, [mouse.active_sys_window.new_box.top]
|
||||
cmp eax, [Screen_Max_Y]
|
||||
jle .check_resize_e
|
||||
sub eax, [Screen_Max_Y]
|
||||
neg eax
|
||||
add [mouse.active_sys_window.new_box.height], eax
|
||||
mov ecx, [Screen_Max_Y]
|
||||
cmp ecx, eax
|
||||
jge .check_resize_e
|
||||
mov [mouse.active_sys_window.new_box.height], ecx
|
||||
|
||||
.check_resize_e:
|
||||
test dl, mouse.WINDOW_RESIZE_E_FLAG
|
||||
jz .call_window_handler
|
||||
|
||||
mov eax, [mouse.state.pos.x]
|
||||
add eax, [mouse.active_sys_window.delta.x]
|
||||
sub eax, [mouse.active_sys_window.old_box.left]
|
||||
mov [mouse.active_sys_window.new_box.width], eax
|
||||
|
||||
mov eax, [mouse.active_sys_window.new_box.width]
|
||||
cmp eax, 127
|
||||
jge @f
|
||||
mov eax, 127
|
||||
mov [mouse.active_sys_window.new_box.width], eax
|
||||
@@: add eax, [mouse.active_sys_window.new_box.left]
|
||||
cmp eax, [Screen_Max_X]
|
||||
jle .call_window_handler
|
||||
sub eax, [Screen_Max_X]
|
||||
neg eax
|
||||
add [mouse.active_sys_window.new_box.width], eax
|
||||
mov ecx, [Screen_Max_X]
|
||||
cmp ecx, eax
|
||||
jge .call_window_handler
|
||||
mov [mouse.active_sys_window.new_box.width], ecx
|
||||
|
||||
.call_window_handler:
|
||||
mov eax, mouse.active_sys_window.old_box
|
||||
mov ebx, mouse.active_sys_window.new_box
|
||||
|
||||
push esi
|
||||
mov esi, mouse.active_sys_window.old_box
|
||||
mov edi, mouse.active_sys_window.new_box
|
||||
mov ecx, BOX.sizeof / 4
|
||||
repe
|
||||
cmpsd
|
||||
pop esi
|
||||
je .exit
|
||||
|
||||
mov [mouse.active_sys_window.last_ticks], 0
|
||||
call sys_window_moving_handler
|
||||
|
||||
.exit:
|
||||
ret
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse._.find_sys_window_under_cursor: ;////////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? Find system window object which is currently visible on screen and has
|
||||
;? mouse cursor within its bounds
|
||||
;------------------------------------------------------------------------------
|
||||
;< esi = process slot
|
||||
;< edi = pointer to WDATA struct
|
||||
;------------------------------------------------------------------------------
|
||||
mov esi, [Screen_Max_X]
|
||||
inc esi
|
||||
imul esi, [mouse.state.pos.y]
|
||||
add esi, [_WinMapAddress]
|
||||
add esi, [mouse.state.pos.x]
|
||||
movzx esi, byte[esi]
|
||||
mov edi, esi
|
||||
shl edi, 5
|
||||
add edi, window_data
|
||||
ret
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse._.activate_sys_window_under_cursor: ;////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? <description>
|
||||
;------------------------------------------------------------------------------
|
||||
; activate and redraw window under cursor (if necessary)
|
||||
call mouse._.find_sys_window_under_cursor
|
||||
movzx esi, word[WIN_STACK + esi * 2]
|
||||
lea esi, [WIN_POS + esi * 2]
|
||||
jmp waredraw
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse._.find_sys_button_under_cursor: ;////////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? Find system button object which is currently visible on screen and has
|
||||
;? mouse cursor within its bounds
|
||||
;------------------------------------------------------------------------------
|
||||
;< eax = pack[8(process slot), 24(button id)] or 0
|
||||
;< ebx = pack[16(button x coord), 16(button y coord)]
|
||||
;------------------------------------------------------------------------------
|
||||
push ecx edx esi edi
|
||||
|
||||
call mouse._.find_sys_window_under_cursor
|
||||
mov edx, esi
|
||||
|
||||
; check if any process button contains cursor
|
||||
mov eax, [BTN_ADDR]
|
||||
mov ecx, [eax]
|
||||
imul esi, ecx, SYS_BUTTON.sizeof
|
||||
add esi, eax
|
||||
inc ecx
|
||||
add esi, SYS_BUTTON.sizeof
|
||||
|
||||
.next_button:
|
||||
dec ecx
|
||||
jz .not_found
|
||||
|
||||
add esi, -SYS_BUTTON.sizeof
|
||||
|
||||
; does it belong to our process?
|
||||
cmp dx, [esi + SYS_BUTTON.pslot]
|
||||
jne .next_button
|
||||
|
||||
; does it contain cursor coordinates?
|
||||
mov eax, [mouse.state.pos.x]
|
||||
sub eax, [edi + WDATA.box.left]
|
||||
sub ax, [esi + SYS_BUTTON.left]
|
||||
jl .next_button
|
||||
sub ax, [esi + SYS_BUTTON.width]
|
||||
jge .next_button
|
||||
mov eax, [mouse.state.pos.y]
|
||||
sub eax, [edi + WDATA.box.top]
|
||||
sub ax, [esi + SYS_BUTTON.top]
|
||||
jl .next_button
|
||||
sub ax, [esi + SYS_BUTTON.height]
|
||||
jge .next_button
|
||||
|
||||
; okay, return it
|
||||
shl edx, 24
|
||||
mov eax, dword[esi + SYS_BUTTON.id_hi - 2]
|
||||
mov ax, [esi + SYS_BUTTON.id_lo]
|
||||
and eax, 0x0ffffff
|
||||
or eax, edx
|
||||
mov ebx, dword[esi + SYS_BUTTON.left - 2]
|
||||
mov bx, [esi + SYS_BUTTON.top]
|
||||
jmp .exit
|
||||
|
||||
.not_found:
|
||||
xor eax, eax
|
||||
xor ebx, ebx
|
||||
|
||||
.exit:
|
||||
pop edi esi edx ecx
|
||||
ret
|
||||
|
||||
align 4
|
||||
;------------------------------------------------------------------------------
|
||||
mouse._.check_sys_window_actions: ;////////////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? <description>
|
||||
;------------------------------------------------------------------------------
|
||||
;< eax = action flags or 0
|
||||
;------------------------------------------------------------------------------
|
||||
; is window movable?
|
||||
test byte[edi + WDATA.cl_titlebar + 3], 0x01
|
||||
jnz .no_action
|
||||
|
||||
mov eax, [mouse.state.pos.x]
|
||||
mov ebx, [mouse.state.pos.y]
|
||||
sub eax, [edi + WDATA.box.left]
|
||||
sub ebx, [edi + WDATA.box.top]
|
||||
|
||||
; is there a window titlebar under cursor?
|
||||
push eax
|
||||
call window._.get_titlebar_height
|
||||
cmp ebx, eax
|
||||
pop eax
|
||||
jl .move_action
|
||||
|
||||
; no there isn't, can it be resized then?
|
||||
mov dl, [edi + WDATA.fl_wstyle]
|
||||
and dl, 0x0f
|
||||
; NOTE: dangerous optimization, revise if window types changed;
|
||||
; this currently implies only types 2 and 3 could be resized
|
||||
test dl, 2
|
||||
jz .no_action
|
||||
|
||||
mov ecx, [edi + WDATA.box.width]
|
||||
add ecx, -window.BORDER_SIZE
|
||||
mov edx, [edi + WDATA.box.height]
|
||||
add edx, -window.BORDER_SIZE
|
||||
|
||||
; is it rolled up?
|
||||
test [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP
|
||||
jnz .resize_w_or_e_action
|
||||
|
||||
cmp eax, window.BORDER_SIZE
|
||||
jl .resize_w_action
|
||||
cmp eax, ecx
|
||||
jg .resize_e_action
|
||||
cmp ebx, edx
|
||||
jle .no_action
|
||||
|
||||
.resize_s_action:
|
||||
cmp eax, window.BORDER_SIZE + 10
|
||||
jl .resize_sw_action
|
||||
add ecx, -10
|
||||
cmp eax, ecx
|
||||
jge .resize_se_action
|
||||
mov eax, mouse.WINDOW_RESIZE_S_FLAG
|
||||
jmp .exit
|
||||
|
||||
.resize_w_or_e_action:
|
||||
cmp eax, window.BORDER_SIZE + 10
|
||||
jl .resize_w_action.direct
|
||||
add ecx, -10
|
||||
cmp eax, ecx
|
||||
jg .resize_e_action.direct
|
||||
jmp .no_action
|
||||
|
||||
.resize_w_action:
|
||||
add edx, -10
|
||||
cmp ebx, edx
|
||||
jge .resize_sw_action
|
||||
.resize_w_action.direct:
|
||||
mov eax, mouse.WINDOW_RESIZE_W_FLAG
|
||||
jmp .exit
|
||||
|
||||
.resize_e_action:
|
||||
add edx, -10
|
||||
cmp ebx, edx
|
||||
jge .resize_se_action
|
||||
.resize_e_action.direct:
|
||||
mov eax, mouse.WINDOW_RESIZE_E_FLAG
|
||||
jmp .exit
|
||||
|
||||
.resize_sw_action:
|
||||
mov eax, mouse.WINDOW_RESIZE_SW_FLAG
|
||||
jmp .exit
|
||||
|
||||
.resize_se_action:
|
||||
mov eax, mouse.WINDOW_RESIZE_SE_FLAG
|
||||
jmp .exit
|
||||
|
||||
.move_action:
|
||||
mov eax, mouse.WINDOW_MOVE_FLAG
|
||||
jmp .exit
|
||||
|
||||
.no_action:
|
||||
xor eax, eax
|
||||
|
||||
.exit:
|
||||
ret
|
||||
|
Reference in New Issue
Block a user