ReactOS 0.4.15-dev-7788-g1ad9096
tmouse.cpp
Go to the documentation of this file.
1
2//Telnet Win32 : an ANSI telnet client.
3//Copyright (C) 1998 Paul Brannan
4//Copyright (C) 1998 I.Ioannou
5//Copyright (C) 1997 Brad Johnson
6//
7//This program is free software; you can redistribute it and/or
8//modify it under the terms of the GNU General Public License
9//as published by the Free Software Foundation; either version 2
10//of the License, or (at your option) any later version.
11//
12//This program is distributed in the hope that it will be useful,
13//but WITHOUT ANY WARRANTY; without even the implied warranty of
14//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15//GNU General Public License for more details.
16//
17//You should have received a copy of the GNU General Public License
18//along with this program; if not, write to the Free Software
19//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20//
21//I.Ioannou
22//roryt@hol.gr
23//
25
26// TMouse.cpp
27// A simple class for handling mouse events
28// Written by Paul Brannan <pbranna@clemson.edu>
29// Last modified August 30, 1998
30
31#include "precomp.h"
32
33TMouse::TMouse(Tnclip &RefClipboard): Clipboard(RefClipboard) {
36}
37
39}
40
41void TMouse::get_coords(COORD *start_coords, COORD *end_coords,
42 COORD *first_coords, COORD *last_coords) {
43 if(end_coords->Y < start_coords->Y ||
44 (end_coords->Y == start_coords->Y && end_coords->X < start_coords->X))
45 {
46 *first_coords = *end_coords;
47 *last_coords = *start_coords;
48 } else {
49 *first_coords = *start_coords;
50 *last_coords = *end_coords;
51 }
52 last_coords->X++;
53}
54
59}
60
63 delete[] chiBuffer;
64}
65
66void TMouse::move_mouse(COORD start_coords, COORD end_coords) {
67 COORD screen_start = {0, 0};
68 COORD first_coords, last_coords;
70
72 ConsoleInfo.dwSize.X * ConsoleInfo.dwSize.Y, screen_start, &Result);
73
74 get_coords(&start_coords, &end_coords, &first_coords, &last_coords);
76 (last_coords.Y - first_coords.Y) + (last_coords.X - first_coords.X),
77 first_coords, &Result);
78}
79
80void TMouse::doClip(COORD start_coords, COORD end_coords) {
81 // COORD screen_start = {0, 0};
82 COORD first_coords, last_coords;
84
85 get_coords(&start_coords, &end_coords, &first_coords, &last_coords);
86
87 // Allocate the minimal size buffer
88 int data_size = 3 + ConsoleInfo.dwSize.X *
89 (last_coords.Y - first_coords.Y) + (last_coords.X - first_coords.X);
91 data_size);
92 LPVOID mem_ptr = GlobalLock(clipboard_data);
93
94 // Reset data_size so we can count the actual data size
95 data_size = 0;
96
97 // Read the console, put carriage returns at the end of each line if
98 // reading more than one line (Paul Brannan 9/17/98)
99 for(int j = first_coords.Y; j <= last_coords.Y; j++) {
100
101 // Read line at (0,j)
103 coords.X = 0;
104 coords.Y = j;
106
107 if(j == first_coords.Y) {
108 coords.X = first_coords.X;
109 length = ConsoleInfo.dwSize.X - first_coords.X;
110 } else {
111 // Add a carriage return to the end of the previous line
112 *((char *)mem_ptr + data_size++) = '\r';
113 *((char *)mem_ptr + data_size++) = '\n';
114 }
115
116 if(j == last_coords.Y) {
117 length -= (ConsoleInfo.dwSize.X - last_coords.X);
118 }
119
120 // Read the next line
121 ReadConsoleOutputCharacter(hStdout, (LPTSTR)((char *)mem_ptr +
122 data_size), length, coords, &Result);
123 data_size += Result;
124
125 // Strip the spaces at the end of the line
126 if((j != last_coords.Y) && (first_coords.Y != last_coords.Y))
127 while(*((char *)mem_ptr + data_size - 1) == ' ') data_size--;
128 }
129 if(first_coords.Y != last_coords.Y) {
130 // Add a carriage return to the end of the last line
131 *((char *)mem_ptr + data_size++) = '\r';
132 *((char *)mem_ptr + data_size++) = '\n';
133 }
134
135 *((char *)mem_ptr + data_size) = 0;
136 GlobalUnlock(clipboard_data);
137
138 Clipboard.Copy(clipboard_data);
139}
140
142 INPUT_RECORD InputRecord;
144 InputRecord.EventType = KEY_EVENT; // just in case
145 while(InputRecord.EventType != MOUSE_EVENT) {
146 if (!ReadConsoleInput(hConsole, &InputRecord, 1, &Result))
147 return; // uh oh! we don't know the starting coordinates!
148 }
149 if(InputRecord.Event.MouseEvent.dwButtonState == 0) return;
150 if(!(InputRecord.Event.MouseEvent.dwButtonState &
153 return;
154 }
155
156 COORD screen_start = {0, 0};
157 COORD start_coords = InputRecord.Event.MouseEvent.dwMousePosition;
158 COORD end_coords = start_coords;
159 BOOL done = FALSE;
160
161 // init vars
162 doMouse_init();
163 int normal_bg = ini.get_normal_bg();
164 int normal_fg = ini.get_normal_fg();
165 if(normal_bg == -1) normal_bg = 0; // FIX ME!! This is just a hack
166 if(normal_fg == -1) normal_fg = 7;
167 normal = (normal_bg << 4) | normal_fg;
168 inverse = (normal_fg << 4) | normal_bg;
169
170 // make screen all one attribute
172 ConsoleInfo.dwSize.Y, screen_start, &Result);
173
174 while(!done) {
175
176 switch (InputRecord.EventType) {
177 case MOUSE_EVENT:
178 switch(InputRecord.Event.MouseEvent.dwEventFlags) {
179 case 0: // only copy if the mouse button has been released
180 if(!InputRecord.Event.MouseEvent.dwButtonState) {
181 doClip(start_coords, end_coords);
182 done = TRUE;
183 }
184 break;
185
186 case MOUSE_MOVED:
187 end_coords = InputRecord.Event.MouseEvent.dwMousePosition;
188 move_mouse(start_coords, end_coords);
189 break;
190 }
191 break;
192 // If we are changing focus, we don't want to highlight anything
193 // (Paul Brannan 9/2/98)
194 case FOCUS_EVENT:
195 return;
196 }
197
199 if (!ReadConsoleInput(hConsole, &InputRecord, 1, &Result))
200 done = TRUE;
201
202 }
203
205}
206
208 doMouse();
209}
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:203
BOOL WINAPI FillConsoleOutputAttribute(IN HANDLE hConsoleOutput, IN WORD wAttribute, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfAttrsWritten)
Definition: console.c:525
BOOL WINAPI GetConsoleScreenBufferInfo(IN HANDLE hConsoleOutput, OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
Definition: console.c:595
int get_normal_fg() const
Definition: tnconfig.h:72
int get_normal_bg() const
Definition: tnconfig.h:71
void scrollMouse()
Definition: tmouse.cpp:207
int normal
Definition: tmouse.h:8
void get_coords(COORD *start_coords, COORD *end_coords, COORD *first_coords, COORD *last_coords)
Definition: tmouse.cpp:41
~TMouse()
Definition: tmouse.cpp:38
void doMouse()
Definition: tmouse.cpp:141
TMouse(Tnclip &RefClipboard)
Definition: tmouse.cpp:33
HANDLE hConsole
Definition: tmouse.h:9
CHAR_INFO * chiBuffer
Definition: tmouse.h:10
int inverse
Definition: tmouse.h:8
void move_mouse(COORD start_coords, COORD end_coords)
Definition: tmouse.cpp:66
HANDLE hStdout
Definition: tmouse.h:9
void doClip(COORD start_coords, COORD end_coords)
Definition: tmouse.cpp:80
CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
Definition: tmouse.h:11
Tnclip & Clipboard
Definition: tmouse.h:12
void doMouse_cleanup()
Definition: tmouse.cpp:61
void doMouse_init()
Definition: tmouse.cpp:55
Definition: tnclip.h:6
void Copy(HGLOBAL clipboard_data)
Definition: tnclip.cpp:40
void Paste()
Definition: tnclip.cpp:48
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define INFINITE
Definition: serial.h:102
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint coords
Definition: glext.h:7368
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
Definition: bl.h:1338
ULONG Y
Definition: bl.h:1340
ULONG X
Definition: bl.h:1339
MOUSE_EVENT_RECORD MouseEvent
Definition: wincon.h:276
union _INPUT_RECORD::@3287 Event
WORD EventType
Definition: wincon.h:273
DWORD dwEventFlags
Definition: wincon.h:257
DWORD dwButtonState
Definition: wincon.h:255
COORD dwMousePosition
Definition: wincon.h:254
SHORT Y
Definition: blue.h:27
SHORT X
Definition: blue.h:26
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
void saveScreen(CHAR_INFO *chiBuffer)
Definition: tconsole.cpp:934
void restoreScreen(CHAR_INFO *chiBuffer)
Definition: tconsole.cpp:964
CHAR_INFO * newBuffer()
Definition: tconsole.cpp:995
TConfig ini
Definition: tnconfig.cpp:45
#define STD_OUTPUT_HANDLE
Definition: winbase.h:268
#define STD_INPUT_HANDLE
Definition: winbase.h:267
#define GMEM_MOVEABLE
Definition: winbase.h:294
#define GMEM_DDESHARE
Definition: winbase.h:298
#define ReadConsoleInput
Definition: wincon.h:778
#define MOUSE_EVENT
Definition: wincon.h:129
#define KEY_EVENT
Definition: wincon.h:128
#define MOUSE_MOVED
Definition: wincon.h:168
#define ReadConsoleOutputCharacter
Definition: wincon.h:781
#define FROM_LEFT_1ST_BUTTON_PRESSED
Definition: wincon.h:159
#define FOCUS_EVENT
Definition: wincon.h:132
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
CHAR * LPTSTR
Definition: xmlstorage.h:192