File: KeyEvents.c

package info (click to toggle)
scilab 4.0-12
  • links: PTS
  • area: non-free
  • in suites: etch, etch-m68k
  • size: 100,640 kB
  • ctags: 57,333
  • sloc: ansic: 377,889; fortran: 242,862; xml: 179,819; tcl: 42,062; sh: 10,593; ml: 9,441; makefile: 4,377; cpp: 1,354; java: 621; csh: 260; yacc: 247; perl: 130; lex: 126; asm: 72; lisp: 30
file content (195 lines) | stat: -rw-r--r-- 6,272 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/*-----------------------------------------------------------------------------------*/
/* INRIA 2005 */
/* Allan CORNET */
/*-----------------------------------------------------------------------------------*/
#include "KeyEvents.h"
/*-----------------------------------------------------------------------------------*/
extern int check_pointer_win __PARAMS ((int *x1,int *y1,int *win));
/*-----------------------------------------------------------------------------------*/
#define CTRL_KEY 1000
#define SHIFT_KEY 2000
#ifndef VK_SLEEP
  #define VK_SLEEP 0x5F
#endif

/* Code  la linux */
#define SCI_VK_CANCEL	65288
#define SCI_VK_PAUSE	65299
#define SCI_VK_SLEEP	65300 
#define SCI_VK_INSERT	65379
#define SCI_VK_DELETE	65535
#define SCI_VK_END	65367
#define SCI_VK_HOME	65360
#define SCI_VK_PRIOR	65365
#define SCI_VK_NEXT	65366
#define SCI_VK_BACK	65289
#define SCI_VK_NUMLOCK 65407 
#define SCI_VK_SCROLL 65300 
#define SCI_VK_SNAPSHOT 0
#define SCI_VK_TAB 65289
#define SCI_VK_ESCAPE 65307
#define SCI_VK_CLEAR 65408
#define SCI_VK_LEFT 65361
#define SCI_VK_F1 65470

