This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-goldedplus/goldlib/gall/gutlwin.cpp

299 lines
7.9 KiB
C++
Raw Normal View History

2000-02-25 10:15:17 +00:00
// This may look like C code, but it is really -*- C++ -*-
// ------------------------------------------------------------------
// The Goldware Library
// Copyright (C) 1999-2000 Alexander S. Aganichev
// ------------------------------------------------------------------
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this program; if not, write to the Free
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
// MA 02111-1307, USA
// ------------------------------------------------------------------
// $Id$
// ------------------------------------------------------------------
// Various Windows functions.
// ------------------------------------------------------------------
// Clipboard handling donated by Eugene Roshal
// ------------------------------------------------------------------
#include <clocale>
#include <cstdio>
#include <cctype>
#define __gctype_h // prevent gctype from being included
2000-02-25 10:15:17 +00:00
#include <gstrall.h>
#include <gmemdbg.h>
#include <gutlos.h>
#include <windows.h>
#ifndef __NO_MMSYSTEM
#include <mmsystem.h>
#endif
// ------------------------------------------------------------------
OSVERSIONINFO WinVer;
2004-10-04 14:50:08 +00:00
char ge_win_coldtitle[GMAXTITLE+1] = "";
char ge_win_title[GMAXTITLE+1] = "";
2000-02-25 10:15:17 +00:00
int ge_win_ext_title;
#if defined(_MSC_VER)
extern "C"
{
#endif
2005-11-01 02:31:41 +00:00
char tu[256];
char tl[256];
#if defined(_MSC_VER)
}
#endif
2000-02-25 10:15:17 +00:00
2002-09-24 10:16:04 +00:00
WCHAR oem2unicode[256];
2000-02-25 10:15:17 +00:00
// ------------------------------------------------------------------
int g_init_os(int flags) {
NW(flags);
int i;
memset(&WinVer, 0, sizeof(OSVERSIONINFO));
WinVer.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx(&WinVer);
SetFileApisToOEM();
2000-02-25 10:15:17 +00:00
GetConsoleTitle(ge_win_coldtitle, sizeof(ge_win_coldtitle));
if(WinVer.dwPlatformId == VER_PLATFORM_WIN32_NT) {
#ifdef __MSVCRT__
char locale[256] = "";
char *lc = setlocale(LC_CTYPE, "");
if(lc) {
strxcpy(locale, lc, 256);
lc = strchr(locale, '.');
if(lc) {
sprintf(lc+1, "%u", GetOEMCP());
}
}
setlocale(LC_CTYPE, locale);
#endif
2000-02-25 10:15:17 +00:00
for(i = 0; i < 256; i++) {
tu[i] = toupper(i);
tl[i] = tolower(i);
2002-05-09 15:19:35 +00:00
CHAR chr = (CHAR)i;
MultiByteToWideChar(CP_OEMCP, MB_USEGLYPHCHARS, &chr, 1, oem2unicode+i, 1);
2000-02-25 10:15:17 +00:00
}
return 0;
}
#ifdef __MSVCRT__
else
setlocale(LC_CTYPE, "C");
#endif
2000-02-25 10:15:17 +00:00
// Due to Win9x doesn't have proper locale support we should rebuild
// tolower/toupper tables
2002-09-23 06:16:34 +00:00
char src[2], dst[2], tst[2];
for(i = 0; i < 32; i++) {
tu[i] = toupper(i);
tl[i] = tolower(i);
2000-02-25 10:15:17 +00:00
}
2002-09-23 06:16:34 +00:00
for(i = 32; i < 256; i++) {
tu[i] = tl[i] = i;
2000-02-25 10:15:17 +00:00
*dst = i; dst[1] = 0;
OemToChar(dst, src);
2002-09-23 06:16:34 +00:00
CharToOem(src, tst);
if(*dst != *tst)
continue;
if(LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_UPPERCASE, src, 1, dst, 2)) {
CharToOem(dst, src);
tu[i] = *src;
}
2000-02-25 10:15:17 +00:00
*dst = i; dst[1] = 0;
OemToChar(dst, src);
2002-09-23 06:16:34 +00:00
if(LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_LOWERCASE, src, 1, dst, 2)) {
CharToOem(dst, src);
tl[i] = *src;
}
2000-02-25 10:15:17 +00:00
}
return 0;
}
// ------------------------------------------------------------------
void g_deinit_os(void) {
SetConsoleTitle(ge_win_coldtitle);
}
// ------------------------------------------------------------------
void g_init_title(char* tasktitle, int titlestatus) {
2004-10-04 14:50:08 +00:00
strxcpy(ge_win_title, tasktitle, GMAXTITLE);
2000-02-25 10:15:17 +00:00
ge_win_ext_title = titlestatus;
}
// ------------------------------------------------------------------
void g_increase_priority(void) {
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
}
// ------------------------------------------------------------------
void g_set_ostitle(char *title) {
SetConsoleTitle(title);
}
// ------------------------------------------------------------------
void g_set_osicon(void) {
// do nothing
}
// ------------------------------------------------------------------
bool g_is_clip_available(void) {
return true;
}
// ------------------------------------------------------------------
char* g_get_clip_text(void) {
HANDLE hClipData;
if(not OpenClipboard(NULL))
return NULL;
int Unicode = false;
int Format = 0;
int ReadType = CF_OEMTEXT;
while((Format = EnumClipboardFormats(Format)) != 0) {
if((Format == CF_UNICODETEXT) and (WinVer.dwPlatformId == VER_PLATFORM_WIN32_NT)) {
2000-02-25 10:15:17 +00:00
Unicode = true;
break;
}
if(Format == CF_TEXT) {
ReadType = CF_TEXT;
break;
}
if(Format == CF_OEMTEXT)
break;
}
char *ClipText = NULL;
if((hClipData = GetClipboardData(Unicode ? CF_UNICODETEXT : ReadType)) != NULL) {
int BufferSize;
char *ClipAddr = (char *)GlobalLock(hClipData);
if(Unicode)
BufferSize = lstrlenW((LPCWSTR)ClipAddr) + 1;
else
BufferSize = strlen(ClipAddr) + 1;
ClipText = (char *) throw_malloc(BufferSize);
if(ClipText != NULL)
if(Unicode)
WideCharToMultiByte(CP_OEMCP, 0, (LPCWSTR)ClipAddr, -1, ClipText, BufferSize, NULL, NULL);
else
if(ReadType == CF_TEXT)
CharToOem(ClipAddr, ClipText);
else
strcpy(ClipText, ClipAddr);
GlobalUnlock(hClipData);
}
CloseClipboard();
return ClipText;
}
// ------------------------------------------------------------------
2000-03-22 17:59:18 +00:00
int g_put_clip_text(const char *Data) {
2000-02-25 10:15:17 +00:00
long DataSize;
if((Data != NULL) and ((DataSize = strlen(Data)) != 0)) {
HGLOBAL hData;
void *GData;
if(not OpenClipboard(NULL))
return -1;
EmptyClipboard();
int BufferSize = DataSize + 1;
if((hData=GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, BufferSize)) != NULL)
if((GData = GlobalLock(hData)) != NULL) {
memcpy(GData, Data, DataSize + 1);
GlobalUnlock(hData);
SetClipboardData(CF_OEMTEXT, (HANDLE)hData);
}
if((hData=GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, BufferSize)) != NULL)
if((GData=GlobalLock(hData)) != NULL) {
memcpy(GData, Data, DataSize + 1);
OemToChar((LPCSTR)GData, (LPTSTR)GData);
GlobalUnlock(hData);
SetClipboardData(CF_TEXT, (HANDLE)hData);
}
if(WinVer.dwPlatformId == VER_PLATFORM_WIN32_NT)
if((hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, BufferSize * 2)) != NULL)
if((GData = GlobalLock(hData)) != NULL) {
WCHAR *UData = (WCHAR *)GData;
while(*Data) {
if((*Data == '\r') or (*Data == '\n') or (*Data == '\t'))
*UData++ = *Data++; // no translation for real control chars
else
2004-01-20 14:58:37 +00:00
*UData++ = oem2unicode[*Data++ & 0xff];
}
*UData = 0;
2000-02-25 10:15:17 +00:00
GlobalUnlock(hData);
SetClipboardData(CF_UNICODETEXT, (HANDLE)hData);
}
CloseClipboard();
}
return 0;
}
// ------------------------------------------------------------------
void g_get_ostitle_name(char *title) {
GetConsoleTitle(title, GMAXTITLE);
}
// ------------------------------------------------------------------
void g_set_ostitle_name(char *title, int mode) {
if(mode == 0) {
2004-10-04 14:50:08 +00:00
char fulltitle[GMAXTITLE+1];
2000-02-25 10:15:17 +00:00
strcpy(fulltitle, ge_win_title);
if(ge_win_ext_title) {
int len = strlen(fulltitle);
2004-10-04 14:50:08 +00:00
if(len < GMAXTITLE-3) {
2000-02-25 10:15:17 +00:00
if(len)
strcat(fulltitle, " - ");
2004-10-04 14:50:08 +00:00
strxcpy(fulltitle+len+3, title, GMAXTITLE-len-3);
2000-02-25 10:15:17 +00:00
}
}
g_set_ostitle(fulltitle);
}
else
g_set_ostitle(title);
}
// ------------------------------------------------------------------