campo-sirio/include/os_win32.cpp
guy 918068e758 form.cpp Migliorata indentazione
isam.*       Migliorata gestione handles dei file isam aperti
os_win16.cpp Migliorate le funzioni di riconoscimento del tipo di disco
os_win32.cpp Semplificati calcoli di centrature icone


git-svn-id: svn://10.65.10.50/trunk@6456 c028cbd2-c16b-5b4b-a496-9718f37d4682
1998-03-30 13:43:36 +00:00

467 lines
11 KiB
C++
Executable File

#define XVT_INCL_NATIVE
#define WIN32_EXTRA_LEAN
#include <os_dep.h>
#include <commdlg.h>
#include <ctype.h>
#include <applicat.h>
#include <colors.h>
#include <utility.h>
#include <window.h>
///////////////////////////////////////////////////////////
// Win32 event hook
///////////////////////////////////////////////////////////
HIDDEN BOOLEAN event_hook(HWND hwnd,
UINT msg,
UINT wparam,
ULONG lparam,
long* ret)
{
switch(msg)
{
case WM_MENUCHAR:
if (wparam > ' ' && wparam <= 'z')
{
WINDOW win = cur_win();
if (win != NULL_WIN)
{
const KEY key = toupper(wparam)+K_CTRL;
dispatch_e_char(win, key);
*ret = 2 << 16;
}
}
break;
case WM_KEYDOWN:
if (wparam == VK_F1)
{
if ((lparam & (1<<29)) == 0) // Il tasto alt non e' premuto
{
KEY k = K_F1;
int sc = GetAsyncKeyState(VK_CONTROL); // Stato del tasto control
if (sc & 0x8000) k += K_CTRL;
int ss = GetAsyncKeyState(VK_SHIFT); // Stato del tasto shift
if (ss & 0x8000) k += K_SHIFT;
WINDOW win = cur_win();
if (win != NULL_WIN)
dispatch_e_char(win, k);
}
}
break;
default:
break;
}
return TRUE; // Continua col processo normale
}
///////////////////////////////////////////////////////////
// Operating system dependent functions
///////////////////////////////////////////////////////////
bool os_allow_another_instance()
{
return TRUE;
}
COLOR os_choose_color(COLOR col, WINDOW win)
{
CHOOSECOLOR cc;
memset(&cc, 0, sizeof(cc)); // Azzera struttura
if (win == NULL_WIN) win = TASK_WIN; // Sceglie una finestra valida
HWND hwnd = (HWND)xvt_vobj_get_attr(win, ATTR_NATIVE_WINDOW);
HDC hdc = GetDC(hwnd);
// Legge la palette di sistema
PALETTEENTRY* pe = NULL;
int max_entries = 0;
if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)
{
max_entries = GetDeviceCaps(hdc, SIZEPALETTE);
pe = new PALETTEENTRY[max_entries];
GetSystemPaletteEntries(hdc, 0, max_entries, pe);
}
ReleaseDC(hwnd, hdc);
// Definisce i 16 colori customizzabili
unsigned long custom_colors[16];
for (int c = 0; c < 16; c++)
{
if (pe)
{
const PALETTEENTRY& e = pe[c < 8 ? c : max_entries - 16 + c];
custom_colors[c] = RGB(e.peRed, e.peGreen, e.peBlue);
}
else
{
const unsigned char val = (c & 0x8) ? 255 : 127;
const unsigned char red = (c & 0x1) ? val : 0;
const unsigned char green = (c & 0x2) ? val : 0;
const unsigned char blue = (c & 0x4) ? val : 0;
custom_colors[c] = RGB(red, green, blue);
}
}
if (pe)
{
delete pe;
pe = NULL;
}
cc.lStructSize = sizeof(cc); // Setta dimensioni
cc.hwndOwner = hwnd; // Setta finestra padre
cc.rgbResult = RGB(XVT_COLOR_GET_RED(c), XVT_COLOR_GET_GREEN(c), XVT_COLOR_GET_BLUE(c));
cc.lpCustColors = custom_colors; // Fissa colori custom
cc.Flags = CC_RGBINIT; // Usa col come primo colore
if (ChooseColor(&cc) != 0)
col = RGB2COLOR(GetRValue(cc.rgbResult), GetGValue(cc.rgbResult), GetBValue(cc.rgbResult));
else
col = COLOR_INVALID;
return col;
}
bool os_deny_another_instance()
{
return FALSE;
}
bool os_destroy_native_icon(unsigned icon)
{
return DestroyIcon((HICON)icon) != 0;
}
void os_draw_native_icon(WINDOW win, const RCT& rct, unsigned icon)
{
HDC hdc = (HDC)xvt_vobj_get_attr(win, ATTR_NATIVE_GRAPHIC_CONTEXT);
int x = (rct.right + rct.left - 32) / 2;
int y = (rct.bottom + rct.top - 32) / 2;
DrawIcon(hdc, x, y, (HICON)icon);
}
unsigned long os_get_free_memory()
{
MEMORYSTATUS ms;
GlobalMemoryStatus(&ms);
return ms.dwAvailPhys;
}
bool os_is_removable_drive(const char* path)
{
return GetDriveType(path) == DRIVE_REMOVABLE;
}
bool os_is_network_drive(const char* path)
{
return GetDriveType(path) == DRIVE_REMOTE;
}
bool os_is_fixed_drive(const char* path)
{
UINT dt = GetDriveType(path);
return dt == DRIVE_FIXED || dt == DRIVE_CDROM;
}
bool os_test_disk_free_space(const char* path, unsigned long filesize)
{
/* Works on WinNT and Win95 OSR2 Only!
ULARGE_INTEGER nRequired;
ULARGE_INTEGER nAvailable;
nRequired.QuadPart = filesize;
GetDiskFreeSpaceEx(path, &nAvailable, NULL, NULL);
return nRequired.QuadPart <= nAvailable.QuadPart;
*/
// On Win95 may fail for disks > 2GB
DWORD nSecPerClust, nBytePerSec, nFreeClust;
GetDiskFreeSpace(path, &nSecPerClust, &nBytePerSec, &nFreeClust, NULL);
__int64 nFree = nFreeClust;
nFree *= nSecPerClust;
nFree *= nBytePerSec;
return nFree > filesize;
}
void os_exec_help_command(MENU_TAG tag, const char* key)
{
TFilename hlp("prassi.hlp");
TString mod(key);
if (mod.not_empty())
{
mod.cut(2); mod.lower();
if (mod != "ba")
hlp.insert(mod, 0);
}
else
{
if (tag == M_HELP_ONCONTEXT)
tag = M_HELP_CONTENTS;
}
HWND hwnd = (HWND)xvt_vobj_get_attr(TASK_WIN, ATTR_NATIVE_WINDOW);
switch(tag)
{
case M_HELP_CONTENTS:
WinHelp(hwnd, hlp, HELP_CONTENTS, 0);
break;
case M_HELP_SEARCH:
WinHelp(hwnd, hlp, HELP_PARTIALKEY, (DWORD)"");
break;
case M_HELP_HELPONHELP:
WinHelp(hwnd, hlp, HELP_HELPONHELP, 0);
break;
case M_HELP_ONCONTEXT:
if (hlp.exist())
{
struct MULTIGUY
{
DWORD mkSize;
TCHAR mkKeylist;
TCHAR mkKeyphrase[16];
} mk;
mk.mkSize = sizeof(MULTIGUY);
mk.mkKeylist = 'M';
strncpy(mk.mkKeyphrase, key, sizeof(mk.mkKeyphrase));
WinHelp(hwnd, hlp, HELP_MULTIKEY, (DWORD)&mk);
}
break;
default: break;
}
}
int os_execute(const TFilename& path, bool sync, bool iconizetask, bool showchild)
{
int exitcode = -1;
STARTUPINFO start;
PROCESS_INFORMATION pi;
memset(&start, 0, sizeof(start));
start.cb = sizeof(start);
start.dwX = start.dwY = start.dwXSize = start.dwYSize = CW_USEDEFAULT;
start.dwFlags = STARTF_USESHOWWINDOW;
start.wShowWindow = showchild ? SW_SHOW : SW_HIDE;
BOOL started = CreateProcess(NULL,(char*)(const char*)path, NULL, NULL, FALSE, 0,
NULL, NULL, &start, &pi);
if (started)
{
HANDLE hProcess = pi.hProcess;
if (sync)
{
ATOM aBa0Atom = NULL;
if (iconizetask && showchild && main_app().name() == "ba0100")
{
TString str;
str << "ba0100->" << cmd2name(path);
aBa0Atom = GlobalAddAtom(str);
}
WaitForInputIdle(hProcess, INFINITE);
TTemp_window tw(TASK_WIN);
if (iconizetask)
{
tw.iconize();
tw.deactivate();
}
if (WaitForSingleObject(hProcess, INFINITE) != 0xFFFFFFFF)
{
unsigned long exit_code;
if (GetExitCodeProcess(hProcess, &exit_code))
exitcode = int(exit_code);
else
exitcode = -2;
}
if (aBa0Atom)
GlobalDeleteAtom(aBa0Atom);
if (iconizetask)
{
tw.maximize();
tw.activate();
do_events();
}
}
else
exitcode = 0;
CloseHandle(pi.hThread);
CloseHandle(hProcess);
}
else
{
exitcode = GetLastError();
error_box("Impossibile eseguire '%s': %d", (const char*)path, exitcode);
}
return exitcode;
}
int os_get_printer_names(TToken_string& t)
{
char* buf = t.get_buffer(4096); // ammazzao'
GetProfileString("devices", NULL, "", buf, t.size());
for (int i = 0; i < t.size(); i++)
{
if (buf[i] == '\0')
{
if (buf[i+1] != '\0')
buf[i] = t.separator();
else
break;
}
}
return t.items();
}
bool os_set_default_printer(const char* name)
{
CHECK(name && *name > ' ', "Null printer name");
TString pdev(name);
if (pdev.find(',') < 0)
{
TString szDevice(256);
GetProfileString ("devices", pdev, "", szDevice.get_buffer(), szDevice.size());
pdev << ',' << szDevice;
}
bool ok = WriteProfileString("windows", "device", pdev) != 0;
return ok;
}
bool os_get_default_printer(TString& name)
{
char* buf = name.get_buffer(256);
bool ok = GetProfileString ("windows", "device", ",,,", buf, name.size()) != 0;
return ok;
}
bool os_spawn_by_menu()
{
#ifdef DBG
bool ok = TRUE;
#else
TString str = main_app().name();
bool ok = str == "ba0100";
if (!ok)
{
str.insert("ba0100->", 0);
ok = GlobalFindAtom(str) != NULL;
}
#endif
return ok;
}
bool os_get_image_editor_path(TFilename& name)
{
// where is EasyDoc installed?
GetPrivateProfileString("Easydoc", "Path", "\\EASYDOC",
name.get_buffer(), name.size(),
"EasyDoc.ini");
// You're unlucky there is no EasyDoc
if (name.empty())
return FALSE;
// paste EasyDoc path
name.add("easydoc.exe");
// is EasyDoc present?
bool ok = name.exist();
return ok;
}
os_type os_get_type()
{
OSVERSIONINFO ovi;
GetVersionEx(&ovi);
os_type t;
switch (ovi.dwPlatformId)
{
case VER_PLATFORM_WIN32s : t = os_Win32s; break;
case VER_PLATFORM_WIN32_NT : t = os_WindowsNT; break;
case VER_PLATFORM_WIN32_WINDOWS: t = os_Windows95; break;
default : t = os_Unknown; break;
}
return t;
}
void os_post_menu_event(WINDOW win, MENU_TAG tag)
{
HWND w = (HWND)xvt_vobj_get_attr(win, ATTR_NATIVE_WINDOW);
PostMessage(w, WM_COMMAND, tag, 0L);
}
void os_set_event_hook()
{
xvt_vobj_set_attr(NULL_WIN, ATTR_EVENT_HOOK, (long)event_hook);
long twin_style = WSF_ICONIZABLE | WSF_CLOSE | WSF_SIZE;
const int scx = GetSystemMetrics(SM_CXSCREEN);
if (scx == 640)
{
const int scy = GetSystemMetrics(SM_CYSCREEN);
const int bcx = GetSystemMetrics(SM_CXFRAME);
const int bcy = GetSystemMetrics(SM_CYFRAME);
static RCT rct;
rct.left = -bcx;
rct.top = GetSystemMetrics(SM_CYCAPTION)-bcy-1;
rct.right = scx+bcx;
rct.bottom = scy+bcy;
xvt_vobj_set_attr(NULL_WIN, ATTR_WIN_PM_TWIN_STARTUP_RCT, long(&rct));
}
else
twin_style |= WSF_MAXIMIZED;
xvt_vobj_set_attr(NULL_WIN,ATTR_WIN_PM_TWIN_STARTUP_STYLE, twin_style);
}
void os_wake_up_caller()
{
HWND hwnd = (HWND)xvt_vobj_get_attr(TASK_WIN, ATTR_NATIVE_WINDOW);
WinHelp(hwnd, "prassi.hlp", HELP_QUIT, 0L);
}
bool os_file_exist(const char* file)
{
return FALSE;
}
bool os_open_spool_row(const char* device)
{
return TRUE;
}
bool os_spool_row(const char* str)
{
return FALSE;
}
bool os_close_spool_row()
{
return TRUE;
}
void os_iconize_window(WINDOW win)
{
HWND hwnd = (HWND)xvt_vobj_get_attr(win, ATTR_NATIVE_WINDOW);
ShowWindow(hwnd, SW_MINIMIZE);
}
void os_maximize_window(WINDOW win)
{
HWND hwnd = (HWND)xvt_vobj_get_attr(win, ATTR_NATIVE_WINDOW);
ShowWindow(hwnd, SW_SHOWMAXIMIZED);
}