/*-----------------------------------------------------------------------------------*/
BOOL IsASpecialKey(UINT vk);
UINT GetScilabSpecialKeyCode(UINT vk);
BOOL is_dead_key (int vk); 
/*-----------------------------------------------------------------------------------*/
/* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/UserInput/VirtualKeyCodes.asp */
/*-----------------------------------------------------------------------------------*/
void ON_EVENT_GRAPH_WM_KEYUP(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
{
	if ( is_dead_key (vk) )
	{
		// Nothing to do
	}
	else
	{
		if (IsASpecialKey(vk))
		{
			struct BCG *ScilabGC = (struct BCG *) GetWindowLong (hwnd, 0);
			int x,y,iwin;
			check_pointer_win(&x,&y,&iwin);
			PushClickQueue (ScilabGC->CurWindow, x,y,-(int)GetScilabSpecialKeyCode(vk),0,1);
		}
		else
		{
			WORD Char=0;
			BYTE KeyState[256]; // Etat des 256 touches du clavier 
			memset ( KeyState, 0, sizeof(KeyState) ); 
			if ( GetKeyboardState ( KeyState ) ) 
			{
				int RetToAscii=0;
				int x,y,iwin;
				struct BCG *ScilabGC = (struct BCG *) GetWindowLong (hwnd, 0);
				int CodeKey=0;

				RetToAscii=ToAscii ( (UINT) vk,MapVirtualKey(vk, 0), KeyState, &Char, 0 );
				if (RetToAscii)
				{
					if (GetKeyState (VK_CONTROL) < 0)
					{
						if ((Char>=1) && (Char<=29))
						{
							CodeKey=('a'-1+Char)+CTRL_KEY;
						}
					}
					else CodeKey=Char;

					check_pointer_win(&x,&y,&iwin);
					PushClickQueue (ScilabGC->CurWindow, x,y,-(int)CodeKey,0,1);
				}
			}
		}
	}
}
/*-----------------------------------------------------------------------------------*/
void ON_EVENT_GRAPH_WM_KEYDOWN(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
{
	if ( is_dead_key (vk) )
	{
		// Nothing to do
	}
	else
	{
		if (IsASpecialKey(vk))
		{
			struct BCG *ScilabGC = (struct BCG *) GetWindowLong (hwnd, 0);
			int x,y,iwin;
			check_pointer_win(&x,&y,&iwin);
			PushClickQueue (ScilabGC->CurWindow, x,y,(int)GetScilabSpecialKeyCode(vk),0,0);
		}
		else
		{
			WORD Char=0;
			BYTE KeyState[256]; // Etat des 256 touches du clavier 
			memset ( KeyState, 0, sizeof(KeyState) ); 
			if ( GetKeyboardState ( KeyState ) ) 
			{
				int RetToAscii=0;
				int x,y,iwin;
				struct BCG *ScilabGC = (struct BCG *) GetWindowLong (hwnd, 0);
				int CodeKey=0;

				RetToAscii=ToAscii ( (UINT) vk,MapVirtualKey(vk, 0), KeyState, &Char, 0 );
				if (RetToAscii)
				{
					if (GetKeyState (VK_CONTROL) < 0)
					{
						if ((Char>=1) && (Char<=29))
						{
							CodeKey=('a'-1+Char)+CTRL_KEY;
						}
					}
					else CodeKey=Char;

					check_pointer_win(&x,&y,&iwin);
					PushClickQueue (ScilabGC->CurWindow, x,y,(int)CodeKey,0,0);
				}
			}
		}
	}
}
/*-----------------------------------------------------------------------------------*/
BOOL IsASpecialKey(UINT vk)
{
	BOOL bOK=FALSE;

	if (vk == VK_CANCEL) return TRUE;
	if (vk == VK_PAUSE) return TRUE;
	if (vk == VK_SLEEP) return TRUE;
	if (vk == VK_INSERT) return TRUE;
	if (vk == VK_DELETE) return TRUE;
	if (vk == VK_END) return TRUE;
	if (vk == VK_HOME) return TRUE;
	if (vk == VK_PRIOR) return TRUE;
	if (vk == VK_NEXT) return TRUE;
	if (vk == VK_BACK) return TRUE;
	if (vk == VK_NUMLOCK) return TRUE;
	if (vk == VK_SCROLL) return TRUE;
	if (vk == VK_TAB) return TRUE;
	if (vk == VK_ESCAPE ) return TRUE;
	if (vk == VK_SNAPSHOT ) return TRUE;
	if (vk == VK_CLEAR ) return TRUE;
	if ( (vk>=VK_LEFT) && (vk<=VK_DOWN) ) return TRUE;
	if ( (vk>=VK_F1) && (vk<=VK_F24) ) return TRUE;

	return FALSE;
}
/*-----------------------------------------------------------------------------------*/
UINT GetScilabSpecialKeyCode(UINT vk)
{
	UINT ScilabSpecialKeyCode=0;

	if (vk == VK_CANCEL)  ScilabSpecialKeyCode=SCI_VK_CANCEL;
	if (vk == VK_PAUSE)  ScilabSpecialKeyCode=SCI_VK_PAUSE;
	if (vk == VK_SLEEP)  ScilabSpecialKeyCode=SCI_VK_SLEEP; 
	if (vk == VK_INSERT) ScilabSpecialKeyCode=SCI_VK_INSERT;
	if (vk == VK_DELETE) ScilabSpecialKeyCode=SCI_VK_DELETE;
	if (vk == VK_END)  ScilabSpecialKeyCode=SCI_VK_END;
	if (vk == VK_HOME)  ScilabSpecialKeyCode=SCI_VK_HOME;
	if (vk == VK_PRIOR)  ScilabSpecialKeyCode=SCI_VK_PRIOR;
	if (vk == VK_NEXT)  ScilabSpecialKeyCode=SCI_VK_NEXT;
	if (vk == VK_BACK)  ScilabSpecialKeyCode=SCI_VK_BACK;
	if (vk == VK_NUMLOCK)  ScilabSpecialKeyCode=SCI_VK_NUMLOCK; 
	if (vk == VK_SCROLL)  ScilabSpecialKeyCode=SCI_VK_SCROLL; 
	if (vk == VK_SNAPSHOT ) ScilabSpecialKeyCode=SCI_VK_SNAPSHOT;
	if (vk == VK_TAB)   ScilabSpecialKeyCode=SCI_VK_TAB;
	if (vk ==  VK_ESCAPE ) ScilabSpecialKeyCode=SCI_VK_ESCAPE;
  if (vk == VK_CLEAR ) ScilabSpecialKeyCode=SCI_VK_CLEAR;
	if ( (vk>=VK_LEFT) && (vk<=VK_DOWN) )  ScilabSpecialKeyCode= (SCI_VK_LEFT-VK_LEFT)+vk;
	if ( (vk>=VK_F1) && (vk<=VK_F24) )  ScilabSpecialKeyCode= (SCI_VK_F1-VK_F1)+vk;

	return ScilabSpecialKeyCode;
}
/*-----------------------------------------------------------------------------------*/
BOOL is_dead_key (int vk) 
{ 
	unsigned int code = MapVirtualKey ( vk, 2 ); 

	// Windows 95 retourne 0x8000, NT retourne 0x80000000 
	return (code & 0x80008000) ? TRUE : FALSE; 
} 
/*-----------------------------------------------------------------------------------*/