various rough additions towards a working dialog

svn path=/trunk/; revision=30176
This commit is contained in:
Ged Murphy 2007-11-05 14:39:24 +00:00
parent 64ee2581fe
commit 6833d9e227
5 changed files with 448 additions and 190 deletions

View file

@ -1,4 +1,4 @@
/* -*- c-basic-offset: 8 -*- /*
rdesktop: A Remote Desktop Protocol client. rdesktop: A Remote Desktop Protocol client.
Connection settings dialog Connection settings dialog
Copyright (C) Ged Murphy 2007 Copyright (C) Ged Murphy 2007
@ -20,10 +20,48 @@
#include <windows.h> #include <windows.h>
#include <commctrl.h> #include <commctrl.h>
#include <stdio.h>
#include <tchar.h>
#include "resource.h" #include "resource.h"
/* As slider control can't contain user data, we have to keep an
* array of RESOLUTION_INFO to have our own associated data.
*/
typedef struct _RESOLUTION_INFO
{
DWORD dmPelsWidth;
DWORD dmPelsHeight;
} RESOLUTION_INFO, *PRESOLUTION_INFO;
typedef struct _SETTINGS_ENTRY
{
struct _SETTINGS_ENTRY *Blink;
struct _SETTINGS_ENTRY *Flink;
DWORD dmBitsPerPel;
DWORD dmPelsWidth;
DWORD dmPelsHeight;
} SETTINGS_ENTRY, *PSETTINGS_ENTRY;
typedef struct _DISPLAY_DEVICE_ENTRY
{
struct _DISPLAY_DEVICE_ENTRY *Flink;
LPTSTR DeviceDescription;
LPTSTR DeviceName;
LPTSTR DeviceKey;
LPTSTR DeviceID;
DWORD DeviceStateFlags;
PSETTINGS_ENTRY Settings; /* sorted by increasing dmPelsHeight, BPP */
DWORD SettingsCount;
PRESOLUTION_INFO Resolutions;
DWORD ResolutionsCount;
PSETTINGS_ENTRY CurrentSettings; /* Points into Settings list */
SETTINGS_ENTRY InitialSettings;
} DISPLAY_DEVICE_ENTRY, *PDISPLAY_DEVICE_ENTRY;
typedef struct _INFO typedef struct _INFO
{ {
PDISPLAY_DEVICE_ENTRY DisplayDeviceList;
PDISPLAY_DEVICE_ENTRY CurrentDisplayDevice;
HWND hSelf; HWND hSelf;
HWND hTab; HWND hTab;
HWND hGeneralPage; HWND hGeneralPage;
@ -65,7 +103,7 @@ GeneralOnInit(PINFO pInfo)
SetWindowPos(pInfo->hGeneralPage, SetWindowPos(pInfo->hGeneralPage,
NULL, NULL,
15, 15,
122, 110,
0, 0,
0, 0,
SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER); SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
@ -138,13 +176,326 @@ GeneralDlgProc(HWND hDlg,
} }
static PSETTINGS_ENTRY
GetPossibleSettings(IN LPCTSTR DeviceName, OUT DWORD* pSettingsCount, OUT PSETTINGS_ENTRY* CurrentSettings)
{
DEVMODE devmode;
DWORD NbSettings = 0;
DWORD iMode = 0;
DWORD dwFlags = 0;
PSETTINGS_ENTRY Settings = NULL;
HDC hDC;
PSETTINGS_ENTRY Current;
DWORD bpp, xres, yres, checkbpp;
DWORD curDispFreq;
/* Get current settings */
*CurrentSettings = NULL;
hDC = CreateIC(NULL, DeviceName, NULL, NULL);
bpp = GetDeviceCaps(hDC, PLANES);
bpp *= GetDeviceCaps(hDC, BITSPIXEL);
xres = GetDeviceCaps(hDC, HORZRES);
yres = GetDeviceCaps(hDC, VERTRES);
DeleteDC(hDC);
/* List all settings */
devmode.dmSize = (WORD)sizeof(DEVMODE);
devmode.dmDriverExtra = 0;
if (!EnumDisplaySettingsEx(DeviceName, ENUM_CURRENT_SETTINGS, &devmode, dwFlags))
return NULL;
curDispFreq = devmode.dmDisplayFrequency;
while (EnumDisplaySettingsEx(DeviceName, iMode, &devmode, dwFlags))
{
if ((devmode.dmBitsPerPel==8 ||
devmode.dmBitsPerPel==16 ||
devmode.dmBitsPerPel==24 ||
devmode.dmBitsPerPel==32) &&
devmode.dmDisplayFrequency==curDispFreq)
{
checkbpp=1;
}
else
checkbpp=0;
if (devmode.dmPelsWidth < 640 ||
devmode.dmPelsHeight < 480 || checkbpp == 0)
{
iMode++;
continue;
}
Current = HeapAlloc(GetProcessHeap(), 0, sizeof(SETTINGS_ENTRY));
if (Current != NULL)
{
/* Sort resolutions by increasing height, and BPP */
PSETTINGS_ENTRY Previous = NULL;
PSETTINGS_ENTRY Next = Settings;
Current->dmPelsWidth = devmode.dmPelsWidth;
Current->dmPelsHeight = devmode.dmPelsHeight;
Current->dmBitsPerPel = devmode.dmBitsPerPel;
while (Next != NULL && (
Next->dmPelsWidth < Current->dmPelsWidth ||
(Next->dmPelsWidth == Current->dmPelsWidth && Next->dmPelsHeight < Current->dmPelsHeight) ||
(Next->dmPelsHeight == Current->dmPelsHeight &&
Next->dmPelsWidth == Current->dmPelsWidth &&
Next->dmBitsPerPel < Current->dmBitsPerPel )))
{
Previous = Next;
Next = Next->Flink;
}
Current->Blink = Previous;
Current->Flink = Next;
if (Previous == NULL)
Settings = Current;
else
Previous->Flink = Current;
if (Next != NULL)
Next->Blink = Current;
if (devmode.dmPelsWidth == xres && devmode.dmPelsHeight == yres && devmode.dmBitsPerPel == bpp)
{
*CurrentSettings = Current;
}
NbSettings++;
}
iMode++;
}
*pSettingsCount = NbSettings;
return Settings;
}
AddDisplayDevice(PINFO pInfo, PDISPLAY_DEVICE DisplayDevice)
{
PDISPLAY_DEVICE_ENTRY newEntry = NULL;
LPTSTR description = NULL;
LPTSTR name = NULL;
LPTSTR key = NULL;
LPTSTR devid = NULL;
DWORD descriptionSize, nameSize, keySize, devidSize;
PSETTINGS_ENTRY Current;
DWORD ResolutionsCount = 1;
DWORD i;
newEntry = HeapAlloc(GetProcessHeap(),
0,
sizeof(DISPLAY_DEVICE_ENTRY));
if (!newEntry) goto ByeBye;
ZeroMemory(newEntry, sizeof(DISPLAY_DEVICE_ENTRY));
newEntry->Settings = GetPossibleSettings(DisplayDevice->DeviceName,
&newEntry->SettingsCount,
&newEntry->CurrentSettings);
if (!newEntry->Settings) goto ByeBye;
newEntry->InitialSettings.dmPelsWidth = newEntry->CurrentSettings->dmPelsWidth;
newEntry->InitialSettings.dmPelsHeight = newEntry->CurrentSettings->dmPelsHeight;
newEntry->InitialSettings.dmBitsPerPel = newEntry->CurrentSettings->dmBitsPerPel;
/* Count different resolutions */
for (Current = newEntry->Settings; Current != NULL; Current = Current->Flink)
{
if (Current->Flink != NULL &&
((Current->dmPelsWidth != Current->Flink->dmPelsWidth) &&
(Current->dmPelsHeight != Current->Flink->dmPelsHeight)))
{
ResolutionsCount++;
}
}
newEntry->Resolutions = HeapAlloc(GetProcessHeap(),
0,
ResolutionsCount * sizeof(RESOLUTION_INFO));
if (!newEntry->Resolutions) goto ByeBye;
newEntry->ResolutionsCount = ResolutionsCount;
/* Fill resolutions infos */
for (Current = newEntry->Settings, i = 0; Current != NULL; Current = Current->Flink)
{
if (Current->Flink == NULL ||
(Current->Flink != NULL &&
((Current->dmPelsWidth != Current->Flink->dmPelsWidth) &&
(Current->dmPelsHeight != Current->Flink->dmPelsHeight))))
{
newEntry->Resolutions[i].dmPelsWidth = Current->dmPelsWidth;
newEntry->Resolutions[i].dmPelsHeight = Current->dmPelsHeight;
i++;
}
}
descriptionSize = (_tcslen(DisplayDevice->DeviceString) + 1) * sizeof(TCHAR);
description = HeapAlloc(GetProcessHeap(), 0, descriptionSize);
if (!description) goto ByeBye;
nameSize = (_tcslen(DisplayDevice->DeviceName) + 1) * sizeof(TCHAR);
name = HeapAlloc(GetProcessHeap(), 0, nameSize);
if (!name) goto ByeBye;
keySize = (_tcslen(DisplayDevice->DeviceKey) + 1) * sizeof(TCHAR);
key = HeapAlloc(GetProcessHeap(), 0, keySize);
if (!key) goto ByeBye;
devidSize = (_tcslen(DisplayDevice->DeviceID) + 1) * sizeof(TCHAR);
devid = HeapAlloc(GetProcessHeap(), 0, devidSize);
if (!devid) goto ByeBye;
memcpy(description, DisplayDevice->DeviceString, descriptionSize);
memcpy(name, DisplayDevice->DeviceName, nameSize);
memcpy(key, DisplayDevice->DeviceKey, keySize);
memcpy(devid, DisplayDevice->DeviceID, devidSize);
newEntry->DeviceDescription = description;
newEntry->DeviceName = name;
newEntry->DeviceKey = key;
newEntry->DeviceID = devid;
newEntry->DeviceStateFlags = DisplayDevice->StateFlags;
newEntry->Flink = pInfo->DisplayDeviceList;
pInfo->DisplayDeviceList = newEntry;
return TRUE;
ByeBye:
if (newEntry != NULL)
{
if (newEntry->Settings != NULL)
{
Current = newEntry->Settings;
while (Current != NULL)
{
PSETTINGS_ENTRY Next = Current->Flink;
HeapFree(GetProcessHeap(), 0, Current);
Current = Next;
}
}
if (newEntry->Resolutions != NULL)
HeapFree(GetProcessHeap(), 0, newEntry->Resolutions);
HeapFree(GetProcessHeap(), 0, newEntry);
}
if (description != NULL)
HeapFree(GetProcessHeap(), 0, description);
if (name != NULL)
HeapFree(GetProcessHeap(), 0, name);
if (key != NULL)
HeapFree(GetProcessHeap(), 0, key);
if (devid != NULL)
HeapFree(GetProcessHeap(), 0, devid);
return FALSE;
}
static VOID
UpdateDisplay(IN HWND hwndDlg, PINFO pGlobalData, IN BOOL bUpdateThumb)
{
TCHAR Buffer[64];
TCHAR Pixel[64];
DWORD index;
LoadString(hInst, IDS_PIXEL, Pixel, sizeof(Pixel) / sizeof(TCHAR));
_stprintf(Buffer, Pixel, pGlobalData->CurrentDisplayDevice->CurrentSettings->dmPelsWidth, pGlobalData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight, Pixel);
//SendDlgItemMessage(pGlobalData->hDisplayPage, IDC_SETTINGS_RESOLUTION_TEXT, WM_SETTEXT, 0, (LPARAM)Buffer);
SetDlgItemText(pGlobalData->hDisplayPage, pGlobalData->hDisplayPage, Buffer);
if (LoadString(hInst, (2900 + pGlobalData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel), Buffer, sizeof(Buffer) / sizeof(TCHAR)))
SendDlgItemMessage(hwndDlg, IDC_GEOSLIDER, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)Buffer);
}
static VOID
FillResolutionsAndColors(PINFO pInfo)
{
PSETTINGS_ENTRY Current;
DWORD index, i, num;
DWORD MaxBpp = 0;
UINT HighBpp;
pInfo->CurrentDisplayDevice = pInfo->DisplayDeviceList; /* Update global variable */
/* find max bpp */
SendDlgItemMessage(pInfo->hDisplayPage,
IDC_BPPCOMBO,
CB_RESETCONTENT,
0,
0);
for (Current = pInfo->DisplayDeviceList->Settings; Current != NULL; Current = Current->Flink)
{
if (Current->dmBitsPerPel > MaxBpp)
MaxBpp = Current->dmBitsPerPel;
}
switch (MaxBpp)
{
case 32:
case 24: HighBpp = IDS_HIGHCOLOR24; break;
case 16: HighBpp = IDS_HIGHCOLOR16; break;
case 8: HighBpp = IDS_256COLORS; break;
}
/* Fill color depths combo box */
SendDlgItemMessage(pInfo->hDisplayPage,
IDC_BPPCOMBO,
CB_RESETCONTENT,
0,
0);
num = HighBpp - IDS_256COLORS;
for (i = 0, Current = pInfo->DisplayDeviceList->Settings;
i <= num && Current != NULL;
i++, Current = Current->Flink)
{
TCHAR Buffer[64];
if (LoadString(hInst,
(IDS_256COLORS + i),
Buffer,
sizeof(Buffer) / sizeof(TCHAR)))
{
index = (DWORD)SendDlgItemMessage(pInfo->hDisplayPage,
IDC_BPPCOMBO,
CB_FINDSTRINGEXACT,
-1,
(LPARAM)Buffer);
if (index == (DWORD)CB_ERR)
{
index = (DWORD)SendDlgItemMessage(pInfo->hDisplayPage,
IDC_BPPCOMBO,
CB_ADDSTRING,
0,
(LPARAM)Buffer);
SendDlgItemMessage(pInfo->hDisplayPage,
IDC_BPPCOMBO,
CB_SETITEMDATA,
index,
Current->dmBitsPerPel);
}
}
}
/* Fill resolutions slider */
SendDlgItemMessage(pInfo->hDisplayPage,
IDC_GEOSLIDER,
TBM_CLEARTICS,
TRUE,
0);
SendDlgItemMessage(pInfo->hDisplayPage,
IDC_GEOSLIDER,
TBM_SETRANGE,
TRUE,
MAKELONG(0, pInfo->DisplayDeviceList->ResolutionsCount)); //extra 1 for full screen
UpdateDisplay(pInfo->hDisplayPage, pInfo, TRUE);
}
static VOID static VOID
DisplayOnInit(PINFO pInfo) DisplayOnInit(PINFO pInfo)
{ {
DISPLAY_DEVICE displayDevice;
DWORD iDevNum = 0;
BOOL GotDev = FALSE;
SetWindowPos(pInfo->hDisplayPage, SetWindowPos(pInfo->hDisplayPage,
NULL, NULL,
15, 15,
122, 110,
0, 0,
0, 0,
SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER); SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
@ -191,6 +542,21 @@ DisplayOnInit(PINFO pInfo)
sizeof(BITMAP), sizeof(BITMAP),
&pInfo->bitmap); &pInfo->bitmap);
} }
/* Get video cards list */
displayDevice.cb = (DWORD)sizeof(DISPLAY_DEVICE);
while (EnumDisplayDevices(NULL, iDevNum, &displayDevice, 0x1))
{
if ((displayDevice.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) != 0)
{
if (AddDisplayDevice(pInfo, &displayDevice))
GotDev = TRUE;
}
iDevNum++;
}
if (GotDev)
FillResolutionsAndColors(pInfo);
} }
@ -238,6 +604,32 @@ DisplayDlgProc(HWND hDlg,
break; break;
} }
case WM_HSCROLL:
{
switch (LOWORD(wParam))
{
case TB_LINEUP:
case TB_LINEDOWN:
case TB_PAGEUP:
case TB_PAGEDOWN:
case TB_TOP:
case TB_BOTTOM:
case TB_ENDTRACK:
{
DWORD newPosition = (DWORD)SendDlgItemMessage(hDlg, IDC_GEOSLIDER, TBM_GETPOS, 0, 0);
//OnResolutionChanged(hwndDlg, pGlobalData, newPosition, TRUE);
UpdateDisplay(hDlg, pInfo, TRUE);
break;
}
case TB_THUMBTRACK:
//OnResolutionChanged(hDlg, pInfo, HIWORD(wParam), FALSE);
UpdateDisplay(hDlg, pInfo, TRUE);
break;
}
break;
}
case WM_CLOSE: case WM_CLOSE:
{ {
if (pInfo->hRemote) if (pInfo->hRemote)

View file

@ -27,22 +27,23 @@ BEGIN
ICON "", IDC_REMICON, 15,19,20,20 ICON "", IDC_REMICON, 15,19,20,20
ICON "", IDC_COLORSICON, 15,98,20,20 ICON "", IDC_COLORSICON, 15,98,20,20
LTEXT "Set the screen size of your remote desktop. Drag the slider to the far right to go fullscreen",IDC_STATIC,53,22,175,21 LTEXT "Set the screen size of your remote desktop. Drag the slider to the far right to go fullscreen",IDC_STATIC,53,22,175,21
CONTROL "",IDC_GEOSLIDER,"msctls_trackbar32",WS_TABSTOP,56,49,124,15 CONTROL "", IDC_GEOSLIDER, "msctls_trackbar32", TBS_AUTOTICKS | WS_TABSTOP, 56, 42, 124, 17
COMBOBOX IDC_BPPCOMBO,56,102,128,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_BPPCOMBO,56,102,128,80, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_COLORIMAGE,"Static",SS_OWNERDRAW | SS_SUNKEN, 56,121,127,13 CONTROL "",IDC_COLORIMAGE,"Static",SS_OWNERDRAW | SS_SUNKEN, 56,121,127,10
LTEXT "Note: Settings on the remote computer might override this setting.",IDC_STATIC,56,143,165,18 LTEXT "Note: Settings on the remote computer might override this setting.",IDC_STATIC,56,143,165,18
LTEXT "Less",IDC_STATIC,35,52,15,8 LTEXT "Less",IDC_STATIC,35,42,15,8
LTEXT "More",IDC_STATIC,189,51,17,8 LTEXT "More",IDC_STATIC,189,42,17,8
LTEXT "", IDC_SETTINGS_RESOLUTION_TEXT, 56, 62, 124, 10, SS_CENTER
END END
IDD_CONNECTDIALOG DIALOGEX 0, 0, 260, 277 IDD_CONNECTDIALOG DIALOGEX 0, 0, 260, 267
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Remote Desktop Connection" CAPTION "Remote Desktop Connection"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Connect",IDOK,147,256,50,14 DEFPUSHBUTTON "Connect",IDOK,147,249,50,14
PUSHBUTTON "Cancel",IDCANCEL,203,256,50,14 PUSHBUTTON "Cancel",IDCANCEL,203,249,50,14
CONTROL "",IDC_TAB,"SysTabControl32",0x0,7,54,246,198 CONTROL "",IDC_TAB,"SysTabControl32",0x0,7,54,246,190
END END
@ -50,4 +51,10 @@ STRINGTABLE
BEGIN BEGIN
IDS_TAB_GENERAL "General" IDS_TAB_GENERAL "General"
IDS_TAB_DISPLAY "Display" IDS_TAB_DISPLAY "Display"
IDS_256COLORS "256 Colors"
IDS_HIGHCOLOR15 "High Color (15 bit)"
IDS_HIGHCOLOR16 "High Color (16 bit)"
IDS_HIGHCOLOR24 "True Color (24 bit)"
IDS_PIXEL "%lux%lu Pixels"
IDS_FULLSCREEN "Full Screen"
END END

View file

@ -1,6 +1,7 @@
#define IDC_STATIC -1
#define IDD_CONNECTDIALOG 101 #define IDD_CONNECTDIALOG 101
#define IDD_GENERAL 105 #define IDD_GENERAL 105
#define IDS_TAB_DISPLAY 106
#define IDD_DISPLAY 107 #define IDD_DISPLAY 107
#define IDC_TAB 1003 #define IDC_TAB 1003
#define IDC_SERVERCOMBO 1007 #define IDC_SERVERCOMBO 1007
@ -9,6 +10,7 @@
#define IDC_OPEN 1010 #define IDC_OPEN 1010
#define IDC_GEOSLIDER 1012 #define IDC_GEOSLIDER 1012
#define IDC_BPPCOMBO 1013 #define IDC_BPPCOMBO 1013
#define IDC_SETTINGS_RESOLUTION_TEXT 1014
#define IDC_LOGONICON 1016 #define IDC_LOGONICON 1016
#define IDC_CONNICON 1017 #define IDC_CONNICON 1017
@ -19,10 +21,19 @@
#define IDB_SPECT 1017 #define IDB_SPECT 1017
#define IDC_COLORIMAGE 1018 #define IDC_COLORIMAGE 1018
#define IDS_TAB_GENERAL 1104
#define IDC_STATIC -1
#define IDI_LOGON 2000 #define IDI_LOGON 2000
#define IDI_CONN 2001 #define IDI_CONN 2001
#define IDI_REMOTE 2002 #define IDI_REMOTE 2002
#define IDI_COLORS 2003 #define IDI_COLORS 2003
#define IDI_MSTSC 2004
#define IDS_TAB_DISPLAY 3000
#define IDS_TAB_GENERAL 3001
#define IDS_PIXEL 3006
#define IDS_FULLSCREEN 3007
#define IDS_256COLORS 4000
#define IDS_HIGHCOLOR15 4001
#define IDS_HIGHCOLOR16 4002
#define IDS_HIGHCOLOR24 4003

View file

@ -3,8 +3,9 @@
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
//1 24 DISCARDABLE "manifest.xml" 1 24 DISCARDABLE "manifest.xml"
IDI_MSTSC ICON "res/mstsc.ico"
IDI_LOGON ICON "res/logon.ico" IDI_LOGON ICON "res/logon.ico"
IDI_CONN ICON "res/connection.ico" IDI_CONN ICON "res/connection.ico"
IDI_REMOTE ICON "res/remote.ico" IDI_REMOTE ICON "res/remote.ico"

View file

@ -18,18 +18,12 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#ifdef _WIN32_WCE
#define MYWINCE
#endif
#include <winsock2.h> /* winsock2.h first */ #include <winsock2.h> /* winsock2.h first */
#include <windows.h> #include <windows.h>
#ifdef MYWINCE
#include <aygshell.h> /* aygshell.lib */
#endif /* MYWINCE */
#include <winuser.h> #include <winuser.h>
#include <stdio.h> #include <stdio.h>
#include "uimain.h" #include "uimain.h"
#include "resource.h"
extern char g_username[]; extern char g_username[];
extern char g_hostname[]; extern char g_hostname[];
@ -69,9 +63,6 @@ static int g_clip_right = 800;
static int g_clip_bottom = 600; static int g_clip_bottom = 600;
static RECT g_wnd_clip; /* this client area of whats actually visable */ static RECT g_wnd_clip; /* this client area of whats actually visable */
/* set from WM_SIZE */ /* set from WM_SIZE */
#ifdef MYWINCE
static int g_sip_up = 0;
#endif
/*****************************************************************************/ /*****************************************************************************/
static void static void
@ -665,79 +656,6 @@ handle_WM_VSCROLL(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
return 0; return 0;
} }
#ifdef MYWINCE
/*****************************************************************************/
static LRESULT
handle_WM_SETTINGCHANGE(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
SIPINFO si;
SHMENUBARINFO mb;
int x;
int y;
int w;
int h;
int style;
ZeroMemory(&si, sizeof(SIPINFO));
si.cbSize = sizeof(SIPINFO);
SHSipInfo(SPI_GETSIPINFO, lParam, &si, 0);
x = si.rcVisibleDesktop.left;
y = si.rcVisibleDesktop.top;
w = si.rcVisibleDesktop.right - x;
h = si.rcVisibleDesktop.bottom - y;
/* get rid of menu */
DestroyWindow(SHFindMenuBar(g_Wnd));
if (si.fdwFlags & SIPF_ON)
{
g_sip_up = 1; /* used for WM_SETFOCUS */
ZeroMemory(&mb, sizeof(SHMENUBARINFO));
mb.cbSize = sizeof(SHMENUBARINFO);
mb.hwndParent = g_Wnd;
mb.dwFlags = SHCMBF_EMPTYBAR;
SHCreateMenuBar(&mb);
MoveWindow(g_Wnd, x, y, w, h, FALSE);
SHFullScreen(g_Wnd, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON |
SHFS_SHOWSTARTICON);
}
else
{
g_sip_up = 0;
if (g_fullscreen)
{
MoveWindow(g_Wnd, 0, 0, g_screen_width, g_screen_height, FALSE);
}
else
{
MoveWindow(g_Wnd, x, y, w, h, FALSE);
}
if ((g_fullscreen && g_width <= g_screen_width &&
g_height <= g_screen_height) ||
(!g_fullscreen && g_width <= w && g_height <= h))
{
style = GetWindowLong(g_Wnd, GWL_STYLE);
if (style & WS_HSCROLL)
{
style &= ~WS_HSCROLL;
style &= ~WS_VSCROLL;
SetWindowLong(g_Wnd, GWL_STYLE, style);
g_xscroll = 0;
g_yscroll = 0;
}
}
if (g_fullscreen)
{
SHFullScreen(g_Wnd, SHFS_HIDETASKBAR | SHFS_SHOWSIPBUTTON |
SHFS_SHOWSTARTICON);
}
else
{
SHFullScreen(g_Wnd, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON |
SHFS_SHOWSTARTICON);
}
}
return 0;
}
#endif /* MYWINCE */
/*****************************************************************************/ /*****************************************************************************/
LRESULT CALLBACK LRESULT CALLBACK
@ -793,18 +711,8 @@ WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
return handle_WM_HSCROLL(hWnd, message, wParam, lParam); return handle_WM_HSCROLL(hWnd, message, wParam, lParam);
case WM_VSCROLL: case WM_VSCROLL:
return handle_WM_VSCROLL(hWnd, message, wParam, lParam); return handle_WM_VSCROLL(hWnd, message, wParam, lParam);
#ifdef MYWINCE
case WM_SETTINGCHANGE:
return handle_WM_SETTINGCHANGE(hWnd, message, wParam, lParam);
#endif /* MYWINCE */
case WM_SETFOCUS: case WM_SETFOCUS:
mi_check_modifier(); mi_check_modifier();
#ifdef MYWINCE
if (g_sip_up)
{
SHSipPreference(hWnd, SIP_UP);
}
#endif
return DefWindowProc(hWnd, message, wParam, lParam); return DefWindowProc(hWnd, message, wParam, lParam);
default: default:
return DefWindowProc(hWnd, message, wParam, lParam); return DefWindowProc(hWnd, message, wParam, lParam);
@ -854,6 +762,8 @@ mi_create_window(void)
str_to_uni(classname, "rdesktop"); str_to_uni(classname, "rdesktop");
wc.lpszClassName = classname; wc.lpszClassName = classname;
str_to_uni(caption, "ReactOS Remote Desktop"); str_to_uni(caption, "ReactOS Remote Desktop");
wc.hIcon = LoadIcon(g_Instance,
MAKEINTRESOURCE(IDI_MSTSC));
/* Register the window class. */ /* Register the window class. */
if (!RegisterClass(&wc)) if (!RegisterClass(&wc))
{ {
@ -863,21 +773,7 @@ mi_create_window(void)
rc.right = rc.left + UI_MIN(g_width, g_screen_width); rc.right = rc.left + UI_MIN(g_width, g_screen_width);
rc.top = 0; rc.top = 0;
rc.bottom = rc.top + UI_MIN(g_height, g_screen_height); rc.bottom = rc.top + UI_MIN(g_height, g_screen_height);
#ifdef MYWINCE
SHInitExtraControls();
x = CW_USEDEFAULT;
y = CW_USEDEFAULT;
w = CW_USEDEFAULT;
h = CW_USEDEFAULT;
style = WS_VISIBLE;
if (g_fullscreen)
{
x = 0;
y = 0;
w = g_screen_width;
h = g_screen_height;
}
#else /* MYWINCE */
if (g_fullscreen) if (g_fullscreen)
{ {
style = WS_POPUP; style = WS_POPUP;
@ -896,7 +792,7 @@ mi_create_window(void)
y = CW_USEDEFAULT; y = CW_USEDEFAULT;
w = rc.right - rc.left; w = rc.right - rc.left;
h = rc.bottom - rc.top; h = rc.bottom - rc.top;
#endif /* MYWINCE */
g_Wnd = CreateWindow(wc.lpszClassName, caption, g_Wnd = CreateWindow(wc.lpszClassName, caption,
style, x, y, w, h, style, x, y, w, h,
(HWND) NULL, (HMENU) NULL, g_Instance, (HWND) NULL, (HMENU) NULL, g_Instance,
@ -915,26 +811,9 @@ mi_create_window(void)
} }
UpdateWindow(g_Wnd); UpdateWindow(g_Wnd);
#ifdef MYWINCE
if (g_fullscreen)
{
SHFullScreen(g_Wnd, SHFS_HIDETASKBAR | SHFS_SHOWSIPBUTTON |
SHFS_SHOWSTARTICON);
}
else
{
SHFullScreen(g_Wnd, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON |
SHFS_SHOWSTARTICON);
}
#endif /* MYWINCE */
/* WinCE doesn't have WSAAsyncSelect */
#ifdef MYWINCE
SetTimer(g_Wnd, 1, 1000 / 60, 0); /* 60 per second */
#else /* MYWINCE */
WSAAsyncSelect(g_tcp_sck, g_Wnd, WM_APP + 1, FD_READ); WSAAsyncSelect(g_tcp_sck, g_Wnd, WM_APP + 1, FD_READ);
SetTimer(g_Wnd, 1, 333, 0); SetTimer(g_Wnd, 1, 333, 0);
#endif /* MYWINCE */
return 1; return 1;
} }
@ -1151,7 +1030,7 @@ mi_process_a_param(char * param1, int state)
{ {
state = 0; state = 0;
g_server_depth = atol(param1); g_server_depth = atol(param1);
if (g_server_depth != 8 && g_server_depth != 15 && g_server_depth != 16) if (g_server_depth != 8 && g_server_depth != 15 && g_server_depth != 16 && g_server_depth != 24)
{ {
mi_error("invalid server bpp\r\n"); mi_error("invalid server bpp\r\n");
} }
@ -1207,31 +1086,19 @@ mi_post_param(void)
} }
else if (g_workarea) else if (g_workarea)
{ {
#ifdef MYWINCE
g_xoff = 0;
g_yoff = 0;
g_width = g_screen_width;
g_height = g_screen_height - 26; /* start menu size is 26 */
#else /* MYWINCE */
g_xoff = GetSystemMetrics(SM_CXEDGE) * 2; g_xoff = GetSystemMetrics(SM_CXEDGE) * 2;
g_yoff = GetSystemMetrics(SM_CYCAPTION) + g_yoff = GetSystemMetrics(SM_CYCAPTION) +
GetSystemMetrics(SM_CYEDGE) * 2; GetSystemMetrics(SM_CYEDGE) * 2;
g_width = g_screen_width; g_width = g_screen_width;
g_height = g_screen_height; g_height = g_screen_height;
g_height = (g_height - g_yoff) - g_xoff - 20; /* todo */ g_height = (g_height - g_yoff) - g_xoff - 20; /* todo */
#endif /* MYWINCE */
g_width_height_set = 1; g_width_height_set = 1;
} }
else else
{ {
#ifdef MYWINCE
g_xoff = 0;
g_yoff = 0;
#else /* MYWINCE */
g_xoff = GetSystemMetrics(SM_CXEDGE) * 2; g_xoff = GetSystemMetrics(SM_CXEDGE) * 2;
g_yoff = GetSystemMetrics(SM_CYCAPTION) + g_yoff = GetSystemMetrics(SM_CYCAPTION) +
GetSystemMetrics(SM_CYEDGE) * 2; GetSystemMetrics(SM_CYEDGE) * 2;
#endif /* MYWINCE */
} }
g_width = g_width & (~3); g_width = g_width & (~3);
return 1; return 1;
@ -1260,11 +1127,8 @@ mi_check_config_file(void)
valueindex = 0; valueindex = 0;
vname[vnameindex] = 0; vname[vnameindex] = 0;
value[valueindex] = 0; value[valueindex] = 0;
#ifdef MYWINCE
str_to_uni(filename, "\\My Documents\\winrdesktop.ini");
#else /* MYWINCE */
str_to_uni(filename, ".\\winrdesktop.ini"); str_to_uni(filename, ".\\winrdesktop.ini");
#endif /* MYWINCE */
fd = CreateFile(filename, GENERIC_READ, fd = CreateFile(filename, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
@ -1334,9 +1198,7 @@ mi_process_cl(LPTSTR lpCmdLine)
{ {
char param[256]; char param[256];
char param1[256]; char param1[256];
#ifndef MYWINCE
TCHAR l_username[256]; TCHAR l_username[256];
#endif
DWORD size; DWORD size;
int len; int len;
int i; int i;
@ -1347,8 +1209,7 @@ mi_process_cl(LPTSTR lpCmdLine)
strcpy(g_username, "pda"); strcpy(g_username, "pda");
/* get username and convert it from unicode */ /* get username and convert it from unicode */
size = 255; size = 255;
#ifndef MYWINCE
/* WinCE doesn't have GetUserName */
if (GetUserName(l_username, &size)) if (GetUserName(l_username, &size))
{ {
for (i = size; i >= 0; i--) for (i = size; i >= 0; i--)
@ -1361,7 +1222,7 @@ mi_process_cl(LPTSTR lpCmdLine)
{ {
mi_show_error("GetUserName"); mi_show_error("GetUserName");
} }
#endif /* MYWINCE */
/* get computer name */ /* get computer name */
if (gethostname(g_hostname, 255) != 0) if (gethostname(g_hostname, 255) != 0)
{ {
@ -1605,12 +1466,8 @@ mi_screen_copy(int x, int y, int cx, int cy, int srcx, int srcy)
HRGN rgn; HRGN rgn;
int ok_to_ScrollWindowEx; int ok_to_ScrollWindowEx;
/* WinCE can't scroll in 2 directions at once */
#ifdef MYWINCE
ok_to_ScrollWindowEx = cx == 0 || cy == 0;
#else /* MYWINCE */
ok_to_ScrollWindowEx = 1; ok_to_ScrollWindowEx = 1;
#endif /* MYWINCE */
if (!ok_to_ScrollWindowEx) if (!ok_to_ScrollWindowEx)
{ {
rgn = CreateRectRgn(x - g_xscroll, y - g_yscroll, rgn = CreateRectRgn(x - g_xscroll, y - g_yscroll,
@ -1667,9 +1524,6 @@ mi_create_cursor(unsigned int x, unsigned int y,
int width, int height, int width, int height,
unsigned char * andmask, unsigned char * xormask) unsigned char * andmask, unsigned char * xormask)
{ {
#ifdef MYWINCE
return (void *) 1;
#else /* MYWINCE */
HCURSOR hCur; HCURSOR hCur;
hCur = CreateCursor(g_Instance, x, y, width, height, andmask, xormask); hCur = CreateCursor(g_Instance, x, y, width, height, andmask, xormask);
@ -1678,32 +1532,25 @@ mi_create_cursor(unsigned int x, unsigned int y,
hCur = LoadCursor(NULL, IDC_ARROW); hCur = LoadCursor(NULL, IDC_ARROW);
} }
return hCur; return hCur;
#endif /* MYWINCE */
} }
/*****************************************************************************/ /*****************************************************************************/
void void
mi_destroy_cursor(void * cursor) mi_destroy_cursor(void * cursor)
{ {
#ifdef MYWINCE
#else /* MYWINCE */
if (g_cursor == cursor) if (g_cursor == cursor)
{ {
g_cursor = 0; g_cursor = 0;
} }
DestroyCursor(cursor); DestroyCursor(cursor);
#endif /* MYWINCE */
} }
/*****************************************************************************/ /*****************************************************************************/
void void
mi_set_cursor(void * cursor) mi_set_cursor(void * cursor)
{ {
#ifdef MYWINCE
#else /* MYWINCE */
g_cursor = cursor; g_cursor = cursor;
SetCursor(g_cursor); SetCursor(g_cursor);
#endif /* MYWINCE */
} }
/*****************************************************************************/ /*****************************************************************************/