ReactOS 0.4.15-dev-7157-gb7dcc10
conwnd.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: win32ss/user/winsrv/consrv/frontends/gui/conwnd.c
5 * PURPOSE: GUI Console Window Class
6 * PROGRAMMERS: Gé van Geldorp
7 * Johannes Anderwald
8 * Jeffrey Morlan
9 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
10 * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
11 */
12
13/* INCLUDES *******************************************************************/
14
15#include <consrv.h>
16#include <intrin.h>
17#include <windowsx.h>
18#include <shellapi.h>
19
20#define NDEBUG
21#include <debug.h>
22
23#include "concfg/font.h"
24#include "guiterm.h"
25#include "resource.h"
26
27/* GLOBALS ********************************************************************/
28
29// #define PM_CREATE_CONSOLE (WM_APP + 1)
30// #define PM_DESTROY_CONSOLE (WM_APP + 2)
31
32// See guiterm.c
33#define CONGUI_MIN_WIDTH 10
34#define CONGUI_MIN_HEIGHT 10
35#define CONGUI_UPDATE_TIME 0
36#define CONGUI_UPDATE_TIMER 1
37
38#define CURSOR_BLINK_TIME 500
39
40
41/**************************************************************\
42\** Define the Console Leader Process for the console window **/
43#define GWLP_CONWND_ALLOC (2 * sizeof(LONG_PTR))
44#define GWLP_CONSOLE_LEADER_PID 0
45#define GWLP_CONSOLE_LEADER_TID 4
46
47VOID
49{
50 PCONSOLE_PROCESS_DATA ProcessData;
51
52 ProcessData = ConSrvGetConsoleLeaderProcess(GuiData->Console);
53
54 ASSERT(ProcessData != NULL);
55 DPRINT("ProcessData: %p, ProcessData->Process %p.\n", ProcessData, ProcessData->Process);
56
57 if (ProcessData->Process)
58 {
59 CLIENT_ID ConsoleLeaderCID = ProcessData->Process->ClientId;
61 (LONG_PTR)(ConsoleLeaderCID.UniqueProcess));
63 (LONG_PTR)(ConsoleLeaderCID.UniqueThread));
64 }
65 else
66 {
67 SetWindowLongPtrW(GuiData->hWindow, GWLP_CONSOLE_LEADER_PID, 0);
68 SetWindowLongPtrW(GuiData->hWindow, GWLP_CONSOLE_LEADER_TID, 0);
69 }
70}
71/**************************************************************/
72
76
78{
83
85{
92
93 { 0, NULL, 0 } /* End of list */
94};
95
97{
101
102 { 0, NULL, 0 } /* End of list */
103};
104
105/*
106 * Default 16-color palette for foreground and background
107 * (corresponding flags in comments).
108 */
110{
111 RGB(0, 0, 0), // (Black)
112 RGB(0, 0, 128), // BLUE
113 RGB(0, 128, 0), // GREEN
114 RGB(0, 128, 128), // BLUE | GREEN
115 RGB(128, 0, 0), // RED
116 RGB(128, 0, 128), // BLUE | RED
117 RGB(128, 128, 0), // GREEN | RED
118 RGB(192, 192, 192), // BLUE | GREEN | RED
119
120 RGB(128, 128, 128), // (Grey) INTENSITY
121 RGB(0, 0, 255), // BLUE | INTENSITY
122 RGB(0, 255, 0), // GREEN | INTENSITY
123 RGB(0, 255, 255), // BLUE | GREEN | INTENSITY
124 RGB(255, 0, 0), // RED | INTENSITY
125 RGB(255, 0, 255), // BLUE | RED | INTENSITY
126 RGB(255, 255, 0), // GREEN | RED | INTENSITY
127 RGB(255, 255, 255) // BLUE | GREEN | RED | INTENSITY
128};
129
130/* FUNCTIONS ******************************************************************/
131
132static LRESULT CALLBACK
134
137{
139 ATOM WndClassAtom;
140
146 LR_SHARED);
152 LR_SHARED);
154
155 WndClass.cbSize = sizeof(WNDCLASSEXW);
156 WndClass.lpszClassName = GUI_CONWND_CLASS;
157 WndClass.lpfnWndProc = ConWndProc;
158 WndClass.style = CS_DBLCLKS /* | CS_HREDRAW | CS_VREDRAW */;
159 WndClass.hInstance = hInstance;
160 WndClass.hIcon = ghDefaultIcon;
161 WndClass.hIconSm = ghDefaultIconSm;
162 WndClass.hCursor = ghDefaultCursor;
163 WndClass.hbrBackground = NULL;
164 WndClass.lpszMenuName = NULL;
165 WndClass.cbClsExtra = 0;
166 WndClass.cbWndExtra = GWLP_CONWND_ALLOC;
167
168 WndClassAtom = RegisterClassExW(&WndClass);
169 if (WndClassAtom == 0)
170 {
171 DPRINT1("Failed to register GUI console class\n");
172 }
173 else
174 {
175 NtUserConsoleControl(GuiConsoleWndClassAtom, &WndClassAtom, sizeof(ATOM));
176 }
177
178 return (WndClassAtom != 0);
179}
180
183{
185}
186
187static VOID
189 const GUICONSOLE_MENUITEM *Items)
190{
191 UINT i = 0;
192 WCHAR szMenuString[255];
193 HMENU hSubMenu;
194
195 do
196 {
197 if (Items[i].uID != (UINT)-1)
198 {
200 Items[i].uID,
201 szMenuString,
202 ARRAYSIZE(szMenuString)) > 0)
203 {
204 if (Items[i].SubMenu != NULL)
205 {
206 hSubMenu = CreatePopupMenu();
207 if (hSubMenu != NULL)
208 {
209 AppendMenuItems(hSubMenu, Items[i].SubMenu);
210
211 if (!AppendMenuW(hMenu,
213 (UINT_PTR)hSubMenu,
214 szMenuString))
215 {
216 DestroyMenu(hSubMenu);
217 }
218 }
219 }
220 else
221 {
222 AppendMenuW(hMenu,
223 MF_STRING,
224 Items[i].wCmdID,
225 szMenuString);
226 }
227 }
228 }
229 else
230 {
231 AppendMenuW(hMenu,
233 0,
234 NULL);
235 }
236 i++;
237 } while (!(Items[i].uID == 0 && Items[i].SubMenu == NULL && Items[i].wCmdID == 0));
238}
239
240//static
241VOID
243{
244 MENUITEMINFOW mii;
245 HMENU hMenu;
246 PWCHAR ptrTab;
247 WCHAR szMenuStringBack[255];
248
249 hMenu = GetSystemMenu(hWnd, FALSE);
250 if (hMenu == NULL)
251 return;
252
253 mii.cbSize = sizeof(mii);
254 mii.fMask = MIIM_STRING;
255 mii.dwTypeData = szMenuStringBack;
256 mii.cch = ARRAYSIZE(szMenuStringBack);
257
258 GetMenuItemInfoW(hMenu, SC_CLOSE, FALSE, &mii);
259
260 ptrTab = wcschr(szMenuStringBack, L'\t');
261 if (ptrTab)
262 {
263 *ptrTab = L'\0';
264 mii.cch = (UINT)wcslen(szMenuStringBack);
265
266 SetMenuItemInfoW(hMenu, SC_CLOSE, FALSE, &mii);
267 }
268
271}
272
273static VOID
275{
276 INPUT_RECORD er;
277
278 DPRINT("Menu item ID: %d\n", CmdId);
279
281
282 /* Send a menu event */
284 er.Event.MenuEvent.dwCommandId = CmdId;
286
288}
289
290static VOID
291Copy(PGUI_CONSOLE_DATA GuiData);
292static VOID
293Paste(PGUI_CONSOLE_DATA GuiData);
294static VOID
296 PCOORD SelectionAnchor OPTIONAL,
297 PCOORD coord);
298
299static VOID
301{
302 PCONSOLE_SCREEN_BUFFER ActiveBuffer = GuiData->ActiveBuffer;
303
304 /* Clear the old selection */
306
307 /* Restart a new selection */
308 GuiData->dwSelectionCursor = ActiveBuffer->ViewOrigin;
309 UpdateSelection(GuiData,
310 &GuiData->dwSelectionCursor,
311 &GuiData->dwSelectionCursor);
312}
313
314static VOID
316{
317 PCONSOLE_SCREEN_BUFFER ActiveBuffer = GuiData->ActiveBuffer;
318 COORD SelectionAnchor;
319
320 /* Clear the old selection */
322
323 /*
324 * The selection area extends to the whole screen buffer's width.
325 */
326 SelectionAnchor.X = SelectionAnchor.Y = 0;
327 GuiData->dwSelectionCursor.X = ActiveBuffer->ScreenBufferSize.X - 1;
328
329 /*
330 * Determine whether the selection must extend to just some part
331 * (for text-mode screen buffers) or to all of the screen buffer's
332 * height (for graphics ones).
333 */
334 if (GetType(ActiveBuffer) == TEXTMODE_BUFFER)
335 {
336 /*
337 * We select all the characters from the first line
338 * to the line where the cursor is positioned.
339 */
340 GuiData->dwSelectionCursor.Y = ActiveBuffer->CursorPosition.Y;
341 }
342 else /* if (GetType(ActiveBuffer) == GRAPHICS_BUFFER) */
343 {
344 /*
345 * We select all the screen buffer area.
346 */
347 GuiData->dwSelectionCursor.Y = ActiveBuffer->ScreenBufferSize.Y - 1;
348 }
349
350 /* Restart a new selection */
352 UpdateSelection(GuiData, &SelectionAnchor, &GuiData->dwSelectionCursor);
353}
354
355static LRESULT
357{
358 LRESULT Ret = TRUE;
360
361 /*
362 * In case the selected menu item belongs to the user-reserved menu id range,
363 * send to him a menu event and return directly. The user must handle those
364 * reserved menu commands...
365 */
366 if (GuiData->CmdIdLow <= (UINT)wParam && (UINT)wParam <= GuiData->CmdIdHigh)
367 {
369 goto Quit;
370 }
371
372 /* ... otherwise, perform actions. */
373 switch (wParam)
374 {
376 Mark(GuiData);
377 break;
378
380 Copy(GuiData);
381 break;
382
384 Paste(GuiData);
385 break;
386
388 SelectAll(GuiData);
389 break;
390
392 DPRINT1("Scrolling is not handled yet\n");
393 break;
394
396 DPRINT1("Finding is not handled yet\n");
397 break;
398
401 break;
402
405 break;
406
407 default:
408 Ret = FALSE;
409 break;
410 }
411
412Quit:
413 if (!Ret)
415
416 return Ret;
417}
418
421{
422 /* This function ensures that the console pointer is not NULL */
424 return ( ((GuiData == NULL) || (GuiData->hWindow == hWnd && GuiData->Console != NULL)) ? GuiData : NULL );
425}
426
427static VOID
428ResizeConWnd(PGUI_CONSOLE_DATA GuiData, DWORD WidthUnit, DWORD HeightUnit)
429{
430 PCONSOLE_SCREEN_BUFFER Buff = GuiData->ActiveBuffer;
431 SCROLLINFO sInfo;
432
434
435 Width = Buff->ViewSize.X * WidthUnit +
437 Height = Buff->ViewSize.Y * HeightUnit +
439
440 /* Set scrollbar sizes */
441 sInfo.cbSize = sizeof(sInfo);
442 sInfo.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
443 sInfo.nMin = 0;
444 if (Buff->ScreenBufferSize.Y > Buff->ViewSize.Y)
445 {
446 sInfo.nMax = Buff->ScreenBufferSize.Y - 1;
447 sInfo.nPage = Buff->ViewSize.Y;
448 sInfo.nPos = Buff->ViewOrigin.Y;
449 SetScrollInfo(GuiData->hWindow, SB_VERT, &sInfo, TRUE);
451 ShowScrollBar(GuiData->hWindow, SB_VERT, TRUE);
452 }
453 else
454 {
456 }
457
458 if (Buff->ScreenBufferSize.X > Buff->ViewSize.X)
459 {
460 sInfo.nMax = Buff->ScreenBufferSize.X - 1;
461 sInfo.nPage = Buff->ViewSize.X;
462 sInfo.nPos = Buff->ViewOrigin.X;
463 SetScrollInfo(GuiData->hWindow, SB_HORZ, &sInfo, TRUE);
465 ShowScrollBar(GuiData->hWindow, SB_HORZ, TRUE);
466 }
467 else
468 {
470 }
471
472 /* Resize the window */
473 SetWindowPos(GuiData->hWindow, NULL, 0, 0, Width, Height,
475 // NOTE: The SWP_NOCOPYBITS flag can be replaced by a subsequent call
476 // to: InvalidateRect(GuiData->hWindow, NULL, TRUE);
477}
478
479
480VOID
482{
483 ULONG i;
484 for (i = 0; i < ARRAYSIZE(GuiData->Font); ++i)
485 {
486 if (GuiData->Font[i] != NULL) DeleteObject(GuiData->Font[i]);
487 GuiData->Font[i] = NULL;
488 }
489}
490
491static HFONT
493 // COORD FontSize,
494 ULONG FontWeight,
495 // BOOLEAN bItalic,
496 BOOLEAN bUnderline,
497 BOOLEAN bStrikeOut)
498{
499 LOGFONTW lf;
500
501 /* Initialize the LOGFONT structure */
502 RtlZeroMemory(&lf, sizeof(lf));
503
504 /* Retrieve the details of the current font */
505 if (GetObjectW(OrgFont, sizeof(lf), &lf) == 0)
506 return NULL;
507
508 /* Change the font attributes */
509 // lf.lfHeight = FontSize.Y;
510 // lf.lfWidth = FontSize.X;
511 lf.lfWeight = FontWeight;
512 // lf.lfItalic = bItalic;
513 lf.lfUnderline = bUnderline;
514 lf.lfStrikeOut = bStrikeOut;
515
516 /* Build a new font */
517 return CreateFontIndirectW(&lf);
518}
519
520BOOL
524 PCWSTR FaceName,
525 _In_ ULONG FontWeight,
527 _In_ COORD FontSize,
528 _In_opt_ UINT CodePage,
529 _In_ BOOL UseDefaultFallback)
530{
531 HDC hDC;
532 HFONT hFont;
533 FONT_DATA FontData;
534 UINT OldCharWidth = GuiData->CharWidth;
535 UINT OldCharHeight = GuiData->CharHeight;
536 COORD OldFontSize = GuiData->GuiInfo.FontSize;
537 WCHAR NewFaceName[LF_FACESIZE];
538
539 /* Default to current code page if none has been provided */
540 if (!CodePage)
541 CodePage = GuiData->Console->OutputCodePage;
542
543 /*
544 * Initialize a new NORMAL font.
545 */
546
547 /* Copy the requested face name into the local buffer.
548 * It will be modified in output by CreateConsoleFontEx()
549 * to hold a possible fallback font face name. */
550 StringCchCopyNW(NewFaceName, ARRAYSIZE(NewFaceName),
551 FaceName, LF_FACESIZE);
552
553 /* NOTE: FontSize is always in cell height/width units (pixels) */
554 hFont = CreateConsoleFontEx((LONG)(ULONG)FontSize.Y,
555 (LONG)(ULONG)FontSize.X,
556 NewFaceName,
557 FontWeight,
559 CodePage,
560 UseDefaultFallback,
561 &FontData);
562 if (!hFont)
563 {
564 DPRINT1("InitFonts: CreateConsoleFontEx('%S') failed\n", NewFaceName);
565 return FALSE;
566 }
567
568 /* Retrieve its character cell size */
569 hDC = GetDC(GuiData->hWindow);
570 if (!GetFontCellSize(hDC, hFont, &GuiData->CharHeight, &GuiData->CharWidth))
571 {
572 DPRINT1("InitFonts: GetFontCellSize failed\n");
573 ReleaseDC(GuiData->hWindow, hDC);
575 return FALSE;
576 }
577 ReleaseDC(GuiData->hWindow, hDC);
578
579 /*
580 * Initialization succeeded.
581 */
582 // Delete all the old fonts first.
583 DeleteFonts(GuiData);
584 GuiData->Font[FONT_NORMAL] = hFont;
585
586 /*
587 * Now build the optional fonts (bold, underlined, mixed).
588 * Do not error in case they fail to be created.
589 */
590 GuiData->Font[FONT_BOLD] =
591 CreateDerivedFont(GuiData->Font[FONT_NORMAL],
592 max(FW_BOLD, FontData.Weight),
593 FALSE,
594 FALSE);
595 GuiData->Font[FONT_UNDERLINE] =
596 CreateDerivedFont(GuiData->Font[FONT_NORMAL],
597 FontData.Weight,
598 TRUE,
599 FALSE);
600 GuiData->Font[FONT_BOLD | FONT_UNDERLINE] =
601 CreateDerivedFont(GuiData->Font[FONT_NORMAL],
602 max(FW_BOLD, FontData.Weight),
603 TRUE,
604 FALSE);
605
606 /*
607 * Save the new font characteristics.
608 */
609 StringCchCopyNW(GuiData->GuiInfo.FaceName,
610 ARRAYSIZE(GuiData->GuiInfo.FaceName),
611 NewFaceName, ARRAYSIZE(NewFaceName));
612 GuiData->GuiInfo.FontWeight = FontData.Weight;
613 GuiData->GuiInfo.FontFamily = FontData.Family;
614 GuiData->GuiInfo.FontSize = FontData.Size;
615
616 /* Resize the terminal, in case the new font has a different size */
617 if ((OldCharWidth != GuiData->CharWidth) ||
618 (OldCharHeight != GuiData->CharHeight) ||
619 (OldFontSize.X != FontData.Size.X ||
620 OldFontSize.Y != FontData.Size.Y))
621 {
622 TermResizeTerminal(GuiData->Console);
623 }
624
625 return TRUE;
626}
627
628
629static BOOL
631{
632 PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA)Create->lpCreateParams;
634
635 if (GuiData == NULL)
636 {
637 DPRINT1("GuiConsoleNcCreate: No GUI data\n");
638 return FALSE;
639 }
640
641 Console = GuiData->Console;
642
643 GuiData->hWindow = hWnd;
644 GuiData->hSysMenu = GetSystemMenu(hWnd, FALSE);
645
646 /* Initialize the fonts */
647 if (!InitFonts(GuiData,
648 GuiData->GuiInfo.FaceName,
649 GuiData->GuiInfo.FontWeight,
650 GuiData->GuiInfo.FontFamily,
651 GuiData->GuiInfo.FontSize,
652 0, FALSE))
653 {
654 /* Reset only the output code page if we don't have a suitable
655 * font for it, possibly falling back to "United States (OEM)". */
656 UINT AltCodePage = GetOEMCP();
657
658 if (AltCodePage == Console->OutputCodePage)
659 AltCodePage = CP_USA;
660
661 DPRINT1("Could not initialize font '%S' for code page %d - Resetting CP to %d\n",
662 GuiData->GuiInfo.FaceName, Console->OutputCodePage, AltCodePage);
663
664 CON_SET_OUTPUT_CP(Console, AltCodePage);
665
666 /* We will use a fallback font if we cannot find
667 * anything for this replacement code page. */
668 if (!InitFonts(GuiData,
669 GuiData->GuiInfo.FaceName,
670 GuiData->GuiInfo.FontWeight,
671 GuiData->GuiInfo.FontFamily,
672 GuiData->GuiInfo.FontSize,
673 0, TRUE))
674 {
675 DPRINT1("Failed to initialize font '%S' for code page %d\n",
676 GuiData->GuiInfo.FaceName, Console->OutputCodePage);
677
678 DPRINT1("GuiConsoleNcCreate: InitFonts failed\n");
679 GuiData->hWindow = NULL;
680 NtSetEvent(GuiData->hGuiInitEvent, NULL);
681 return FALSE;
682 }
683 }
684
685 /* Initialize the terminal framebuffer */
686 GuiData->hMemDC = CreateCompatibleDC(NULL);
687 GuiData->hBitmap = NULL;
688 GuiData->hSysPalette = NULL; /* Original system palette */
689
690 /* Update the icons of the window */
691 if (GuiData->hIcon != ghDefaultIcon)
692 {
693 DefWindowProcW(GuiData->hWindow, WM_SETICON, ICON_BIG , (LPARAM)GuiData->hIcon );
694 DefWindowProcW(GuiData->hWindow, WM_SETICON, ICON_SMALL, (LPARAM)GuiData->hIconSm);
695 }
696
697 // FIXME: Keep these instructions here ? ///////////////////////////////////
698 Console->ActiveBuffer->CursorBlinkOn = TRUE;
699 Console->ActiveBuffer->ForceCursorOff = FALSE;
701
703
704 if (GuiData->IsWindowVisible)
705 {
707 }
708
709 // FIXME: HACK: Potential HACK for CORE-8129; see revision 63595.
710 //CreateSysMenu(GuiData->hWindow);
711
712 DPRINT("OnNcCreate - setting start event\n");
713 NtSetEvent(GuiData->hGuiInitEvent, NULL);
714
715 /* We accept dropped files */
716 DragAcceptFiles(GuiData->hWindow, TRUE);
717
718 return (BOOL)DefWindowProcW(GuiData->hWindow, WM_NCCREATE, 0, (LPARAM)Create);
719}
720
721static VOID
723{
724 WORD ActivationState = LOWORD(wParam);
725
726 DPRINT("WM_ACTIVATE - ActivationState = %d\n", ActivationState);
727
728 if ( ActivationState == WA_ACTIVE ||
729 ActivationState == WA_CLICKACTIVE )
730 {
731 if (GuiData->GuiInfo.FullScreen)
732 {
733 EnterFullScreen(GuiData);
734 // // PostMessageW(GuiData->hWindow, WM_SYSCOMMAND, SC_RESTORE, 0);
735 // SendMessageW(GuiData->hWindow, WM_SYSCOMMAND, SC_RESTORE, 0);
736 }
737 }
738 else // if (ActivationState == WA_INACTIVE)
739 {
740 if (GuiData->GuiInfo.FullScreen)
741 {
743 LeaveFullScreen(GuiData);
744 // // PostMessageW(GuiData->hWindow, WM_SYSCOMMAND, SC_MINIMIZE, 0);
745 // SendMessageW(GuiData->hWindow, WM_SYSCOMMAND, SC_MINIMIZE, 0);
746 }
747 }
748
749 /*
750 * Ignore the next mouse event when we are going to be enabled again via
751 * the mouse, in order to prevent, e.g. when we are in Edit mode, erroneous
752 * mouse actions from the user that could spoil text selection or copy/pastes.
753 */
754 if (ActivationState == WA_CLICKACTIVE)
755 GuiData->IgnoreNextMouseEvent = TRUE;
756}
757
758static VOID
760{
762 INPUT_RECORD er;
763
765
766 /* Set console focus state */
767 Console->HasFocus = SetFocus;
768
769 /*
770 * Set the priority of the processes of this console
771 * in accordance with the console focus state.
772 */
774
775 /* Send a focus event */
779
781
782 if (SetFocus)
783 DPRINT("TODO: Create console caret\n");
784 else
785 DPRINT("TODO: Destroy console caret\n");
786}
787
788VOID
790 PCOORD SelectionAnchor,
791 PSMALL_RECT SmallRect)
792{
793 if (Begin == NULL || End == NULL) return;
794
795 *Begin = *SelectionAnchor;
796 End->X = (SelectionAnchor->X == SmallRect->Left) ? SmallRect->Right
797 /* Case X != Left, must be == Right */ : SmallRect->Left;
798 End->Y = (SelectionAnchor->Y == SmallRect->Top ) ? SmallRect->Bottom
799 /* Case Y != Top, must be == Bottom */ : SmallRect->Top;
800
801 /* Exchange Begin / End if Begin > End lexicographically */
802 if (Begin->Y > End->Y || (Begin->Y == End->Y && Begin->X > End->X))
803 {
804 End->X = _InterlockedExchange16(&Begin->X, End->X);
805 End->Y = _InterlockedExchange16(&Begin->Y, End->Y);
806 }
807}
808
809static HRGN
811 BOOL LineSelection,
812 PCOORD SelectionAnchor,
813 PSMALL_RECT SmallRect)
814{
815 if (!LineSelection)
816 {
817 RECT rect;
818 SmallRectToRect(GuiData, &rect, SmallRect);
820 }
821 else
822 {
823 HRGN SelRgn;
824 COORD Begin, End;
825
826 GetSelectionBeginEnd(&Begin, &End, SelectionAnchor, SmallRect);
827
828 if (Begin.Y == End.Y)
829 {
830 SMALL_RECT sr;
831 RECT r ;
832
833 sr.Left = Begin.X;
834 sr.Top = Begin.Y;
835 sr.Right = End.X;
836 sr.Bottom = End.Y;
837
838 // Debug thingie to see whether I can put this corner case
839 // together with the previous one.
840 if (SmallRect->Left != sr.Left ||
841 SmallRect->Top != sr.Top ||
842 SmallRect->Right != sr.Right ||
843 SmallRect->Bottom != sr.Bottom)
844 {
845 DPRINT1("\n"
846 "SmallRect = (%d, %d, %d, %d)\n"
847 "sr = (%d, %d, %d, %d)\n"
848 "\n",
849 SmallRect->Left, SmallRect->Top, SmallRect->Right, SmallRect->Bottom,
850 sr.Left, sr.Top, sr.Right, sr.Bottom);
851 }
852
853 SmallRectToRect(GuiData, &r, &sr);
854 SelRgn = CreateRectRgnIndirect(&r);
855 }
856 else
857 {
858 PCONSOLE_SCREEN_BUFFER ActiveBuffer = GuiData->ActiveBuffer;
859
860 HRGN rg1, rg2, rg3;
861 SMALL_RECT sr1, sr2, sr3;
862 RECT r1 , r2 , r3 ;
863
864 sr1.Left = Begin.X;
865 sr1.Top = Begin.Y;
866 sr1.Right = ActiveBuffer->ScreenBufferSize.X - 1;
867 sr1.Bottom = Begin.Y;
868
869 sr2.Left = 0;
870 sr2.Top = Begin.Y + 1;
871 sr2.Right = ActiveBuffer->ScreenBufferSize.X - 1;
872 sr2.Bottom = End.Y - 1;
873
874 sr3.Left = 0;
875 sr3.Top = End.Y;
876 sr3.Right = End.X;
877 sr3.Bottom = End.Y;
878
879 SmallRectToRect(GuiData, &r1, &sr1);
880 SmallRectToRect(GuiData, &r2, &sr2);
881 SmallRectToRect(GuiData, &r3, &sr3);
882
886
887 CombineRgn(rg1, rg1, rg2, RGN_XOR);
888 CombineRgn(rg1, rg1, rg3, RGN_XOR);
889 DeleteObject(rg3);
890 DeleteObject(rg2);
891
892 SelRgn = rg1;
893 }
894
895 return SelRgn;
896 }
897}
898
899static VOID
901{
902 HRGN rgnPaint = CreateRectRgnIndirect(&pps->rcPaint);
903 HRGN rgnSel = CreateSelectionRgn(GuiData, GuiData->LineSelection,
905 &GuiData->Selection.srSelection);
906
907 /* Invert the selection */
908
909 int ErrorCode = CombineRgn(rgnPaint, rgnPaint, rgnSel, RGN_AND);
910 if (ErrorCode != ERROR && ErrorCode != NULLREGION)
911 {
912 InvertRgn(pps->hdc, rgnPaint);
913 }
914
915 DeleteObject(rgnSel);
916 DeleteObject(rgnPaint);
917}
918
919static VOID
921 PCOORD SelectionAnchor OPTIONAL,
923{
925 HRGN oldRgn = CreateSelectionRgn(GuiData, GuiData->LineSelection,
927 &GuiData->Selection.srSelection);
928
929 /* Update the anchor if needed (use the old one if NULL) */
930 if (SelectionAnchor)
931 GuiData->Selection.dwSelectionAnchor = *SelectionAnchor;
932
933 // TODO: Scroll buffer to bring 'coord' into view
934
935 if (coord != NULL)
936 {
937 SMALL_RECT rc;
938 HRGN newRgn;
939
940 /*
941 * Pressing the Control key while selecting text, allows us to enter
942 * into line-selection mode, the selection mode of *nix terminals.
943 */
944 BOOL OldLineSel = GuiData->LineSelection;
946
947 /* Exchange left/top with right/bottom if required */
948 rc.Left = min(GuiData->Selection.dwSelectionAnchor.X, coord->X);
949 rc.Top = min(GuiData->Selection.dwSelectionAnchor.Y, coord->Y);
950 rc.Right = max(GuiData->Selection.dwSelectionAnchor.X, coord->X);
951 rc.Bottom = max(GuiData->Selection.dwSelectionAnchor.Y, coord->Y);
952
953 newRgn = CreateSelectionRgn(GuiData, GuiData->LineSelection,
955 &rc);
956
958 {
959 if (OldLineSel != GuiData->LineSelection ||
960 memcmp(&rc, &GuiData->Selection.srSelection, sizeof(SMALL_RECT)) != 0)
961 {
962 /* Calculate the region that needs to be updated */
963 if (oldRgn && newRgn && CombineRgn(newRgn, newRgn, oldRgn, RGN_XOR) != ERROR)
964 {
965 InvalidateRgn(GuiData->hWindow, newRgn, FALSE);
966 }
967 }
968 }
969 else
970 {
971 InvalidateRgn(GuiData->hWindow, newRgn, FALSE);
972 }
973
974 DeleteObject(newRgn);
975
977 GuiData->Selection.srSelection = rc;
978 GuiData->dwSelectionCursor = *coord;
979
980 if ((GuiData->Selection.dwFlags & CONSOLE_SELECTION_IN_PROGRESS) == 0)
981 {
982 LPWSTR SelTypeStr = NULL , WindowTitle = NULL;
983 SIZE_T SelTypeStrLength = 0, Length = 0;
984
985 /* Clear the old selection */
987 {
988 InvalidateRgn(GuiData->hWindow, oldRgn, FALSE);
989 }
990
991 /*
992 * When passing a zero-length buffer size, LoadString(...) returns
993 * a read-only pointer buffer to the program's resource string.
994 */
995 SelTypeStrLength =
999 (LPWSTR)&SelTypeStr, 0);
1000
1001 /*
1002 * Prepend the selection type string to the current console title
1003 * if we succeeded in retrieving a valid localized string.
1004 */
1005 if (SelTypeStr)
1006 {
1007 // 3 for " - " and 1 for NULL
1008 Length = Console->Title.Length + (SelTypeStrLength + 3 + 1) * sizeof(WCHAR);
1009 WindowTitle = ConsoleAllocHeap(0, Length);
1010
1011 wcsncpy(WindowTitle, SelTypeStr, SelTypeStrLength);
1012 WindowTitle[SelTypeStrLength] = UNICODE_NULL;
1013 wcscat(WindowTitle, L" - ");
1014 wcscat(WindowTitle, Console->Title.Buffer);
1015
1016 SetWindowTextW(GuiData->hWindow, WindowTitle);
1017 ConsoleFreeHeap(WindowTitle);
1018 }
1019
1022 }
1023 }
1024 else
1025 {
1026 /* Clear the selection */
1028 {
1029 InvalidateRgn(GuiData->hWindow, oldRgn, FALSE);
1030 }
1031
1034
1035 /* Restore the console title */
1036 SetWindowTextW(GuiData->hWindow, Console->Title.Buffer);
1037 }
1038
1039 DeleteObject(oldRgn);
1040}
1041
1042static VOID
1044{
1045 PCONSOLE_SCREEN_BUFFER ActiveBuffer = GuiData->ActiveBuffer;
1046 PAINTSTRUCT ps;
1047 RECT rcPaint;
1048
1049 /* Do nothing if the window is hidden */
1050 if (!GuiData->IsWindowVisible) return;
1051
1052 BeginPaint(GuiData->hWindow, &ps);
1053 if (ps.hdc != NULL &&
1054 ps.rcPaint.left < ps.rcPaint.right &&
1055 ps.rcPaint.top < ps.rcPaint.bottom)
1056 {
1057 EnterCriticalSection(&GuiData->Lock);
1058
1059 /* Compose the current screen-buffer on-memory */
1060 if (GetType(ActiveBuffer) == TEXTMODE_BUFFER)
1061 {
1063 GuiData, &ps.rcPaint, &rcPaint);
1064 }
1065 else /* if (GetType(ActiveBuffer) == GRAPHICS_BUFFER) */
1066 {
1068 GuiData, &ps.rcPaint, &rcPaint);
1069 }
1070
1071 /* Send it to screen */
1072 BitBlt(ps.hdc,
1073 ps.rcPaint.left,
1074 ps.rcPaint.top,
1075 rcPaint.right - rcPaint.left,
1076 rcPaint.bottom - rcPaint.top,
1077 GuiData->hMemDC,
1078 rcPaint.left,
1079 rcPaint.top,
1080 SRCCOPY);
1081
1082 /* Draw the selection region if needed */
1084 {
1085 PaintSelectionRect(GuiData, &ps);
1086 }
1087
1088 // TODO: Move cursor display here!
1089
1090 LeaveCriticalSection(&GuiData->Lock);
1091 }
1092 EndPaint(GuiData->hWindow, &ps);
1093
1094 return;
1095}
1096
1097static VOID
1099{
1100 PCONSOLE_SCREEN_BUFFER ActiveBuffer = GuiData->ActiveBuffer;
1101
1102 /* Do nothing if the window is hidden */
1103 if (!GuiData->IsWindowVisible) return;
1104
1105 // See WM_PALETTECHANGED message
1106 // if ((HWND)wParam == hWnd) break;
1107
1108 // if (GetType(ActiveBuffer) == GRAPHICS_BUFFER)
1109 if (ActiveBuffer->PaletteHandle)
1110 {
1111 DPRINT("WM_PALETTECHANGED changing palette\n");
1112
1113 /* Specify the use of the system palette for the framebuffer */
1114 SetSystemPaletteUse(GuiData->hMemDC, ActiveBuffer->PaletteUsage);
1115
1116 /* Realize the (logical) palette */
1117 RealizePalette(GuiData->hMemDC);
1118 }
1119}
1120
1121static BOOL
1122IsSystemKey(WORD VirtualKeyCode)
1123{
1124 switch (VirtualKeyCode)
1125 {
1126 /* From MSDN, "Virtual-Key Codes" */
1127 case VK_RETURN:
1128 case VK_SHIFT:
1129 case VK_CONTROL:
1130 case VK_MENU:
1131 case VK_PAUSE:
1132 case VK_CAPITAL:
1133 case VK_ESCAPE:
1134 case VK_LWIN:
1135 case VK_RWIN:
1136 case VK_NUMLOCK:
1137 case VK_SCROLL:
1138 return TRUE;
1139 default:
1140 return FALSE;
1141 }
1142}
1143
1144static VOID
1146{
1147 PCONSRV_CONSOLE Console = GuiData->Console;
1148 PCONSOLE_SCREEN_BUFFER ActiveBuffer;
1149
1151
1152 ActiveBuffer = GuiData->ActiveBuffer;
1153
1155 {
1156 WORD VirtualKeyCode = LOWORD(wParam);
1157
1158 if (msg != WM_KEYDOWN) goto Quit;
1159
1160 if (VirtualKeyCode == VK_RETURN)
1161 {
1162 /* Copy (and clear) selection if ENTER is pressed */
1163 Copy(GuiData);
1164 goto Quit;
1165 }
1166 else if ( VirtualKeyCode == VK_ESCAPE ||
1167 (VirtualKeyCode == 'C' && (GetKeyState(VK_CONTROL) & KEY_PRESSED)) )
1168 {
1169 /* Cancel selection if ESC or Ctrl-C are pressed */
1170 UpdateSelection(GuiData, NULL, NULL);
1171 goto Quit;
1172 }
1173
1174 if ((GuiData->Selection.dwFlags & CONSOLE_MOUSE_SELECTION) == 0)
1175 {
1176 /* Keyboard selection mode */
1177 BOOL Interpreted = FALSE;
1178 BOOL MajPressed = !!(GetKeyState(VK_SHIFT) & KEY_PRESSED);
1179
1180 switch (VirtualKeyCode)
1181 {
1182 case VK_LEFT:
1183 {
1184 Interpreted = TRUE;
1185 if (GuiData->dwSelectionCursor.X > 0)
1186 GuiData->dwSelectionCursor.X--;
1187
1188 break;
1189 }
1190
1191 case VK_RIGHT:
1192 {
1193 Interpreted = TRUE;
1194 if (GuiData->dwSelectionCursor.X < ActiveBuffer->ScreenBufferSize.X - 1)
1195 GuiData->dwSelectionCursor.X++;
1196
1197 break;
1198 }
1199
1200 case VK_UP:
1201 {
1202 Interpreted = TRUE;
1203 if (GuiData->dwSelectionCursor.Y > 0)
1204 GuiData->dwSelectionCursor.Y--;
1205
1206 break;
1207 }
1208
1209 case VK_DOWN:
1210 {
1211 Interpreted = TRUE;
1212 if (GuiData->dwSelectionCursor.Y < ActiveBuffer->ScreenBufferSize.Y - 1)
1213 GuiData->dwSelectionCursor.Y++;
1214
1215 break;
1216 }
1217
1218 case VK_HOME:
1219 {
1220 Interpreted = TRUE;
1221 GuiData->dwSelectionCursor.X = 0;
1222 GuiData->dwSelectionCursor.Y = 0;
1223 break;
1224 }
1225
1226 case VK_END:
1227 {
1228 Interpreted = TRUE;
1229 GuiData->dwSelectionCursor.Y = ActiveBuffer->ScreenBufferSize.Y - 1;
1230 break;
1231 }
1232
1233 case VK_PRIOR:
1234 {
1235 Interpreted = TRUE;
1236 GuiData->dwSelectionCursor.Y -= ActiveBuffer->ViewSize.Y;
1237 if (GuiData->dwSelectionCursor.Y < 0)
1238 GuiData->dwSelectionCursor.Y = 0;
1239
1240 break;
1241 }
1242
1243 case VK_NEXT:
1244 {
1245 Interpreted = TRUE;
1246 GuiData->dwSelectionCursor.Y += ActiveBuffer->ViewSize.Y;
1247 if (GuiData->dwSelectionCursor.Y >= ActiveBuffer->ScreenBufferSize.Y)
1248 GuiData->dwSelectionCursor.Y = ActiveBuffer->ScreenBufferSize.Y - 1;
1249
1250 break;
1251 }
1252
1253 default:
1254 break;
1255 }
1256
1257 if (Interpreted)
1258 {
1259 UpdateSelection(GuiData,
1260 !MajPressed ? &GuiData->dwSelectionCursor : NULL,
1261 &GuiData->dwSelectionCursor);
1262 }
1263 else if (!IsSystemKey(VirtualKeyCode))
1264 {
1265 /* Emit an error beep sound */
1266 SendNotifyMessage(GuiData->hWindow, PM_CONSOLE_BEEP, 0, 0);
1267 }
1268
1269 goto Quit;
1270 }
1271 else
1272 {
1273 /* Mouse selection mode */
1274
1275 if (!IsSystemKey(VirtualKeyCode))
1276 {
1277 /* Clear the selection and send the key into the input buffer */
1278 UpdateSelection(GuiData, NULL, NULL);
1279 }
1280 else
1281 {
1282 goto Quit;
1283 }
1284 }
1285 }
1286
1287 if ((GuiData->Selection.dwFlags & CONSOLE_SELECTION_IN_PROGRESS) == 0)
1288 {
1289 MSG Message;
1290
1291 Message.hwnd = GuiData->hWindow;
1292 Message.message = msg;
1293 Message.wParam = wParam;
1294 Message.lParam = lParam;
1295
1297 }
1298
1299Quit:
1301}
1302
1303
1304// FIXME: Remove after fixing OnTimer
1305VOID
1307 SHORT x, SHORT y);
1308
1309static VOID
1311{
1312 PCONSRV_CONSOLE Console = GuiData->Console;
1314
1315 /* Do nothing if the window is hidden */
1316 if (!GuiData->IsWindowVisible) return;
1317
1319
1321
1322 Buff = GuiData->ActiveBuffer;
1323
1324 if (GetType(Buff) == TEXTMODE_BUFFER)
1325 {
1326 /* Repaint the caret */
1327 InvalidateCell(GuiData, Buff->CursorPosition.X, Buff->CursorPosition.Y);
1328 Buff->CursorBlinkOn = !Buff->CursorBlinkOn;
1329
1330 if ((GuiData->OldCursor.x != Buff->CursorPosition.X) ||
1331 (GuiData->OldCursor.y != Buff->CursorPosition.Y))
1332 {
1333 SCROLLINFO sInfo;
1334 int OldScrollX = -1, OldScrollY = -1;
1335 int NewScrollX = -1, NewScrollY = -1;
1336
1337 sInfo.cbSize = sizeof(sInfo);
1338 sInfo.fMask = SIF_POS;
1339 // Capture the original position of the scroll bars and save them.
1340 if (GetScrollInfo(GuiData->hWindow, SB_HORZ, &sInfo)) OldScrollX = sInfo.nPos;
1341 if (GetScrollInfo(GuiData->hWindow, SB_VERT, &sInfo)) OldScrollY = sInfo.nPos;
1342
1343 // If we successfully got the info for the horizontal scrollbar
1344 if (OldScrollX >= 0)
1345 {
1346 if ((Buff->CursorPosition.X < Buff->ViewOrigin.X) ||
1347 (Buff->CursorPosition.X >= (Buff->ViewOrigin.X + Buff->ViewSize.X)))
1348 {
1349 // Handle the horizontal scroll bar
1350 if (Buff->CursorPosition.X >= Buff->ViewSize.X)
1351 NewScrollX = Buff->CursorPosition.X - Buff->ViewSize.X + 1;
1352 else
1353 NewScrollX = 0;
1354 }
1355 else
1356 {
1357 NewScrollX = OldScrollX;
1358 }
1359 }
1360 // If we successfully got the info for the vertical scrollbar
1361 if (OldScrollY >= 0)
1362 {
1363 if ((Buff->CursorPosition.Y < Buff->ViewOrigin.Y) ||
1364 (Buff->CursorPosition.Y >= (Buff->ViewOrigin.Y + Buff->ViewSize.Y)))
1365 {
1366 // Handle the vertical scroll bar
1367 if (Buff->CursorPosition.Y >= Buff->ViewSize.Y)
1368 NewScrollY = Buff->CursorPosition.Y - Buff->ViewSize.Y + 1;
1369 else
1370 NewScrollY = 0;
1371 }
1372 else
1373 {
1374 NewScrollY = OldScrollY;
1375 }
1376 }
1377
1378 // Adjust scroll bars and refresh the window if the cursor has moved outside the visible area
1379 // NOTE: OldScroll# and NewScroll# will both be -1 (initial value) if the info for the respective scrollbar
1380 // was not obtained successfully in the previous steps. This means their difference is 0 (no scrolling)
1381 // and their associated scrollbar is left alone.
1382 if ((OldScrollX != NewScrollX) || (OldScrollY != NewScrollY))
1383 {
1384 Buff->ViewOrigin.X = NewScrollX;
1385 Buff->ViewOrigin.Y = NewScrollY;
1386 ScrollWindowEx(GuiData->hWindow,
1387 (OldScrollX - NewScrollX) * GuiData->CharWidth,
1388 (OldScrollY - NewScrollY) * GuiData->CharHeight,
1389 NULL,
1390 NULL,
1391 NULL,
1392 NULL,
1394 if (NewScrollX >= 0)
1395 {
1396 sInfo.nPos = NewScrollX;
1397 SetScrollInfo(GuiData->hWindow, SB_HORZ, &sInfo, TRUE);
1398 }
1399 if (NewScrollY >= 0)
1400 {
1401 sInfo.nPos = NewScrollY;
1402 SetScrollInfo(GuiData->hWindow, SB_VERT, &sInfo, TRUE);
1403 }
1404 UpdateWindow(GuiData->hWindow);
1405 // InvalidateRect(GuiData->hWindow, NULL, FALSE);
1406 GuiData->OldCursor.x = Buff->CursorPosition.X;
1407 GuiData->OldCursor.y = Buff->CursorPosition.Y;
1408 }
1409 }
1410 }
1411 else /* if (GetType(Buff) == GRAPHICS_BUFFER) */
1412 {
1413 }
1414
1416}
1417
1418static BOOL
1420{
1421 PCONSRV_CONSOLE Console = GuiData->Console;
1422
1424 return TRUE;
1425
1426 // TODO: Prompt for termination ? (Warn the user about possible apps running in this console)
1427
1428 /*
1429 * FIXME: Windows will wait up to 5 seconds for the thread to exit.
1430 * We shouldn't wait here, though, since the console lock is entered.
1431 * A copy of the thread list probably needs to be made.
1432 */
1434
1436 return FALSE;
1437}
1438
1439static LRESULT
1441{
1443
1444 /* Free the GuiData registration */
1446
1447 /* Reset the system menu back to default and destroy the previous menu */
1449
1450 if (GuiData)
1451 {
1452 if (GuiData->IsWindowVisible)
1454
1455 /* Free the terminal framebuffer */
1456 if (GuiData->hMemDC ) DeleteDC(GuiData->hMemDC);
1457 if (GuiData->hBitmap) DeleteObject(GuiData->hBitmap);
1458 // if (GuiData->hSysPalette) DeleteObject(GuiData->hSysPalette);
1459 DeleteFonts(GuiData);
1460 }
1461
1462 return DefWindowProcW(hWnd, WM_NCDESTROY, 0, 0);
1463}
1464
1465static VOID
1466OnScroll(PGUI_CONSOLE_DATA GuiData, INT nBar, WORD sbCode)
1467{
1468 PCONSRV_CONSOLE Console = GuiData->Console;
1470 SCROLLINFO sInfo;
1471 INT oldPos, Maximum;
1472 PSHORT pOriginXY;
1473
1474 ASSERT(nBar == SB_HORZ || nBar == SB_VERT);
1475
1477
1478 Buff = GuiData->ActiveBuffer;
1479
1480 if (nBar == SB_HORZ)
1481 {
1482 Maximum = Buff->ScreenBufferSize.X - Buff->ViewSize.X;
1483 pOriginXY = &Buff->ViewOrigin.X;
1484 }
1485 else // if (nBar == SB_VERT)
1486 {
1487 Maximum = Buff->ScreenBufferSize.Y - Buff->ViewSize.Y;
1488 pOriginXY = &Buff->ViewOrigin.Y;
1489 }
1490
1491 /* Set scrollbar sizes */
1492 sInfo.cbSize = sizeof(sInfo);
1494
1495 if (!GetScrollInfo(GuiData->hWindow, nBar, &sInfo)) goto Quit;
1496
1497 oldPos = sInfo.nPos;
1498
1499 switch (sbCode)
1500 {
1501 case SB_LINEUP: // SB_LINELEFT:
1502 sInfo.nPos--;
1503 break;
1504
1505 case SB_LINEDOWN: // SB_LINERIGHT:
1506 sInfo.nPos++;
1507 break;
1508
1509 case SB_PAGEUP: // SB_PAGELEFT:
1510 sInfo.nPos -= sInfo.nPage;
1511 break;
1512
1513 case SB_PAGEDOWN: // SB_PAGERIGHT:
1514 sInfo.nPos += sInfo.nPage;
1515 break;
1516
1517 case SB_THUMBTRACK:
1518 sInfo.nPos = sInfo.nTrackPos;
1520 break;
1521
1522 case SB_THUMBPOSITION:
1523 sInfo.nPos = sInfo.nTrackPos;
1525 break;
1526
1527 case SB_TOP: // SB_LEFT:
1528 sInfo.nPos = sInfo.nMin;
1529 break;
1530
1531 case SB_BOTTOM: // SB_RIGHT:
1532 sInfo.nPos = sInfo.nMax;
1533 break;
1534
1535 default:
1536 break;
1537 }
1538
1539 sInfo.nPos = min(max(sInfo.nPos, 0), Maximum);
1540
1541 if (oldPos != sInfo.nPos)
1542 {
1543 USHORT OldX = Buff->ViewOrigin.X;
1544 USHORT OldY = Buff->ViewOrigin.Y;
1545 UINT WidthUnit, HeightUnit;
1546
1547 /* We now modify Buff->ViewOrigin */
1548 *pOriginXY = sInfo.nPos;
1549
1550 GetScreenBufferSizeUnits(Buff, GuiData, &WidthUnit, &HeightUnit);
1551
1552 ScrollWindowEx(GuiData->hWindow,
1553 (OldX - Buff->ViewOrigin.X) * WidthUnit ,
1554 (OldY - Buff->ViewOrigin.Y) * HeightUnit,
1555 NULL,
1556 NULL,
1557 NULL,
1558 NULL,
1560
1561 sInfo.fMask = SIF_POS;
1562 SetScrollInfo(GuiData->hWindow, nBar, &sInfo, TRUE);
1563
1564 UpdateWindow(GuiData->hWindow);
1565 // InvalidateRect(GuiData->hWindow, NULL, FALSE);
1566 }
1567
1568Quit:
1570 return;
1571}
1572
1573static COORD
1575{
1577 COORD Coord;
1578 UINT WidthUnit, HeightUnit;
1579
1580 GetScreenBufferSizeUnits(Buffer, GuiData, &WidthUnit, &HeightUnit);
1581
1582 Coord.X = Buffer->ViewOrigin.X + ((SHORT)LOWORD(lParam) / (int)WidthUnit );
1583 Coord.Y = Buffer->ViewOrigin.Y + ((SHORT)HIWORD(lParam) / (int)HeightUnit);
1584
1585 /* Clip coordinate to ensure it's inside buffer */
1586 if (Coord.X < 0)
1587 Coord.X = 0;
1588 else if (Coord.X >= Buffer->ScreenBufferSize.X)
1589 Coord.X = Buffer->ScreenBufferSize.X - 1;
1590
1591 if (Coord.Y < 0)
1592 Coord.Y = 0;
1593 else if (Coord.Y >= Buffer->ScreenBufferSize.Y)
1594 Coord.Y = Buffer->ScreenBufferSize.Y - 1;
1595
1596 return Coord;
1597}
1598
1599static LRESULT
1601{
1602 BOOL DoDefault = FALSE;
1603 PCONSRV_CONSOLE Console = GuiData->Console;
1604
1605 /*
1606 * HACK FOR CORE-8394 (Part 2):
1607 *
1608 * Check whether we should ignore the next mouse move event.
1609 * In either case we reset the HACK flag.
1610 *
1611 * See Part 1 of this hack below.
1612 */
1613 if (GuiData->HackCORE8394IgnoreNextMove && msg == WM_MOUSEMOVE)
1614 {
1616 goto Quit;
1617 }
1619
1620 // FIXME: It's here that we need to check whether we have focus or not
1621 // and whether we are or not in edit mode, in order to know if we need
1622 // to deal with the mouse.
1623
1624 if (GuiData->IgnoreNextMouseEvent)
1625 {
1626 if (msg != WM_LBUTTONDOWN &&
1627 msg != WM_MBUTTONDOWN &&
1628 msg != WM_RBUTTONDOWN &&
1629 msg != WM_XBUTTONDOWN)
1630 {
1631 /*
1632 * If this mouse event is not a button-down action
1633 * then this is the last one being ignored.
1634 */
1635 GuiData->IgnoreNextMouseEvent = FALSE;
1636 }
1637 else
1638 {
1639 /*
1640 * This mouse event is a button-down action.
1641 * Ignore it and perform default action.
1642 */
1643 DoDefault = TRUE;
1644 }
1645 goto Quit;
1646 }
1647
1649 {
1650 DoDefault = TRUE;
1651 goto Quit;
1652 }
1653
1655 (Console->QuickEdit) )
1656 {
1657 switch (msg)
1658 {
1659 case WM_LBUTTONDOWN:
1660 {
1661 /* Check for selection state */
1665 {
1666 /*
1667 * A mouse selection is currently in progress and the user
1668 * has pressed the SHIFT key and clicked somewhere, update
1669 * the selection.
1670 */
1671 GuiData->dwSelectionCursor = PointToCoord(GuiData, lParam);
1672 UpdateSelection(GuiData, NULL, &GuiData->dwSelectionCursor);
1673 }
1674 else
1675 {
1676 /* Clear the old selection */
1678
1679 /* Restart a new selection */
1680 GuiData->dwSelectionCursor = PointToCoord(GuiData, lParam);
1681 SetCapture(GuiData->hWindow);
1683 UpdateSelection(GuiData,
1684 &GuiData->dwSelectionCursor,
1685 &GuiData->dwSelectionCursor);
1686 }
1687
1688 break;
1689 }
1690
1691 case WM_LBUTTONUP:
1692 {
1693 if (!(GuiData->Selection.dwFlags & CONSOLE_MOUSE_DOWN)) break;
1694
1695 // GuiData->dwSelectionCursor = PointToCoord(GuiData, lParam);
1696 GuiData->Selection.dwFlags &= ~CONSOLE_MOUSE_DOWN;
1697 // UpdateSelection(GuiData, NULL, &GuiData->dwSelectionCursor);
1699
1700 break;
1701 }
1702
1703 case WM_LBUTTONDBLCLK:
1704 {
1706
1708 {
1709#define IS_WORD_SEP(c) \
1710 ((c) == L'\0' || (c) == L' ' || (c) == L'\t' || (c) == L'\r' || (c) == L'\n')
1711
1713 COORD cL, cR;
1714 PCHAR_INFO ptrL, ptrR;
1715
1716 /* Starting point */
1717 cL = cR = PointToCoord(GuiData, lParam);
1718 ptrL = ptrR = ConioCoordToPointer(TextBuffer, cL.X, cL.Y);
1719
1720 /* Enlarge the selection by checking for whitespace */
1721 while ((0 < cL.X) && !IS_WORD_SEP(ptrL->Char.UnicodeChar)
1722 && !IS_WORD_SEP((ptrL-1)->Char.UnicodeChar))
1723 {
1724 --cL.X;
1725 --ptrL;
1726 }
1727 while ((cR.X < TextBuffer->ScreenBufferSize.X - 1) &&
1728 !IS_WORD_SEP(ptrR->Char.UnicodeChar) &&
1729 !IS_WORD_SEP((ptrR+1)->Char.UnicodeChar))
1730 {
1731 ++cR.X;
1732 ++ptrR;
1733 }
1734
1735 /*
1736 * Update the selection started with the single
1737 * left-click that preceded this double-click.
1738 */
1740 UpdateSelection(GuiData, &cL, &cR);
1741
1742 /* Ignore the next mouse move event */
1743 GuiData->IgnoreNextMouseEvent = TRUE;
1744#undef IS_WORD_SEP
1745 }
1746
1747 break;
1748 }
1749
1750 case WM_RBUTTONDOWN:
1751 case WM_RBUTTONDBLCLK:
1752 {
1754 {
1755 Paste(GuiData);
1756 }
1757 else
1758 {
1759 Copy(GuiData);
1760 }
1761
1762 /* Ignore the next mouse move event */
1763 GuiData->IgnoreNextMouseEvent = TRUE;
1764 break;
1765 }
1766
1767 case WM_MOUSEMOVE:
1768 {
1769 if (!(GET_KEYSTATE_WPARAM(wParam) & MK_LBUTTON)) break;
1770 if (!(GuiData->Selection.dwFlags & CONSOLE_MOUSE_DOWN)) break;
1771
1772 GuiData->dwSelectionCursor = PointToCoord(GuiData, lParam);
1773 UpdateSelection(GuiData, NULL, &GuiData->dwSelectionCursor);
1774 break;
1775 }
1776
1777 default:
1778 DoDefault = TRUE; // FALSE;
1779 break;
1780 }
1781
1782 /*
1783 * HACK FOR CORE-8394 (Part 1):
1784 *
1785 * It appears that when running ReactOS on VBox with Mouse Integration
1786 * enabled, the next mouse event coming after a button-down action is
1787 * a mouse-move. However it is NOT always a rule, so that we cannot use
1788 * the IgnoreNextMouseEvent flag to just "ignore" the next mouse event,
1789 * thinking it would always be a mouse-move event.
1790 *
1791 * To work around this problem (that should really be fixed in Win32k),
1792 * we use a second flag to ignore this possible next mouse move event.
1793 */
1794 switch (msg)
1795 {
1796 case WM_LBUTTONDOWN:
1797 case WM_MBUTTONDOWN:
1798 case WM_RBUTTONDOWN:
1799 case WM_XBUTTONDOWN:
1801 default:
1802 break;
1803 }
1804 }
1806 {
1807 INPUT_RECORD er;
1808 WORD wKeyState = GET_KEYSTATE_WPARAM(wParam);
1809 DWORD dwButtonState = 0;
1810 DWORD dwControlKeyState = 0;
1811 DWORD dwEventFlags = 0;
1812
1813 switch (msg)
1814 {
1815 case WM_LBUTTONDOWN:
1816 SetCapture(GuiData->hWindow);
1817 dwButtonState = FROM_LEFT_1ST_BUTTON_PRESSED;
1818 dwEventFlags = 0;
1819 break;
1820
1821 case WM_MBUTTONDOWN:
1822 SetCapture(GuiData->hWindow);
1823 dwButtonState = FROM_LEFT_2ND_BUTTON_PRESSED;
1824 dwEventFlags = 0;
1825 break;
1826
1827 case WM_RBUTTONDOWN:
1828 SetCapture(GuiData->hWindow);
1829 dwButtonState = RIGHTMOST_BUTTON_PRESSED;
1830 dwEventFlags = 0;
1831 break;
1832
1833 case WM_XBUTTONDOWN:
1834 {
1835 /* Get which X-button was pressed */
1836 WORD wButton = GET_XBUTTON_WPARAM(wParam);
1837
1838 /* Check for X-button validity */
1839 if (wButton & ~(XBUTTON1 | XBUTTON2))
1840 {
1841 DPRINT1("X-button 0x%04x invalid\n", wButton);
1842 DoDefault = TRUE;
1843 break;
1844 }
1845
1846 SetCapture(GuiData->hWindow);
1847 dwButtonState = (wButton == XBUTTON1 ? FROM_LEFT_3RD_BUTTON_PRESSED
1849 dwEventFlags = 0;
1850 break;
1851 }
1852
1853 case WM_LBUTTONUP:
1855 dwButtonState = 0;
1856 dwEventFlags = 0;
1857 break;
1858
1859 case WM_MBUTTONUP:
1861 dwButtonState = 0;
1862 dwEventFlags = 0;
1863 break;
1864
1865 case WM_RBUTTONUP:
1867 dwButtonState = 0;
1868 dwEventFlags = 0;
1869 break;
1870
1871 case WM_XBUTTONUP:
1872 {
1873 /* Get which X-button was released */
1874 WORD wButton = GET_XBUTTON_WPARAM(wParam);
1875
1876 /* Check for X-button validity */
1877 if (wButton & ~(XBUTTON1 | XBUTTON2))
1878 {
1879 DPRINT1("X-button 0x%04x invalid\n", wButton);
1880 /* Ok, just release the button anyway... */
1881 }
1882
1884 dwButtonState = 0;
1885 dwEventFlags = 0;
1886 break;
1887 }
1888
1889 case WM_LBUTTONDBLCLK:
1890 dwButtonState = FROM_LEFT_1ST_BUTTON_PRESSED;
1891 dwEventFlags = DOUBLE_CLICK;
1892 break;
1893
1894 case WM_MBUTTONDBLCLK:
1895 dwButtonState = FROM_LEFT_2ND_BUTTON_PRESSED;
1896 dwEventFlags = DOUBLE_CLICK;
1897 break;
1898
1899 case WM_RBUTTONDBLCLK:
1900 dwButtonState = RIGHTMOST_BUTTON_PRESSED;
1901 dwEventFlags = DOUBLE_CLICK;
1902 break;
1903
1904 case WM_XBUTTONDBLCLK:
1905 {
1906 /* Get which X-button was double-clicked */
1907 WORD wButton = GET_XBUTTON_WPARAM(wParam);
1908
1909 /* Check for X-button validity */
1910 if (wButton & ~(XBUTTON1 | XBUTTON2))
1911 {
1912 DPRINT1("X-button 0x%04x invalid\n", wButton);
1913 DoDefault = TRUE;
1914 break;
1915 }
1916
1917 dwButtonState = (wButton == XBUTTON1 ? FROM_LEFT_3RD_BUTTON_PRESSED
1919 dwEventFlags = DOUBLE_CLICK;
1920 break;
1921 }
1922
1923 case WM_MOUSEMOVE:
1924 dwButtonState = 0;
1925 dwEventFlags = MOUSE_MOVED;
1926 break;
1927
1928 case WM_MOUSEWHEEL:
1929 dwButtonState = GET_WHEEL_DELTA_WPARAM(wParam) << 16;
1930 dwEventFlags = MOUSE_WHEELED;
1931 break;
1932
1933 case WM_MOUSEHWHEEL:
1934 dwButtonState = GET_WHEEL_DELTA_WPARAM(wParam) << 16;
1935 dwEventFlags = MOUSE_HWHEELED;
1936 break;
1937
1938 default:
1939 DoDefault = TRUE;
1940 break;
1941 }
1942
1943 /*
1944 * HACK FOR CORE-8394 (Part 1):
1945 *
1946 * It appears that when running ReactOS on VBox with Mouse Integration
1947 * enabled, the next mouse event coming after a button-down action is
1948 * a mouse-move. However it is NOT always a rule, so that we cannot use
1949 * the IgnoreNextMouseEvent flag to just "ignore" the next mouse event,
1950 * thinking it would always be a mouse-move event.
1951 *
1952 * To work around this problem (that should really be fixed in Win32k),
1953 * we use a second flag to ignore this possible next mouse move event.
1954 */
1955 switch (msg)
1956 {
1957 case WM_LBUTTONDOWN:
1958 case WM_MBUTTONDOWN:
1959 case WM_RBUTTONDOWN:
1960 case WM_XBUTTONDOWN:
1962 default:
1963 break;
1964 }
1965
1966 if (!DoDefault)
1967 {
1968 if (wKeyState & MK_LBUTTON)
1969 dwButtonState |= FROM_LEFT_1ST_BUTTON_PRESSED;
1970 if (wKeyState & MK_MBUTTON)
1971 dwButtonState |= FROM_LEFT_2ND_BUTTON_PRESSED;
1972 if (wKeyState & MK_RBUTTON)
1973 dwButtonState |= RIGHTMOST_BUTTON_PRESSED;
1974 if (wKeyState & MK_XBUTTON1)
1975 dwButtonState |= FROM_LEFT_3RD_BUTTON_PRESSED;
1976 if (wKeyState & MK_XBUTTON2)
1977 dwButtonState |= FROM_LEFT_4TH_BUTTON_PRESSED;
1978
1980 dwControlKeyState |= RIGHT_ALT_PRESSED;
1982 dwControlKeyState |= LEFT_ALT_PRESSED;
1984 dwControlKeyState |= RIGHT_CTRL_PRESSED;
1986 dwControlKeyState |= LEFT_CTRL_PRESSED;
1988 dwControlKeyState |= SHIFT_PRESSED;
1990 dwControlKeyState |= NUMLOCK_ON;
1992 dwControlKeyState |= SCROLLLOCK_ON;
1994 dwControlKeyState |= CAPSLOCK_ON;
1995 /* See WM_CHAR MSDN documentation for instance */
1996 if (HIWORD(lParam) & KF_EXTENDED)
1997 dwControlKeyState |= ENHANCED_KEY;
1998
1999 /* Send a mouse event */
2002 er.Event.MouseEvent.dwButtonState = dwButtonState;
2003 er.Event.MouseEvent.dwControlKeyState = dwControlKeyState;
2004 er.Event.MouseEvent.dwEventFlags = dwEventFlags;
2005
2007 }
2008 }
2009 else
2010 {
2011 DoDefault = TRUE;
2012 }
2013
2015
2016Quit:
2017 if (!DoDefault)
2018 return 0;
2019
2020 if (msg == WM_MOUSEWHEEL || msg == WM_MOUSEHWHEEL)
2021 {
2022 INT nBar;
2023 WORD sbCode;
2024 // WORD wKeyState = GET_KEYSTATE_WPARAM(wParam);
2025 SHORT wDelta = GET_WHEEL_DELTA_WPARAM(wParam);
2026
2027 if (msg == WM_MOUSEWHEEL)
2028 nBar = SB_VERT;
2029 else // if (msg == WM_MOUSEHWHEEL)
2030 nBar = SB_HORZ;
2031
2032 // NOTE: We currently do not support zooming...
2033 // if (wKeyState & MK_CONTROL)
2034
2035 // FIXME: For some reason our win32k does not set the key states
2036 // when sending WM_MOUSEWHEEL or WM_MOUSEHWHEEL ...
2037 // if (wKeyState & MK_SHIFT)
2039 sbCode = (wDelta >= 0 ? SB_PAGEUP : SB_PAGEDOWN);
2040 else
2041 sbCode = (wDelta >= 0 ? SB_LINEUP : SB_LINEDOWN);
2042
2043 OnScroll(GuiData, nBar, sbCode);
2044 }
2045
2046 return DefWindowProcW(GuiData->hWindow, msg, wParam, lParam);
2047}
2048
2049
2050static VOID
2052{
2053 if (OpenClipboard(GuiData->hWindow))
2054 {
2056
2058 {
2060 }
2061 else /* if (GetType(Buffer) == GRAPHICS_BUFFER) */
2062 {
2064 }
2065
2067 }
2068
2069 /* Clear the selection */
2070 UpdateSelection(GuiData, NULL, NULL);
2071}
2072
2073static VOID
2075{
2076 if (OpenClipboard(GuiData->hWindow))
2077 {
2079
2081 {
2083 }
2084 else /* if (GetType(Buffer) == GRAPHICS_BUFFER) */
2085 {
2087 }
2088
2090 }
2091}
2092
2093static VOID
2095{
2096 PCONSRV_CONSOLE Console = GuiData->Console;
2097 PCONSOLE_SCREEN_BUFFER ActiveBuffer;
2098 DWORD windx, windy;
2099 UINT WidthUnit, HeightUnit;
2100
2102
2103 ActiveBuffer = GuiData->ActiveBuffer;
2104
2105 GetScreenBufferSizeUnits(ActiveBuffer, GuiData, &WidthUnit, &HeightUnit);
2106
2109
2110 minMaxInfo->ptMinTrackSize.x = windx;
2111 minMaxInfo->ptMinTrackSize.y = windy;
2112
2113 windx = (ActiveBuffer->ScreenBufferSize.X) * WidthUnit + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE));
2114 windy = (ActiveBuffer->ScreenBufferSize.Y) * HeightUnit + 2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION);
2115
2116 if (ActiveBuffer->ViewSize.X < ActiveBuffer->ScreenBufferSize.X) windy += GetSystemMetrics(SM_CYHSCROLL); // Window currently has a horizontal scrollbar
2117 if (ActiveBuffer->ViewSize.Y < ActiveBuffer->ScreenBufferSize.Y) windx += GetSystemMetrics(SM_CXVSCROLL); // Window currently has a vertical scrollbar
2118
2119 minMaxInfo->ptMaxTrackSize.x = windx;
2120 minMaxInfo->ptMaxTrackSize.y = windy;
2121
2123}
2124
2125static VOID
2127{
2128 PCONSRV_CONSOLE Console = GuiData->Console;
2129
2130 /* Do nothing if the window is hidden */
2131 if (!GuiData->IsWindowVisible || IsIconic(GuiData->hWindow)) return;
2132
2134
2135 if (!GuiData->WindowSizeLock &&
2137 {
2138 PCONSOLE_SCREEN_BUFFER Buff = GuiData->ActiveBuffer;
2139 DWORD windx, windy, charx, chary;
2140 UINT WidthUnit, HeightUnit;
2141
2142 GetScreenBufferSizeUnits(Buff, GuiData, &WidthUnit, &HeightUnit);
2143
2144 GuiData->WindowSizeLock = TRUE;
2145
2146 windx = LOWORD(lParam);
2147 windy = HIWORD(lParam);
2148
2149 /* Compensate for existing scroll bars (because lParam values do not accommodate scroll bar) */
2150 if (Buff->ViewSize.X < Buff->ScreenBufferSize.X) windy += GetSystemMetrics(SM_CYHSCROLL); // Window currently has a horizontal scrollbar
2151 if (Buff->ViewSize.Y < Buff->ScreenBufferSize.Y) windx += GetSystemMetrics(SM_CXVSCROLL); // Window currently has a vertical scrollbar
2152
2153 charx = windx / (int)WidthUnit ;
2154 chary = windy / (int)HeightUnit;
2155
2156 /* Character alignment (round size up or down) */
2157 if ((windx % WidthUnit ) >= (WidthUnit / 2)) ++charx;
2158 if ((windy % HeightUnit) >= (HeightUnit / 2)) ++chary;
2159
2160 /* Compensate for added scroll bars in window */
2161 if (Buff->ViewSize.X < Buff->ScreenBufferSize.X) windy -= GetSystemMetrics(SM_CYHSCROLL); // Window will have a horizontal scroll bar
2162 if (Buff->ViewSize.Y < Buff->ScreenBufferSize.Y) windx -= GetSystemMetrics(SM_CXVSCROLL); // Window will have a vertical scroll bar
2163
2164 charx = windx / (int)WidthUnit ;
2165 chary = windy / (int)HeightUnit;
2166
2167 /* Character alignment (round size up or down) */
2168 if ((windx % WidthUnit ) >= (WidthUnit / 2)) ++charx;
2169 if ((windy % HeightUnit) >= (HeightUnit / 2)) ++chary;
2170
2171 /* Resize window */
2172 if ((charx != Buff->ViewSize.X) || (chary != Buff->ViewSize.Y))
2173 {
2174 Buff->ViewSize.X = (charx <= (DWORD)Buff->ScreenBufferSize.X) ? charx : Buff->ScreenBufferSize.X;
2175 Buff->ViewSize.Y = (chary <= (DWORD)Buff->ScreenBufferSize.Y) ? chary : Buff->ScreenBufferSize.Y;
2176 }
2177
2178 ResizeConWnd(GuiData, WidthUnit, HeightUnit);
2179
2180 /* Adjust the start of the visible area if we are attempting to show nonexistent areas */
2181 if ((Buff->ScreenBufferSize.X - Buff->ViewOrigin.X) < Buff->ViewSize.X) Buff->ViewOrigin.X = Buff->ScreenBufferSize.X - Buff->ViewSize.X;
2182 if ((Buff->ScreenBufferSize.Y - Buff->ViewOrigin.Y) < Buff->ViewSize.Y) Buff->ViewOrigin.Y = Buff->ScreenBufferSize.Y - Buff->ViewSize.Y;
2183 InvalidateRect(GuiData->hWindow, NULL, TRUE);
2184
2185 GuiData->WindowSizeLock = FALSE;
2186 }
2187
2189}
2190
2191static VOID
2193{
2194 RECT rcWnd;
2195
2196 // TODO: Simplify the code.
2197 // See: GuiConsoleNotifyWndProc() PM_CREATE_CONSOLE.
2198
2199 /* Retrieve our real position */
2200 GetWindowRect(GuiData->hWindow, &rcWnd);
2201 GuiData->GuiInfo.WindowOrigin.x = rcWnd.left;
2202 GuiData->GuiInfo.WindowOrigin.y = rcWnd.top;
2203}
2204
2205static VOID
2207{
2208 LPWSTR pszPath;
2209 WCHAR szPath[MAX_PATH + 2];
2210
2211 szPath[0] = L'"';
2212
2213 DragQueryFileW(hDrop, 0, &szPath[1], ARRAYSIZE(szPath) - 1);
2214 DragFinish(hDrop);
2215
2216 if (wcschr(&szPath[1], L' ') != NULL)
2217 {
2219 pszPath = szPath;
2220 }
2221 else
2222 {
2223 pszPath = &szPath[1];
2224 }
2225
2226 PasteText(Console, pszPath, wcslen(pszPath));
2227}
2228
2229/*
2230// HACK: This functionality is standard for general scrollbars. Don't add it by hand.
2231
2232VOID
2233GuiConsoleHandleScrollbarMenu(VOID)
2234{
2235 HMENU hMenu;
2236
2237 hMenu = CreatePopupMenu();
2238 if (hMenu == NULL)
2239 {
2240 DPRINT("CreatePopupMenu failed\n");
2241 return;
2242 }
2243
2244 //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLHERE);
2245 //InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1);
2246 //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLTOP);
2247 //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLBOTTOM);
2248 //InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1);
2249 //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLPAGE_UP);
2250 //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLPAGE_DOWN);
2251 //InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1);
2252 //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLUP);
2253 //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLDOWN);
2254}
2255*/
2256
2257HBITMAP
2259{
2260 BITMAPINFO bmi;
2261 ZeroMemory(&bmi, sizeof(BITMAPINFO));
2262 bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
2263 bmi.bmiHeader.biWidth = width;
2265 bmi.bmiHeader.biPlanes = 1;
2268 return CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, NULL, NULL, 0);
2269}
2270
2271static LRESULT CALLBACK
2273{
2274 LRESULT Result = 0;
2275 PGUI_CONSOLE_DATA GuiData = NULL;
2277
2278 /*
2279 * - If it's the first time we create a window for the terminal,
2280 * just initialize it and return.
2281 *
2282 * - If we are destroying the window, just do it and return.
2283 */
2284 if (msg == WM_NCCREATE)
2285 {
2287 }
2288 else if (msg == WM_NCDESTROY)
2289 {
2290 return OnNcDestroy(hWnd);
2291 }
2292
2293 /*
2294 * Now the terminal window is initialized.
2295 * Get the terminal data via the window's data.
2296 * If there is no data, just go away.
2297 */
2298 GuiData = GuiGetGuiData(hWnd);
2299 if (GuiData == NULL) return DefWindowProcW(hWnd, msg, wParam, lParam);
2300
2301 // TEMPORARY HACK until all of the functions can deal with a NULL GuiData->ActiveBuffer ...
2302 if (GuiData->ActiveBuffer == NULL) return DefWindowProcW(hWnd, msg, wParam, lParam);
2303
2304 /*
2305 * Just retrieve a pointer to the console in case somebody needs it.
2306 * It is not NULL because it was checked in GuiGetGuiData.
2307 * Each helper function which needs the console has to validate and lock it.
2308 */
2309 Console = GuiData->Console;
2310
2311 /* We have a console, start message dispatching */
2312 switch (msg)
2313 {
2314 case WM_ACTIVATE:
2315 OnActivate(GuiData, wParam);
2316 break;
2317
2318 case WM_CLOSE:
2319 if (OnClose(GuiData)) goto Default;
2320 break;
2321
2322 case WM_ERASEBKGND:
2323 return TRUE;
2324
2325 case WM_PAINT:
2326 OnPaint(GuiData);
2327 break;
2328
2329 case WM_TIMER:
2330 OnTimer(GuiData);
2331 break;
2332
2333 case WM_PALETTECHANGED:
2334 {
2335 DPRINT("WM_PALETTECHANGED called\n");
2336
2337 /*
2338 * Protects against infinite loops:
2339 * "... A window that receives this message must not realize
2340 * its palette, unless it determines that wParam does not contain
2341 * its own window handle." (WM_PALETTECHANGED description - MSDN)
2342 *
2343 * This message is sent to all windows, including the one that
2344 * changed the system palette and caused this message to be sent.
2345 * The wParam of this message contains the handle of the window
2346 * that caused the system palette to change. To avoid an infinite
2347 * loop, care must be taken to check that the wParam of this message
2348 * does not match the window's handle.
2349 */
2350 if ((HWND)wParam == hWnd) break;
2351
2352 DPRINT("WM_PALETTECHANGED ok\n");
2353 OnPaletteChanged(GuiData);
2354 DPRINT("WM_PALETTECHANGED quit\n");
2355 break;
2356 }
2357
2358 case WM_KEYDOWN:
2359 case WM_KEYUP:
2360 case WM_CHAR:
2361 case WM_DEADCHAR:
2362 case WM_SYSKEYDOWN:
2363 case WM_SYSKEYUP:
2364 case WM_SYSCHAR:
2365 case WM_SYSDEADCHAR:
2366 {
2367 /* Detect Alt-Enter presses and switch back and forth to fullscreen mode */
2369 {
2370 /* Switch only at first Alt-Enter press, and ignore subsequent key repetitions */
2371 if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) != KF_REPEAT)
2373
2374 break;
2375 }
2376 /* Detect Alt-Esc/Space/Tab presses defer to DefWindowProc */
2377 if ( (HIWORD(lParam) & KF_ALTDOWN) && (wParam == VK_ESCAPE || wParam == VK_SPACE || wParam == VK_TAB))
2378 {
2379 return DefWindowProcW(hWnd, msg, wParam, lParam);
2380 }
2381 /* Detect Alt+Shift */
2382 if (wParam == VK_SHIFT && (msg == WM_SYSKEYDOWN || msg == WM_SYSKEYUP))
2383 {
2384 return DefWindowProcW(hWnd, msg, wParam, lParam);
2385 }
2386
2387 OnKey(GuiData, msg, wParam, lParam);
2388 break;
2389 }
2390
2391 case WM_SETCURSOR:
2392 {
2393 /* Do nothing if the window is hidden */
2394 if (!GuiData->IsWindowVisible) goto Default;
2395
2396 /*
2397 * The message was sent because we are manually triggering a change.
2398 * Check whether the mouse is indeed present on this console window
2399 * and take appropriate decisions.
2400 */
2401 if (wParam == -1 && lParam == -1)
2402 {
2403 POINT mouseCoords;
2404 HWND hWndHit;
2405
2406 /* Get the placement of the mouse */
2407 GetCursorPos(&mouseCoords);
2408
2409 /* On which window is placed the mouse ? */
2410 hWndHit = WindowFromPoint(mouseCoords);
2411
2412 /* It's our window. Perform the hit-test to be used later on. */
2413 if (hWndHit == hWnd)
2414 {
2415 wParam = (WPARAM)hWnd;
2416 lParam = DefWindowProcW(hWndHit, WM_NCHITTEST, 0,
2417 MAKELPARAM(mouseCoords.x, mouseCoords.y));
2418 }
2419 }
2420
2421 /* Set the mouse cursor only when we are in the client area */
2422 if ((HWND)wParam == hWnd && LOWORD(lParam) == HTCLIENT)
2423 {
2424 if (GuiData->MouseCursorRefCount >= 0)
2425 {
2426 /* Show the cursor */
2427 SetCursor(GuiData->hCursor);
2428 }
2429 else
2430 {
2431 /* Hide the cursor if the reference count is negative */
2432 SetCursor(NULL);
2433 }
2434 return TRUE;
2435 }
2436 else
2437 {
2438 goto Default;
2439 }
2440 }
2441
2442 case WM_LBUTTONDOWN:
2443 case WM_MBUTTONDOWN:
2444 case WM_RBUTTONDOWN:
2445 case WM_XBUTTONDOWN:
2446 case WM_LBUTTONUP:
2447 case WM_MBUTTONUP:
2448 case WM_RBUTTONUP:
2449 case WM_XBUTTONUP:
2450 case WM_LBUTTONDBLCLK:
2451 case WM_MBUTTONDBLCLK:
2452 case WM_RBUTTONDBLCLK:
2453 case WM_XBUTTONDBLCLK:
2454 case WM_MOUSEMOVE:
2455 case WM_MOUSEWHEEL:
2456 case WM_MOUSEHWHEEL:
2457 {
2458 Result = OnMouse(GuiData, msg, wParam, lParam);
2459 break;
2460 }
2461
2462 case WM_HSCROLL:
2463 OnScroll(GuiData, SB_HORZ, LOWORD(wParam));
2464 break;
2465
2466 case WM_VSCROLL:
2467 OnScroll(GuiData, SB_VERT, LOWORD(wParam));
2468 break;
2469
2470 case WM_CONTEXTMENU:
2471 {
2472 /* Do nothing if the window is hidden */
2473 if (!GuiData->IsWindowVisible) break;
2474
2475 if (DefWindowProcW(hWnd /*GuiData->hWindow*/, WM_NCHITTEST, 0, lParam) == HTCLIENT)
2476 {
2477 HMENU hMenu = CreatePopupMenu();
2478 if (hMenu != NULL)
2479 {
2481 TrackPopupMenuEx(hMenu,
2485 hWnd,
2486 NULL);
2487 DestroyMenu(hMenu);
2488 }
2489 break;
2490 }
2491 else
2492 {
2493 goto Default;
2494 }
2495 }
2496
2497 case WM_INITMENU:
2498 {
2499 HMENU hMenu = (HMENU)wParam;
2500 if (hMenu != NULL)
2501 {
2502 /* Enable or disable the Close menu item */
2505
2506 /* Enable or disable the Copy and Paste items */
2510 // FIXME: Following whether the active screen buffer is text-mode
2511 // or graphics-mode, search for CF_UNICODETEXT or CF_BITMAP formats.
2515 }
2516
2518 break;
2519 }
2520
2521 case WM_MENUSELECT:
2522 {
2523 if (HIWORD(wParam) == 0xFFFF) // Allow all the menu flags
2524 {
2526 }
2527 break;
2528 }
2529
2530 case WM_COMMAND:
2531 case WM_SYSCOMMAND:
2532 {
2533 Result = OnCommand(GuiData, wParam, lParam);
2534 break;
2535 }
2536
2537 case WM_DROPFILES:
2538 OnDropFiles(Console, (HDROP)wParam);
2539 break;
2540
2541 case WM_SETFOCUS:
2542 case WM_KILLFOCUS:
2543 OnFocus(GuiData, (msg == WM_SETFOCUS));
2544 break;
2545
2546 case WM_GETMINMAXINFO:
2548 break;
2549
2550 case WM_MOVE:
2551 OnMove(GuiData);
2552 break;
2553
2554#if 0 // This code is here to prepare & control dynamic console SB resizing.
2555 case WM_SIZING:
2556 {
2557 PRECT dragRect = (PRECT)lParam;
2558 switch (wParam)
2559 {
2560 case WMSZ_LEFT:
2561 DPRINT1("WMSZ_LEFT\n");
2562 break;
2563 case WMSZ_RIGHT:
2564 DPRINT1("WMSZ_RIGHT\n");
2565 break;
2566 case WMSZ_TOP:
2567 DPRINT1("WMSZ_TOP\n");
2568 break;
2569 case WMSZ_TOPLEFT:
2570 DPRINT1("WMSZ_TOPLEFT\n");
2571 break;
2572 case WMSZ_TOPRIGHT:
2573 DPRINT1("WMSZ_TOPRIGHT\n");
2574 break;
2575 case WMSZ_BOTTOM:
2576 DPRINT1("WMSZ_BOTTOM\n");
2577 break;
2578 case WMSZ_BOTTOMLEFT:
2579 DPRINT1("WMSZ_BOTTOMLEFT\n");
2580 break;
2581 case WMSZ_BOTTOMRIGHT:
2582 DPRINT1("WMSZ_BOTTOMRIGHT\n");
2583 break;
2584 default:
2585 DPRINT1("wParam = %d\n", wParam);
2586 break;
2587 }
2588 DPRINT1("dragRect = {.left = %d ; .top = %d ; .right = %d ; .bottom = %d}\n",
2589 dragRect->left, dragRect->top, dragRect->right, dragRect->bottom);
2590 break;
2591 }
2592#endif
2593
2594 case WM_SIZE:
2595 OnSize(GuiData, wParam, lParam);
2596 break;
2597
2598 case PM_RESIZE_TERMINAL:
2599 {
2600 PCONSOLE_SCREEN_BUFFER Buff = GuiData->ActiveBuffer;
2601 HDC hDC;
2602 HBITMAP hnew, hold;
2603
2605 UINT WidthUnit, HeightUnit;
2606
2607 /* Do nothing if the window is hidden */
2608 if (!GuiData->IsWindowVisible) break;
2609
2610 GetScreenBufferSizeUnits(Buff, GuiData, &WidthUnit, &HeightUnit);
2611
2612 Width = Buff->ScreenBufferSize.X * WidthUnit ;
2613 Height = Buff->ScreenBufferSize.Y * HeightUnit;
2614
2615 /* Recreate the framebuffer */
2616 hDC = GetDC(GuiData->hWindow);
2618 ReleaseDC(GuiData->hWindow, hDC);
2619 hold = SelectObject(GuiData->hMemDC, hnew);
2620 if (GuiData->hBitmap)
2621 {
2622 if (hold == GuiData->hBitmap) DeleteObject(GuiData->hBitmap);
2623 }
2624 GuiData->hBitmap = hnew;
2625
2626 /* Resize the window to the user's values */
2627 GuiData->WindowSizeLock = TRUE;
2628 ResizeConWnd(GuiData, WidthUnit, HeightUnit);
2629 GuiData->WindowSizeLock = FALSE;
2630 break;
2631 }
2632
2633 /*
2634 * Undocumented message sent by Windows' console.dll for applying console info.
2635 * See http://www.catch22.net/sites/default/source/files/setconsoleinfo.c
2636 * and http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf
2637 * for more information.
2638 */
2639 case WM_SETCONSOLEINFO:
2640 {
2642 break;
2643 }
2644
2645 case PM_CONSOLE_BEEP:
2646 DPRINT1("Beep\n");
2647 Beep(800, 200);
2648 break;
2649
2651 SetWindowTextW(GuiData->hWindow, GuiData->Console->Title.Buffer);
2652 break;
2653
2654 default: Default:
2656 break;
2657 }
2658
2659 return Result;
2660}
2661
2662/* EOF */
static HDC hDC
Definition: 3dtext.c:33
unsigned char BOOLEAN
CConsole Console
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char UINT32 const char BOOLEAN Begin
Definition: acpixf.h:1301
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
#define IDS_COPY
Definition: resource.h:131
#define CF_UNICODETEXT
Definition: constants.h:408
#define DPRINT1
Definition: precomp.h:8
HFONT hFont
Definition: main.c:53
@ Create
Definition: registry.c:563
#define IDS_PROPERTIES
Definition: resource.h:102
#define IDI_TERMINAL
Definition: resource.h:44
WCHAR WndClass[]
Definition: capicon.c:23
HINSTANCE hInstance
Definition: charmap.c:19
Definition: bufpool.h:45
WPARAM wParam
Definition: combotst.c:138
char TextBuffer[BUFFERLEN]
Definition: combotst.c:45
LPARAM lParam
Definition: combotst.c:139
NTSTATUS ConioProcessInputEvent(PCONSRV_CONSOLE Console, PINPUT_RECORD InputEvent)
Definition: coninput.c:201
#define PAUSED_FROM_SELECTION
Definition: conio_winsrv.h:111
#define PAUSED_FROM_SCROLLBAR
Definition: conio_winsrv.h:110
HINSTANCE ConSrvDllInstance
Definition: init.c:21
static BOOL OnNcCreate(HWND hWnd, LPCREATESTRUCTW Create)
Definition: conwnd.c:630
static COORD PointToCoord(PGUI_CONSOLE_DATA GuiData, LPARAM lParam)
Definition: conwnd.c:1574
static VOID OnGetMinMaxInfo(PGUI_CONSOLE_DATA GuiData, PMINMAXINFO minMaxInfo)
Definition: conwnd.c:2094
VOID CreateSysMenu(HWND hWnd)
Definition: conwnd.c:242
static VOID OnFocus(PGUI_CONSOLE_DATA GuiData, BOOL SetFocus)
Definition: conwnd.c:759
BOOLEAN UnRegisterConWndClass(HINSTANCE hInstance)
Definition: conwnd.c:182
static LRESULT OnNcDestroy(HWND hWnd)
Definition: conwnd.c:1440
static BOOL IsSystemKey(WORD VirtualKeyCode)
Definition: conwnd.c:1122
HCURSOR ghDefaultCursor
Definition: conwnd.c:75
#define GWLP_CONSOLE_LEADER_PID
Definition: conwnd.c:44
static VOID SelectAll(PGUI_CONSOLE_DATA GuiData)
Definition: conwnd.c:315
static VOID OnMove(PGUI_CONSOLE_DATA GuiData)
Definition: conwnd.c:2192
static VOID OnPaint(PGUI_CONSOLE_DATA GuiData)
Definition: conwnd.c:1043
static LRESULT CALLBACK ConWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: conwnd.c:2272
#define CONGUI_UPDATE_TIME
Definition: conwnd.c:35
HBITMAP CreateFrameBufferBitmap(HDC hDC, int width, int height)
Definition: conwnd.c:2258
static const GUICONSOLE_MENUITEM GuiConsoleEditMenuItems[]
Definition: conwnd.c:84
HICON ghDefaultIcon
Definition: conwnd.c:73
static VOID OnTimer(PGUI_CONSOLE_DATA GuiData)
Definition: conwnd.c:1310
VOID InvalidateCell(PGUI_CONSOLE_DATA GuiData, SHORT x, SHORT y)
Definition: guiterm.c:88
static HFONT CreateDerivedFont(HFONT OrgFont, ULONG FontWeight, BOOLEAN bUnderline, BOOLEAN bStrikeOut)
Definition: conwnd.c:492
static HRGN CreateSelectionRgn(PGUI_CONSOLE_DATA GuiData, BOOL LineSelection, PCOORD SelectionAnchor, PSMALL_RECT SmallRect)
Definition: conwnd.c:810
const COLORREF s_Colors[16]
Definition: conwnd.c:109
struct _GUICONSOLE_MENUITEM GUICONSOLE_MENUITEM
VOID SetConWndConsoleLeaderCID(IN PGUI_CONSOLE_DATA GuiData)
Definition: conwnd.c:48
static VOID Copy(PGUI_CONSOLE_DATA GuiData)
Definition: conwnd.c:2051
static VOID OnScroll(PGUI_CONSOLE_DATA GuiData, INT nBar, WORD sbCode)
Definition: conwnd.c:1466
static BOOL OnClose(PGUI_CONSOLE_DATA GuiData)
Definition: conwnd.c:1419
static VOID Mark(PGUI_CONSOLE_DATA GuiData)
Definition: conwnd.c:300
static VOID AppendMenuItems(HMENU hMenu, const GUICONSOLE_MENUITEM *Items)
Definition: conwnd.c:188
#define CURSOR_BLINK_TIME
Definition: conwnd.c:38
static VOID UpdateSelection(PGUI_CONSOLE_DATA GuiData, PCOORD SelectionAnchor OPTIONAL, PCOORD coord)
Definition: conwnd.c:920
static LRESULT OnMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: conwnd.c:1600
#define IS_WORD_SEP(c)
static PGUI_CONSOLE_DATA GuiGetGuiData(HWND hWnd)
Definition: conwnd.c:420
static VOID SendMenuEvent(PCONSRV_CONSOLE Console, UINT CmdId)
Definition: conwnd.c:274
VOID DeleteFonts(PGUI_CONSOLE_DATA GuiData)
Definition: conwnd.c:481
static VOID OnPaletteChanged(PGUI_CONSOLE_DATA GuiData)
Definition: conwnd.c:1098
static VOID OnSize(PGUI_CONSOLE_DATA GuiData, WPARAM wParam, LPARAM lParam)
Definition: conwnd.c:2126
struct _GUICONSOLE_MENUITEM * PGUICONSOLE_MENUITEM
#define GWLP_CONSOLE_LEADER_TID
Definition: conwnd.c:45
#define GWLP_CONWND_ALLOC
Definition: conwnd.c:43
static LRESULT OnCommand(PGUI_CONSOLE_DATA GuiData, WPARAM wParam, LPARAM lParam)
Definition: conwnd.c:356
static VOID PaintSelectionRect(PGUI_CONSOLE_DATA GuiData, PPAINTSTRUCT pps)
Definition: conwnd.c:900
static const GUICONSOLE_MENUITEM GuiConsoleMainMenuItems[]
Definition: conwnd.c:96
#define CONGUI_MIN_WIDTH
Definition: conwnd.c:33
VOID GetSelectionBeginEnd(PCOORD Begin, PCOORD End, PCOORD SelectionAnchor, PSMALL_RECT SmallRect)
Definition: conwnd.c:789
static VOID ResizeConWnd(PGUI_CONSOLE_DATA GuiData, DWORD WidthUnit, DWORD HeightUnit)
Definition: conwnd.c:428
static VOID OnKey(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: conwnd.c:1145
static VOID Paste(PGUI_CONSOLE_DATA GuiData)
Definition: conwnd.c:2074
#define CONGUI_MIN_HEIGHT
Definition: conwnd.c:34
static VOID OnActivate(PGUI_CONSOLE_DATA GuiData, WPARAM wParam)
Definition: conwnd.c:722
BOOLEAN RegisterConWndClass(IN HINSTANCE hInstance)
Definition: conwnd.c:136
static VOID OnDropFiles(PCONSRV_CONSOLE Console, HDROP hDrop)
Definition: conwnd.c:2206
HICON ghDefaultIconSm
Definition: conwnd.c:74
BOOL InitFonts(_Inout_ PGUI_CONSOLE_DATA GuiData, _In_reads_or_z_(LF_FACESIZE) PCWSTR FaceName, _In_ ULONG FontWeight, _In_ ULONG FontFamily, _In_ COORD FontSize, _In_opt_ UINT CodePage, _In_ BOOL UseDefaultFallback)
Definition: conwnd.c:521
#define CONGUI_UPDATE_TIMER
Definition: conwnd.c:36
#define FONT_NORMAL
Definition: conwnd.h:35
#define FONT_BOLD
Definition: conwnd.h:36
#define GUI_CONWND_CLASS
Definition: conwnd.h:15
#define PM_RESIZE_TERMINAL
Definition: conwnd.h:20
struct _GUI_CONSOLE_DATA * PGUI_CONSOLE_DATA
#define KEY_PRESSED
Definition: conwnd.h:26
#define PM_CONSOLE_SET_TITLE
Definition: conwnd.h:22
#define FONT_UNDERLINE
Definition: conwnd.h:37
#define KEY_TOGGLED
Definition: conwnd.h:25
#define PM_CONSOLE_BEEP
Definition: conwnd.h:21
BOOL WINAPI Beep(IN DWORD dwFreq, IN DWORD dwDuration)
Definition: deviceio.c:48
WORD ATOM
Definition: dimm.idl:113
#define LF_FACESIZE
Definition: dimm.idl:39
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define wcschr
Definition: compat.h:17
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
void WINAPI DragFinish(HDROP h)
Definition: shellole.c:538
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
Definition: shellole.c:622
void WINAPI DragAcceptFiles(HWND hWnd, BOOL b)
Definition: shellole.c:522
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
static const WCHAR Message[]
Definition: register.c:74
static VOID NTAPI BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
Definition: common.c:49
#define BI_RGB
Definition: precomp.h:47
#define RGB(r, g, b)
Definition: precomp.h:62
#define ERROR(name)
Definition: error_private.h:53
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
BOOL EnterFullScreen(PGUI_CONSOLE_DATA GuiData)
Definition: fullscreen.c:21
VOID LeaveFullScreen(PGUI_CONSOLE_DATA GuiData)
Definition: fullscreen.c:39
VOID GuiConsoleSwitchFullScreen(PGUI_CONSOLE_DATA GuiData)
Definition: fullscreen.c:175
pKey DeleteObject()
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint coord
Definition: glext.h:9511
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 i
Definition: glfuncs.h:248
VOID GuiApplyUserSettings(PGUI_CONSOLE_DATA GuiData, HANDLE hClientSection)
Definition: guisettings.c:258
VOID GuiConsoleShowConsoleProperties(PGUI_CONSOLE_DATA GuiData, BOOL Defaults)
Definition: guisettings.c:44
VOID GuiCopyFromTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, PGUI_CONSOLE_DATA GuiData)
Definition: text.c:306
FORCEINLINE VOID SmallRectToRect(PGUI_CONSOLE_DATA GuiData, PRECT Rect, PSMALL_RECT SmallRect)
Definition: guiterm.h:43
FORCEINLINE VOID GetScreenBufferSizeUnits(IN PCONSOLE_SCREEN_BUFFER Buffer, IN PGUI_CONSOLE_DATA GuiData, OUT PUINT WidthUnit, OUT PUINT HeightUnit)
Definition: guiterm.h:22
VOID PasteText(IN PCONSRV_CONSOLE Console, IN PWCHAR Buffer, IN SIZE_T cchSize)
Definition: text.c:238
VOID GuiPasteToTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, PGUI_CONSOLE_DATA GuiData)
Definition: text.c:339
VOID GuiPaintTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, PGUI_CONSOLE_DATA GuiData, PRECT rcView, PRECT rcFramebuffer)
Definition: text.c:433
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
@ GuiConsoleWndClassAtom
Definition: ntuser.h:1826
NTSTATUS APIENTRY NtUserConsoleControl(IN CONSOLECONTROL ConsoleCtrl, IN PVOID ConsoleCtrlInfo, IN ULONG ConsoleCtrlInfoLength)
Definition: console.c:14
short _InterlockedExchange16(_Interlocked_operand_ short volatile *_Target, short _Value)
if(dx< 0)
Definition: linetemp.h:194
#define ASSERT(a)
Definition: mode.c:44
LPCWSTR szPath
Definition: env.c:37
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:92
static HICON
Definition: imagelist.c:84
static DNS_RECORDW r3
Definition: record.c:39
static DNS_RECORDW r1
Definition: record.c:37
static DNS_RECORDW r2
Definition: record.c:38
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
#define min(a, b)
Definition: monoChain.cc:55
#define _In_reads_or_z_(size)
Definition: ms_sal.h:325
#define _Inout_
Definition: ms_sal.h:378
#define _In_
Definition: ms_sal.h:308
#define _In_opt_
Definition: ms_sal.h:309
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
unsigned int UINT
Definition: ndis.h:50
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4436
#define DWORD
Definition: nt_native.h:44
#define UNICODE_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
NTSTATUS NTAPI NtSetEvent(IN HANDLE EventHandle, OUT PLONG PreviousState OPTIONAL)
Definition: event.c:455
#define L(x)
Definition: ntvdm.h:50
#define TEXTMODE_BUFFER
Definition: pccons.c:21
#define LOWORD(l)
Definition: pedump.c:82
short SHORT
Definition: pedump.c:59
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
#define WM_CONTEXTMENU
Definition: richedit.h:64
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define IDS_PASTE
Definition: shresdef.h:231
#define DPRINT
Definition: sndvol32.h:71
& rect
Definition: startmenu.cpp:1413
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
STRSAFEAPI StringCchCopyNW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, size_t cchToCopy)
Definition: strsafe.h:236
BYTE lfStrikeOut
Definition: dimm.idl:66
LONG lfWeight
Definition: dimm.idl:63
BYTE lfUnderline
Definition: dimm.idl:65
WCHAR UnicodeChar
Definition: wincon.h:184
union _CHAR_INFO::@3275 Char
HANDLE UniqueThread
Definition: compat.h:826
HANDLE UniqueProcess
Definition: compat.h:825
PCSR_PROCESS Process
Definition: consrv.h:43
COORD CursorPosition
Definition: conio.h:71
COORD ScreenBufferSize
Definition: conio.h:62
BOOLEAN CursorBlinkOn
Definition: conio.h:72
HPALETTE PaletteHandle
Definition: conio.h:78
SMALL_RECT srSelection
Definition: wincon.h:210
UNICODE_STRING Title
Definition: conio_winsrv.h:178
Definition: bl.h:1338
ULONG Y
Definition: bl.h:1340
ULONG X
Definition: bl.h:1339
CLIENT_ID ClientId
Definition: csrsrv.h:38
COORD Size
Definition: font.h:57
ULONG Family
Definition: font.h:56
ULONG Weight
Definition: font.h:55
const struct _GUICONSOLE_MENUITEM * SubMenu
Definition: conwnd.c:80
HMENU hSysMenu
Definition: conwnd.h:76
PCONSOLE_SCREEN_BUFFER ActiveBuffer
Definition: conwnd.h:91
CONSOLE_SELECTION_INFO Selection
Definition: conwnd.h:92
HANDLE hGuiInitEvent
Definition: conwnd.h:44
BOOLEAN IsWindowVisible
Definition: conwnd.h:52
BOOL IsCloseButtonEnabled
Definition: conwnd.h:77
BOOL WindowSizeLock
Definition: conwnd.h:43
BOOL LineSelection
Definition: conwnd.h:94
BOOL HackCORE8394IgnoreNextMove
Definition: conwnd.h:74
BOOL IgnoreNextMouseEvent
Definition: conwnd.h:72
PCONSRV_CONSOLE Console
Definition: conwnd.h:90
HCURSOR hCursor
Definition: conwnd.h:70
CRITICAL_SECTION Lock
Definition: conwnd.h:42
HFONT Font[FONT_MAXNO]
Definition: conwnd.h:85
UINT CharWidth
Definition: conwnd.h:86
POINT OldCursor
Definition: conwnd.h:54
GUI_CONSOLE_INFO GuiInfo
Definition: conwnd.h:96
HBITMAP hBitmap
Definition: conwnd.h:63
HICON hIconSm
Definition: conwnd.h:67
HPALETTE hSysPalette
Definition: conwnd.h:64
UINT CharHeight
Definition: conwnd.h:87
INT MouseCursorRefCount
Definition: conwnd.h:71
COORD dwSelectionCursor
Definition: conwnd.h:93
WCHAR FaceName[LF_FACESIZE]
Definition: guisettings.h:18
MOUSE_EVENT_RECORD MouseEvent
Definition: wincon.h:276
FOCUS_EVENT_RECORD FocusEvent
Definition: wincon.h:279
union _INPUT_RECORD::@3277 Event
MENU_EVENT_RECORD MenuEvent
Definition: wincon.h:278
WORD EventType
Definition: wincon.h:273
DWORD dwControlKeyState
Definition: wincon.h:256
DWORD dwEventFlags
Definition: wincon.h:257
DWORD dwButtonState
Definition: wincon.h:255
COORD dwMousePosition
Definition: wincon.h:254
SHORT Top
Definition: wincon.h:192
SHORT Right
Definition: wincon.h:193
SHORT Left
Definition: wincon.h:191
SHORT Bottom
Definition: wincon.h:194
USHORT biBitCount
Definition: precomp.h:37
ULONG biCompression
Definition: precomp.h:38
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1476
LPWSTR dwTypeData
Definition: winuser.h:3268
POINT ptMinTrackSize
Definition: winuser.h:3629
POINT ptMaxTrackSize
Definition: winuser.h:3630
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
SHORT Right
Definition: blue.h:34
SHORT Left
Definition: blue.h:32
SHORT Top
Definition: blue.h:33
SHORT Bottom
Definition: blue.h:35
#define max(a, b)
Definition: svc.c:63
#define TermResizeTerminal(Console)
Definition: term.h:28
#define ICON_BIG
Definition: tnclass.cpp:51
#define ICON_SMALL
Definition: tnclass.cpp:48
#define GWLP_USERDATA
Definition: treelist.c:63
#define WM_MOUSEWHEEL
Definition: treelist.c:96
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint32_t DWORD_PTR
Definition: typedefs.h:65
int16_t * PSHORT
Definition: typedefs.h:55
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
Definition: font.h:89
#define CP_USA
Definition: font.h:19
_In_ HFONT _Out_ PUINT Height
Definition: font.h:88
#define PRECT
Definition: precomp.h:27
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
Definition: bitmap.c:245
HFONT CreateConsoleFontEx(_In_ LONG Height, _In_opt_ LONG Width, _Inout_updates_z_(LF_FACESIZE) PWSTR FaceName, _In_ ULONG FontWeight, _In_ ULONG FontFamily, _In_ UINT CodePage, _In_ BOOL UseDefaultFallback, _Out_ PFONT_DATA FontData)
Validates and creates a suitable console font based on the font characteristics given in input.
Definition: font.c:505
#define WM_SETCONSOLEINFO
Definition: settings.h:21
BOOLEAN NTAPI ConDrvValidateConsoleUnsafe(IN PCONSOLE Console, IN CONSOLE_STATE ExpectedState, IN BOOLEAN LockConsole)
Definition: console.c:36
PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y)
Definition: text.c:143
VOID ConioUnpause(PCONSRV_CONSOLE Console, UCHAR Flags)
Definition: console.c:866
NTSTATUS NTAPI ConSrvSetConsoleProcessFocus(IN PCONSRV_CONSOLE Console, IN BOOLEAN SetForeground)
Definition: console.c:1453
PCONSOLE_PROCESS_DATA NTAPI ConSrvGetConsoleLeaderProcess(IN PCONSRV_CONSOLE Console)
Definition: console.c:1363
NTSTATUS NTAPI ConSrvConsoleProcessCtrlEvent(IN PCONSRV_CONSOLE Console, IN ULONG ProcessGroupId, IN ULONG CtrlEvent)
Definition: console.c:1402
VOID ConioPause(PCONSRV_CONSOLE Console, UCHAR Flags)
Definition: console.c:859
VOID GuiCopyFromGraphicsBuffer(PGRAPHICS_SCREEN_BUFFER Buffer, PGUI_CONSOLE_DATA GuiData)
Definition: graphics.c:21
VOID GuiPaintGraphicsBuffer(PGRAPHICS_SCREEN_BUFFER Buffer, PGUI_CONSOLE_DATA GuiData, PRECT rcView, PRECT rcFramebuffer)
Definition: graphics.c:124
VOID GuiPasteToGraphicsBuffer(PGRAPHICS_SCREEN_BUFFER Buffer, PGUI_CONSOLE_DATA GuiData)
Definition: graphics.c:111
#define ID_SYSTEM_EDIT_COPY
Definition: resource.h:13
#define ID_SYSTEM_EDIT_PASTE
Definition: resource.h:14
#define ID_SYSTEM_DEFAULTS
Definition: resource.h:18
#define IDS_SELECT_TITLE
Definition: resource.h:32
#define IDS_EDIT
Definition: resource.h:21
#define ID_SYSTEM_EDIT_SCROLL
Definition: resource.h:16
#define IDS_MARK
Definition: resource.h:22
#define IDS_FIND
Definition: resource.h:27
#define IDS_MARK_TITLE
Definition: resource.h:31
#define IDS_SCROLL
Definition: resource.h:26
#define IDS_SELECTALL
Definition: resource.h:25
#define ID_SYSTEM_EDIT_SELECTALL
Definition: resource.h:15
#define ID_SYSTEM_EDIT_FIND
Definition: resource.h:17
#define ID_SYSTEM_EDIT_MARK
Definition: resource.h:12
#define IDS_DEFAULTS
Definition: resource.h:28
#define ID_SYSTEM_PROPERTIES
Definition: resource.h:19
VOID NTAPI ConioProcessKey(PCONSRV_CONSOLE Console, MSG *msg)
Definition: input.c:60
#define ConsoleAllocHeap(Flags, Size)
Definition: heap.h:14
#define ConsoleFreeHeap(HeapBase)
Definition: heap.h:15
#define GetConsoleInputBufferMode(Console)
Definition: conio.h:320
struct _TEXTMODE_SCREEN_BUFFER * PTEXTMODE_SCREEN_BUFFER
#define CON_SET_OUTPUT_CP(Console, CodePage)
Definition: conio.h:323
@ CONSOLE_RUNNING
Definition: conio.h:283
#define GetType(This)
Definition: conio.h:54
#define ZeroMemory
Definition: winbase.h:1712
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define CAPSLOCK_ON
Definition: wincon.h:144
#define CONSOLE_NO_SELECTION
Definition: wincon.h:102
#define DOUBLE_CLICK
Definition: wincon.h:169
#define LEFT_CTRL_PRESSED
Definition: wincon.h:140
#define SHIFT_PRESSED
Definition: wincon.h:141
#define CONSOLE_MOUSE_DOWN
Definition: wincon.h:106
#define ENABLE_MOUSE_INPUT
Definition: wincon.h:82
#define CONSOLE_MOUSE_SELECTION
Definition: wincon.h:105
#define FROM_LEFT_4TH_BUTTON_PRESSED
Definition: wincon.h:163
#define NUMLOCK_ON
Definition: wincon.h:142
#define MOUSE_EVENT
Definition: wincon.h:129
#define RIGHT_CTRL_PRESSED
Definition: wincon.h:139
#define MOUSE_MOVED
Definition: wincon.h:168
#define RIGHT_ALT_PRESSED
Definition: wincon.h:137
#define FROM_LEFT_2ND_BUTTON_PRESSED
Definition: wincon.h:161
#define ENHANCED_KEY
Definition: wincon.h:145
#define FROM_LEFT_3RD_BUTTON_PRESSED
Definition: wincon.h:162
#define MENU_EVENT
Definition: wincon.h:131
#define SCROLLLOCK_ON
Definition: wincon.h:143
#define MOUSE_HWHEELED
Definition: wincon.h:172
#define CONSOLE_SELECTION_IN_PROGRESS
Definition: wincon.h:103
#define LEFT_ALT_PRESSED
Definition: wincon.h:138
#define FROM_LEFT_1ST_BUTTON_PRESSED
Definition: wincon.h:159
#define RIGHTMOST_BUTTON_PRESSED
Definition: wincon.h:160
#define CTRL_CLOSE_EVENT
Definition: wincon.h:70
#define MOUSE_WHEELED
Definition: wincon.h:170
#define CONSOLE_SELECTION_NOT_EMPTY
Definition: wincon.h:104
#define FOCUS_EVENT
Definition: wincon.h:132
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
DWORD COLORREF
Definition: windef.h:300
HICON HCURSOR
Definition: windef.h:299
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
#define DIB_RGB_COLORS
Definition: wingdi.h:367
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
UINT WINAPI RealizePalette(_In_ HDC)
Definition: palette.c:138
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
#define FW_BOLD
Definition: wingdi.h:378
#define NULLREGION
Definition: wingdi.h:361
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
BOOL WINAPI InvertRgn(_In_ HDC, _In_ HRGN)
Definition: painting.c:229
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
int WINAPI CombineRgn(_In_opt_ HRGN hrgnDest, _In_opt_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ int fnCombineMode)
#define RGN_AND
Definition: wingdi.h:356
#define SRCCOPY
Definition: wingdi.h:333
#define RGN_XOR
Definition: wingdi.h:360
#define BITSPIXEL
Definition: wingdi.h:720
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
HRGN WINAPI CreateRectRgnIndirect(_In_ LPCRECT)
BOOL WINAPI DeleteDC(_In_ HDC)
UINT WINAPI SetSystemPaletteUse(_In_ HDC, _In_ UINT)
UINT WINAPI GetOEMCP(void)
Definition: nls.c:2322
#define WM_PAINT
Definition: winuser.h:1619
HWND WINAPI SetCapture(_In_ HWND hWnd)
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define WM_ERASEBKGND
Definition: winuser.h:1624
#define MK_RBUTTON
Definition: winuser.h:2367
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define WM_CLOSE
Definition: winuser.h:1620
#define SWP_NOACTIVATE
Definition: winuser.h:1241
#define MF_BYCOMMAND
Definition: winuser.h:202
#define WM_SYSCOMMAND
Definition: winuser.h:1740
#define SB_THUMBTRACK
Definition: winuser.h:573
#define MIIM_STRING
Definition: winuser.h:727
#define GetWindowLongPtrW
Definition: winuser.h:4828
#define VK_TAB
Definition: winuser.h:2198
#define SM_CYEDGE
Definition: winuser.h:1008
#define SB_LINEUP
Definition: winuser.h:564
#define WM_HSCROLL
Definition: winuser.h:1742
#define MAKELPARAM(l, h)
Definition: winuser.h:4007
#define WM_KEYUP
Definition: winuser.h:1715
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890
#define WMSZ_BOTTOMRIGHT
Definition: winuser.h:2470
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WMSZ_BOTTOMLEFT
Definition: winuser.h:2469
#define SM_CXEDGE
Definition: winuser.h:1007
#define IMAGE_ICON
Definition: winuser.h:212
#define WM_VSCROLL
Definition: winuser.h:1743
#define TPM_RIGHTBUTTON
Definition: winuser.h:2379
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define SIF_RANGE
Definition: winuser.h:1234
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SM_CXVSCROLL
Definition: winuser.h:960
#define VK_SPACE
Definition: winuser.h:2218
#define WM_SIZE
Definition: winuser.h:1610
#define SB_VERT
Definition: winuser.h:553
#define VK_CAPITAL
Definition: winuser.h:2205
#define WM_DROPFILES
Definition: winuser.h:1824
#define SB_BOTTOM
Definition: winuser.h:577
#define WM_LBUTTONDBLCLK
Definition: winuser.h:1777
#define SM_CXFRAME
Definition: winuser.h:993
#define SWP_NOMOVE
Definition: winuser.h:1243
#define WM_PALETTECHANGED
Definition: winuser.h:1876
#define WM_COMMAND
Definition: winuser.h:1739
#define SW_INVALIDATE
Definition: winuser.h:2578
#define MF_STRING
Definition: winuser.h:138
#define KF_ALTDOWN
Definition: winuser.h:2448
#define VK_SCROLL
Definition: winuser.h:2279
#define KF_EXTENDED
Definition: winuser.h:2445
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2172
#define IDC_ARROW
Definition: winuser.h:687
BOOL WINAPI CloseClipboard(void)
Definition: ntwrapper.h:178
#define VK_CONTROL
Definition: winuser.h:2202
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:2639
#define WM_NCHITTEST
Definition: winuser.h:1685
#define WM_RBUTTONUP
Definition: winuser.h:1779
#define WMSZ_TOP
Definition: winuser.h:2465
#define SM_CYSMICON
Definition: winuser.h:1012
BOOL WINAPI SetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
#define VK_UP
Definition: winuser.h:2224
#define WM_RBUTTONDBLCLK
Definition: winuser.h:1780
#define WM_SETFOCUS
Definition: winuser.h:1612
HCURSOR WINAPI SetCursor(_In_opt_ HCURSOR)
#define SIF_PAGE
Definition: winuser.h:1232
#define WM_MOUSEMOVE
Definition: winuser.h:1774
#define SIZE_MINIMIZED
Definition: winuser.h:2505
#define WM_INITMENU
Definition: winuser.h:1744
BOOL WINAPI OpenClipboard(_In_opt_ HWND)
#define CS_DBLCLKS
Definition: winuser.h:651
HMENU WINAPI GetSystemMenu(_In_ HWND, _In_ BOOL)
#define WM_LBUTTONDOWN
Definition: winuser.h:1775
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2074
#define VK_LCONTROL
Definition: winuser.h:2283
BOOL WINAPI TrackPopupMenuEx(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _In_ HWND, _In_opt_ LPTPMPARAMS)
#define SIF_TRACKPOS
Definition: winuser.h:1236
#define MF_POPUP
Definition: winuser.h:136
#define VK_PAUSE
Definition: winuser.h:2204
#define SM_CYFRAME
Definition: winuser.h:995
#define WMSZ_LEFT
Definition: winuser.h:2463
#define SM_CYHSCROLL
Definition: winuser.h:961
BOOL WINAPI IsIconic(_In_ HWND)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define VK_NEXT
Definition: winuser.h:2220
#define WM_NCCREATE
Definition: winuser.h:1682
#define WM_ACTIVATE
Definition: winuser.h:1611
#define VK_RCONTROL
Definition: winuser.h:2284
#define WM_RBUTTONDOWN
Definition: winuser.h:1778
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
#define WMSZ_TOPLEFT
Definition: winuser.h:2466
#define SC_MINIMIZE
Definition: winuser.h:2585
#define KF_UP
Definition: winuser.h:2450
#define SM_CXSMICON
Definition: winuser.h:1011
#define MK_MBUTTON
Definition: winuser.h:2370
#define WM_SYSCHAR
Definition: winuser.h:1720
#define VK_RETURN
Definition: winuser.h:2200
#define SM_CYICON
Definition: winuser.h:972
#define WM_SYSDEADCHAR
Definition: winuser.h:1721
#define WM_GETMINMAXINFO
Definition: winuser.h:1639
HWND WINAPI SetFocus(_In_opt_ HWND)
#define SIZE_MAXIMIZED
Definition: winuser.h:2506
#define MF_ENABLED
Definition: winuser.h:128
#define MF_SEPARATOR
Definition: winuser.h:137
BOOL WINAPI DrawMenuBar(_In_ HWND)
#define SWP_NOCOPYBITS
Definition: winuser.h:1242
#define VK_RMENU
Definition: winuser.h:2286
#define WM_TIMER
Definition: winuser.h:1741
#define VK_END
Definition: winuser.h:2221
#define VK_HOME
Definition: winuser.h:2222
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
#define WMSZ_TOPRIGHT
Definition: winuser.h:2467
BOOL WINAPI UpdateWindow(_In_ HWND)
#define SB_PAGEDOWN
Definition: winuser.h:569
ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW *)
#define HTCLIENT
Definition: winuser.h:2474
#define WM_MBUTTONDBLCLK
Definition: winuser.h:1783
#define WM_SYSKEYUP
Definition: winuser.h:1719
HDC WINAPI GetDC(_In_opt_ HWND)
BOOL WINAPI InvalidateRgn(_In_ HWND, _In_opt_ HRGN, _In_ BOOL)
#define SB_LINEDOWN
Definition: winuser.h:565
#define SC_CLOSE
Definition: winuser.h:2591
#define VK_LWIN
Definition: winuser.h:2234
#define LR_SHARED
Definition: winuser.h:1099
#define WM_LBUTTONUP
Definition: winuser.h:1776
#define WM_CHAR
Definition: winuser.h:1716
#define WA_ACTIVE
Definition: winuser.h:2622
BOOL WINAPI DestroyMenu(_In_ HMENU)
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
#define WM_MOVE
Definition: winuser.h:1609
#define WMSZ_BOTTOM
Definition: winuser.h:2468
#define VK_LEFT
Definition: winuser.h:2223
#define WM_SIZING
Definition: winuser.h:1806
#define WM_NCDESTROY
Definition: winuser.h:1683
#define VK_RIGHT
Definition: winuser.h:2225
#define SIZE_RESTORED
Definition: winuser.h:2504
#define SB_TOP
Definition: winuser.h:578
#define SIF_POS
Definition: winuser.h:1233
#define VK_DOWN
Definition: winuser.h:2226
HWND WINAPI WindowFromPoint(_In_ POINT)
#define WA_CLICKACTIVE
Definition: winuser.h:2623
#define WMSZ_RIGHT
Definition: winuser.h:2464
#define VK_NUMLOCK
Definition: winuser.h:2278
#define WM_SETCURSOR
Definition: winuser.h:1635
#define KF_REPEAT
Definition: winuser.h:2449
#define MK_LBUTTON
Definition: winuser.h:2366
struct _WNDCLASSEXW WNDCLASSEXW
#define VK_SHIFT
Definition: winuser.h:2201
#define VK_PRIOR
Definition: winuser.h:2219
int WINAPI SetScrollInfo(_In_ HWND, _In_ int, _In_ LPCSCROLLINFO, _In_ BOOL)
BOOL WINAPI UnregisterClassW(_In_ LPCWSTR, HINSTANCE)
BOOL WINAPI ShowScrollBar(_In_ HWND, _In_ int, _In_ BOOL)
#define WM_KEYDOWN
Definition: winuser.h:1714
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define SWP_NOZORDER
Definition: winuser.h:1246
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define SetWindowLongPtrW
Definition: winuser.h:5345
#define WM_MBUTTONUP
Definition: winuser.h:1782
BOOL WINAPI GetScrollInfo(_In_ HWND, _In_ int, _Inout_ LPSCROLLINFO)
#define SendNotifyMessage
Definition: winuser.h:5845
#define SM_CXICON
Definition: winuser.h:971
#define WM_MENUSELECT
Definition: winuser.h:1746
#define VK_ESCAPE
Definition: winuser.h:2213
BOOL WINAPI EnableMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
int WINAPI ScrollWindowEx(_In_ HWND, _In_ int, _In_ int, _In_opt_ LPCRECT, _In_opt_ LPCRECT, _In_opt_ HRGN, _Out_opt_ LPRECT, _In_ UINT)
#define WM_DEADCHAR
Definition: winuser.h:1717
#define WM_KILLFOCUS
Definition: winuser.h:1613
#define SM_CYCAPTION
Definition: winuser.h:962
int WINAPI GetSystemMetrics(_In_ int)
#define SB_PAGEUP
Definition: winuser.h:568
#define WM_SYSKEYDOWN
Definition: winuser.h:1718
BOOL WINAPI IsClipboardFormatAvailable(_In_ UINT)
#define WM_MBUTTONDOWN
Definition: winuser.h:1781
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define VK_RWIN
Definition: winuser.h:2235
#define SB_HORZ
Definition: winuser.h:552
SHORT WINAPI GetKeyState(_In_ int)
#define VK_LMENU
Definition: winuser.h:2285
#define VK_MENU
Definition: winuser.h:2203
BOOL WINAPI AppendMenuW(_In_ HMENU, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
#define MF_GRAYED
Definition: winuser.h:129
#define SB_THUMBPOSITION
Definition: winuser.h:572
_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
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184