Remove hw/xwin/xlaunch
Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk> Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
This commit is contained in:
parent
73864a87aa
commit
5596f10cce
|
@ -175,27 +175,7 @@ install-exec-hook:
|
|||
EXTRA_DIST = \
|
||||
$(xwinconfig_DATA) \
|
||||
X.ico \
|
||||
XWin.rc \
|
||||
xlaunch/config.cc \
|
||||
xlaunch/COPYING \
|
||||
xlaunch/main.cc \
|
||||
xlaunch/resources/dialog.rc \
|
||||
xlaunch/resources/fullscreen.bmp \
|
||||
xlaunch/resources/images.rc \
|
||||
xlaunch/resources/multiwindow.bmp \
|
||||
xlaunch/resources/nodecoration.bmp \
|
||||
xlaunch/resources/resources.h \
|
||||
xlaunch/resources/resources.rc \
|
||||
xlaunch/resources/strings.rc \
|
||||
xlaunch/resources/windowed.bmp \
|
||||
xlaunch/window/dialog.cc \
|
||||
xlaunch/window/dialog.h \
|
||||
xlaunch/window/util.cc \
|
||||
xlaunch/window/util.h \
|
||||
xlaunch/window/window.cc \
|
||||
xlaunch/window/window.h \
|
||||
xlaunch/window/wizard.cc \
|
||||
xlaunch/window/wizard.h
|
||||
XWin.rc
|
||||
|
||||
relink:
|
||||
$(AM_V_at)rm -f XWin$(EXEEXT) && $(MAKE) XWin$(EXEEXT)
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
|
||||
Copyright (c) 2005 Alexander Gottwald
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above copyright
|
||||
holders shall not be used in advertising or otherwise to promote the sale,
|
||||
use or other dealings in this Software without prior written authorization.
|
||||
|
|
@ -1,79 +0,0 @@
|
|||
#
|
||||
# Copyright (c) 2005 Alexander Gottwald
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the "Software"),
|
||||
# to deal in the Software without restriction, including without limitation
|
||||
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
# and/or sell copies of the Software, and to permit persons to whom the
|
||||
# Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
# THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
# DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# Except as contained in this notice, the name(s) of the above copyright
|
||||
# holders shall not be used in advertising or otherwise to promote the sale,
|
||||
# use or other dealings in this Software without prior written authorization.
|
||||
#
|
||||
WINDRES=windres
|
||||
|
||||
TARGET=mingw
|
||||
#DEBUG_FLAGS=-D_DEBUG
|
||||
|
||||
OS_FLAGS_mingw=-mno-cygwin
|
||||
OS_FLAGS=$(OS_FLAGS_$(TARGET)) $(DEBUG_FLAGS)
|
||||
|
||||
X11_DIR_$(TARGET)=/usr/X11R6
|
||||
X11_DIR_mingw=../../../../../exports
|
||||
X11_DIR=$(X11_DIR_$(TARGET))
|
||||
X11_INCLUDE=-I$(X11_DIR)/include
|
||||
X11_LIBDIR=-L$(X11_DIR)/lib
|
||||
X11_LIBS_$(TARGET)=-lX11
|
||||
X11_LIBS_mingw=-lX11 -lwsock32
|
||||
X11_LIBS=$(X11_LIBS_$(TARGET))
|
||||
|
||||
PROGRAMFILES:=$(shell cygpath -u $(PROGRAMFILES))
|
||||
#MSXML_DIR=$(PROGRAMFILES)/MSXML 4.0
|
||||
MSXML_DIR=$(PROGRAMFILES)/Microsoft XML Parser SDK
|
||||
MSXML_INCLUDE="-I$(MSXML_DIR)/inc"
|
||||
MSXML_LIBDIR="-L$(MSXML_DIR)/lib"
|
||||
MSXML_LIBS=
|
||||
|
||||
|
||||
CXXFLAGS=-g $(OS_FLAGS) $(X11_INCLUDE) $(MSXML_INCLUDE)
|
||||
LDFLAGS=-mwindows $(X11_LIBDIR) $(MSXML_LIBDIR)
|
||||
LIBS=-lcomctl32 -lole32 -loleaut32 $(X11_LIBS) $(MSXML_LIBS)
|
||||
all:xlaunch.exe
|
||||
%.res: %.rc
|
||||
$(WINDRES) -O coff -o $@ $<
|
||||
|
||||
WINDOW_PARTS=window util dialog wizard
|
||||
WINDOW_OBJECTS=$(foreach file,$(WINDOW_PARTS),window/$(file).o)
|
||||
|
||||
RESOURCES_IMAGES=resources/multiwindow.bmp resources/fullscreen.bmp \
|
||||
resources/windowed.bmp resources/nodecoration.bmp
|
||||
|
||||
resources/resources.res: resources/resources.rc resources/resources.h \
|
||||
resources/images.rc resources/dialog.rc resources/strings.rc \
|
||||
$(RESOURCES_IMAGES)
|
||||
xlaunch.exe: $(WINDOW_OBJECTS) main.o config.o resources/resources.res
|
||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
|
||||
|
||||
|
||||
window/dialog.o: window/dialog.cc window/dialog.h window/window.h window/util.h
|
||||
window/frame.o: window/frame.cc window/frame.h window/window.h
|
||||
window/util.o: window/util.cc window/util.h
|
||||
window/window.o: window/window.cc window/window.h window/util.h
|
||||
window/wizard.o: window/wizard.cc window/wizard.h window/dialog.h \
|
||||
window/window.h window/util.h
|
||||
main.o: main.cc window/util.h window/wizard.h window/dialog.h \
|
||||
window/window.h resources/resources.h config.h
|
||||
config.o: config.cc config.h
|
|
@ -1,282 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
#include "config.h"
|
||||
#include "window/util.h"
|
||||
#include <msxml2.h>
|
||||
#include <stdexcept>
|
||||
|
||||
const CLSID CLSID_DOMDocument40 = {0x88d969c0,0xf192,0x11d4,0xa6,0x5f,0x00,0x40,0x96,0x32,0x51,0xe5};
|
||||
const CLSID CLSID_DOMDocument30 = {0xf5078f32,0xc551,0x11d3,0x89,0xb9,0x00,0x00,0xf8,0x1f,0xe2,0x21};
|
||||
const IID IID_IXMLDOMDocument2 = {0x2933BF95,0x7B36,0x11d2,0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60};
|
||||
|
||||
#define HRCALL(x, msg) if (FAILED(x)) { throw std::runtime_error("OLE Error:" msg " failed"); };
|
||||
|
||||
char *wcconvert(const wchar_t *wstr)
|
||||
{
|
||||
int chars = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
|
||||
if (chars == 0)
|
||||
throw win32_error("WideCharToMultiByte");
|
||||
char *mbstr = new char[chars];
|
||||
chars = WideCharToMultiByte(CP_ACP, 0, wstr, -1, mbstr, chars, NULL, NULL);
|
||||
if (chars == 0)
|
||||
throw win32_error("WideCharToMultiByte");
|
||||
return mbstr;
|
||||
}
|
||||
|
||||
wchar_t *mbconvert(const char *mbstr)
|
||||
{
|
||||
int chars = MultiByteToWideChar(CP_ACP, 0, mbstr, -1, NULL, 0);
|
||||
if (chars == 0)
|
||||
throw win32_error("MultiByteToWideChar");
|
||||
wchar_t *wstr = new wchar_t[chars];
|
||||
chars = MultiByteToWideChar(CP_ACP, 0, mbstr, -1, wstr, chars);
|
||||
if (chars == 0)
|
||||
throw win32_error("MultiByteToWideChar");
|
||||
return wstr;
|
||||
}
|
||||
|
||||
VARIANT VariantString(const char *filename)
|
||||
{
|
||||
|
||||
wchar_t *str = mbconvert(filename);
|
||||
|
||||
VARIANT var;
|
||||
VariantInit(&var);
|
||||
V_BSTR(&var) = SysAllocString(str);
|
||||
V_VT(&var) = VT_BSTR;
|
||||
|
||||
delete [] str;
|
||||
return var;
|
||||
}
|
||||
|
||||
VARIANT VariantString(const wchar_t *str)
|
||||
{
|
||||
VARIANT var;
|
||||
VariantInit(&var);
|
||||
V_BSTR(&var) = SysAllocString(str);
|
||||
V_VT(&var) = VT_BSTR;
|
||||
return var;
|
||||
}
|
||||
|
||||
IXMLDOMDocument2 *CreateDocument()
|
||||
{
|
||||
IXMLDOMDocument2 *doc = NULL;
|
||||
|
||||
CoInitialize(NULL);
|
||||
|
||||
HRCALL(CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER,
|
||||
IID_IXMLDOMDocument2, (void**)&doc), "CoCreateInstance");
|
||||
|
||||
try {
|
||||
HRCALL(doc->put_async(VARIANT_FALSE), "put_async");
|
||||
HRCALL(doc->put_validateOnParse(VARIANT_FALSE), "put_validateOnParse");
|
||||
HRCALL(doc->put_resolveExternals(VARIANT_FALSE), "put_resolveExternals");
|
||||
|
||||
IXMLDOMProcessingInstruction *pi = NULL;
|
||||
IXMLDOMElement *root = NULL;
|
||||
BSTR xml = SysAllocString(L"xml");
|
||||
BSTR ver = SysAllocString(L"version='1.0'");
|
||||
HRCALL(doc->createProcessingInstruction(xml,ver, &pi),
|
||||
"createProcessingInstruction");
|
||||
HRCALL(doc->appendChild(pi, NULL),
|
||||
"appendChild");
|
||||
pi->Release();
|
||||
SysFreeString(xml);
|
||||
SysFreeString(ver);
|
||||
|
||||
BSTR elemname = SysAllocString(L"XLaunch");
|
||||
HRCALL(doc->createElement(elemname, &root), "createElement");
|
||||
HRCALL(doc->appendChild(root, NULL), "appendChild");
|
||||
SysFreeString(elemname);
|
||||
} catch (...)
|
||||
{
|
||||
doc->Release();
|
||||
throw;
|
||||
}
|
||||
return doc;
|
||||
}
|
||||
|
||||
void setAttribute(IXMLDOMElement *elem, const wchar_t *name, const wchar_t *value)
|
||||
{
|
||||
BSTR str = SysAllocString(name);
|
||||
VARIANT var = VariantString(value);
|
||||
HRCALL(elem->setAttribute(str, var), "setAttribute");
|
||||
VariantClear(&var);
|
||||
SysFreeString(str);
|
||||
}
|
||||
|
||||
void setAttribute(IXMLDOMElement *elem, const wchar_t *name, const char *value)
|
||||
{
|
||||
wchar_t *wstr = mbconvert(value);
|
||||
setAttribute(elem, name, wstr);
|
||||
delete [] wstr;
|
||||
return;
|
||||
}
|
||||
|
||||
void CConfig::Save(const char *filename)
|
||||
{
|
||||
IXMLDOMDocument2 *doc = CreateDocument();
|
||||
IXMLDOMElement *root = NULL;
|
||||
|
||||
HRCALL(doc->get_documentElement(&root), "get_documentElement");
|
||||
|
||||
switch (window)
|
||||
{
|
||||
case MultiWindow:
|
||||
setAttribute(root, L"WindowMode", L"MultiWindow");
|
||||
break;
|
||||
case Fullscreen:
|
||||
setAttribute(root, L"WindowMode", L"Fullscreen");
|
||||
break;
|
||||
default:
|
||||
case Windowed:
|
||||
setAttribute(root, L"WindowMode", L"Windowed");
|
||||
break;
|
||||
case Nodecoration:
|
||||
setAttribute(root, L"WindowMode", L"Nodecoration");
|
||||
break;
|
||||
}
|
||||
switch (client)
|
||||
{
|
||||
default:
|
||||
case NoClient:
|
||||
setAttribute(root, L"ClientMode", L"NoClient");
|
||||
break;
|
||||
case StartProgram:
|
||||
setAttribute(root, L"ClientMode", L"StartProgram");
|
||||
break;
|
||||
case XDMCP:
|
||||
setAttribute(root, L"ClientMode", L"XDMCP");
|
||||
break;
|
||||
}
|
||||
setAttribute(root, L"LocalClient", local?L"True":L"False");
|
||||
setAttribute(root, L"Display", display.c_str());
|
||||
setAttribute(root, L"Program", program.c_str());
|
||||
setAttribute(root, L"RemoteProtocol", protocol.c_str());
|
||||
setAttribute(root, L"RemoteHost", host.c_str());
|
||||
setAttribute(root, L"RemoteUser", user.c_str());
|
||||
setAttribute(root, L"XDMCPHost", xdmcp_host.c_str());
|
||||
setAttribute(root, L"XDMCPBroadcast", broadcast?L"True":L"False");
|
||||
setAttribute(root, L"XDMCPIndirect", indirect?L"True":L"False");
|
||||
setAttribute(root, L"Clipboard", clipboard?L"True":L"False");
|
||||
setAttribute(root, L"ExtraParams", extra_params.c_str());
|
||||
|
||||
VARIANT var = VariantString(filename);
|
||||
HRCALL(doc->save(var), "save");
|
||||
VariantClear(&var);
|
||||
|
||||
|
||||
root->Release();
|
||||
doc->Release();
|
||||
}
|
||||
|
||||
BOOL getAttribute(IXMLDOMElement *elem, const wchar_t *name, std::string &ret)
|
||||
{
|
||||
VARIANT var;
|
||||
HRCALL(elem->getAttribute((OLECHAR*)name, &var), "getAttribute");
|
||||
if (V_VT(&var) != VT_NULL && V_VT(&var) == VT_BSTR)
|
||||
{
|
||||
char *str = wcconvert(V_BSTR(&var));
|
||||
ret = str;
|
||||
delete [] str;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
BOOL getAttributeBool(IXMLDOMElement *elem, const wchar_t *name, bool &ret)
|
||||
{
|
||||
std::string str;
|
||||
if (getAttribute(elem, name, str))
|
||||
{
|
||||
if (str == "True")
|
||||
ret = true;
|
||||
else
|
||||
ret = false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void CConfig::Load(const char *filename)
|
||||
{
|
||||
IXMLDOMDocument2 *doc = CreateDocument();
|
||||
IXMLDOMElement *root = NULL;
|
||||
|
||||
VARIANT var = VariantString(filename);
|
||||
VARIANT_BOOL status;
|
||||
HRCALL(doc->load(var, &status), "load");
|
||||
VariantClear(&var);
|
||||
|
||||
if (status == VARIANT_FALSE)
|
||||
{
|
||||
doc->Release();
|
||||
return;
|
||||
}
|
||||
|
||||
HRCALL(doc->get_documentElement(&root), "get_documentElement");
|
||||
|
||||
std::string windowMode;
|
||||
std::string clientMode;
|
||||
|
||||
if (getAttribute(root, L"WindowMode", windowMode))
|
||||
{
|
||||
if (windowMode == "MultiWindow")
|
||||
window = MultiWindow;
|
||||
else if (windowMode == "Fullscreen")
|
||||
window = Fullscreen;
|
||||
else if (windowMode == "Windowed")
|
||||
window = Windowed;
|
||||
else if (windowMode == "Nodecoration")
|
||||
window = Nodecoration;
|
||||
}
|
||||
if (getAttribute(root, L"ClientMode", clientMode))
|
||||
{
|
||||
if (clientMode == "NoClient")
|
||||
client = NoClient;
|
||||
else if (clientMode == "StartProgram")
|
||||
client = StartProgram;
|
||||
else if (clientMode == "XDMCP")
|
||||
client = XDMCP;
|
||||
}
|
||||
|
||||
getAttributeBool(root, L"LocalClient", local);
|
||||
getAttribute(root, L"Display", display);
|
||||
getAttribute(root, L"Program", program);
|
||||
getAttribute(root, L"RemoteProtocol", protocol);
|
||||
getAttribute(root, L"RemoteHost", host);
|
||||
getAttribute(root, L"RemoteUser", user);
|
||||
getAttribute(root, L"XDMCPHost", xdmcp_host);
|
||||
getAttributeBool(root, L"XDMCPBroadcast", broadcast);
|
||||
getAttributeBool(root, L"XDMCPIndirect", indirect);
|
||||
getAttributeBool(root, L"Clipboard", clipboard);
|
||||
getAttribute(root, L"ExtraParams", extra_params);
|
||||
|
||||
|
||||
doc->Release();
|
||||
}
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
#ifndef __CONFIG_H__
|
||||
#define __CONFIG_H__
|
||||
|
||||
#include <string>
|
||||
struct CConfig
|
||||
{
|
||||
enum {MultiWindow, Fullscreen, Windowed, Nodecoration} window;
|
||||
enum {NoClient, StartProgram, XDMCP} client;
|
||||
bool local;
|
||||
std::string display;
|
||||
std::string protocol;
|
||||
std::string program;
|
||||
std::string host;
|
||||
std::string user;
|
||||
bool broadcast;
|
||||
bool indirect;
|
||||
std::string xdmcp_host;
|
||||
bool clipboard;
|
||||
std::string extra_params;
|
||||
#ifdef _DEBUG
|
||||
CConfig() : window(MultiWindow), client(StartProgram), local(false), display("1"),
|
||||
protocol("Putty"), program("xterm"), host("lupus"), user("ago"),
|
||||
broadcast(false), indirect(false), xdmcp_host("lupus"),
|
||||
clipboard(true), extra_params() {};
|
||||
#else
|
||||
CConfig() : window(MultiWindow), client(StartProgram), local(false), display("0"),
|
||||
protocol("Putty"), program("xterm"), host(""), user(""),
|
||||
broadcast(true), indirect(false), xdmcp_host(""),
|
||||
clipboard(true), extra_params() {};
|
||||
#endif
|
||||
void Load(const char* filename);
|
||||
void Save(const char* filename);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,700 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
#include "window/util.h"
|
||||
#include "window/wizard.h"
|
||||
#include "resources/resources.h"
|
||||
#include "config.h"
|
||||
#include <prsht.h>
|
||||
#include <commctrl.h>
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
/// @brief Send WM_ENDSESSION to all program windows.
|
||||
/// This will shutdown the started xserver
|
||||
BOOL CALLBACK KillWindowsProc(HWND hwnd, LPARAM lParam)
|
||||
{
|
||||
SendMessage(hwnd, WM_ENDSESSION, 0, 0);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/// @brief Actual wizard implementation.
|
||||
/// This is based on generic CWizard but handles the special dialogs
|
||||
class CMyWizard : public CWizard
|
||||
{
|
||||
public:
|
||||
private:
|
||||
CConfig config; /// Storage for config options.
|
||||
public:
|
||||
/// @brief Constructor.
|
||||
/// Set wizard pages.
|
||||
CMyWizard() : CWizard()
|
||||
{
|
||||
AddPage(IDD_DISPLAY, IDS_DISPLAY_TITLE, IDS_DISPLAY_SUBTITLE);
|
||||
AddPage(IDD_CLIENTS, IDS_CLIENTS_TITLE, IDS_CLIENTS_SUBTITLE);
|
||||
AddPage(IDD_PROGRAM, IDS_PROGRAM_TITLE, IDS_PROGRAM_SUBTITLE);
|
||||
AddPage(IDD_XDMCP, IDS_XDMCP_TITLE, IDS_XDMCP_SUBTITLE);
|
||||
//AddPage(IDD_FONTPATH, IDS_FONTPATH_TITLE, IDS_FONTPATH_SUBTITLE);
|
||||
AddPage(IDD_CLIPBOARD, IDS_CLIPBOARD_TITLE, IDS_CLIPBOARD_SUBTITLE);
|
||||
AddPage(IDD_FINISH, IDS_FINISH_TITLE, IDS_FINISH_SUBTITLE);
|
||||
}
|
||||
|
||||
virtual void LoadConfig(const char *filename)
|
||||
{
|
||||
try {
|
||||
config.Load(filename);
|
||||
} catch (std::runtime_error &e)
|
||||
{
|
||||
printf("Fehler: %s\n", e.what());
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Handle the PSN_WIZNEXT message.
|
||||
/// @param hwndDlg Handle to active page dialog.
|
||||
/// @param index Index of current page.
|
||||
/// @return TRUE if the message was handled. FALSE otherwise.
|
||||
virtual BOOL WizardNext(HWND hwndDlg, unsigned index)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
printf("%s %d\n", __FUNCTION__, index);
|
||||
#endif
|
||||
switch (PageID(index))
|
||||
{
|
||||
case IDD_DISPLAY:
|
||||
// Check for select window mode
|
||||
if (IsDlgButtonChecked(hwndDlg, IDC_MULTIWINDOW))
|
||||
config.window = CConfig::MultiWindow;
|
||||
else if (IsDlgButtonChecked(hwndDlg, IDC_FULLSCREEN))
|
||||
config.window = CConfig::Fullscreen;
|
||||
else if (IsDlgButtonChecked(hwndDlg, IDC_WINDOWED))
|
||||
config.window = CConfig::Windowed;
|
||||
else if (IsDlgButtonChecked(hwndDlg, IDC_NODECORATION))
|
||||
config.window = CConfig::Nodecoration;
|
||||
else
|
||||
{
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
|
||||
return TRUE;
|
||||
}
|
||||
// Get selected display number
|
||||
{
|
||||
char buffer[512];
|
||||
GetDlgItemText(hwndDlg, IDC_DISPLAY, buffer, 512);
|
||||
buffer[511] = 0;
|
||||
config.display = buffer;
|
||||
}
|
||||
// Check for valid input
|
||||
if (config.display.empty())
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
|
||||
else
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIENTS);
|
||||
return TRUE;
|
||||
case IDD_CLIENTS:
|
||||
// Check for select client startup method
|
||||
if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT))
|
||||
{
|
||||
config.client = CConfig::StartProgram;
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROGRAM);
|
||||
} else if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP))
|
||||
{
|
||||
config.client = CConfig::XDMCP;
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_XDMCP);
|
||||
} else if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT_NONE))
|
||||
{
|
||||
config.client = CConfig::NoClient;
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIPBOARD);
|
||||
} else
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
|
||||
return TRUE;
|
||||
case IDD_PROGRAM:
|
||||
// Check wether local or remote client should be started
|
||||
if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT_LOCAL))
|
||||
config.local = true;
|
||||
else if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT_REMOTE))
|
||||
config.local = false;
|
||||
else
|
||||
{
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
|
||||
return TRUE;
|
||||
}
|
||||
// Read program, user and host name
|
||||
{
|
||||
char buffer[512];
|
||||
GetDlgItemText(hwndDlg, IDC_CLIENT_USER, buffer, 512);
|
||||
buffer[511] = 0;
|
||||
config.user = buffer;
|
||||
GetDlgItemText(hwndDlg, IDC_CLIENT_HOST, buffer, 512);
|
||||
buffer[511] = 0;
|
||||
config.host = buffer;
|
||||
GetDlgItemText(hwndDlg, IDC_CLIENT_PROGRAM, buffer, 512);
|
||||
buffer[511] = 0;
|
||||
config.program = buffer;
|
||||
}
|
||||
// Check for valid input
|
||||
if (!config.local && (config.host.empty() || config.program.empty()))
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
|
||||
else
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIPBOARD);
|
||||
return TRUE;
|
||||
case IDD_XDMCP:
|
||||
// Check for broadcast
|
||||
if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP_BROADCAST))
|
||||
config.broadcast = true;
|
||||
else if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP_QUERY))
|
||||
config.broadcast = false;
|
||||
else
|
||||
{
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
|
||||
return TRUE;
|
||||
}
|
||||
// Check for indirect mode
|
||||
if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP_INDIRECT))
|
||||
config.indirect = true;
|
||||
else
|
||||
config.indirect = false;
|
||||
// Read hostname
|
||||
{
|
||||
char buffer[512];
|
||||
GetDlgItemText(hwndDlg, IDC_XDMCP_HOST, buffer, 512);
|
||||
buffer[511] = 0;
|
||||
config.xdmcp_host = buffer;
|
||||
}
|
||||
// Check for valid input
|
||||
if (!config.broadcast && config.xdmcp_host.empty())
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
|
||||
else
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIPBOARD);
|
||||
return TRUE;
|
||||
case IDD_CLIPBOARD:
|
||||
// check for clipboard
|
||||
if (IsDlgButtonChecked(hwndDlg, IDC_CLIPBOARD))
|
||||
config.clipboard = true;
|
||||
else
|
||||
config.clipboard = false;
|
||||
// read parameters
|
||||
{
|
||||
char buffer[512];
|
||||
GetDlgItemText(hwndDlg, IDC_EXTRA_PARAMS, buffer, 512);
|
||||
buffer[511] = 0;
|
||||
config.extra_params = buffer;
|
||||
}
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_FINISH);
|
||||
return TRUE;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
/// @brief Handle PSN_WIZFINISH message.
|
||||
/// @param hwndDlg Handle to active page dialog.
|
||||
/// @param index Index of current page.
|
||||
/// @return TRUE if the message was handled. FALSE otherwise.
|
||||
virtual BOOL WizardFinish(HWND hwndDlg, unsigned index)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
printf("finish %d\n", index);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
/// @brief Handle PSN_WIZBACK message.
|
||||
/// Basicly handles switching to proper page (skipping XDMCP or program page
|
||||
/// if required).
|
||||
/// @param hwndDlg Handle to active page dialog.
|
||||
/// @param index Index of current page.
|
||||
/// @return TRUE if the message was handled. FALSE otherwise.
|
||||
virtual BOOL WizardBack(HWND hwndDlg, unsigned index)
|
||||
{
|
||||
switch (PageID(index))
|
||||
{
|
||||
case IDD_PROGRAM:
|
||||
case IDD_XDMCP:
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIENTS);
|
||||
return TRUE;
|
||||
case IDD_FONTPATH:
|
||||
case IDD_CLIPBOARD: // temporary. fontpath is disabled
|
||||
switch (config.client)
|
||||
{
|
||||
case CConfig::NoClient:
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIENTS);
|
||||
return TRUE;
|
||||
case CConfig::StartProgram:
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROGRAM);
|
||||
return TRUE;
|
||||
case CConfig::XDMCP:
|
||||
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_XDMCP);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
/// @brief Handle PSN_SETACTIVE message.
|
||||
/// @param hwndDlg Handle to active page dialog.
|
||||
/// @param index Index of current page.
|
||||
/// @return TRUE if the message was handled. FALSE otherwise.
|
||||
virtual BOOL WizardActivate(HWND hwndDlg, unsigned index)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
printf("%s %d\n", __FUNCTION__, index);
|
||||
#endif
|
||||
switch (PageID(index))
|
||||
{
|
||||
case IDD_CLIENTS:
|
||||
// Enable or disable XDMCP radiobutton and text
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP), config.window != CConfig::MultiWindow);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP_DESC), config.window != CConfig::MultiWindow);
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
protected:
|
||||
/// @brief Enable or disable the control for remote clients.
|
||||
/// @param hwndDlg Handle to active page dialog.
|
||||
/// @param state State of control group.
|
||||
void EnableRemoteProgramGroup(HWND hwndDlg, BOOL state)
|
||||
{
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_PROTOCOL), state);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_HOST), state);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_USER), state);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_PROTOCOL_DESC), state);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_HOST_DESC), state);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_USER_DESC), state);
|
||||
}
|
||||
/// @brief Enable or disable the control for XDMCP connection.
|
||||
/// @param hwndDlg Handle to active page dialog.
|
||||
/// @param state State of control group.
|
||||
void EnableXDMCPQueryGroup(HWND hwndDlg, BOOL state)
|
||||
{
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP_HOST), state);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP_INDIRECT), state);
|
||||
}
|
||||
/// @brief Fill program box with default values.
|
||||
/// @param hwndDlg Handle to active page dialog.
|
||||
void FillProgramBox(HWND hwndDlg)
|
||||
{
|
||||
HWND cbwnd = GetDlgItem(hwndDlg, IDC_CLIENT_PROGRAM);
|
||||
if (cbwnd == NULL)
|
||||
return;
|
||||
SendMessage(cbwnd, CB_RESETCONTENT, 0, 0);
|
||||
SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "xterm");
|
||||
SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "startkde");
|
||||
SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "gnome-session");
|
||||
SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) ".xinitrc");
|
||||
SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "wmaker");
|
||||
SendMessage(cbwnd, CB_SETCURSEL, 0, 0);
|
||||
}
|
||||
/// @brief Fill protocol box with default values.
|
||||
/// @param hwndDlg Handle to active page dialog.
|
||||
void FillProtocolBox(HWND hwndDlg)
|
||||
{
|
||||
HWND cbwnd = GetDlgItem(hwndDlg, IDC_CLIENT_PROTOCOL);
|
||||
if (cbwnd == NULL)
|
||||
return;
|
||||
SendMessage(cbwnd, CB_RESETCONTENT, 0, 0);
|
||||
SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "Putty");
|
||||
//SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "OpenSSH");
|
||||
SendMessage(cbwnd, CB_SETCURSEL, 0, 0);
|
||||
}
|
||||
void ShowSaveDialog(HWND parent)
|
||||
{
|
||||
char szTitle[512];
|
||||
char szFilter[512];
|
||||
char szFileTitle[512];
|
||||
char szFile[MAX_PATH];
|
||||
HINSTANCE hInst = GetModuleHandle(NULL);
|
||||
|
||||
LoadString(hInst, IDS_SAVE_TITLE, szTitle, sizeof(szTitle));
|
||||
LoadString(hInst, IDS_SAVE_FILETITLE, szFileTitle, sizeof(szFileTitle));
|
||||
LoadString(hInst, IDS_SAVE_FILTER, szFilter, sizeof(szFilter));
|
||||
for (unsigned i=0; szFilter[i]; i++)
|
||||
if (szFilter[i] == '%')
|
||||
szFilter[i] = '\0';
|
||||
|
||||
strcpy(szFile, "config.xlaunch");
|
||||
|
||||
OPENFILENAME ofn;
|
||||
memset(&ofn, 0, sizeof(OPENFILENAME));
|
||||
ofn.lStructSize = sizeof(OPENFILENAME);
|
||||
ofn.hwndOwner = parent;
|
||||
ofn.lpstrFilter = szFilter;
|
||||
ofn.lpstrFile= szFile;
|
||||
ofn.nMaxFile = sizeof(szFile)/ sizeof(*szFile);
|
||||
ofn.lpstrFileTitle = szFileTitle;
|
||||
ofn.nMaxFileTitle = sizeof(szFileTitle);
|
||||
ofn.lpstrInitialDir = (LPSTR)NULL;
|
||||
ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;
|
||||
ofn.lpstrTitle = szTitle;
|
||||
|
||||
if (GetSaveFileName(&ofn))
|
||||
{
|
||||
try {
|
||||
config.Save(ofn.lpstrFile);
|
||||
} catch (std::runtime_error &e)
|
||||
{
|
||||
printf("Fehler: %s\n", e.what());
|
||||
}
|
||||
}
|
||||
}
|
||||
public:
|
||||
|
||||
/// @brief Handle messages fo the dialog pages.
|
||||
/// @param hwndDlg Handle of active dialog.
|
||||
/// @param uMsg Message code.
|
||||
/// @param wParam Message parameter.
|
||||
/// @param lParam Message parameter.
|
||||
/// @param psp Handle to sheet paramters.
|
||||
virtual INT_PTR PageDispatch(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, PROPSHEETPAGE *psp)
|
||||
{
|
||||
HWND hwnd;
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
switch (PageID(PageIndex(psp)))
|
||||
{
|
||||
case IDD_DISPLAY:
|
||||
// Init display dialog. Enable correct check buttons
|
||||
switch (config.window)
|
||||
{
|
||||
default:
|
||||
case CConfig::MultiWindow:
|
||||
CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_MULTIWINDOW);
|
||||
break;
|
||||
case CConfig::Fullscreen:
|
||||
CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_FULLSCREEN);
|
||||
break;
|
||||
case CConfig::Windowed:
|
||||
CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_WINDOWED);
|
||||
break;
|
||||
case CConfig::Nodecoration:
|
||||
CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_NODECORATION);
|
||||
break;
|
||||
}
|
||||
// Set display number
|
||||
SetDlgItemText(hwndDlg, IDC_DISPLAY, config.display.c_str());
|
||||
break;
|
||||
case IDD_CLIENTS:
|
||||
// Init client dialog. Enable correct check buttons
|
||||
switch (config.client)
|
||||
{
|
||||
default:
|
||||
case CConfig::NoClient:
|
||||
CheckRadioButton(hwndDlg, IDC_CLIENT_NONE, IDC_CLIENT, IDC_CLIENT_NONE);
|
||||
break;
|
||||
case CConfig::StartProgram:
|
||||
CheckRadioButton(hwndDlg, IDC_CLIENT_NONE, IDC_CLIENT, IDC_CLIENT);
|
||||
break;
|
||||
case CConfig::XDMCP:
|
||||
CheckRadioButton(hwndDlg, IDC_CLIENT_NONE, IDC_CLIENT, IDC_XDMCP);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case IDD_PROGRAM:
|
||||
// Init program dialog. Check local and remote buttons
|
||||
CheckRadioButton(hwndDlg, IDC_CLIENT_LOCAL, IDC_CLIENT_REMOTE, config.local?IDC_CLIENT_LOCAL:IDC_CLIENT_REMOTE);
|
||||
EnableRemoteProgramGroup(hwndDlg, config.local?FALSE:TRUE);
|
||||
// Fill combo boxes
|
||||
FillProgramBox(hwndDlg);
|
||||
FillProtocolBox(hwndDlg);
|
||||
// Set edit fields
|
||||
if (!config.program.empty())
|
||||
SetDlgItemText(hwndDlg, IDC_CLIENT_PROGRAM, config.program.c_str());
|
||||
SetDlgItemText(hwndDlg, IDC_CLIENT_USER, config.user.c_str());
|
||||
SetDlgItemText(hwndDlg, IDC_CLIENT_HOST, config.host.c_str());
|
||||
break;
|
||||
case IDD_XDMCP:
|
||||
// Init XDMCP dialog. Check broadcast and indirect button
|
||||
CheckRadioButton(hwndDlg, IDC_XDMCP_QUERY, IDC_XDMCP_BROADCAST, config.broadcast?IDC_XDMCP_BROADCAST:IDC_XDMCP_QUERY);
|
||||
CheckDlgButton(hwndDlg, IDC_XDMCP_INDIRECT, config.indirect?BST_CHECKED:BST_UNCHECKED);
|
||||
EnableXDMCPQueryGroup(hwndDlg, config.broadcast?FALSE:TRUE);
|
||||
// Set hostname
|
||||
SetDlgItemText(hwndDlg, IDC_XDMCP_HOST, config.xdmcp_host.c_str());
|
||||
break;
|
||||
case IDD_CLIPBOARD:
|
||||
CheckDlgButton(hwndDlg, IDC_CLIPBOARD, config.clipboard?BST_CHECKED:BST_UNCHECKED);
|
||||
SetDlgItemText(hwndDlg, IDC_EXTRA_PARAMS, config.extra_params.c_str());
|
||||
break;
|
||||
|
||||
}
|
||||
case WM_COMMAND:
|
||||
// Handle control messages
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
// Handle clicks on images. Check proper radiobutton
|
||||
case IDC_MULTIWINDOW_IMG:
|
||||
case IDC_FULLSCREEN_IMG:
|
||||
case IDC_WINDOWED_IMG:
|
||||
case IDC_NODECORATION_IMG:
|
||||
CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, LOWORD(wParam)-4);
|
||||
SetFocus(GetDlgItem(hwndDlg, LOWORD(wParam)-4));
|
||||
break;
|
||||
// Disable unavailable controls
|
||||
case IDC_CLIENT_REMOTE:
|
||||
case IDC_CLIENT_LOCAL:
|
||||
EnableRemoteProgramGroup(hwndDlg, LOWORD(wParam) == IDC_CLIENT_REMOTE);
|
||||
break;
|
||||
case IDC_XDMCP_QUERY:
|
||||
case IDC_XDMCP_BROADCAST:
|
||||
EnableXDMCPQueryGroup(hwndDlg, LOWORD(wParam) == IDC_XDMCP_QUERY);
|
||||
break;
|
||||
case IDC_FINISH_SAVE:
|
||||
ShowSaveDialog(hwndDlg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
// pass messages to parent
|
||||
return CWizard::PageDispatch(hwndDlg, uMsg, wParam, lParam, psp);
|
||||
}
|
||||
|
||||
/// @brief Try to connect to server.
|
||||
/// Repeat until successful, server died or maximum number of retries
|
||||
/// reached.
|
||||
Display *WaitForServer(HANDLE serverProcess)
|
||||
{
|
||||
int ncycles = 120; /* # of cycles to wait */
|
||||
int cycles; /* Wait cycle count */
|
||||
Display *xd;
|
||||
|
||||
for (cycles = 0; cycles < ncycles; cycles++) {
|
||||
if ((xd = XOpenDisplay(NULL))) {
|
||||
return xd;
|
||||
}
|
||||
else {
|
||||
if (WaitForSingleObject(serverProcess, 1000) == WAIT_TIMEOUT)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/// @brief Do the actual start of Xming and clients
|
||||
void StartUp()
|
||||
{
|
||||
std::string buffer;
|
||||
std::string client;
|
||||
|
||||
// Construct display strings
|
||||
std::string display_id = ":" + config.display;
|
||||
std::string display = "localhost" + display_id + ":0";
|
||||
|
||||
#ifdef _DEBUG
|
||||
// Debug only: Switch to Xming installation directory
|
||||
SetCurrentDirectory("C:\\Programme\\Xming");
|
||||
#endif
|
||||
|
||||
// Build Xming commandline
|
||||
buffer = "Xming " + display_id + " ";
|
||||
switch (config.window)
|
||||
{
|
||||
case CConfig::MultiWindow:
|
||||
buffer += "-multiwindow ";
|
||||
break;
|
||||
case CConfig::Fullscreen:
|
||||
buffer += "-fullscreen ";
|
||||
break;
|
||||
case CConfig::Nodecoration:
|
||||
buffer += "-nodecoration ";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// Add XDMCP parameter
|
||||
if (config.client == CConfig::XDMCP)
|
||||
{
|
||||
if (config.broadcast)
|
||||
buffer += "-broadcast ";
|
||||
else
|
||||
{
|
||||
if (config.indirect)
|
||||
buffer += "-indirect ";
|
||||
else
|
||||
buffer += "-query ";
|
||||
buffer += config.xdmcp_host;
|
||||
buffer += " ";
|
||||
}
|
||||
}
|
||||
if (config.clipboard)
|
||||
buffer += "-clipboard ";
|
||||
if (!config.extra_params.empty())
|
||||
{
|
||||
buffer += config.extra_params;
|
||||
buffer += " ";
|
||||
}
|
||||
|
||||
// Construct client commandline
|
||||
if (config.client == CConfig::StartProgram)
|
||||
{
|
||||
if (!config.local)
|
||||
{
|
||||
char cmdline[512];
|
||||
std::string host = config.host;
|
||||
if (!config.user.empty())
|
||||
host = config.user + "@" + config.host;
|
||||
if (config.protocol == "Putty")
|
||||
snprintf(cmdline,512,"plink -X %s %s",
|
||||
host.c_str(),config.program.c_str());
|
||||
else
|
||||
snprintf(cmdline,512,"ssh -Y %s %s",
|
||||
host.c_str(),config.program.c_str());
|
||||
client += cmdline;
|
||||
} else
|
||||
client += config.program.c_str();
|
||||
}
|
||||
|
||||
// Prepare program startup
|
||||
STARTUPINFO si, sic;
|
||||
PROCESS_INFORMATION pi, pic;
|
||||
HANDLE handles[2];
|
||||
DWORD hcount = 0;
|
||||
Display *dpy = NULL;
|
||||
|
||||
ZeroMemory( &si, sizeof(si) );
|
||||
si.cb = sizeof(si);
|
||||
ZeroMemory( &pi, sizeof(pi) );
|
||||
ZeroMemory( &sic, sizeof(sic) );
|
||||
sic.cb = sizeof(sic);
|
||||
ZeroMemory( &pic, sizeof(pic) );
|
||||
|
||||
// Start Xming process.
|
||||
#ifdef _DEBUG
|
||||
printf("%s\n", buffer.c_str());
|
||||
#endif
|
||||
if( !CreateProcess( NULL, (CHAR*)buffer.c_str(), NULL, NULL,
|
||||
FALSE, 0, NULL, NULL, &si, &pi ))
|
||||
throw win32_error("CreateProcess failed");
|
||||
handles[hcount++] = pi.hProcess;
|
||||
|
||||
if (!client.empty())
|
||||
{
|
||||
// Set DISPLAY variable
|
||||
SetEnvironmentVariable("DISPLAY",display.c_str());
|
||||
|
||||
// Wait for server to startup
|
||||
dpy = WaitForServer(pi.hProcess);
|
||||
if (dpy == NULL)
|
||||
{
|
||||
while (hcount--)
|
||||
TerminateProcess(handles[hcount], (DWORD)-1);
|
||||
throw std::runtime_error("Connection to server failed");
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
printf("%s\n", client.c_str());
|
||||
#endif
|
||||
|
||||
// Hide a console window
|
||||
// FIXME: This may make it impossible to enter the password
|
||||
sic.dwFlags = STARTF_USESHOWWINDOW;
|
||||
sic.wShowWindow = SW_HIDE;
|
||||
|
||||
// Start the child process.
|
||||
if( !CreateProcess( NULL, (CHAR*)client.c_str(), NULL, NULL,
|
||||
FALSE, 0, NULL, NULL, &sic, &pic ))
|
||||
{
|
||||
DWORD err = GetLastError();
|
||||
while (hcount--)
|
||||
TerminateProcess(handles[hcount], (DWORD)-1);
|
||||
throw win32_error("CreateProcess failed", err);
|
||||
}
|
||||
handles[hcount++] = pic.hProcess;
|
||||
}
|
||||
|
||||
// Wait until any child process exits.
|
||||
DWORD ret = WaitForMultipleObjects(hcount, handles, FALSE, INFINITE );
|
||||
|
||||
#ifdef _DEBUG
|
||||
printf("killing process!\n");
|
||||
#endif
|
||||
// Check if Xming is still running
|
||||
DWORD exitcode;
|
||||
GetExitCodeProcess(pi.hProcess, &exitcode);
|
||||
unsigned counter = 0;
|
||||
while (exitcode == STILL_ACTIVE)
|
||||
{
|
||||
if (++counter > 10)
|
||||
TerminateProcess(pi.hProcess, (DWORD)-1);
|
||||
else
|
||||
// Shutdown Xming (the soft way!)
|
||||
EnumThreadWindows(pi.dwThreadId, KillWindowsProc, 0);
|
||||
Sleep(500);
|
||||
GetExitCodeProcess(pi.hProcess, &exitcode);
|
||||
}
|
||||
// Kill the client
|
||||
TerminateProcess(pic.hProcess, (DWORD)-1);
|
||||
|
||||
// Close process and thread handles.
|
||||
CloseHandle( pi.hProcess );
|
||||
CloseHandle( pi.hThread );
|
||||
CloseHandle( pic.hProcess );
|
||||
CloseHandle( pic.hThread );
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
try {
|
||||
InitCommonControls();
|
||||
CMyWizard dialog;
|
||||
|
||||
bool skip_wizard = false;
|
||||
|
||||
for (int i = 1; i < argc; i++)
|
||||
{
|
||||
if (argv[i] == NULL)
|
||||
continue;
|
||||
|
||||
std::string arg(argv[i]);
|
||||
if (arg == "-load" && i + 1 < argc)
|
||||
{
|
||||
i++;
|
||||
dialog.LoadConfig(argv[i]);
|
||||
continue;
|
||||
}
|
||||
if (arg == "-run" && i + 1 < argc)
|
||||
{
|
||||
i++;
|
||||
dialog.LoadConfig(argv[i]);
|
||||
skip_wizard = true;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
if (skip_wizard || (ret =dialog.ShowModal()) != 0)
|
||||
dialog.StartUp();
|
||||
#ifdef _DEBUG
|
||||
printf("return %d\n", ret);
|
||||
#endif
|
||||
return 0;
|
||||
} catch (std::runtime_error &e)
|
||||
{
|
||||
printf("Fehler: %s\n", e.what());
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,118 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
#include <windows.h>
|
||||
#include "resources.h"
|
||||
|
||||
#ifndef STR_CAPTION_DISPLAY
|
||||
#include "strings.rc"
|
||||
#endif
|
||||
|
||||
IDD_DISPLAY DIALOGEX 0, 0, 317, 143
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTERMOUSE
|
||||
CAPTION STR_CAPTION_DISPLAY
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
AUTORADIOBUTTON STR_MULTIWINDOW,IDC_MULTIWINDOW,7,25,70,24,BS_MULTILINE|BS_TOP
|
||||
AUTORADIOBUTTON STR_FULLSCREEN,IDC_FULLSCREEN,157,25,70,24,BS_MULTILINE|BS_TOP
|
||||
AUTORADIOBUTTON STR_WINDOWED,IDC_WINDOWED,7,75,70,24,BS_MULTILINE|BS_TOP
|
||||
AUTORADIOBUTTON STR_NODECORATION,IDC_NODECORATION,157,75,70,24,BS_MULTILINE|BS_TOP
|
||||
|
||||
CONTROL "IMG_MULTIWINDOW",IDC_MULTIWINDOW_IMG,"Static",SS_BITMAP | SS_NOTIFY,80,10,0,0
|
||||
CONTROL "IMG_FULLSCREEN",IDC_FULLSCREEN_IMG,"Static",SS_BITMAP | SS_NOTIFY,230,10,0,0
|
||||
CONTROL "IMG_WINDOWED",IDC_WINDOWED_IMG,"Static",SS_BITMAP | SS_NOTIFY,80,60,0,0
|
||||
CONTROL "IMG_NODECORATION",IDC_NODECORATION_IMG,"Static",SS_BITMAP | SS_NOTIFY,230,60,0,0
|
||||
|
||||
LTEXT STR_DISPLAY_DESC,IDC_DISPLAY_DESC,7,120,64,12
|
||||
EDITTEXT IDC_DISPLAY,80,118,67,12,ES_NUMBER
|
||||
END
|
||||
|
||||
IDD_CLIENTS DIALOGEX 0, 0, 317, 143
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTERMOUSE
|
||||
CAPTION STR_CAPTION_CLIENTS
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
AUTORADIOBUTTON STR_CLIENT_NONE,IDC_CLIENT_NONE,7,14,300,10
|
||||
AUTORADIOBUTTON STR_CLIENT,IDC_CLIENT,7,56,300,10
|
||||
AUTORADIOBUTTON STR_XDMCP,IDC_XDMCP,7,98,300,10
|
||||
|
||||
LTEXT STR_CLIENT_NONE_DESC,IDC_CLIENT_NONE_DESC,19,28,280,27
|
||||
LTEXT STR_CLIENT_DESC,IDC_CLIENT_DESC,19,70,280,27
|
||||
LTEXT STR_XDMCP_DESC,IDC_XDMCP_DESC,19,112,280,27
|
||||
END
|
||||
|
||||
IDD_PROGRAM DIALOGEX 0, 0, 317, 143
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTERMOUSE
|
||||
CAPTION STR_CAPTION_PROGRAM
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
LTEXT STR_CLIENT_PROGRAM_DESC,IDC_CLIENT_PROGRAM_DESC,7,14,64,10
|
||||
COMBOBOX IDC_CLIENT_PROGRAM,70,12,64,54,CBS_DROPDOWN | WS_VSCROLL
|
||||
|
||||
AUTORADIOBUTTON STR_CLIENT_LOCAL,IDC_CLIENT_LOCAL,7,28,300,10
|
||||
AUTORADIOBUTTON STR_CLIENT_REMOTE,IDC_CLIENT_REMOTE,7,42,300,10
|
||||
|
||||
LTEXT STR_CLIENT_PROTOCOL_DESC,IDC_CLIENT_PROTOCOL_DESC,19,56,70,10
|
||||
COMBOBOX IDC_CLIENT_PROTOCOL,100,54,64,54,CBS_DROPDOWNLIST | WS_VSCROLL
|
||||
|
||||
LTEXT STR_CLIENT_HOST_DESC,IDC_CLIENT_HOST_DESC,19,70,70,10
|
||||
LTEXT STR_CLIENT_USER_DESC,IDC_CLIENT_USER_DESC,19,84,70,10
|
||||
EDITTEXT IDC_CLIENT_HOST,100,68,64,12
|
||||
EDITTEXT IDC_CLIENT_USER,100,82,64,12
|
||||
END
|
||||
|
||||
IDD_XDMCP DIALOGEX 0, 0, 317, 143
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTERMOUSE
|
||||
CAPTION STR_CAPTION_XDMCP
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
AUTORADIOBUTTON STR_XDMCP_QUERY, IDC_XDMCP_QUERY,7,14,64,10
|
||||
EDITTEXT IDC_XDMCP_HOST,78,12,64,12
|
||||
AUTOCHECKBOX STR_XDMCP_INDIRECT,IDC_XDMCP_INDIRECT,19,28,280,10
|
||||
AUTORADIOBUTTON STR_XDMCP_BROADCAST, IDC_XDMCP_BROADCAST,7,42,300,10
|
||||
LTEXT STR_XDMCP_QUERY_DESC,IDC_XDMCP_QUERY_DESC,7,56,300,42
|
||||
END
|
||||
|
||||
IDD_CLIPBOARD DIALOGEX 0, 0, 317, 143
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTERMOUSE
|
||||
CAPTION STR_CAPTION_CLIPBOARD
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
AUTOCHECKBOX STR_CLIPBOARD,IDC_CLIPBOARD,7,14,300,10
|
||||
LTEXT STR_CLIPBOARD_DESC,IDC_CLIPBOARD_DESC,19,28,280,27
|
||||
|
||||
LTEXT STR_EXTRA_PARAMS_DESC,IDC_EXTRA_PARAMS_DESC,7,56,280,10
|
||||
EDITTEXT IDC_EXTRA_PARAMS,7,70,128,12
|
||||
END
|
||||
|
||||
IDD_FINISH DIALOGEX 0, 0, 317, 143
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTERMOUSE
|
||||
CAPTION STR_CAPTION_FINISH
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
LTEXT STR_FINISH_DESC,IDC_FINISH_DESC,7,14,300,28
|
||||
LTEXT STR_FINISH_SAVE_DESC,IDC_FINISH_SAVE_DESC,7,56,300,12
|
||||
PUSHBUTTON STR_FINISH_SAVE,IDC_FINISH_SAVE,7,68,75,14
|
||||
END
|
Binary file not shown.
Before Width: | Height: | Size: 22 KiB |
|
@ -1,29 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
IMG_MULTIWINDOW BITMAP "resources\\multiwindow.bmp"
|
||||
IMG_WINDOWED BITMAP "resources\\windowed.bmp"
|
||||
IMG_FULLSCREEN BITMAP "resources\\fullscreen.bmp"
|
||||
IMG_NODECORATION BITMAP "resources\\nodecoration.bmp"
|
Binary file not shown.
Before Width: | Height: | Size: 22 KiB |
Binary file not shown.
Before Width: | Height: | Size: 22 KiB |
|
@ -1,99 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
|
||||
#define IDC_STATIC -1
|
||||
|
||||
#define IDD_WELCOME 100
|
||||
#define IDD_FINISH 101
|
||||
#define IDD_DISPLAY 102
|
||||
#define IDD_CLIENTS 103
|
||||
#define IDD_PROGRAM 104
|
||||
#define IDD_XDMCP 105
|
||||
#define IDD_FONTPATH 106
|
||||
#define IDD_CLIPBOARD 107
|
||||
|
||||
#define IDS_DISPLAY_TITLE 300
|
||||
#define IDS_DISPLAY_SUBTITLE 301
|
||||
#define IDS_CLIENTS_TITLE 302
|
||||
#define IDS_CLIENTS_SUBTITLE 303
|
||||
#define IDS_PROGRAM_TITLE 304
|
||||
#define IDS_PROGRAM_SUBTITLE 305
|
||||
#define IDS_XDMCP_TITLE 306
|
||||
#define IDS_XDMCP_SUBTITLE 307
|
||||
#define IDS_FONTPATH_TITLE 308
|
||||
#define IDS_FONTPATH_SUBTITLE 309
|
||||
#define IDS_FINISH_TITLE 310
|
||||
#define IDS_FINISH_SUBTITLE 311
|
||||
#define IDS_CLIPBOARD_TITLE 312
|
||||
#define IDS_CLIPBOARD_SUBTITLE 313
|
||||
#define IDS_SAVE_TITLE 320
|
||||
#define IDS_SAVE_FILETITLE 321
|
||||
#define IDS_SAVE_FILTER 322
|
||||
|
||||
#define IDC_MULTIWINDOW 200
|
||||
#define IDC_WINDOWED 201
|
||||
#define IDC_FULLSCREEN 202
|
||||
#define IDC_NODECORATION 203
|
||||
#define IDC_MULTIWINDOW_IMG 204
|
||||
#define IDC_WINDOWED_IMG 205
|
||||
#define IDC_FULLSCREEN_IMG 206
|
||||
#define IDC_NODECORATION_IMG 207
|
||||
#define IDC_DISPLAY 208
|
||||
#define IDC_DISPLAY_DESC 209
|
||||
|
||||
#define IDC_CLIENT_NONE 210
|
||||
#define IDC_XDMCP 211
|
||||
#define IDC_CLIENT 212
|
||||
#define IDC_CLIENT_LOCAL 213
|
||||
#define IDC_CLIENT_REMOTE 214
|
||||
#define IDC_CLIENT_HOST 215
|
||||
#define IDC_CLIENT_USER 216
|
||||
#define IDC_CLIENT_PROTOCOL 217
|
||||
#define IDC_CLIENT_CONFIGURE 218
|
||||
#define IDC_CLIENT_PROGRAM 219
|
||||
#define IDC_XDMCP_QUERY 220
|
||||
#define IDC_XDMCP_BROADCAST 221
|
||||
#define IDC_XDMCP_INDIRECT 222
|
||||
#define IDC_XDMCP_HOST 223
|
||||
#define IDC_CLIENT_NONE_DESC 224
|
||||
#define IDC_XDMCP_DESC 225
|
||||
#define IDC_CLIENT_DESC 226
|
||||
#define IDC_XDMCP_QUERY_DESC 227
|
||||
#define IDC_CLIENT_PROGRAM_DESC 228
|
||||
#define IDC_CLIENT_HOST_DESC 229
|
||||
#define IDC_CLIENT_USER_DESC 230
|
||||
#define IDC_CLIENT_PROTOCOL_DESC 231
|
||||
|
||||
#define IDC_FONTPATH_DESC 240
|
||||
|
||||
#define IDC_FINISH_DESC 250
|
||||
#define IDC_FINISH_SAVE 251
|
||||
#define IDC_FINISH_SAVE_DESC 252
|
||||
|
||||
#define IDC_CLIPBOARD 260
|
||||
#define IDC_CLIPBOARD_DESC 261
|
||||
#define IDC_EXTRA_PARAMS 262
|
||||
#define IDC_EXTRA_PARAMS_DESC 263
|
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
#include <windows.h>
|
||||
|
||||
#include "resources.h"
|
||||
#include "images.rc"
|
||||
#include "dialog.rc"
|
|
@ -1,108 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
|
||||
#define STR_CAPTION_DISPLAY "Display settings"
|
||||
#define STR_MULTIWINDOW "Multiple windows"
|
||||
#define STR_FULLSCREEN "Fullscreen"
|
||||
#define STR_WINDOWED "One large window"
|
||||
#define STR_NODECORATION "One window without titlebar"
|
||||
#define STR_DISPLAY_DESC "Display number"
|
||||
|
||||
#define STR_CAPTION_CLIENTS "Client startup"
|
||||
#define STR_CLIENT_NONE "Start no client"
|
||||
#define STR_CLIENT_NONE_DESC "This will just start the xserver. You will be able to start local clients later."
|
||||
#define STR_CLIENT "Start a program"
|
||||
#define STR_CLIENT_DESC "This will start a local or remote program which will connect to the xserver. You will be able to start local clients later too. Remote programs are started using SSH."
|
||||
#define STR_XDMCP "Open session via XDMCP"
|
||||
#define STR_XDMCP_DESC "This will start a remote XDMCP session. Starting local clients later is limited. This option is not available with the ""Multiple windows"" mode."
|
||||
|
||||
#define STR_CAPTION_PROGRAM "Start program"
|
||||
#define STR_CLIENT_PROGRAM_DESC "Start program"
|
||||
#define STR_CLIENT_LOCAL "Start program on this computer"
|
||||
#define STR_CLIENT_REMOTE "Start program on remote computer"
|
||||
#define STR_CLIENT_PROTOCOL_DESC "Connect using"
|
||||
#define STR_CLIENT_HOST_DESC "Connect to computer"
|
||||
#define STR_CLIENT_USER_DESC "Login as user"
|
||||
|
||||
|
||||
#define STR_CAPTION_XDMCP "XDMCP settings"
|
||||
#define STR_XDMCP_QUERY "Connect to host"
|
||||
#define STR_XDMCP_INDIRECT "Use indirect connect"
|
||||
#define STR_XDMCP_BROADCAST "Search for hosts (broadcast)"
|
||||
#define STR_XDMCP_QUERY_DESC "Some XDMCP servers must be configured to allow remote connections. Please check the documentation about configuring XDMCP servers."
|
||||
|
||||
|
||||
#define STR_CAPTION_FONTPATH "Fontpath settings"
|
||||
|
||||
#define STR_CAPTION_CLIPBOARD "Clipboard settings"
|
||||
#define STR_CLIPBOARD "Clipboard"
|
||||
#define STR_CLIPBOARD_DESC "Start the integrated clipboard manager"
|
||||
#define STR_EXTRA_PARAMS_DESC "Additional parameters for Xming"
|
||||
|
||||
#define STR_CAPTION_FINISH "Finish configuration"
|
||||
#define STR_FINISH_DESC "Configuration is complete. Clish Finish to start Xming."
|
||||
#define STR_FINISH_SAVE_DESC "You may also save the configuration for later use."
|
||||
#define STR_FINISH_SAVE "Save configuration"
|
||||
|
||||
#define STR_DISPLAY_TITLE "Select display settings"
|
||||
#define STR_DISPLAY_SUBTITLE "Choose how Xming display programs"
|
||||
#define STR_CLIENTS_TITLE "Select how to start clients"
|
||||
#define STR_CLIENTS_SUBTITLE ""
|
||||
#define STR_PROGRAM_TITLE "Specify the program to start"
|
||||
#define STR_PROGRAM_SUBTITLE ""
|
||||
#define STR_XDMCP_TITLE "Configure a remote XDMCP connection"
|
||||
#define STR_XDMCP_SUBTITLE ""
|
||||
#define STR_FONTPATH_TITLE "Define font locations"
|
||||
#define STR_FONTPATH_SUBTITLE ""
|
||||
#define STR_FINISH_TITLE "Configuration complete"
|
||||
#define STR_FINISH_SUBTITLE ""
|
||||
#define STR_CLIPBOARD_TITLE "Clipboard settings"
|
||||
#define STR_CLIPBOARD_SUBTITLE ""
|
||||
|
||||
#define STR_SAVE_TITLE "Save configuration"
|
||||
#define STR_SAVE_FILETITLE "Filename"
|
||||
#define STR_SAVE_FILTER "Xlaunch Files (*.xlaunch)%*.xlaunch%%"
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_DISPLAY_TITLE STR_DISPLAY_TITLE
|
||||
IDS_DISPLAY_SUBTITLE STR_DISPLAY_SUBTITLE
|
||||
IDS_CLIENTS_TITLE STR_CLIENTS_TITLE
|
||||
IDS_CLIENTS_SUBTITLE STR_CLIENTS_SUBTITLE
|
||||
IDS_PROGRAM_TITLE STR_PROGRAM_TITLE
|
||||
IDS_PROGRAM_SUBTITLE STR_PROGRAM_SUBTITLE
|
||||
IDS_XDMCP_TITLE STR_XDMCP_TITLE
|
||||
IDS_XDMCP_SUBTITLE STR_XDMCP_SUBTITLE
|
||||
IDS_FONTPATH_TITLE STR_FONTPATH_TITLE
|
||||
IDS_FONTPATH_SUBTITLE STR_FONTPATH_SUBTITLE
|
||||
IDS_FINISH_TITLE STR_FINISH_TITLE
|
||||
IDS_FINISH_SUBTITLE STR_FINISH_SUBTITLE
|
||||
IDS_CLIPBOARD_TITLE STR_CLIPBOARD_TITLE
|
||||
IDS_CLIPBOARD_SUBTITLE STR_CLIPBOARD_SUBTITLE
|
||||
IDS_SAVE_TITLE STR_SAVE_TITLE
|
||||
IDS_SAVE_FILETITLE STR_SAVE_FILETITLE
|
||||
IDS_SAVE_FILTER STR_SAVE_FILTER
|
||||
END
|
Binary file not shown.
Before Width: | Height: | Size: 22 KiB |
|
@ -1,86 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include "dialog.h"
|
||||
#include "util.h"
|
||||
|
||||
CBaseDialog::CBaseDialog() : CWindow(""), result(0)
|
||||
{
|
||||
}
|
||||
|
||||
CDialog::CDialog(const char *res) : CBaseDialog(), resourcename(res)
|
||||
{
|
||||
}
|
||||
|
||||
HWND CDialog::CreateWindowHandle()
|
||||
{
|
||||
HWND ret = CreateDialog(
|
||||
GetModuleHandle(NULL),
|
||||
resourcename.c_str(),
|
||||
NULL,
|
||||
DialogProc);
|
||||
if (ret == NULL)
|
||||
throw win32_error("CreateDialog failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK CBaseDialog::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
MessageDebug::debug(hwndDlg, uMsg, wParam, lParam, __FUNCTION__);
|
||||
CBaseDialog* dialog = (CDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
|
||||
if (dialog != NULL)
|
||||
return dialog->DlgDispatch(hwndDlg, uMsg, wParam, lParam);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
INT_PTR CBaseDialog::DlgDispatch(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDOK:
|
||||
case IDCANCEL:
|
||||
result = wParam;
|
||||
EndDialog(hwndDlg, wParam);
|
||||
DestroyWindow(hwndDlg);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
INT_PTR CDialog::DlgDispatch(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
return CBaseDialog::DlgDispatch(hwndDlg, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
int CBaseDialog::Execute()
|
||||
{
|
||||
return CWindow::ShowModal();
|
||||
}
|
|
@ -1,54 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
#ifndef __DIALOG_H__
|
||||
#define __DIALOG_H__
|
||||
|
||||
#include "window.h"
|
||||
class CBaseDialog : public CWindow
|
||||
{
|
||||
private:
|
||||
int result;
|
||||
protected:
|
||||
static INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
virtual INT_PTR DlgDispatch(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
public:
|
||||
CBaseDialog();
|
||||
int Execute();
|
||||
};
|
||||
|
||||
class CDialog : public CBaseDialog
|
||||
{
|
||||
private:
|
||||
std::string resourcename;
|
||||
protected:
|
||||
virtual INT_PTR DlgDispatch(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
virtual HWND CreateWindowHandle();
|
||||
public:
|
||||
CDialog(const char *res);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -1,53 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
#ifndef __UTIL_H__
|
||||
#define __UTIL_H__
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdexcept>
|
||||
|
||||
|
||||
class win32_error : public std::runtime_error
|
||||
{
|
||||
public:
|
||||
static std::string message(DWORD code);
|
||||
DWORD errorcode;
|
||||
win32_error(const std::string &msg,DWORD code = GetLastError()) : std::runtime_error(msg + ":" + message(code)), errorcode(code) {};
|
||||
};
|
||||
|
||||
#define MESSAGE_NAMES_LEN 1024
|
||||
#define NOTIFY_NAMES_LEN 0
|
||||
class MessageDebug
|
||||
{
|
||||
protected:
|
||||
static const char * message_names[MESSAGE_NAMES_LEN];
|
||||
static const char * notify_names[NOTIFY_NAMES_LEN];
|
||||
public:
|
||||
static void debug(HWND handle, UINT uMsg, WPARAM wParam, LPARAM lParam, const char *prefix);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
|
@ -1,284 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
|
||||
#include "window.h"
|
||||
#include "util.h"
|
||||
#include <stdio.h>
|
||||
#include <stdexcept>
|
||||
|
||||
CWindow::CWindowClass CWindow::windowClass("CWINDOWCLASS", DefWindowProc);
|
||||
|
||||
CWindow::CWindowClass::CWindowClass(const char *_name, WNDPROC _wndproc) :
|
||||
wndproc(_wndproc), atom(0), classname(_name)
|
||||
{
|
||||
Register();
|
||||
}
|
||||
|
||||
CWindow::CWindowClass::~CWindowClass()
|
||||
{
|
||||
UnregisterClass(classname.c_str(), GetModuleHandle(NULL));
|
||||
}
|
||||
|
||||
void CWindow::CWindowClass::Register()
|
||||
{
|
||||
WNDCLASSEX wndclass;
|
||||
memset(&wndclass, 0, sizeof(wndclass));
|
||||
wndclass.cbSize = sizeof(wndclass);
|
||||
wndclass.style = 0;
|
||||
wndclass.lpfnWndProc = wndproc;
|
||||
wndclass.cbClsExtra = 0;
|
||||
wndclass.cbWndExtra = 0;
|
||||
wndclass.hInstance = GetModuleHandle(NULL);
|
||||
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
||||
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wndclass.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
|
||||
wndclass.lpszMenuName = NULL;
|
||||
wndclass.lpszClassName = classname.c_str();
|
||||
wndclass.hIconSm = NULL;
|
||||
atom = RegisterClassEx(&wndclass);
|
||||
if (atom == 0)
|
||||
throw win32_error("RegisterClassEx failed");
|
||||
}
|
||||
|
||||
CWindow::CWindow(const char *_title) : title(_title), hwnd(NULL), parent(NULL), bounds(), owndproc(NULL), showing(FALSE)
|
||||
{
|
||||
style = WS_CHILD;
|
||||
exstyle = 0;
|
||||
}
|
||||
|
||||
HWND CWindow::CreateWindowHandle()
|
||||
{
|
||||
HWND ret = CreateWindowEx(
|
||||
exstyle,
|
||||
GetClassName(),
|
||||
title.c_str(),
|
||||
style,
|
||||
bounds.left,
|
||||
bounds.top,
|
||||
bounds.width,
|
||||
bounds.height,
|
||||
parent,
|
||||
NULL,
|
||||
GetModuleHandle(NULL),
|
||||
0
|
||||
);
|
||||
if (ret == NULL)
|
||||
throw win32_error("CreateWindowEx failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
void CWindow::Create()
|
||||
{
|
||||
if (hwnd != NULL)
|
||||
return;
|
||||
hwnd = CreateWindowHandle();
|
||||
if (hwnd == NULL)
|
||||
throw win32_error("Could not create window");
|
||||
|
||||
// Reset the error code
|
||||
DWORD err = 0;
|
||||
SetLastError(err);
|
||||
|
||||
// Attach the object reference to the window handle
|
||||
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)this);
|
||||
err = GetLastError();
|
||||
if (err != 0)
|
||||
throw win32_error("SetWindowLongPtr failed",err);
|
||||
|
||||
// Set the window proc
|
||||
owndproc = (WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)WindowProc);
|
||||
err = GetLastError();
|
||||
if (err != 0)
|
||||
throw win32_error("SetWindowLongPtr failed",err);
|
||||
}
|
||||
|
||||
const char *CWindow::GetClassName()
|
||||
{
|
||||
return windowClass.GetClassName();
|
||||
}
|
||||
|
||||
LRESULT CALLBACK CWindow::WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
MessageDebug::debug(hwnd, uMsg, wParam, lParam, __FUNCTION__);
|
||||
CWindow* window = (CWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
||||
if (window != NULL)
|
||||
return window->Dispatch(hwnd, uMsg, wParam, lParam);
|
||||
return DefWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
LRESULT CWindow::Dispatch(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_SIZE:
|
||||
bounds.width = LOWORD(lParam);
|
||||
bounds.height = LOWORD(lParam);
|
||||
break;
|
||||
case WM_MOVE:
|
||||
bounds.left = LOWORD(lParam);
|
||||
bounds.top = LOWORD(lParam);
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
showing = FALSE;
|
||||
break;
|
||||
}
|
||||
if (owndproc)
|
||||
return CallWindowProc(owndproc, hwnd, uMsg, wParam, lParam);
|
||||
else
|
||||
return DefWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
void CWindow::Show()
|
||||
{
|
||||
if (hwnd == NULL)
|
||||
Create();
|
||||
ShowWindow(hwnd, SW_SHOWNORMAL);
|
||||
}
|
||||
|
||||
int CWindow::ShowModal()
|
||||
{
|
||||
MSG msg;
|
||||
BOOL bRet;
|
||||
showing = TRUE;
|
||||
Show();
|
||||
|
||||
while( showing && (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
|
||||
{
|
||||
if (bRet == -1)
|
||||
{
|
||||
// handle the error and possibly exit
|
||||
}
|
||||
else
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CWindow::SetLeft(int left)
|
||||
{
|
||||
bounds.left = left;
|
||||
if (hwnd)
|
||||
if (!SetWindowPos(hwnd, NULL,
|
||||
bounds.left, bounds.top,
|
||||
0, 0,
|
||||
SWP_NOZORDER | SWP_NOSIZE))
|
||||
throw win32_error("SetWindowPos failed");
|
||||
}
|
||||
|
||||
void CWindow::SetTop(int top)
|
||||
{
|
||||
bounds.top = top;
|
||||
if (hwnd)
|
||||
if (!SetWindowPos(hwnd, NULL,
|
||||
bounds.left, bounds.top,
|
||||
0, 0,
|
||||
SWP_NOZORDER | SWP_NOSIZE))
|
||||
throw win32_error("SetWindowPos failed");
|
||||
}
|
||||
|
||||
void CWindow::SetWidth(int width)
|
||||
{
|
||||
bounds.width = width;
|
||||
if (hwnd)
|
||||
if (!SetWindowPos(hwnd, NULL,
|
||||
0, 0,
|
||||
bounds.width, bounds.height,
|
||||
SWP_NOZORDER | SWP_NOMOVE))
|
||||
throw win32_error("SetWindowPos failed");
|
||||
}
|
||||
void CWindow::SetHeight(int height)
|
||||
{
|
||||
bounds.height = height;
|
||||
if (hwnd)
|
||||
if (!SetWindowPos(hwnd, NULL,
|
||||
0, 0,
|
||||
bounds.width, bounds.height,
|
||||
SWP_NOZORDER | SWP_NOMOVE))
|
||||
throw win32_error("SetWindowPos failed");
|
||||
}
|
||||
|
||||
void CWindow::SetBounds(int left, int top, int width, int height)
|
||||
{
|
||||
bounds = CBoundary(left, top, width, height);
|
||||
if (hwnd)
|
||||
if (!SetWindowPos(hwnd, NULL,
|
||||
bounds.left, bounds.top,
|
||||
bounds.width, bounds.height,
|
||||
SWP_NOZORDER))
|
||||
throw win32_error("SetWindowPos failed");
|
||||
}
|
||||
|
||||
void CWindow::SetBounds(const RECT &rect)
|
||||
{
|
||||
bounds = rect;
|
||||
if (hwnd)
|
||||
if (!SetWindowPos(hwnd, NULL,
|
||||
bounds.left, bounds.top,
|
||||
bounds.width, bounds.height,
|
||||
SWP_NOZORDER))
|
||||
throw win32_error("SetWindowPos failed");
|
||||
}
|
||||
|
||||
HWND CWindow::GetHandle()
|
||||
{
|
||||
if (hwnd == NULL)
|
||||
Create();
|
||||
return hwnd;
|
||||
}
|
||||
|
||||
void CWindow::SetParent(CWindow *window)
|
||||
{
|
||||
parent = window->GetHandle();
|
||||
if (hwnd != NULL)
|
||||
if (::SetParent(hwnd, parent) == NULL)
|
||||
throw win32_error("SetParent failed");
|
||||
|
||||
}
|
||||
|
||||
void CWindow::SetStyle(DWORD style)
|
||||
{
|
||||
this->style = style;
|
||||
SetLastError(0);
|
||||
if (hwnd)
|
||||
SetWindowLong(hwnd, GWL_STYLE, style);
|
||||
int err = GetLastError();
|
||||
if (err != 0)
|
||||
throw win32_error("SetWindowLong failed", err);
|
||||
}
|
||||
|
||||
void CWindow::SetExStyle(DWORD exstyle)
|
||||
{
|
||||
this->exstyle = exstyle;
|
||||
SetLastError(0);
|
||||
if (hwnd)
|
||||
SetWindowLong(hwnd, GWL_EXSTYLE, exstyle);
|
||||
int err = GetLastError();
|
||||
if (err != 0)
|
||||
throw win32_error("SetWindowWLong failed", err);
|
||||
}
|
|
@ -1,114 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
#ifndef __WINDOW_H__
|
||||
#define __WINDOW_H__
|
||||
|
||||
#include <windows.h>
|
||||
#include <string>
|
||||
|
||||
class CDialog;
|
||||
class CWindow
|
||||
{
|
||||
friend class CDialog;
|
||||
public:
|
||||
struct CBoundary
|
||||
{
|
||||
int left;
|
||||
int top;
|
||||
int width;
|
||||
int height;
|
||||
CBoundary() :
|
||||
left(0), top(0), width(0), height(0) {};
|
||||
CBoundary(int x, int y, int w, int h) :
|
||||
left(x), top(y), width(w), height(h) {};
|
||||
CBoundary(const RECT &r) :
|
||||
left(r.left), top(r.top), width(r.right-r.left), height(r.bottom-r.top) {};
|
||||
};
|
||||
class CWindowClass
|
||||
{
|
||||
private:
|
||||
WNDPROC wndproc;
|
||||
ATOM atom;
|
||||
std::string classname;
|
||||
protected:
|
||||
void Register();
|
||||
public:
|
||||
CWindowClass(const char *name, WNDPROC wndproc);
|
||||
~CWindowClass();
|
||||
const char *GetClassName() { return classname.c_str(); };
|
||||
};
|
||||
private:
|
||||
static CWindowClass windowClass;
|
||||
|
||||
std::string title;
|
||||
DWORD exstyle;
|
||||
DWORD style;
|
||||
CBoundary bounds;
|
||||
HWND hwnd;
|
||||
HWND parent;
|
||||
WNDPROC owndproc;
|
||||
|
||||
BOOL showing;
|
||||
|
||||
protected:
|
||||
|
||||
virtual const char *GetClassName();
|
||||
virtual HWND CreateWindowHandle();
|
||||
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
public:
|
||||
CWindow(const char *title);
|
||||
virtual void Create();
|
||||
|
||||
virtual int ShowModal();
|
||||
|
||||
void Show();
|
||||
void Hide();
|
||||
|
||||
void SetWidth(int width);
|
||||
void SetHeight(int height);
|
||||
void SetLeft(int left);
|
||||
void SetTop(int top);
|
||||
int GetWidth() { return bounds.width; };
|
||||
int GetHeight() { return bounds.height; };
|
||||
int GetLeft() { return bounds.left; };
|
||||
int GetTop() { return bounds.top; };
|
||||
|
||||
void SetBounds(int left, int top, int width, int height);
|
||||
void SetBounds(const RECT &rect);
|
||||
|
||||
void SetStyle(DWORD style);
|
||||
DWORD GetStyle() { return style; };
|
||||
|
||||
void SetExStyle(DWORD exstyle);
|
||||
DWORD GetExStyle() { return exstyle; };
|
||||
|
||||
HWND GetHandle();
|
||||
void SetParent(CWindow *window);
|
||||
|
||||
virtual LRESULT Dispatch(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,244 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
#include "wizard.h"
|
||||
#include "util.h"
|
||||
|
||||
CWizard::CWizard() : pages()
|
||||
{
|
||||
};
|
||||
|
||||
void CWizard::AddPage(const PROPSHEETPAGE &page)
|
||||
{
|
||||
pages.push_back(page);
|
||||
}
|
||||
|
||||
void CWizard::AddPage(const char *page, HINSTANCE instance)
|
||||
{
|
||||
PROPSHEETPAGE psp;
|
||||
if (instance == NULL)
|
||||
instance = GetModuleHandle(NULL);
|
||||
|
||||
memset(&psp, 0, sizeof(psp));
|
||||
psp.dwSize = sizeof(PROPSHEETPAGE);
|
||||
psp.dwFlags = PSP_DEFAULT;
|
||||
psp.hInstance = instance;
|
||||
psp.pszTemplate = page;
|
||||
psp.pfnDlgProc = WizardDialogProc;
|
||||
psp.lParam = (LPARAM)this;
|
||||
|
||||
AddPage(psp);
|
||||
}
|
||||
|
||||
void CWizard::AddPage(DWORD id, DWORD title, DWORD subtitle, HINSTANCE instance)
|
||||
{
|
||||
PROPSHEETPAGE psp;
|
||||
if (instance == NULL)
|
||||
instance = GetModuleHandle(NULL);
|
||||
|
||||
memset(&psp, 0, sizeof(psp));
|
||||
psp.dwSize = sizeof(PROPSHEETPAGE);
|
||||
psp.dwFlags = PSP_DEFAULT;
|
||||
#if _WIN32_IE >= 0x0500
|
||||
if (title != 0)
|
||||
{
|
||||
psp.dwFlags |= PSP_USEHEADERTITLE;
|
||||
psp.pszHeaderTitle = MAKEINTRESOURCE(title);
|
||||
}
|
||||
if (subtitle != 0)
|
||||
{
|
||||
psp.dwFlags |= PSP_USEHEADERSUBTITLE;
|
||||
psp.pszHeaderSubTitle = MAKEINTRESOURCE(subtitle);
|
||||
}
|
||||
#endif
|
||||
|
||||
psp.hInstance = instance;
|
||||
psp.pszTemplate = MAKEINTRESOURCE(id);
|
||||
psp.pfnDlgProc = WizardDialogProc;
|
||||
psp.lParam = (LPARAM)this;
|
||||
|
||||
AddPage(psp);
|
||||
}
|
||||
|
||||
HWND CWizard::CreateWindowHandle()
|
||||
{
|
||||
PROPSHEETHEADER psh;
|
||||
HWND ret;
|
||||
|
||||
PrepareSheetHeader(psh, FALSE);
|
||||
ret = (HWND)PropertySheet(&psh);
|
||||
free(psh.phpage);
|
||||
if (ret == NULL)
|
||||
throw win32_error("PropertySheet failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
int CWizard::ShowModal()
|
||||
{
|
||||
PROPSHEETHEADER psh;
|
||||
int ret;
|
||||
|
||||
PrepareSheetHeader(psh, TRUE);
|
||||
ret = PropertySheet(&psh);
|
||||
free(psh.phpage);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void CWizard::PrepareSheetHeader(PROPSHEETHEADER &psh, BOOL modal)
|
||||
{
|
||||
HPROPSHEETPAGE *phpage = (HPROPSHEETPAGE*)malloc(pages.size() * sizeof(HPROPSHEETPAGE));
|
||||
DWORD modeflag;
|
||||
|
||||
if (modal)
|
||||
modeflag = 0;
|
||||
else
|
||||
modeflag = PSH_MODELESS;
|
||||
|
||||
for (unsigned i = 0; i < pages.size(); i++)
|
||||
{
|
||||
phpage[i] = CreatePropertySheetPage(&pages[i]);
|
||||
if (phpage[i] == NULL)
|
||||
{
|
||||
DWORD err = GetLastError();
|
||||
free(phpage);
|
||||
throw win32_error("CreatePropertySheetPage failed", err);
|
||||
}
|
||||
}
|
||||
|
||||
memset(&psh, 0, sizeof(psh));
|
||||
psh.dwSize = sizeof(PROPSHEETHEADER);
|
||||
#if _WIN32_IE >= 0x0500
|
||||
psh.dwFlags = PSH_WIZARD97 | modeflag;
|
||||
#else
|
||||
psh.dwFlags = PSH_WIZARD | modeflag;
|
||||
#endif
|
||||
psh.hwndParent = NULL;
|
||||
psh.hInstance = GetModuleHandle(NULL);
|
||||
psh.pszIcon = NULL;
|
||||
psh.pszCaption = (LPSTR) "Cell Properties";
|
||||
psh.nPages = pages.size();
|
||||
psh.nStartPage = 0;
|
||||
psh.phpage = phpage;
|
||||
psh.pfnCallback = NULL;
|
||||
}
|
||||
|
||||
DWORD CWizard::PageID(unsigned index)
|
||||
{
|
||||
if (index < pages.size() && IS_INTRESOURCE(pages[index].pszTemplate))
|
||||
return (DWORD)pages[index].pszTemplate;
|
||||
return (DWORD)-1;
|
||||
}
|
||||
|
||||
unsigned CWizard::PageIndex(PROPSHEETPAGE *psp)
|
||||
{
|
||||
for (unsigned i = 0; i < pages.size(); i++)
|
||||
{
|
||||
if (IS_INTRESOURCE(psp->pszTemplate) || IS_INTRESOURCE(pages[i].pszTemplate ))
|
||||
{
|
||||
if (psp->pszTemplate == pages[i].pszTemplate)
|
||||
return i;
|
||||
}
|
||||
else if (psp->pszTemplate && pages[i].pszTemplate)
|
||||
{
|
||||
if (strcmp(psp->pszTemplate, pages[i].pszTemplate) == 0)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return (unsigned)-1;
|
||||
}
|
||||
|
||||
INT_PTR CWizard::DlgDispatch(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
return CBaseDialog::DlgDispatch(hwndDlg, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
INT_PTR CWizard::PageDispatch(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, PROPSHEETPAGE *psp)
|
||||
{
|
||||
LPNMHDR pnmh = (LPNMHDR)lParam;
|
||||
DWORD flags;
|
||||
unsigned pageindex;
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_NOTIFY:
|
||||
switch (pnmh->code)
|
||||
{
|
||||
case PSN_SETACTIVE:
|
||||
#ifdef _DEBUG
|
||||
printf("PSN_SETACTIVE %d\n", PageIndex(psp));
|
||||
#endif
|
||||
pageindex = PageIndex(psp);
|
||||
if (pageindex != (unsigned)-1)
|
||||
{
|
||||
flags = 0;
|
||||
if (pageindex > 0)
|
||||
flags |= PSWIZB_BACK;
|
||||
if ((unsigned)pageindex + 1 == pages.size())
|
||||
flags |= PSWIZB_FINISH;
|
||||
if ((unsigned)pageindex + 1 < pages.size())
|
||||
flags |= PSWIZB_NEXT;
|
||||
PropSheet_SetWizButtons(GetParent(hwndDlg), flags);
|
||||
}
|
||||
WizardActivate(hwndDlg, pageindex);
|
||||
break;
|
||||
case PSN_WIZNEXT:
|
||||
if (WizardNext(hwndDlg, PageIndex(psp)))
|
||||
return TRUE;
|
||||
break;
|
||||
case PSN_WIZBACK:
|
||||
if (WizardBack(hwndDlg, PageIndex(psp)))
|
||||
return TRUE;
|
||||
break;
|
||||
case PSN_WIZFINISH:
|
||||
if (WizardFinish(hwndDlg, PageIndex(psp)))
|
||||
return TRUE;
|
||||
DestroyWindow(GetParent(hwndDlg));
|
||||
case PSN_RESET:
|
||||
if (WizardReset(hwndDlg, PageIndex(psp)))
|
||||
return TRUE;
|
||||
DestroyWindow(GetParent(hwndDlg));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return DlgDispatch(hwndDlg, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
|
||||
INT_PTR CALLBACK CWizard::WizardDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
MessageDebug::debug(hwndDlg, uMsg, wParam, lParam, __FUNCTION__);
|
||||
PROPSHEETPAGE *psp = (PROPSHEETPAGE*)lParam;
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)psp);
|
||||
break;
|
||||
}
|
||||
psp = (PROPSHEETPAGE*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
|
||||
CWizard* wizard = psp?(CWizard*)psp->lParam:NULL;
|
||||
if (wizard != NULL)
|
||||
return wizard->PageDispatch(hwndDlg, uMsg, wParam, lParam, psp);
|
||||
return FALSE;
|
||||
}
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Alexander Gottwald
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name(s) of the above copyright
|
||||
* holders shall not be used in advertising or otherwise to promote the sale,
|
||||
* use or other dealings in this Software without prior written authorization.
|
||||
*/
|
||||
#ifndef __WIZARD_H__
|
||||
#define __WIZARD_H__
|
||||
|
||||
#include "dialog.h"
|
||||
#include <vector>
|
||||
|
||||
#define _WIN32_IE 0x0500
|
||||
#include <prsht.h>
|
||||
|
||||
class CWizard : public CBaseDialog
|
||||
{
|
||||
private:
|
||||
std::vector<PROPSHEETPAGE> pages;
|
||||
void PrepareSheetHeader(PROPSHEETHEADER &psh, BOOL modal);
|
||||
protected:
|
||||
virtual HWND CreateWindowHandle();
|
||||
static INT_PTR CALLBACK WizardDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
virtual INT_PTR DlgDispatch(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
virtual INT_PTR PageDispatch(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, PROPSHEETPAGE *psp);
|
||||
virtual unsigned PageIndex(PROPSHEETPAGE *psp);
|
||||
virtual DWORD PageID(unsigned index);
|
||||
virtual BOOL WizardNext(HWND hwndDlg, unsigned index) { return FALSE; }
|
||||
virtual BOOL WizardBack(HWND hwndDlg, unsigned index) { return FALSE; }
|
||||
virtual BOOL WizardFinish(HWND hwndDlg, unsigned index) { return FALSE; }
|
||||
virtual BOOL WizardReset(HWND hwndDlg, unsigned index) { return FALSE; }
|
||||
virtual BOOL WizardActivate(HWND hwndDlg, unsigned index) { return FALSE; }
|
||||
public:
|
||||
CWizard();
|
||||
void AddPage(const PROPSHEETPAGE &page);
|
||||
void AddPage(const char *page, HINSTANCE instance = NULL);
|
||||
void AddPage(DWORD id, DWORD title, DWORD subtitle, HINSTANCE instance = NULL);
|
||||
virtual int ShowModal();
|
||||
};
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user