📄 gvpinit.c
字号:
SWP swp;
FONTMETRICS fm;
POINTL char_size;
RECTL rect;
HPS hps;
PVOID pResource;
int i;
short *pButtonID;
ULONG version[3];
int badarg;
args.multithread = TRUE;
badarg = parse_argv(&args, argc, argv);
parse_args(&args);
/* IMPORTANT: debug must be set before malloc is called. */
if (DosQuerySysInfo(QSV_VERSION_MAJOR, QSV_VERSION_REVISION,
&version, sizeof(version))) os_version = 201000; /* a guess */
else
os_version = version[0]*10000 + version[1]*100 + version[2];
rc = init1();
if (rc)
return rc;
/* save SHELL default size and location */
rc = WinQueryTaskSizePos(hab, 0, &swp);
if (rc)
return rc;
load_string(IDS_WAIT, szWait, sizeof(szWait));
init_options();
read_profile(szIniFile);
use_args(&args);
view_init(&view);
if (!load_language(option.language)) {
message_box("Couldn't load language specific resources. Resetting to English.", 0);
option.language = IDM_LANGEN;
if (!load_language(option.language)) {
message_box("Couldn't load English resources. Please reinstall GSview", 0);
return (APIRET)-1;
}
}
if (!WinRegisterClass( /* register this window class */
hab, /* anchor block */
szClass, /* class name */
(PFNWP) ClientWndProc, /* window function */
CS_SIZEREDRAW | /* window style */
CS_MOVENOTIFY,
0)) /* no storage */
return (APIRET)-1;
hwnd_frame = WinCreateStdWindow(
HWND_DESKTOP, /* window type */
0, /* frame style is not WS_VISIBLE */
&frame_flags, /* definitions */
szClass, /* client class */
(PSZ)szAppName, /* title */
WS_VISIBLE, /* client style */
0, /* resource module */
ID_GSVIEW, /* resource identifier */
&hwnd_bmp); /* pointer to client */
hwnd_image = hwnd_bmp;
change_language();
if (!WinRegisterClass( /* register this window class */
hab, /* anchor block */
(PSZ)status_class, /* class name */
(PFNWP) StatusWndProc, /* window function */
CS_SIZEREDRAW, /* window style */
0)) /* no storage */
return (APIRET)-1;
if (!WinRegisterClass( /* register this window class */
hab, /* anchor block */
(PSZ)button_class, /* class name */
(PFNWP) ButtonWndProc, /* window function */
CS_SIZEREDRAW | CS_MOVENOTIFY, /* window style */
0)) /* no storage */
return (APIRET)-1;
hptr_crosshair = WinLoadPointer(HWND_DESKTOP, 0, IDP_CROSSHAIR);
hptr_hand = WinLoadPointer(HWND_DESKTOP, 0, IDP_HAND);
/* get initial size and position of status window */
WinQueryWindowRect(hwnd_bmp, &rect);
statusbar.x = rect.xRight - rect.xLeft;
hps = WinGetPS(hwnd_bmp);
GpiQueryFontMetrics(hps, sizeof(FONTMETRICS), &fm);
char_size.y = fm.lMaxAscender + fm.lMaxDescender + fm.lExternalLeading + 2;
char_size.x = fm.lAveCharWidth;
statusbar.y = char_size.y;
WinReleasePS(hwnd_bmp);
hwnd_status = WinCreateWindow(
hwnd_frame,
status_class,
(PCSZ)"status bar",
WS_VISIBLE | WS_SYNCPAINT,
rect.xLeft, rect.yTop, rect.xRight, statusbar.y,
hwnd_frame,
HWND_TOP,
ID_STATUSBAR,
NULL,
NULL);
button_size.x = 24;
button_size.y = 24;
button_shift.x = 0;
button_shift.y = button_size.y;
buttonbar.x = button_size.x;
hwnd_button = WinCreateWindow(
hwnd_frame,
button_class,
(PCSZ)"button bar",
(option.button_show ? WS_VISIBLE : 0) | WS_SYNCPAINT,
rect.xLeft, rect.yBottom,
rect.xLeft+buttonbar.x, rect.yTop - rect.yBottom,
hwnd_frame,
hwnd_bmp,
ID_BUTTONBAR,
NULL,
NULL);
rc = DosGetResource((HMODULE)0, RT_RCDATA, IDR_BUTTON ,&pResource);
if ( rc || (pResource == NULL) )
return rc;
pButtonID = (short *)pResource;
WinQueryWindowRect(hwnd_button, &rect);
hps = WinGetPS(hwnd_button);
for (i=0; pButtonID[i]; i++) {
char title[16];
HBITMAP hbm;
title[0] = '\0';
hbm = GpiLoadBitmap(hps, 0, pButtonID[i], 0, 0);
if (!hbm) {
load_string(pButtonID[i], title, sizeof(title));
}
if (buttonhead == (struct button *)NULL)
buttontail = buttonhead = (struct button *)malloc(sizeof(struct button));
else {
buttontail->next = (struct button *)malloc(sizeof(struct button));
buttontail = buttontail->next;
}
buttontail->id = pButtonID[i];
buttontail->hbitmap = hbm;
buttontail->rect.xLeft = rect.xLeft + i * button_shift.x;
buttontail->rect.yBottom = rect.yTop - button_size.y - i * button_shift.y;
buttontail->rect.xRight = buttontail->rect.xLeft + button_size.x;
buttontail->rect.yTop = buttontail->rect.yBottom + button_size.y;
strcpy(buttontail->str, title);
buttontail->next = NULL;
}
WinReleasePS(hps);
DosFreeResource(pResource);
OldFrameWndProc = WinSubclassWindow(hwnd_frame, (PFNWP)FrameWndProc);
rc = restore_window_position(&swp);
if (rc)
return rc;
init2();
#ifdef __EMX__
if (_emx_vcmp < 0x302e3962) {
char buf[MAXSTR];
char mess[MAXSTR];
load_string(IDS_WRONGEMX, mess, sizeof(mess)-1);
sprintf(buf, mess, _emx_vprt, EMX_NEEDED);
message_box(buf, MB_ICONEXCLAMATION);
}
#endif
if (argc == 1)
return rc;
if (!rc)
rc = DosCreateMutexSem(NULL, &hmutex_ps, 0, FALSE);
if (rc)
return rc;
gsview_initc(argc, argv);
if (badarg) {
gs_addmessf("Unknown argument %d: %s\n", badarg, argv[badarg]);
gserror(IDS_PARSEERROR, NULL, 0, SOUND_ERROR);
}
return rc;
}
/* Platform specific preprocessing of arguments */
BOOL
parse_args(GSVIEW_ARGS *args)
{
char workdir[MAXSTR];
char *filename = args->filename;
/* remember the working directory */
gs_getcwd(workdir, sizeof(workdir));
debug = args->debug;
multithread = args->multithread;
if (args->print || args->convert) {
print_silent = TRUE;
print_exit = TRUE;
}
if (filename[0]) {
/* make sure filename contains full path */
char fullname[MAXSTR+MAXSTR];
if (filename[0]=='\\' || filename[0]=='/') {
if (filename[1] && (filename[1]=='\\' || filename[1]=='/')) {
/* UNC name */
/* do nothing */
}
else {
/* referenced from root directory, so add drive */
fullname[0] = workdir[0];
fullname[1] = workdir[1];
strncpy(fullname+2, filename, sizeof(fullname)-2);
strncpy(args->filename, fullname, sizeof(args->filename)-1);
}
}
else if ( ! (isalpha((int)(filename[0])) && filename[1]==':')) {
/* Doesn't include drive code, so add work dir */
int j;
strcpy(fullname, workdir);
j = strlen(workdir) - 1;
if ( (j >= 0) && !((fullname[j] == '\\') || (fullname[j] == '/')) )
strcat(fullname, "\\");
strcat(fullname, filename);
strncpy(args->filename, fullname, sizeof(args->filename)-1);
}
else if (isalpha((int)(filename[0])) && (filename[1]==':') &&
!((filename[2]=='\\') || (filename[2]=='/'))) {
/* contains drive code, but not directory */
char filedir[MAXSTR];
strncpy(filedir, filename, 2); /* copy drive code */
filedir[2] = '\0';
gs_chdir(filedir);
/* get path on specified drive */
gs_getcwd(fullname, sizeof(fullname));
if (fullname[0] && (fullname[strlen(fullname)-1]!='/')
&& (fullname[strlen(fullname)-1]!='\\'))
strcat(fullname, "\\");
strcat(fullname, filename+2); /* append relative path */
strncpy(args->filename, fullname, sizeof(args->filename)-1);
gs_chdir(workdir);
}
else {
/* contains full path */
/* make this the work dir */
char *t;
char filedir[MAXSTR];
strcpy(filedir, filename);
if ( (t = strrchr(filedir, '\\')) != (char *)NULL ) {
*(++t) = '\0';
gs_chdir(filedir);
}
}
}
return TRUE;
}
void
post_args(void)
{
WinPostMsg(hwnd_bmp, WM_COMMAND, (MPARAM)IDM_ARGS, (MPARAM)&args);
}
APIRET
restore_window_position(SWP *pswp)
{
SWP swp;
swp.fl = SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW;
if ((option.img_size.x != CW_USEDEFAULT) &&
(option.img_size.y != CW_USEDEFAULT) &&
(option.img_origin.y != CW_USEDEFAULT) &&
(option.img_origin.y != CW_USEDEFAULT)) {
LONG cxClientMax ;
LONG cyClientMax ;
LONG cyTitleBar ;
LONG cxSizeBorder ;
LONG cySizeBorder ;
/* do not allow window to be entirely off-screen */
if (option.img_size.x + option.img_origin.x < 16)
option.img_origin.x = 0;
if (option.img_size.y + option.img_origin.y < 16)
option.img_origin.y = 0;
/* get maximum client window size */
cxClientMax = WinQuerySysValue (HWND_DESKTOP, SV_CXFULLSCREEN) ;
cyClientMax = WinQuerySysValue (HWND_DESKTOP, SV_CYFULLSCREEN) ;
cyTitleBar = WinQuerySysValue (HWND_DESKTOP, SV_CYTITLEBAR) ;
cxSizeBorder = WinQuerySysValue (HWND_DESKTOP, SV_CXSIZEBORDER) ;
cySizeBorder = WinQuerySysValue (HWND_DESKTOP, SV_CYSIZEBORDER) ;
cyClientMax += cyTitleBar ;
if (option.img_max)
swp.fl |= SWP_MAXIMIZE;
/* Make sure x origin is within display boundaries */
swp.x = option.img_origin.x ;
if (swp.x < -cxSizeBorder)
swp.x = 0 ;
/* Make sure window isn't too wide, or negative value */
swp.cx = option.img_size.x ;
if (swp.cx >= cxClientMax || swp.cx < 0) {
swp.cx = cxClientMax ;
swp.x = 0 ;
}
if ((swp.x + swp.cx) > (cxClientMax + cxSizeBorder))
swp.x = cxClientMax + cxSizeBorder - swp.cx ;
/* Make sure y origin is within display boundaries */
swp.y = option.img_origin.y ;
if (swp.y < -cySizeBorder)
swp.y = 0 ;
/* Make sure window isn't too high, or negative value */
swp.cy = option.img_size.y ;
if (swp.cy > cyClientMax || swp.cy < 0) {
swp.cy = cyClientMax ;
swp.y = 0 ;
}
if ((swp.y + swp.cy) > (cyClientMax + cySizeBorder))
swp.y = cyClientMax + cySizeBorder - swp.cy ;
}
else { /* No saved position -- use supplied position */
swp = *pswp;
swp.fl = SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW;
}
/* don't activate or show window yet */
/* we might want to print silently */
swp.fl &= ~(SWP_ACTIVATE | SWP_SHOW);
swp.fl |= SWP_DEACTIVATE | SWP_HIDE;
/* Position and size this frame window */
if (!WinSetWindowPos(hwnd_frame, HWND_TOP,
swp.x, swp.y, swp.cx, swp.cy, swp.fl))
return 1;
return 0;
}
APIRET init1()
{
char buf[MAXSTR];
char *tail, *env;
APIRET rc = 0;
char *p;
PTIB pptib;
PPIB pppib;
if ( (rc = DosGetInfoBlocks(&pptib, &pppib)) != 0 ) {
sprintf(buf,"init1: Couldn't get pid, rc = %ld\n", rc);
error_message(buf);
return rc;
}
/* get path to EXE */
if ( (rc = DosQueryModuleName(pppib->pib_hmte, sizeof(szExePath), szExePath)) != 0 ) {
sprintf(buf,"init1: Couldn't get module name, rc = %ld\n", rc);
error_message(buf);
return FALSE;
}
if ((tail = strrchr(szExePath,'\\')) != (PCHAR)NULL) {
tail++;
*tail = '\0';
}
/* Find available language DLLs */
language_find();
strcpy(szHelpName, szExePath);
p = szHelpName + strlen(szHelpName);
load_string(IDS_HELPFILE, p, sizeof(szHelpName) - (int)(p-szHelpName));
/* get path to INI directory */
if ((env = getenv("SYSTEM_INI")) != (char *)NULL) {
strcpy(szIniFile, env);
if ((tail = strrchr(szIniFile,'\\')) != (PCHAR)NULL) {
tail++;
*tail = '\0';
}
}
else
strcpy(szIniFile, szExePath);
strcat(szIniFile, INIFILE);
if ((env = getenv("MMBASE")) != (char *)NULL) {
char buf[MAXSTR];
HMODULE hmodMCIAPI;
strcpy((char *)szMMini, env);
strtok((char *)szMMini, ";");
strcat((char *)szMMini, "\\MMPM.INI");
/* attempt to load MCIAPI.DLL ourselves so gvpm will work without MMOS2 */
if (!DosLoadModule((PBYTE)buf, sizeof(buf), (PCSZ)"MCIAPI", &hmodMCIAPI)) {
DosQueryProcAddr(hmodMCIAPI, 0, (PCSZ)"mciPlayFile", (PFN *)(&pfnMciPlayFile));
}
}
/* local stuff */
if (!rc) {
rc = DosCreateEventSem(NULL, &display.event, 0, FALSE);
if (rc)
error_message("Failed to create display.event semaphore");
}
if (!rc) {
HPS ps = WinGetPS(HWND_DESKTOP);
HDC hdc = GpiQueryDevice(ps);
DevQueryCaps(hdc, CAPS_COLOR_PLANES, 1, &display.planes);
DevQueryCaps(hdc, CAPS_COLOR_BITCOUNT, 1, &display.bitcount);
DevQueryCaps(hdc, CAPS_ADDITIONAL_GRAPHICS, 1, &display.hasPalMan);
display.hasPalMan &= CAPS_PALETTE_MANAGER;
WinReleasePS(ps);
/*
{ char buf[MAXSTR];
sprintf(buf,"main: display planes = %d, bitcount = %d",display.planes,display.bitcount);
message_box(buf, 0);
}
*/
}
return rc;
}
APIRET
init2(void)
{
init_check_menu();
update_scroll_bars();
return 0;
}
void
show_buttons(void)
{
WinSendMsg(hwnd_frame, WM_UPDATEFRAME, (MPARAM)frame_flags, (MPARAM)0);
}
int
gsview_create_objects(char *groupname)
{
char buf[MAXSTR];
char setup[MAXSTR];
APIRET rc;
strcpy(buf, szExePath);
strcat(buf, "\\gvpm.exe");
sprintf(setup, "EXENAME=%s;ASSOCFILTER=*.ps,*.eps,*.pdf", buf);
rc = !WinCreateObject((PCSZ)"WPProgram", (PCSZ)"GSview", (PCSZ)setup, (PCSZ)"<WP_DESKTOP>",
CO_REPLACEIFEXISTS);
if (rc)
gserror(IDS_PROGRAMOBJECTFAILED, NULL, 0, SOUND_ERROR);
return rc;
}
HINSTANCE zlib_hinstance;
PFN_gzopen gzopen;
PFN_gzread gzread;
PFN_gzclose gzclose;
void
unload_zlib(void)
{
if (zlib_hinstance == (HINSTANCE)NULL)
return;
DosFreeModule(zlib_hinstance);
zlib_hinstance = (HINSTANCE)NULL;
gzopen = NULL;
gzread = NULL;
gzclose = NULL;
}
/* load zlib DLL for gunzip */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -