summaryrefslogtreecommitdiff
path: root/Build/source/texk/windvi/windvi.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/windvi/windvi.c')
-rw-r--r--Build/source/texk/windvi/windvi.c3354
1 files changed, 0 insertions, 3354 deletions
diff --git a/Build/source/texk/windvi/windvi.c b/Build/source/texk/windvi/windvi.c
deleted file mode 100644
index eb5f7e2e2b6..00000000000
--- a/Build/source/texk/windvi/windvi.c
+++ /dev/null
@@ -1,3354 +0,0 @@
-#include "wingui.h"
-
-/* C RunTime Header Files */
-#ifndef DEBUG_GUI
-#include <kpathsea/c-minmax.h>
-#endif
-
-
-LRESULT DispDefault(EDWP, HWND, UINT, WPARAM, LPARAM);
-
-/* Functions defined in winevt.c */
-#include <stdio.h>
-#include <setjmp.h>
-#include "xdvi-config.h"
-
-/*
- System type
-*/
-int iSystemType = -1;
-
-int GetSystemType(void);
-
-/****************************************************************************
- Global Variables
- ***************************************************************************/
-
-HINSTANCE hInst; /* Current instance */
-char szAppName[100]; /* Name of the app */
-char szTitle[100]; /* The title bar text */
-HWND hWndMain; /* Application main window handle */
-HWND hWndDraw; /* The window with the dvi page */
-HWND hViewLog = NULL; /* Logging window */
-HDC maneDC; /* DC for the screen window */
-HBITMAP maneDIB; /* In memory bitmap for the dvi page */
-HBITMAP magDIB; /* In memory bitmap for the magnifying glass */
-HMENU hMenuMain; /* Main menu */
-
-char *szLogFileName; /* Temporary log file for kpathsea */
-HANDLE hCrtIn, hCrtOut, hCrtErr; /* Standard handles */
-/* hCrtOut and hCrtErr are the same handle, duplicated
- from the writable part of a pipe.
- */
-HANDLE hLogIn; /* One side of the pipe for logging */
-/*
- Logging needs 2 threads :
- - one sentinel for reading on the other (readable) end of the pipe
- - one loop message for the hViewLog window.
- With these threads, anybody writing on stdout/stderr will
- make hViewLog pop up, and the writings will be displayed
- almost synchronously.
- */
-HANDLE hViewLogThread = 0,
- hLogLoopThread = 0;
-BOOL bLogShown; /* Log window is shown */
-
-int tbHeight, sbHeight; /* Toolbar and Status bar heights */
-int maneHeight, maneWidth; /* hWndDraw height and width */
-RECT maneRect; /* hWndDraw Rect */
-RECT rectWndPrev; /* Previous instance window rectangle */
-BOOL bPrevInstance = FALSE; /* Is there a previous instance ? */
-BOOL bSkipFirstClick = FALSE; /* Avoid mag. glass at click to gain focus. */
-
-/* Scrollbars' variables */
-SCROLLINFO si;
-int xMinScroll;
-int xMaxScroll;
-int xCurrentScroll;
-int yMinScroll;
-int yMaxScroll;
-int yCurrentScroll;
-BOOL fScroll;
-BOOL fSize;
-
-BOOL bInitComplete = FALSE; /* Initialization phase completed */
-
-/* Mouse Position */
-int xMousePos;
-int yMousePos;
-
-/*
- Last used files.
- This is a queue. It is addressed in thae arry, indexes modulo number of
- entries. Two values tell the head and tail of the queue.
-*/
-char **lpLastUsedFiles;
-int iLastUsedFilesNum;
-int iLastCurrentUsed, iLastLatestUsed;
-
-/*****************************************************************************
- Main window message table definition.
- ****************************************************************************/
-MSD rgmsd[] =
-{
- {WM_CREATE, MsgCreate },
- {WM_SIZE, MsgSize },
- {WM_MOVE, MsgMove },
- {WM_DROPFILES, MsgDropFiles },
- {WM_COMMAND, MsgCommand },
- {WM_NOTIFY, MsgNotify },
- {WM_MENUSELECT, MsgMenuSelect},
- {WM_DESTROY, MsgDestroy },
- {WM_CHAR, MsgChar },
- {WM_KEYDOWN, MsgKeyDown },
- {WM_ACTIVATE, MsgActivate },
- {WM_COPYDATA, MsgCopyData }
- /* {WM_PAINT, MsgPaint } */
-};
-
-MSDI msdiMain =
-{
- sizeof(rgmsd) / sizeof(MSD),
- rgmsd,
- edwpWindow
-};
-
-
-/* Main window command table definition. */
-CMD rgcmd[] =
-{
- {IDM_FILEOPEN, CmdOpen},
- {IDM_FILECLOSE, CmdClose},
- {IDM_FILEPRINT, CmdFilePrint},
- {IDM_FILEPRINTDVIPS, CmdFilePrint},
- {IDM_FILEPAGESU, CmdStub},
- {IDM_FILEPRINTSU, CmdFilePrSetup},
- {IDM_EXIT, CmdExit},
-
- {IDM_FILE_RECENT, CmdOpenRecentFile},
- {IDM_FILE_RECENT1, CmdOpenRecentFile},
- {IDM_FILE_RECENT2, CmdOpenRecentFile},
- {IDM_FILE_RECENT3, CmdOpenRecentFile},
- {IDM_FILE_RECENT4, CmdOpenRecentFile},
- {IDM_FILE_RECENT5, CmdOpenRecentFile},
- {IDM_FILE_RECENT6, CmdOpenRecentFile},
- {IDM_FILE_RECENT7, CmdOpenRecentFile},
- {IDM_FILE_RECENT8, CmdOpenRecentFile},
- {IDM_FILE_RECENT9, CmdOpenRecentFile},
-
- {IDM_ZOOMIN, CmdZoomIn},
- {IDM_ZOOMOUT, CmdZoomOut},
- {IDM_REDRAWPAGE, CmdRedrawPage},
- {IDM_KEEPPOS, CmdKeepPosition},
- {IDM_TOGGLEPS, CmdTogglePS},
- {IDM_TOGGLEGRID, CmdToggleGrid},
-
- {IDM_NEXTPAGE, CmdNextPage},
- {IDM_PREVIOUSPAGE,CmdPreviousPage},
- {IDM_NEXT5, CmdNext5},
- {IDM_PREVIOUS5, CmdPrevious5},
- {IDM_NEXT10, CmdNext10},
- {IDM_PREVIOUS10, CmdPrevious10},
- {IDM_GOTOPAGE, CmdGotoPage},
- {IDM_SRCSPECIALS, CmdSrcSpecials},
- {IDM_FIRSTPAGE, CmdFirstPage},
- {IDM_LASTPAGE, CmdLastPage},
-
-#ifdef HTEX
- {IDM_URLBACK, CmdUrlBack},
-#endif
- {ID_OPTIONS_WINDVI, CmdWindviConfig},
- {ID_OPTIONS_TEXCONFIG, CmdTexConfig},
-
- {IDM_HELPTOPICS, CmdHelpTopics},
- /* {IDM_HELPCONTENTS, CmdHelpContents}, */
- /* {IDM_HELPSEARCH, CmdHelpSearch}, */
- /* {IDM_HELPHELP, CmdHelpHelp}, */
- {IDM_VIEW_LOG, CmdViewLog},
- {IDM_ABOUT, CmdAbout},
-};
-
-CMDI cmdiMain =
-{
- sizeof(rgcmd) / sizeof(CMD),
- rgcmd,
- edwpWindow
-};
-
-/*****************************************************************************
- Toolbar window
- ****************************************************************************/
-HWND hWndToolbar;
-
-int bVertToolbar = 0;
-/*
-**TODO** Change the following values to match your toolbar bitmap
-
-NUMIMAGES = Number of images in toolbar.bmp. Note that this is not
-the same as the number of elements on the toolbar.
-IMAGEWIDTH = Width of a single button image in toolbar.bmp
-IMAGEHEIGHT = Height of a single button image in toolbar.bmp
-BUTTONWIDTH = Width of a button on the toolbar (zero = default)
-BUTTONHEIGHT = Height of a button on the toolbar (zero = default)
-*/
-
-#define NUMIMAGES 17
-
-#define IMAGEWIDTH 18
-#define IMAGEHEIGHT 17
-#define BUTTONWIDTH 0
-#define BUTTONHEIGHT 0
-
-/*
-**TODO** Add/remove entries in the following array to define the
-toolbar buttons (see documentation for TBBUTTON).
-*/
-
-TBBUTTON tbButton[] =
-{
- {0, IDM_FILEOPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {1, IDM_FILEPRINT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
- {2, IDM_ZOOMIN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {3, IDM_ZOOMOUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
- {4, IDM_PREVIOUS10, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {6, IDM_PREVIOUS5, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {8, IDM_PREVIOUSPAGE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {11, IDM_REDRAWPAGE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {9, IDM_NEXTPAGE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {7, IDM_NEXT5, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {5, IDM_NEXT10, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
- {13,IDM_GOTOPAGE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {16,IDM_SRCSPECIALS,
-#ifdef SRC_SPECIALS
- TBSTATE_ENABLED,
-#else
- TBSTATE_HIDDEN,
-#endif
- TBSTYLE_BUTTON | TBSTYLE_CHECK, 0, 0},
- {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
- {10,IDM_TOGGLEGRID, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
- {12,IDM_TOGGLEPS,
-#ifdef PS_GS
- TBSTATE_ENABLED,
-#else
- TBSTATE_HIDDEN,
-#endif
- TBSTYLE_BUTTON | TBSTYLE_CHECK, 0, 0},
- {15,IDM_BOOKMODE, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_CHECK, 0, 0},
- {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
- {14,IDM_URLBACK,
-#ifdef HTEX
- TBSTATE_ENABLED,
-#else
- TBSTATE_HIDDEN,
-#endif
- TBSTYLE_BUTTON, 0, 0},
-};
-
-/****************************************************************************
- Status Bar Window
- ****************************************************************************/
-HWND hWndStatusbar;
-
-/* **TODO** Add entries to this array for each popup menu in the same
- positions as they appear in the main menu. Remember to define
- the ID's in globals.h and add the strings to windvi.rc. */
-
-UINT idPopup[] =
-{
- IDS_FILEMENU,
- IDS_MOVEMENU,
- IDS_VIEWMENU,
- IDS_HELPMENU,
-};
-
-/*
- 6 -> 123,123
- 5 -> Cursor Pos:
- 4 -> 999
- 3 -> Scaling:
- 2 -> 999999
- 1 -> Page:
- */
-
-/*****************************************************************************/
-
-/*
- FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
-
- PURPOSE: Entry point for the application.
-
- COMMENTS:
-
- This function initializes the application and processes the
- message loop.
-*/
-int APIENTRY WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow)
-{
- MSG msg;
- HANDLE hAccelTable;
-
- /* Initialize global strings */
- lstrcpy (szAppName, SZAPPNAME);
- LoadString (hInstance, IDS_APPNAME, szTitle, 100);
-
- /* Setup standard io, real-time logging ... */
- SetupEnv();
-
- /* are we nt, w9x ? */
- iSystemType = GetSystemType();
-
- /* Get all information from command line */
- ParseCmdLine(GetCommandLine());
-
- if (!hPrevInstance) {
- /* Perform instance initialization: */
- if (!InitApplication(hInstance)) {
- CleanUp();
- return (FALSE);
- }
- }
-
- /* Perform application initialization: */
- if (!InitInstance(hInstance, nCmdShow)) {
- CleanUp();
- return (FALSE);
- }
-
-#if 0
- hAccelTable = LoadAccelerators (hInstance, szAppName);
-#endif
-
- bInitComplete = TRUE;
- SetForegroundWindow(hWndMain);
- /* Main message loop: */
- while (GetMessage(&msg, NULL, 0, 0)) {
-#if 0
- if (!TranslateAccelerator (msg.hwnd, hAccelTable, &msg)) {
-#endif
- TranslateMessage(&msg);
- DispatchMessage(&msg);
-#if 0
- }
-#endif
- }
- CleanUp();
-#if 0
- DestroyWindow(hWndMain);
-#endif
- return (msg.wParam);
-}
-
-/*
- FUNCTION: SetupEnv()
- PURPOSE: initializing stdi, stdout, stderr, redirecting output to the
- view log window in real-time.
-*/
-void SetupEnv()
-{
- SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
- HANDLE current_pid, hTmpOut;
- DWORD idLogThread;
- FILE *hf;
- int fdIn, fdOut, fdErr;
- int i;
- extern char tick_tmp[];
-
- /* if _DEBUG is not defined, these macros will result in nothing. */
- SETUP_CRTDBG;
- /* Set the debug-heap flag so that freed blocks are kept on the
- linked list, to catch any inadvertent use of freed memory */
- /* SET_CRT_DEBUG_FIELD( _CRTDBG_DELAY_FREE_MEM_DF );
- SET_CRT_DEBUG_FIELD( _CRTDBG_CHECK_ALWAYS_DF ); */
-
-#if 0
- /* maybe we could still have an option to write log to some temp file ? */
- szLogFileName = xmalloc(260);
- if (GetTempFileName(szTempPath, "xdvi", 0, szLogFileName) == 0)
- Win32Error("GetTempFileName");
-#endif
-
- if (GetTempPath(PATH_MAX, tick_tmp) == 0)
- Win32Error("GetTempPath/tick_tmp");
-
- hCrtIn = CreateFile("NUL", GENERIC_READ, FILE_SHARE_READ,
- &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (SetStdHandle(STD_INPUT_HANDLE, hCrtIn) == FALSE)
- Win32Error("SetStdHandle/hCrtIn");
-
- if (CreatePipe(&hLogIn, &hTmpOut, &sa, 0) == FALSE) {
- Win32Error("Init/CreatePipe");
- }
-
- current_pid = GetCurrentProcess();
-
- if (DuplicateHandle(current_pid, hTmpOut,
- current_pid, &hCrtOut,
- 0, TRUE, DUPLICATE_SAME_ACCESS) == FALSE)
- Win32Error("DuplicateHandle/OutErr");
-
- if (DuplicateHandle(current_pid, hTmpOut,
- current_pid, &hCrtErr,
- 0, TRUE, DUPLICATE_SAME_ACCESS) == FALSE)
- Win32Error("DuplicateHandle/OutErr");
-
-
- CloseHandleAndClear(&hTmpOut);
-
- if (SetStdHandle(STD_OUTPUT_HANDLE, hCrtOut) == FALSE)
- Win32Error("SetStdHandle/hCrtOut");
-
- if (SetStdHandle(STD_ERROR_HANDLE, hCrtErr) == FALSE)
- Win32Error("SetStdHandle/hCrtErr");
-
- fdIn = _open_osfhandle((long) hCrtIn,
- // (long) GetStdHandle(STD_INPUT_HANDLE),
- _O_TEXT
- );
- hf = _fdopen( fdIn, "r" );
- *stdin = *hf;
- i = setvbuf( stdin, NULL, _IONBF, 0 );
-
- fdOut = _open_osfhandle((long) hCrtOut,
- // (long) GetStdHandle(STD_OUTPUT_HANDLE),
- _O_TEXT
- );
- hf = _fdopen( fdOut, "w" );
- *stdout = *hf;
- i = setvbuf( stdout, NULL, _IONBF, 0 );
-
- fdErr = _open_osfhandle((long) hCrtErr,
- // (long) GetStdHandle(STD_ERROR_HANDLE),
- _O_TEXT
- );
- hf = _fdopen( fdErr, "w" );
- *stderr = *hf;
- i = setvbuf( stderr, NULL, _IONBF, 0 );
-
- /* Run a thread for the ViewLog dialog box. The thread will
- wait for something to read on hLogIn. */
- if ((hViewLogThread = CreateThread(&sa, /* security attributes */
- 0, /* default stack size */
- ViewLogSentinel, /* start address of thread */
- 0, /* parameter */
- 0, /* creation flags */
- &idLogThread /* thread id */
- )) == NULL)
- Win32Error("Log/CreateThread");
-#if 0
- fprintf(stderr, "Setupenv done\n");
-#endif
-}
-
-/*
- FUNCTION: InitApplication(HANDLE)
-
- PURPOSE: Initializes window data and registers window class
-
- COMMENTS:
-
- In this function, we initialize a window class by filling out a data
- structure of type WNDCLASS and calling either RegisterClass or
- the internal MyRegisterClass.
-*/
-BOOL InitApplication(HINSTANCE hInstance)
-{
- WNDCLASSEX wc;
- HWND hWndPrev;
- HANDLE hMutex;
-
-#if 0
- /* Win32 will always set hPrevInstance to NULL, so lets check
- things a little closer. This is because we only want a single
- version of this app to run at a time */
- hwnd = FindWindow (szAppName, szTitle);
- if (hwnd) {
- /* We found another version of ourself. Lets defer to it: */
- if (IsIconic(hwnd)) {
- ShowWindow(hwnd, SW_RESTORE);
- }
- SetForegroundWindow (hwnd);
-
- /* If this app actually had any functionality, we would
- also want to communicate any action that our 'twin'
- should now perform based on how the user tried to
- execute us. */
- return FALSE;
- }
-#endif
-
- hWndPrev = FindWindow(szAppName, NULL);
- if (hWndPrev) {
- GetWindowRect(hWndPrev, &rectWndPrev);
- bPrevInstance = TRUE;
- }
-
- /* hPrevInstance is always NULL under Win32. We have been asked to run only one instance
- of windvi. Next instance will have to wake up the first one, and send it :
- - at least new working directory and file name
- - other params ? With the restriction that we cannot send pointers. */
- if (resource.single_flag) {
- COPYDATASTRUCT CopyData;
- SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
- struct data_exchange DataEx;
-
- /* We create a mutex to be sure to be alone, but only if the option
- single_instance has been given. */
-
- if ((hMutex = CreateMutex(&sa, TRUE, "WindviMutex")) == NULL) {
- Win32Error("WinMain/CreateMutex");
- return FALSE;
- }
- if (GetLastError() == ERROR_ALREADY_EXISTS) {
- /* send the right message to the existing instance */
- if (!hWndPrev) {
- MessageBox(hWndMain, "Can't find the previous instance.", NULL, MB_APPLMODAL | MB_ICONHAND | MB_OK);
- return FALSE;
- }
- /* We found another version of ourself. Lets defer to it: */
- if (IsIconic(hWndPrev)) {
- ShowWindow(hWndPrev, SW_RESTORE);
- }
- if (!SetForegroundWindow(hWndPrev))
- Win32Error("WinMain/SetForegroundWindow");
- /* We send the data_exchange structure ! */
- GetCurrentDirectory(sizeof(DataEx.cwd), DataEx.cwd);
- lstrcpy(DataEx.dviname, dvi_name);
-
- if (curr_page) {
- current_page = (*curr_page ? atoi(curr_page) : 1) - 1;
- }
-
- DataEx.currentpage = current_page;
- DataEx.shrinkfactor = mane.shrinkfactor;
- CopyData.dwData = 0;
- CopyData.cbData = sizeof(DataEx);
- CopyData.lpData = &DataEx;
- SendMessage(hWndPrev, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&CopyData);
- /* and exit */
- return FALSE;
- }
- }
-
-
- /* Fill in window class structure with parameters that describe
- the main window. */
- /* CS_OWNDC : un DC pour chaque fenêtre de la classe */
- wc.cbSize = sizeof(WNDCLASSEX);
- wc.lpszClassName = szAppName;
- wc.hInstance = hInstance;
- wc.lpfnWndProc = (WNDPROC)WndProc;
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_APPICON));
- wc.lpszMenuName = szAppName;
- wc.style = CS_OWNDC;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
- wc.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPICON));
- /* wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);*/
-
-
- if (!RegisterClassEx(&wc)) {
- /* Assume we are running on NT where RegisterClassEx() is
- not implemented, so let's try calling RegisterClass(). */
-
- if (!RegisterClass((LPWNDCLASS)&wc.style)) {
- Win32Error("RegisterClassEx");
- return FALSE;
- }
- }
-
- wc.lpszClassName = "ClientDrawClass";
- wc.hInstance = hInstance;
- wc.lpfnWndProc = (WNDPROC)DrawProc;
- wc.hCursor = NULL; /* Different cursors may be loaded */
- wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_APPICON));
- wc.lpszMenuName = NULL;
- wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
- wc.style = CS_OWNDC /* 0| CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNCLIENT */;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_APPICON));
-
-
- if (!RegisterClassEx(&wc)) {
- /* Assume we are running on NT where RegisterClassEx() is
- not implemented, so let's try calling RegisterClass(). */
-
- if (!RegisterClass((LPWNDCLASS)&wc.style)) {
- Win32Error("RegisterClassEx");
- return FALSE;
- }
- }
-
- wc.lpszClassName = "MagnifyGlass";
- wc.hInstance = hInstance;
- wc.lpfnWndProc = (WNDPROC)MagnifyProc;
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_APPICON));
- wc.lpszMenuName = NULL;
- wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
- wc.style = CS_OWNDC /* | CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNCLIENT */;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_APPICON));
-
-
- if (!RegisterClassEx(&wc)) {
- /* Assume we are running on NT where RegisterClassEx() is
- not implemented, so let's try calling RegisterClass(). */
-
- if (!RegisterClass((LPWNDCLASS)&wc.style)) {
- Win32Error("RegisterClassEx");
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-/*
- FUNCTION: InitInstance(HANDLE, int)
-
- PURPOSE: Saves instance handle and creates main window
-
- COMMENTS:
-
- In this function, we save the instance handle in a global variable and
- create and display the main program window.
- */
-BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
-{
- extern void UpdateMainMenuUsedFiles(void);
- hInst = hInstance; /* Store instance handle in our global variable */
-
- magDIB = maneDIB = NULL;
-
- /* Setup bswap function */
- bswap = (check_386() ? bswap_c : bswap_asm);
-
- /* setup units */
- pixel_to_unit();
-
-#ifdef _TRACE
- fprintf(stderr, "w = %d, h = %d\n", page_w, page_h);
-#endif
-
- hCursWait = LoadCursor(NULL, IDC_WAIT);
- hCursArrow = LoadCursor(NULL, IDC_ARROW);
- hCursCross = LoadCursor(NULL, IDC_CROSS);
-/* BEGIN CHUNK xdvi.c 2 */
-#ifdef SRC_SPECIALS
- hCursSrc = LoadCursor(NULL, IDC_IBEAM);
-#endif
-/* END CHUNK xdvi.c 2 */
-
- hWndMain = CreateWindowEx(WS_EX_ACCEPTFILES, szAppName, szTitle,
- WS_OVERLAPPEDWINDOW /*| WS_CLIPCHILDREN */,
- CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
- NULL, NULL, hInstance, NULL);
-
- if (!hWndMain) {
- Win32Error("CreateWindow");
- return (FALSE);
- }
- if (!CreateTBar(hWndMain))
- return FALSE;
- if (!CreateSBar(hWndMain))
- return FALSE;
- if (!CreateDraw(hWndMain))
- return FALSE;
- if (!CreateMagnify(hWndDraw))
- return FALSE;
-
- hMenuMain = GetMenu(hWndMain);
- CheckMenuItem(hMenuMain, IDM_TOGGLEPS, (resource._postscript ? MF_CHECKED : MF_UNCHECKED));
- CheckMenuItem(hMenuMain, IDM_TOGGLEGRID, (resource._grid_mode ? MF_CHECKED : MF_UNCHECKED));
- CheckMenuItem(hMenuMain, IDM_KEEPPOS, (resource.keep_flag ? MF_CHECKED : MF_UNCHECKED));
-
- UpdateMainMenuUsedFiles();
-
- ShowWindow(hWndMain, nCmdShow);
- return (TRUE);
-}
-
-/*
- FUNCTION: DispMessage(LPMSDI, HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: Call the function associated with a message.
-
- PARAMETERS:
- lpmsdi - Structure containing the message dispatch information.
- hwnd - The window handle
- uMessage - The message number
- wparam - Message specific data
- lparam - Message specific data
-
- RETURN VALUE:
- The value returned by the message function that was called.
-
- COMMENTS:
- Runs the table of messages stored in lpmsdi->rgmsd searching
- for a message number that matches uMessage. If a match is found,
- call the associated function. Otherwise, call DispDefault to
- call the default function, if any, associated with the message
- structure. In either case, return the value recieved from the
- message or default function.
- */
-
-LRESULT DispMessage(LPMSDI lpmsdi,
- HWND hwnd,
- UINT uMessage,
- WPARAM wparam,
- LPARAM lparam)
-{
- int imsd = 0;
-
- MSD *rgmsd = lpmsdi->rgmsd;
- int cmsd = lpmsdi->cmsd;
-
- for (imsd = 0; imsd < cmsd; imsd++)
- {
- if (rgmsd[imsd].uMessage == uMessage)
- return rgmsd[imsd].pfnmsg(hwnd, uMessage, wparam, lparam);
- }
-
- return DispDefault(lpmsdi->edwp, hwnd, uMessage, wparam, lparam);
-}
-
-/*
- FUNCTION: DispCommand(LPCMDI, HWND, WPARAM, LPARAM)
-
- PURPOSE: Call the function associated with a command.
-
- PARAMETERS:
- lpcmdi - Structure containing the command dispatch information.
- hwnd - The window handle
- GET_WM_COMMAND_ID(wparam, lparam) - Identifier of the menu item,
- control, or accelerator.
- GET_WM_COMMAND_CMD(wparam, lparam) - Notification code.
- GET_WM_COMMAND_HWND(wparam, lparam) - The control handle or NULL.
-
- RETURN VALUE:
- The value returned by the command function that was called.
-
- COMMENTS:
- Runs the table of commands stored in lpcmdi->rgcmd searching
- for a command number that matches wCommand. If a match is found,
- call the associated function. Otherwise, call DispDefault to
- call the default function, if any, associated with the command
- structure. In either case, return the value recieved from the
- command or default function.
- */
-
-
-LRESULT DispCommand(LPCMDI lpcmdi,
- HWND hwnd,
- WPARAM wparam,
- LPARAM lparam)
-{
- LRESULT lRet = 0;
- WORD wCommand = GET_WM_COMMAND_ID(wparam, lparam);
- int icmd;
-
- CMD *rgcmd = lpcmdi->rgcmd;
- int ccmd = lpcmdi->ccmd;
-
- /* Message packing of wparam and lparam have changed for Win32,
- so use the GET_WM_COMMAND macro to unpack the commnad */
-
- for (icmd = 0; icmd < ccmd; icmd++) {
- if (rgcmd[icmd].wCommand == wCommand) {
- return rgcmd[icmd].pfncmd(hwnd,
- wCommand,
- GET_WM_COMMAND_CMD(wparam, lparam),
- GET_WM_COMMAND_HWND(wparam, lparam));
- }
- }
-
- return DispDefault(lpcmdi->edwp, hwnd, WM_COMMAND, wparam, lparam);
-}
-
-
-
-/*
- FUNCTION: DispDefault(EDWP, HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: Call the appropriate default window procedure.
-
- PARAMETERS:
- edwp - Enumerate specifying the appropriate default winow procedure.
- hwnd - The window handle
- uMessage - The message number
- wparam - Message specific data
- lparam - Message specific data
-
- RETURN VALUE:
- If there is a default proc, return the value returned by the
- default proc. Otherwise, return 0.
-
- COMMENTS:
- Calls the default procedure associated with edwp using the specified
- parameters.
- */
-
-LRESULT DispDefault(EDWP edwp,
- HWND hwnd,
- UINT uMessage,
- WPARAM wparam,
- LPARAM lparam)
-{
- switch (edwp)
- {
- case edwpNone:
- return 0;
- case edwpWindow:
- return DefWindowProc(hwnd, uMessage, wparam, lparam);
- case edwpDialog:
- return DefDlgProc(hwnd, uMessage, wparam, lparam);
- case edwpMDIFrame:
- return DefFrameProc(hwnd, NULL, uMessage, wparam, lparam);
- case edwpMDIChild:
- return DefMDIChildProc(hwnd, uMessage, wparam, lparam);
- }
- return 0;
-}
-
-/*****************************************************************************
- Main Window messages
- ****************************************************************************/
-
-/*
- FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: Processes messages for the main window.
-
- PARAMETERS:
- hwnd - window handle
- uMessage - message number
- wparam - additional information (dependant on message number)
- lparam - additional information (dependant on message number)
-
- RETURN VALUE:
- The return value depends on the message number. If the message
- is implemented in the message dispatch table, the return value is
- the value returned by the message handling function. Otherwise,
- the return value is the value returned by the default window procedure.
-
- COMMENTS:
- Call the DispMessage() function with the main window's message dispatch
- information (msdiMain) and the message specific information.
- */
-
-LRESULT CALLBACK WndProc(HWND hwnd,
- UINT uMessage,
- WPARAM wparam,
- LPARAM lparam)
-{
- return DispMessage(&msdiMain, hwnd, uMessage, wparam, lparam);
-}
-
-/*
- FUNCTION: MsgCommand(HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: Handle the WM_COMMAND messages for the main window.
-
- PARAMETERS:
- hwnd - window handle
- uMessage - WM_COMMAND (Unused)
- GET_WM_COMMAND_ID(wparam, lparam) - Command identifier
- GET_WM_COMMAND_HWND(wparam, lparam) - Control handle
-
- RETURN VALUE:
- The return value depends on the message number. If the message
- is implemented in the message dispatch table, the return value is
- the value returned by the message handling function. Otherwise,
- the return value is the value returned by the default window procedure.
-
- COMMENTS:
- Call the DispCommand() function with the main window's command dispatch
- information (cmdiMain) and the command specific information.
- */
-
-LRESULT MsgCommand(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- return DispCommand(&cmdiMain, hwnd, wparam, lparam);
-}
-
-
-/*
- FUNCTION: MsgCreate(HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: Handle the WM_CREATE messages for the main window.
- and call InitCommonControls() API to initialize the
- common control library.
-
- PARAMETERS:
- hwnd - window handle
-
- RETURN VALUE:
- Return 0 if the StatusBar and ToolBar Windows could be created
- successfully. Otherwise, returns -1 to abort the main window
- creation.
-
- COMMENTS:
- Call the CreateTSBars function with the main window's window handle
- information (msdiMain).
- */
-
-LRESULT MsgCreate(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- int nRet = -1;
- FARPROC icce;
-
- top_level = hwnd;
-
- if (!(icce = GetProcAddress(GetModuleHandle("comctl32.dll"),
- "InitCommonControlsEx"))) {
-#if 0
- fprintf(stderr, "Not running the latest comctl32.dll\n");
-#endif
- bVertToolbar = 0;
- InitCommonControls() ; /* Initialize the common control library. */
- }
- else {
- INITCOMMONCONTROLSEX icc = { sizeof(INITCOMMONCONTROLSEX),
- ICC_BAR_CLASSES };
- if ((*icce)(&icc) == FALSE)
- Win32Error("InitCommonControlsEx");;
- bVertToolbar = 1;
- }
-
- DragAcceptFiles(hwnd, TRUE);
-
- return 0;
-}
-
-void UpdateGeometry()
-{
- RECT r;
- char buf[256];
-
- /* Avoid updating when in iconic form */
- if (IsIconic(hWndMain)) return;
-
- /* Update the geometry string */
- GetWindowRect(hWndMain, &r);
-
- sprintf(buf, "%ux%u%+d%+d",
- r.right - r.left,
- r.bottom - r.top,
- /* be safe, do not allow huge numbers */
- (r.left < 0 ? 0 : r.left) % maneHorzRes,
- (r.top < 0 ? 0 : r.top) % maneVertRes
- );
- if (geometry) free(geometry);
- geometry = strdup(buf);
-}
-
-/*
- FUNCTION: MsgSize(HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: This function resizes the toolbar and statusbar controls.
-
-
- PARAMETERS:
-
- hwnd - Window handle (Used)
- uMessage - Message number (Used)
- wparam - Extra data (Used)
- lparam - Extra data (Used)
-
- RETURN VALUE:
-
- Always returns 0 - Message handled
-
- COMMENTS:
-
- When the window procdure that has the status and tool bar controls
- receive the WM_SIZE message, it has to pass the message on to these
- controls so that these controls can adjust their size accordingly.
- */
-
-
-LRESULT MsgSize(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- fSize = TRUE;
-
- SendMessage(hWndStatusbar, uMessage, wparam, lparam);
- SendMessage(hWndToolbar, uMessage, wparam, lparam);
-
- /* Re-position the panes in the status bar */
- InitializeStatusBar(hwnd);
-
- /* Re-size client window relative to the tool/status bars */
- if (wparam != SIZE_MINIMIZED)
- SizeClientWindow(hwnd);
-
- UpdateGeometry();
-
- return 0;
-}
-/*
- We need to update geometry in case of moving.
- */
-LRESULT MsgMove(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- UpdateGeometry();
- return 0;
-}
-
-void SetScrollBars(HWND hwnd)
-{
- RECT r;
-
- GetClientRect(hwnd, &r);
-
- /* Scrollbars */
- xMinScroll = 0;
- xMaxScroll = max((unsigned)page_w, r.right) - 1;
- /* mane.base_x = */xCurrentScroll = min(xCurrentScroll, xMaxScroll - max(r.right-1, 0));
-
- si.cbSize = sizeof(si);
- si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
- si.nMin = xMinScroll;
- si.nMax = xMaxScroll;
- si.nPage = r.right;
- si.nPos = xCurrentScroll;
- SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
-
- yMinScroll = 0;
- yMaxScroll = max((unsigned)page_h, r.bottom) - 1;
- /* mane.base_y = */yCurrentScroll = min(yCurrentScroll, yMaxScroll - max(r.bottom-1, 0));
-
- si.cbSize = sizeof(si);
- si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
- si.nMin = yMinScroll;
- si.nMax = yMaxScroll;
- si.nPage = r.bottom;
- si.nPos = yCurrentScroll;
- SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
-
-#ifdef _TRACE
- fprintf(stderr, "Page %d x %d\nScrollbars to [%d, %d, %d] and [%d, %d, %d]\n",
- r.right, r.bottom,
- xMinScroll, xCurrentScroll, xMaxScroll,
- yMinScroll, yCurrentScroll, yMaxScroll);
-#endif
-}
-
-void SizeClientWindow(HWND hwnd)
-{
- int xNewSize, yNewSize;
- POINT ptOldOrg;
- int xorg, yorg;
- RECT r;
- int parentWidth, parentHeight;
- /* Re-position the child window */
-
- GetClientRect(hwnd, &r);
- parentHeight = r.bottom;
- parentWidth = r.right;
- GetClientRect(hWndToolbar, &r);
- tbHeight = r.bottom;
- GetClientRect(hWndStatusbar, &r);
- sbHeight = r.bottom;
-
- maneRect.left = 0;
- maneRect.right = parentWidth;
- maneRect.top = 0;
- maneRect.bottom = parentHeight - sbHeight -tbHeight - 1;
-
- xNewSize = parentWidth;
- yNewSize = parentHeight - sbHeight -tbHeight;
-
- /* FIXME: try to SetWindowPos() instead */
- SetWindowPos(hWndDraw, HWND_TOPMOST, 0, tbHeight+1,
- xNewSize, yNewSize,
- SWP_NOACTIVATE | SWP_DEFERERASE | SWP_SHOWWINDOW
- | SWP_NOOWNERZORDER | SWP_NOZORDER);
-
- GetClientRect(hWndDraw, &r);
-
- maneWidth = r.right;
- maneHeight = r.bottom;
-
- SetScrollBars(hWndDraw);
-
-#if 1
-/* GdiFlush(); */
-/* UpdateWindow(hWndDraw); */
- /* FIXME : adjust the position of the page */
- if (maneDrawDC && hWndDraw && bInitComplete) {
- GetWindowOrgEx(maneDrawDC, &ptOldOrg);
- if (mane.win == hWndDraw && GetClientRect(hWndDraw, &maneRect)) {
- int xorg = (int)(page_w - maneRect.right)/2;
- int yorg = (int)(page_h - maneRect.bottom)/2;
- xorg = min(0, xorg);
- yorg = min(0, yorg);
-#if 0
- fprintf(stderr, "Old org (%ld, %ld) New org (%ld, %ld) page %d %d rect %d %d\n",
- ptOldOrg.x, ptOldOrg.y,
- xorg, yorg, page_w, page_h, maneRect.right, maneRect.bottom);
-#endif
- ScrollWindowEx(hWndDraw,
- - xorg + ptOldOrg.x, - yorg + ptOldOrg.y,
- NULL, NULL, (HRGN)NULL, (LPRECT)NULL,
- SW_INVALIDATE | SW_ERASE);
-/* fprintf(stderr, "scrolled window by %d, %d\n", */
-/* - xorg + ptOldOrg.x, - yorg + ptOldOrg.y); */
-/* GdiFlush(); */
-/* UpdateWindow(hWndDraw); */
- if (SetWindowOrgEx(maneDrawDC, xorg, yorg, NULL) == 0) {
- Win32Error("MsgDrawPaint/SetWindowOrgEx(x,y)");
- }
-/* fprintf(stderr, "Set new org @ (%ld, %ld)\n", xorg, yorg); */
-/* GdiFlush(); */
-/* UpdateWindow(hWndDraw); */
- }
- else {
- Win32Error("MsgDrawPaint/GetClientRect(hwnd)");
- }
- }
-#endif
-}
-
-/*
- FUNCTION: MsgDestroy(HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: Calls PostQuitMessage().
-
- PARAMETERS:
-
- hwnd - Window handle (Unused)
- uMessage - Message number (Unused)
- wparam - Extra data (Unused)
- lparam - Extra data (Unused)
-
- RETURN VALUE:
-
- Always returns 0 - Message handled
-
- COMMENTS:
- */
-
-
-LRESULT MsgDestroy(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- DragAcceptFiles(hwnd, FALSE);
- SaveOptions();
-
- PostQuitMessage(0);
- return 0;
-}
-
-/*
- FUNCTION: CmdExit(HWND, WORD, WORD, HWND)
-
- PURPOSE: Exit the application.
-
- PARAMETERS:
- hwnd - The window.
- wCommand - IDM_EXIT (unused)
- wNotify - Notification number (unused)
- hwndCtrl - NULL (unused)
-
- RETURN VALUE:
- Always returns 0 - command handled.
-
- COMMENTS:
- */
-
-
-LRESULT CmdExit(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
-{
- DragAcceptFiles(hwnd, FALSE);
- SaveOptions();
-
- PostQuitMessage(0);
- return 0;
-}
-
-/*
- Status Bar functions
- */
-
-LRESULT MsgDropFiles(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- WORD cFiles;
- char lpszFile[MAX_PATH];
-
- cFiles = DragQueryFile((HANDLE) wparam, 0xFFFFFFFF, (LPSTR) NULL, 0);
- if (cFiles != 1) {
- MessageBox(hWndMain, "Only one dvi file open.", NULL, MB_APPLMODAL | MB_ICONHAND | MB_OK);
- }
- DragQueryFile((HANDLE) wparam, 0, lpszFile, sizeof(lpszFile));
- dvi_name = xstrdup(lpszFile);
- DragFinish((HANDLE) wparam);
-
- open_dvi_file();
- if (reconfig() == FALSE) {
- char buf[40];
- mane.shrinkfactor +=3;
- wsprintf(buf, "New shrink factor : %d\n", mane.shrinkfactor);
- UpdateStatusBar(buf, 0, 0);
- if (reconfig() == FALSE) {
- MessageBox(hWndMain, "Can't allocate page bitmap !\r\nPlease report this error.", NULL, MB_APPLMODAL | MB_ICONERROR | MB_OK);
- CleanExit(1);
- }
- }
- redraw_page();
- SetForegroundWindow(hwnd);
-
- return 0;
-
-}
-#if 0
-/*
- FUNCTION: MsgTimer(HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: Calls GetLocalTime() to set the time on the status bar
-
-
- PARAMETERS:
-
- hwnd - Window handle (Unused)
- uMessage - Message number (Unused)
- wparam - Extra data (Unused)
- lparam - Extra data (Unused)
-
- RETURN VALUE:
-
- Always returns 0 - Message handled
-
- COMMENTS:
-
- Every time the window procedure receives a Timer message, it calls
- GetLocalTime() to obtain the time and then formats the time into
- a string. The time sting is then displayed on the status bar.
- */
-
-LRESULT MsgTimer(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- char szBuf[16]; /* Temp buffer. */
- SYSTEMTIME sysTime;
-
-
- GetLocalTime(&sysTime);
-
- wsprintf(szBuf,
- "%2d:%02d:%02d %s",
- (sysTime.wHour == 0 ? 12 :
- (sysTime.wHour <= 12 ? sysTime.wHour : sysTime.wHour -12)),
- sysTime.wMinute,
- sysTime.wSecond,
- (sysTime.wHour < 12 ? "AM":"PM"));
-
- UpdateStatusBar(szBuf, 8, 0);
- return 0;
-}
-
-/*
- FUNCTION: MsgMousemove(HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: Obtains the Cursor position to display coordinates on
- the status bar.
-
- PARAMETERS:
-
- hwnd - Window handle (Unused)
- uMessage - Message number (Unused)
- wparam - Extra data (Unused)
- lparam - Extra data (Used)
-
- RETURN VALUE:
-
- Always returns 0 - Message handled
-
- COMMENTS:
-
- The mouse coordinates (x and y) are in the HI And LO words
- of LPARAM
- */
-
-
-LRESULT MsgMousemove(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- char szBuf[20]; /* Array for formatting mouse coordinates */
-
- wsprintf(szBuf, "%d,%d", LOWORD(lparam), HIWORD(lparam));
- UpdateStatusBar(szBuf, 6, 0);
- return 0;
-}
-#endif
-
-/*
- FUNCTION: MsgMenuSelect(HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: Upadates menu selections on the status bar.
-
-
- PARAMETERS:
-
- hwnd - Window handle (Used)
- uMessage - Message number (Used)
- wparam - Extra data (Used)
- lparam - Extra data (Used)
-
- RETURN VALUE:
-
- Always returns 0 - Message handled
-
- COMMENTS:
- This message is sent when the user selects menu items by
- by pulling down a popup menu move the mouse around to highlite
- different menu items.
- */
-
-LRESULT MsgMenuSelect(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- static char szBuffer[128];
- UINT nStringID = 0;
- UINT fuFlags = GET_WM_MENUSELECT_FLAGS(wparam, lparam) & 0xffff;
- UINT uCmd = GET_WM_MENUSELECT_CMD(wparam, lparam);
- HMENU hMenu = GET_WM_MENUSELECT_HMENU(wparam, lparam);
-
-
- szBuffer[0] = 0; /* First reset the buffer */
-
-
- if (fuFlags == 0xffff && hMenu == NULL) /* Menu has been closed */
- nStringID = IDS_DESCRIPTION;
-
- else if (fuFlags & MFT_SEPARATOR) /* Ignore separators */
- nStringID = 0;
-
- else if (fuFlags & MF_POPUP) /* Popup menu */
- {
- if (fuFlags & MF_SYSMENU) /* System menu */
- nStringID = IDS_SYSMENU;
-
- else
- /* Get string ID for popup menu from idPopup array. */
- nStringID = ((uCmd < sizeof(idPopup)/sizeof(idPopup[0])) ?
- idPopup[uCmd] : 0);
- } /* for MF_POPUP */
-
- else /* Must be a command item */
- nStringID = uCmd; /* String ID == Command ID */
-
- /* Load the string if we have an ID */
- if (0 != nStringID)
- LoadString(hInst, nStringID, szBuffer, sizeof(szBuffer));
-
- /* Finally... send the string to the status bar */
- UpdateStatusBar(szBuffer, 0, 0);
-
- return 0;
-}
-
-
-/*
- FUNCTION: InitializeStatusBar(HWND)
-
- PURPOSE: Initialize statusbar control with time and mouse positions.
-
-
- PARAMETERS:
-
- hwndParent - Window handle of the status bar's parent
-
-
- RETURN VALUE: NONE
-
-
- COMMENTS:
-
- This function initializes the time and mouse positions sections of
- the statubar window. The Date for the time section is obtained by
- calling SetTimer API. When the timer messages start comming in,
- GetSytemTime() to fill the time section.
- The WPARAM of SB_SETTEXT is divided into 2 parameters. The LOWORD
- determines which section/part the text goes into, and the HIWORD
- tells how the bar is drawn (popin or popout).
- */
-
-void InitializeStatusBar(HWND hwndParent)
-{
- const cSpaceInBetween = 8;
- char szBuf[20];
- int ptArray[7]; /* Array defining the number of parts/sections */
- SIZE size; /* the Status bar will display. */
- RECT rect;
- HDC hDC;
-
- /*
- * Fill in the ptArray...
- */
-
- hDC = GetDC(hwndParent);
- GetClientRect(hwndParent, &rect);
-
- ptArray[6] = rect.right;
-
- if (GetTextExtentPoint(hDC, "999999.999xx x 999999.999xx", 27, &size))
- ptArray[5] = ptArray[6] - (size.cx) - cSpaceInBetween;
- else
- ptArray[5] = 0;
-
- if (GetTextExtentPoint(hDC, "Cursor Pos:", 12, &size))
- ptArray[4] = ptArray[5] - (size.cx) - cSpaceInBetween;
- else
- ptArray[4] = 0;
-
- if (GetTextExtentPoint(hDC, "999", 2, &size))
- ptArray[3] = ptArray[4] - (size.cx) - cSpaceInBetween;
- else
- ptArray[3] = 0;
-
- if (GetTextExtentPoint(hDC, "Scaling:", 9, &size))
- ptArray[2] = ptArray[3] - (size.cx) - cSpaceInBetween;
- else
- ptArray[2] = 0;
-
- if (GetTextExtentPoint(hDC, "99999 of 99999", 14, &size))
- ptArray[1] = ptArray[2] - (size.cx) - cSpaceInBetween;
- else
- ptArray[1] = 0;
-
- if (GetTextExtentPoint(hDC, "Page:", 6, &size))
- ptArray[0] = ptArray[1] - (size.cx) - cSpaceInBetween;
- else
- ptArray[0] = 0;
-
- ReleaseDC(hwndParent, hDC);
-
- SendMessage(hWndStatusbar,
- SB_SETPARTS,
- sizeof(ptArray)/sizeof(ptArray[0]),
- (LPARAM)(LPINT)ptArray);
-
- UpdateStatusBar(SZDESCRIPTION, 0, 0);
- UpdateStatusBar("Page:", 1, SBT_POPOUT);
- wsprintf(szBuf, "%5d of %5d", current_page+1, total_pages);
- UpdateStatusBar(szBuf, 2, 0);
- UpdateStatusBar("Page:", 1, SBT_POPOUT);
- UpdateStatusBar("Scaling:", 3, SBT_POPOUT);
- wsprintf(szBuf, "%2d", mane.shrinkfactor);
- UpdateStatusBar(szBuf, 4, 0);
- UpdateStatusBar("Cursor Pos:", 5, SBT_POPOUT);
-}
-
-/*
- FUNCTION: CreateSBar(HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: Calls CreateStatusWindow() to create the status bar
-
-
- PARAMETERS:
-
- hwndParent - Window handle of the status bar's parent
-
- RETURN VALUE:
-
- If both controls were created successfully Return TRUE,
- else returns FALSE.
-
- COMMENTS:
- */
-
-BOOL CreateSBar(HWND hwndParent)
-{
- hWndStatusbar = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER,
- SZDESCRIPTION,
- hwndParent,
- IDM_STATUSBAR);
- if(hWndStatusbar)
- {
- InitializeStatusBar(hwndParent);
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-/*
- FUNCTION: UpdateStatusBar(HWND)
-
- PURPOSE: Updates the statusbar control with appropriate text
-
-
- PARAMETERS:
-
- lpszStatusString - text to be displayed
- partNumber - which part of the status bar to display text in
- displayFlags - display flags
-
-
- RETURN VALUE: NONE
-
-
- COMMENTS:
- None
- */
-
-
-void UpdateStatusBar(LPSTR lpszStatusString, WORD partNumber, WORD displayFlags)
-{
-
- SendMessage(hWndStatusbar,
- SB_SETTEXT,
- partNumber | displayFlags,
- (LPARAM)lpszStatusString);
-}
-
-/*
- FUNCTION: CreateTBar(HWND)
-
- PURPOSE: Calls CreateToolBarEx()
-
-
- PARAMETERS:
-
- hwnd - Window handle : Used for the hWndParent parameter of the control.
-
- RETURN VALUE:
-
- If toolbar control was created successfully Return TRUE,
- else returns FALSE.
-
- COMMENTS:
- */
-
-
-BOOL CreateTBar(HWND hwnd)
-{
- DWORD style = WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS;
-
- hWndToolbar = CreateToolbarEx(hwnd,
- style,
- IDR_TOOLBAR1,
- NUMIMAGES,
- hInst,
- IDR_TOOLBAR1,
- tbButton,
- sizeof(tbButton)/sizeof(TBBUTTON),
- BUTTONWIDTH,
- BUTTONHEIGHT,
- IMAGEWIDTH,
- IMAGEHEIGHT,
- sizeof(TBBUTTON));
- if (hWndToolbar != NULL) {
- ShowWindow(hWndToolbar, SW_SHOW);
- return TRUE;
- }
-
- return FALSE;
-}
-
-/*
- FUNCTION: MsgNotify(HWND, UINT, WPARAM, LPARAM)
-
- PURPOSE: WM_NOTIFY is sent to the parent window to get the
- tooltip text assoc'd with that toolbar button.
-
- PARAMETERS:
-
- hwnd - Window handle (Unused)
- uMessage - Message number (Unused)
- wparam - Extra data (Unused)
- lparam - TOOLTIPTEXT FAR*
-
- RETURN VALUE:
- Always returns 0 - Message handled
-
-
- COMMENTS:
- This message fills in the lpszText field of the TOOLTIPTEXT
- structure if code == TTN_NEEDTEXT
- */
-
-LRESULT MsgNotify(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- LPTOOLTIPTEXT lpToolTipText;
- static char szBuffer[64];
-
- lpToolTipText = (LPTOOLTIPTEXT)lparam;
- if (lpToolTipText->hdr.code == TTN_NEEDTEXT)
- {
- LoadString(hInst,
- lpToolTipText->hdr.idFrom, /* string ID == command ID */
- szBuffer,
- sizeof(szBuffer));
-
- lpToolTipText->lpszText = szBuffer;
- }
- return 0;
-}
-
-
-
-/*
- Miscellaneous functions
- */
-/*
- FUNCTION: CenterWindow(HWND, HWND)
-
- PURPOSE: Center one window over another.
-
- PARAMETERS:
- hwndChild - The handle of the window to be centered.
- hwndParent- The handle of the window to center on.
-
- RETURN VALUE:
-
- TRUE - Success
- FALSE - Failure
-
- COMMENTS:
-
- Dialog boxes take on the screen position that they were designed
- at, which is not always appropriate. Centering the dialog over a
- particular window usually results in a better position.
- */
-
-BOOL CenterWindow(HWND hwndChild, HWND hwndParent)
-{
- RECT rcChild, rcParent;
- int cxChild, cyChild, cxParent, cyParent;
- int cxScreen, cyScreen, xNew, yNew;
- HDC hdc;
-
- /* Get the Height and Width of the child window */
- GetWindowRect(hwndChild, &rcChild);
- cxChild = rcChild.right - rcChild.left;
- cyChild = rcChild.bottom - rcChild.top;
-
- /* Get the Height and Width of the parent window */
- GetWindowRect(hwndParent, &rcParent);
- cxParent = rcParent.right - rcParent.left;
- cyParent = rcParent.bottom - rcParent.top;
-
- /* Get the display limits */
- hdc = GetDC(hwndChild);
- cxScreen = GetDeviceCaps(hdc, HORZRES);
- cyScreen = GetDeviceCaps(hdc, VERTRES);
- ReleaseDC(hwndChild, hdc);
-
- /* Calculate new X position, then adjust for screen */
- xNew = rcParent.left + ((cxParent - cxChild) / 2);
- if (xNew < 0)
- {
- xNew = 0;
- }
- else if ((xNew + cxChild) > cxScreen)
- {
- xNew = cxScreen - cxChild;
- }
-
- /* Calculate new Y position, then adjust for screen */
- yNew = rcParent.top + ((cyParent - cyChild) / 2);
- if (yNew < 0)
- {
- yNew = 0;
- }
- else if ((yNew + cyChild) > cyScreen)
- {
- yNew = cyScreen - cyChild;
- }
-
- /* Set it, and return */
- return SetWindowPos(hwndChild,
- NULL,
- xNew, yNew,
- 0, 0,
- SWP_NOSIZE | SWP_NOZORDER);
-}
-
-
-/*
- FUNCTION: CmdStub(HWND, WORD, WORD, HWND)
-
- PURPOSE: Display statusbar updates by calling UpdateStatusBar
-
- PARAMETERS:
- hwnd - The window.
- wCommand - Menu command ID
- wNotify - Notification number (unused)
- hwndCtrl - NULL (unused)
-
- RETURN VALUE:
- Always returns 0 - command handled.
-
- COMMENTS:
- Assumes there is a resource string describing this command with the
- same ID as the command ID. Loads the string and calls UpdateStatusBar
- to put the string into main pane of the status bar.
- */
-
-LRESULT CmdStub(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
-{
- char szBuffer[50];
- int cbWritten = 0;
-
- cbWritten = LoadString(hInst, wCommand, szBuffer, sizeof(szBuffer));
- if(cbWritten == 0)
- {
- lstrcpy(szBuffer, "Unknown Command");
- UpdateStatusBar(szBuffer, 0, 0);
- }
- else
- {
- UpdateStatusBar(szBuffer, 0, 0);
- MessageBox (hwnd,
- "Command Not Yet Implemented.\r\n",
- "Windvi",
- MB_OK | MB_ICONEXCLAMATION);
- }
- /*
- * Once the command is executed, set the statusbar text to
- * original text.
- */
- UpdateStatusBar(SZDESCRIPTION, 0, 0);
-
- return 0;
-}
-/*
- Utility functions
-*/
-
-#if 0
-
-/****************************************************************************
- * *
- * FUNCTION : PaletteSize(VOID FAR * pv) *
- * *
- * PURPOSE : Calculates the palette size in bytes. If the info. block *
- * is of the BITMAPCOREHEADER type, the number of colors is *
- * multiplied by 3 to give the palette size, otherwise the *
- * number of colors is multiplied by 4. *
- * *
- * RETURNS : Palette size in number of bytes. *
- * *
- ****************************************************************************/
-WORD PaletteSize (VOID FAR * pv)
-{
- LPBITMAPINFOHEADER lpbi;
- WORD NumColors;
- lpbi = (LPBITMAPINFOHEADER)pv;
- /* NumColors = DibNumColors(lpbi); */
- NumColors = lpbi->biBitCount;
- if (lpbi->biSize == sizeof(BITMAPCOREHEADER))
- return (WORD)(NumColors * sizeof(RGBTRIPLE));
- else
- return (WORD)(NumColors * sizeof(RGBQUAD));
-}
-
-/****************************************************************************
- * *
- * FUNCTION : DibBlt( HDC hdc, *
- * int x0, int y0, *
- * int dx, int dy, *
- * HANDLE hdib, *
- * int x1, int y1, *
- * LONG rop) *
- * *
-
-* PURPOSE : Draws a bitmap in CF_DIB format, using SetDIBits to device.*
- * taking the same parameters as BitBlt(). *
- * *
- * RETURNS : TRUE - if function succeeds. *
- * FALSE - otherwise. *
- * *
- ****************************************************************************/
-BOOL DibBlt (
- HDC hdc,
- INT x0,
- INT y0,
- INT dx,
- INT dy,
- HANDLE hdib,
- INT x1,
- INT y1,
- LONG rop)
-{
- LPBITMAPINFOHEADER lpbi;
- LPSTR pBuf;
- DIBSECTION ds;
-
- if (!hdib)
- return PatBlt(hdc,x0,y0,dx,dy,rop);
-
- /* our dibs are created with CreateDIBsection(),
- so are DIBSECTION. We need to retrieve them with GetObject().
- FIXME : this does not work as-is.
- */
-
- if (GetObject(hdib, sizeof(DIBSECTION), &ds) == 0)
- Win32Error("DibBlt/GetObject");
-
- /* lpbi = (VOID FAR *)GlobalLock(hdib); */
- lpbi = &(ds.dsBmih);
-
- if (!lpbi)
- return FALSE;
-
- /* pBuf = (LPSTR)lpbi + (WORD)lpbi->biSize + PaletteSize(lpbi); */
- pBuf = (LPSTR)lpbi + (WORD)lpbi->biSize +
- lpbi->biBitCount * sizeof(RGBQUAD);
- if (SetDIBitsToDevice (hdc, x0, y0, dx, dy,
- x1,y1,
- x1,
- dy,
- pBuf, (LPBITMAPINFO)lpbi,
- DIB_RGB_COLORS ) == 0)
- Win32Error("DibBlt/SetDIBitsToDevice");
-
- /* GlobalUnlock(hdib); */
- return TRUE;
-}
-
-#endif
-
-static char full_dviname[512];
-
-void CloseDviFile()
-{
- char *fp, *name;
-
- /* Nothing to close ? */
- if (!dvi_file)
- return;
-
- if (dvistate != SAVED) {
- /* Just in case we have tried to change directory : retain
- the full name. */
-
- /* Get the full file name */
-#if 1
- /* Beware : might have added file:
- FIXME: there should be a copy of original dvi_name
- rather that parsing it back !
- In fact, dvi_name must be made absolute first.
- */
- if (memicmp(dvi_name, "file:", 5) == 0) {
- if (GetFullPathName(dvi_name+5, sizeof(full_dviname), full_dviname, &fp) == 0)
- Win32Error("CloseDviFile/GetFullPathName");
- }
- else
-#endif
- if (GetFullPathName(dvi_name, sizeof(full_dviname), full_dviname, &fp) == 0) {
- Win32Error("CloseDviFile/GetFullPathName");
- }
-
- dvistate = SAVED;
- dvipos = ftell(dvi_file);
- fclose(dvi_file);
- dvi_file = NULL;
-#if 0
- fprintf(stderr, "Dvi file %s is closed\n", dvi_name);
-#endif
- }
-}
-
-void ReopenDviFile()
-{
- if (dvistate == SAVED && dvi_file == NULL) {
- dvi_file = fopen(full_dviname, OPEN_MODE);
- if (dvi_file) {
- /* user may have destroyed it !
- FIXME: this needs testing */
- fseek(dvi_file, dvipos, SEEK_SET);
- }
- dvistate = RESTORED;
-#if 0
- fprintf(stderr, "Dvi file %s is reopened\n", dvi_name);
-#endif
- }
-}
-
-BOOL IsOpenedDviFile()
-{
- return dvistate == RESTORED;
-}
-
-LRESULT MsgActivate(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- extern Boolean check_dvi_file();
- int fActive = LOWORD(wparam);
-
- if (debug & DBG_EVENT) {
- fprintf(stderr, "Activate Draw: mag %s, set_home %s, init %scomplete, activated by %s\n",
- (bMagDisp ? "on" : "off"),
- (bSetHome ? "on" : "off"),
- (bInitComplete ? "" : "in"),
- (fActive == WA_CLICKACTIVE ? "click" : "other than click"));
- }
-
- if (!bInitComplete || !dvi_file)
- return;
-
- if (/* !bMagDisp && !bSetHome && */ bInitComplete) {
- if (fActive == WA_ACTIVE)
- bSkipFirstClick = FALSE;
- else if (fActive == WA_CLICKACTIVE)
- bSkipFirstClick = TRUE;
- if (fActive == WA_ACTIVE || fActive == WA_CLICKACTIVE) {
- /* We are being activated */
- /* Reopen dvi file */
- ReopenDviFile();
- if (resource.scan_flag) {
- if (dvi_file) check_dvi_file();
- /* ChangePage(0); */
- }
- }
- else if (fActive == WA_INACTIVE) {
- /* We are being deactivated */
- if (bMagDisp) {
- /* Remove the mag glass !
- Look at windraw.c for more precisions.
- */
- foreGC = ruleGC = highGC = maneDrawDC;
- fprintf(stderr, "hiding mag glass\n");
- ShowWindow(hWndMagnify, SW_HIDE);
- bMagDisp = FALSE;
- /* FIXME : is this needed ? */
- bDrawKeep = FALSE;
- UpdateWindow(hWndDraw);
- /* restores the old shrink factor and redisplay page */
- ClipCursor(NULL);
- ReleaseCapture();
- }
- else if (bSetHome) {
- /* Restore cursor */
- bSetHome = FALSE;
- ClipCursor(NULL);
- ReleaseCapture();
- SetCursor(hCursArrow);
- }
- /* Save dvi file params & close it if possible */
- if (dvi_file) {
- CloseDviFile();
- }
- }
- }
-
- return 0;
-}
-
-
-LRESULT MsgCopyData(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- char oldDir[256];
- int fa;
- struct data_exchange *lpDataEx = (struct data_exchange *)(((COPYDATASTRUCT *)lparam)->lpData);
-
-#if 0
- MessageBox(hWndMain, lpDataEx->cwd, lpDataEx->dviname,
- MB_APPLMODAL | MB_ICONINFORMATION);
-#endif
- /* Should we check for new file existence ? */
- GetCurrentDirectory(sizeof(oldDir), oldDir);
- SetCurrentDirectory(lpDataEx->cwd);
- NormalizeDviName(sizeof(lpDataEx->dviname), lpDataEx->dviname);
- if (((fa = GetFileAttributes(lpDataEx->dviname)) != 0xFFFFFFFF)
- && ((fa & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)) {
- CloseCurrentFile();
- mane.shrinkfactor = lpDataEx->shrinkfactor;
- current_page = lpDataEx->currentpage;
- wsprintf(oldDir, "page %d shrink %d", current_page, mane.shrinkfactor);
-#if 0
- MessageBox(hWndMain, oldDir, lpDataEx->dviname,
- MB_APPLMODAL | MB_ICONINFORMATION);
-#endif
- OpenCurrentFile(lpDataEx->dviname);
- SetForegroundWindow(hwnd);
- }
- else {
- MessageBox(hWndMain, "Can't find file !", lpDataEx->dviname,
- MB_APPLMODAL | MB_ICONERROR);
- SetCurrentDirectory(oldDir);
- }
- return TRUE;
-}
-
-#define TRSIZE 100
-
-/* BEGIN CHUNK events.c 1 */
-#ifdef SRC_SPECIALS
-#define src_jumpButton resource._src_jumpButton
-#endif
-/* END CHUNK events.c 1 */
-
-LRESULT MsgChar(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- char szBuf[80];
- static BOOL has_arg = FALSE;
- static int number = 0;
- static int sign = 1;
- char ch;
- BOOL arg0;
- int number0;
-/* BEGIN CHUNK events.c 3 */
- int src_x, src_y;
-/* END CHUNK events.c 3 */
-
- ch = wparam;
-
-#if 0
- printf("char %c (%d) (%x) \n", ch, ch, ch);
-#endif
- if (ch >= '0' && ch <= '9') {
- has_arg = TRUE;
- number = number * 10 + sign * (ch - '0');
- return 0;
- }
- else if (ch == '-') {
- has_arg = TRUE;
- sign = -1;
- number = 0;
- return 0;
- }
- number0 = number;
- number = 0;
- sign = 1;
- arg0 = has_arg;
- has_arg = FALSE;
-#if 0
- printf("arg0 %d number0 %d\n", arg0, number0);
-#endif
- switch (wparam) {
-
- case 'Z':
- debug = (arg0 ? number0 : -1);
- break;
-
- case 'q':
- case 'Q':
- case '\003': /* control-C */
- case '\004': /* control-D */
-#ifdef VMS
- case '\032': /* control-Z */
- if (MessageBox(hWndMain, "Really want to quit ?", "Exit",
- MB_APPLMODAL | MB_ICONQUESTION | MB_OKCANCEL) == IDOK)
- PostQuitMessage((ch == 'Q') ? 2 : 0);
- break;
-#endif
-#if PS
- ps_destroy();
-#endif
-
- case 'n':
- case 'f':
- case ' ':
- /* case '\r': */
- /* case '\n': */
- /* scroll forward; i.e. go to relative page */
- ChangePage(arg0 ? number0 : 1);
- break;
-#ifdef HTEX
- case 'F': /* Follow link forward! */
- {
- int x, y;
- if (pointerlocate(&x, &y)) {
- /* screen_to_page(&mane,s_x,s_y,&page,&px,&py); */
- (void) htex_handleref(current_page, x, y);
-#if 0
- redraw_page();
-#endif
- }
- }
- return 0; /* Should goto bad if problem arises? */
- case 'B': /* Go back to previous anchor. */
- htex_goback(); /* Should goto bad if problem arises? */
-#if 0
- redraw_page();
-#endif
- return 0;
-#endif
-
- case 'p':
- case 'b':
- /* case '\b':
- case '\177': Del */
- /* scroll backward */
- ChangePage( - (arg0 ? number0 : 1));
- break;
-
- case '<':
- ChangePage(-current_page);
- break;
-
- case 'g':
- case 'j':
- case '>':
- /* go to absolute page (last by default) */
- ChangePage((arg0 ? number0 - pageno_correct :
- total_pages - 1) - current_page);
- break;
-
- case '?':
- case 'h':
- case 'H': /* Help */
- show_help();
- return 0;
-
- case 'P': /* declare current page */
- pageno_correct = arg0 * number0 - current_page;
- return 0;
-
- case 'k':
- resource.keep_flag = (arg0 ? number0 : !resource.keep_flag);
- CheckMenuItem(hMenuMain, IDM_KEEPPOS, (resource.keep_flag ? MF_CHECKED : MF_UNCHECKED));
- wsprintf(szBuf, "Home position %skept.", (resource.keep_flag ? "" : "not "));
- UpdateStatusBar(szBuf, 0, 0);
- break;
-
- case '\f':
- /* redisplay current page */
- ChangePage(0);
- break;
-
- case '^':
- home(TRUE);
- break;
-
- case 'l':
- SendMessage(hWndDraw, WM_HSCROLL, MAKELONG(SB_PAGEUP, 0), 0L);
- break;
-
- case 'r':
- SendMessage(hWndDraw, WM_HSCROLL, MAKELONG(SB_PAGEDOWN, 0), 0L);
- break;
-
- case 'u':
- SendMessage(hWndDraw, WM_VSCROLL, MAKELONG(SB_PAGEUP, 0), 0L);
- break;
-
- case 'd':
- SendMessage(hWndDraw, WM_VSCROLL, MAKELONG(SB_PAGEDOWN, 0), 0L);
- break;
-
- case 'c':
-#ifndef WIN32
- scrollwindow(&mane, mane.base_x + eventp->xkey.x - clip_w/2,
- mane.base_y + eventp->xkey.y - clip_h/2);
- if (x_bar) paint_x_bar();
- if (y_bar) paint_y_bar();
- XWarpPointer(DISP, None, None, 0, 0, 0, 0,
- clip_w/2 - eventp->xkey.x, clip_h/2 - eventp->xkey.y);
- return;
-#else
- break;
-#endif
- case 'M':
- {
- POINT ptOrg = { 0, 0};
- GetWindowOrgEx(maneDrawDC, &ptOrg);
- home_x = min(xMousePos + xCurrentScroll + ptOrg.x, (unsigned) page_w) * mane.shrinkfactor;
- home_y = min(yMousePos + yCurrentScroll + ptOrg.y, (unsigned) page_h) * mane.shrinkfactor;
- if (resource.sidemargin) free(resource.sidemargin);
- resource.sidemargin = pixtoa(home_x);
- if (resource.topmargin) free(resource.topmargin);
- resource.topmargin = pixtoa(home_y);
-
- wsprintf(szBuf, "Setting home to %5d, %5d", home_x, home_y);
- UpdateStatusBar(szBuf, 0, 0);
- }
- break;
-/* BEGIN CHUNK events.c 4 */
-#ifdef SRC_SPECIALS
- case 'X':
- {
- POINT ptOrg = { 0, 0};
- GetWindowOrgEx(maneDrawDC, &ptOrg);
- src_x = min(xMousePos + ptOrg.x + xCurrentScroll, (unsigned) page_w) /* * mane.shrinkfactor */;
- src_y = min(yMousePos + ptOrg.y + yCurrentScroll, (unsigned) page_h) /* * mane.shrinkfactor */;
- /* just highlight next special without calling editor for it */
- src_find_special(0, src_x, src_y);
- }
- return;
-#endif
-/* END CHUNK events.c 4 */
-
- case 's':
- if (!arg0) {
- int temp;
-
- number0 = ROUNDUP(unshrunk_page_w, window_w - 2);
- temp = ROUNDUP(unshrunk_page_h, window_h - 2);
- if (number0 < temp) number0 = temp;
- }
- if (number0 <= 0) goto bad;
- if (number0 == mane.shrinkfactor) return 0;
-
- ChangeZoom(number0);
- break;
-
-/* BEGIN CHUNK events.c 6 */
-#ifdef SRC_SPECIALS
- /*
- * Control-S toggles visibility of src specials
- * (mnemonic for isearch in Emacs ;-)
- * Also changes the cursor to emphasize the new mode.
- */
- case '\023': /* Control-S */
- if (src_evalMode) {
- if (src_warn_verbosity >= SRC_WARNINGS_MEDIUM) {
- Fprintf(stdout, "SRC specials OFF\n");
- }
- /* free src_arr */
- src_cleanup();
- src_evalMode = False;
- SetCursor(hCursArrow);
- }
- else {
- if (src_warn_verbosity >= SRC_WARNINGS_MEDIUM) {
- Fprintf(stdout, "SRC specials ON\n");
- }
- src_evalMode = True;
- /* used to have this in addition to emphasize the mode,
- * but usage seems more coherent without it: */
- /* src_tickVisibility = True; */
- SetCursor(hCursSrc);
- }
- redraw_page();
- break;
- case 'T':
- /*
- * change shape of specials, but only when they're visible;
- * this makes the key usable for other purposes in ordinary mode.
- * However, it seems that in ordinary mode `T' already does the same
- * as Ctrl-p: print the Unit/bitord/byteord stuff; what's
- * the reason for this ???
- */
- if (src_evalMode) {
- src_tickShape++;
- if (src_tickShape > SPECIAL_SHAPE_MAX_NUM) {
- src_tickShape = 0;
- }
- if (src_warn_verbosity >= SRC_WARNINGS_MEDIUM) {
- Fprintf(stdout, "changing shape to \"%d\"\n", src_tickShape);
- }
- if (src_tickVisibility) {
- redraw_page();
- }
- break;
- }
-#ifndef PS_GS
- case 'V':
- if (src_evalMode) {
- /*
- * toggle visibility of src specials
- */
- if (src_tickVisibility) {
- if (src_warn_verbosity >= SRC_WARNINGS_MEDIUM) {
- Fprintf(stdout, "SRC special visibility OFF\n");
- }
- src_tickVisibility = False;
- }
- else {
- if (src_warn_verbosity >= SRC_WARNINGS_MEDIUM) {
- Fprintf(stdout, "SRC special visibility ON\n");
- }
- src_tickVisibility = True;
- }
- redraw_page();
- return;
- }
-#endif /* PS_GS */
-#endif /* SRC_SPECIALS */
-/* END CHUNK events.c 6 */
- case 'S':
- if (!arg0) goto bad;
-#ifdef GREY
- if (use_grey) {
- float newgamma = number0 != 0 ? number0 / 100.0 : 1.0;
-
- if (newgamma == gamma) return 0;
- gamma = newgamma;
- init_colors();
- ChangePage(0);
- return 0;
- }
-#endif
- if (number0 < 0) goto bad;
- if (number0 == density) return 0;
- density = number0;
- reset_fonts();
- if (mane.shrinkfactor == 1) return 0;
- ChangePage(0);
- break;
-
- case 't':
- { /* toggle through magnifier ruler tick units */
- extern void pixel_to_unit(void);
- extern char * pos_format;
- extern double p2u_factor;
- char szBuf[80];
- int k = 0;
- static char *TeX_units[] = {
- "bp", "cc", "cm", "dd", "in", "mm", "pc", "pt", "sp",
- };
- POINT ptOrg = { 0, 0};
- GetWindowOrgEx(maneDrawDC, &ptOrg);
-
- for (k = 0; k < sizeof(TeX_units)/sizeof(TeX_units[0]); ++k)
- if (strcmp(resource._tick_units,TeX_units[k]) == 0)
- break;
- k++;
- if (k >= sizeof(TeX_units)/sizeof(TeX_units[0]))
- k = 0;
- resource._tick_units = TeX_units[k];
- pixel_to_unit();
- wsprintf(szBuf, "Ruler units = %.2s\n", resource._tick_units);
- UpdateStatusBar(szBuf, 0, 0);
- sprintf(szBuf, pos_format,
- (xMousePos + xCurrentScroll + ptOrg.x) * mane.shrinkfactor * p2u_factor,
- (yMousePos + yCurrentScroll + ptOrg.y) * mane.shrinkfactor * p2u_factor);
- UpdateStatusBar(szBuf, 6, 0);
- }
- break;
-
- case 'G':
- use_grey = (arg0 ? number0 : !use_grey);
- if (use_grey) init_colors();
- reset_fonts();
- ChangePage(0);
- break;
-
- case 'D':
- grid_mode = (arg0 ? number0 : !grid_mode );
- init_page();
- reconfig();
- ChangePage(0);
- break;
-
-
-#if PS
- case 'v':
- if (!arg0 || resource._postscript != !number0) {
- resource._postscript = !resource._postscript;
- if (resource._postscript) scanned_page = scanned_page_bak;
- psp.toggle();
- }
- ChangePage(0);
- break;
-#endif
-
-#ifdef SELFILE
- case '\006': /* control-f */
- ++dvi_time ; /* notice we want a new file in check_dvi_file */
- ChangePage(0);
- break ;
-#endif /* SELFILE */
-
-#if PS_GS
- case 'V':
-/* BEGIN CHUNK events.c 7 */
-#ifdef SRC_SPECIALS
- if (src_evalMode) {
- /*
- * toggle visibility of src specials
- */
- if (src_tickVisibility) {
- if (src_warn_verbosity >= SRC_WARNINGS_MEDIUM) {
- Fprintf(stdout, "SRC special visibility OFF\n");
- }
- src_tickVisibility = False;
- }
- else {
- if (src_warn_verbosity >= SRC_WARNINGS_MEDIUM) {
- Fprintf(stdout, "SRC special visibility ON\n");
- }
- src_tickVisibility = True;
- }
- redraw_page();
- return;
- }
- else {
-#endif
-/* END CHUNK events.c 7 */
- if (!arg0 || resource.gs_alpha != !number0)
- resource.gs_alpha = !resource.gs_alpha;
- break;
-/* BEGIN CHUNK events.c 8 */
-#ifdef SRC_SPECIALS
- }
-#endif
-/* END CHUNK events.c 8 */
-#endif
-
- case 'R':
- /* reread DVI file */
- --dvi_time; /* then it will notice a change */
- ChangePage(0);
- break;
- default:
- break;
- }
-
- goto good;
-
- bad:
- if (MessageBeep(0xFFFFFFFF) == 0)
- Win32Error("HandleKey/MessageBeep");
- good:
- return 0;
-}
-
-LRESULT MsgKeyDown(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- WORD wScrollNotify = 0xFFFF;
- UINT msg = WM_VSCROLL;
- int new_zoom = shrink_factor,
- rel_page = 0;
-
-#define SHIFTED 0x8000
-#define KEYCOUNT 0x000F
-
- int ctrl = (GetKeyState(VK_CONTROL) & SHIFTED);
- int shift = (GetKeyState(VK_SHIFT) & SHIFTED);
- int l_alt = (GetKeyState(VK_LMENU) & SHIFTED);
- int r_alt = (GetKeyState(VK_RMENU) & SHIFTED);
- int count = lparam & KEYCOUNT;
-
-#if 0
- fprintf(stderr, "ctrl = %x, shift = %x, wparam = %x, count = %x\n",
- ctrl, shift, wparam, count);
-#endif
-
- switch (wparam) {
- case VK_LEFT:
- msg = WM_HSCROLL;
- if (ctrl)
- wScrollNotify = SB_LEFT;
- else if (shift)
- wScrollNotify = SB_PAGELEFT;
- else
- wScrollNotify = SB_LINELEFT;
- break;
-
- case VK_RIGHT:
- msg = WM_HSCROLL;
- if (ctrl)
- wScrollNotify = SB_RIGHT;
- else if (shift)
- wScrollNotify = SB_PAGERIGHT;
- else
- wScrollNotify = SB_LINERIGHT;
- break;
-
- case VK_UP:
- msg = WM_VSCROLL;
- if (ctrl)
- wScrollNotify = SB_TOP;
- else if (shift)
- wScrollNotify = SB_PAGEUP;
- else
- wScrollNotify = SB_LINEUP;
- break;
-
- case VK_DOWN:
- msg = WM_VSCROLL;
- if (ctrl)
- wScrollNotify = SB_BOTTOM;
- else if (shift)
- wScrollNotify = SB_PAGEDOWN;
- else
- wScrollNotify = SB_LINEDOWN;
- break;
-
- case VK_PRIOR:
- if (ctrl)
- ChangePage(-current_page);
- wScrollNotify = SB_PAGEUP;
- break;
-
- case VK_NEXT:
- if (ctrl)
- ChangePage(total_pages - 1 - current_page);
- wScrollNotify = SB_PAGEDOWN;
- break;
-
- case VK_END:
- /* Only vertical end */
- wScrollNotify = SB_BOTTOM;
- break;
-
- case VK_HOME:
- home(TRUE);
- break;
-
- case VK_ADD:
- new_zoom -= count;
- break;
-
- case VK_SUBTRACT:
- new_zoom += count;
- break;
-
- case VK_RETURN:
- rel_page = count;
- break;
-
- case VK_BACK:
- rel_page = -count;
- break;
-
- case 'L':
- if (ctrl) {
- ChangePage(0);
- }
- break;
-
- }
-#if 0
- fprintf(stderr, "wScrollNotify = %x msg = %x\n", wScrollNotify, msg);
-#endif
- if (new_zoom != shrink_factor)
- ChangeZoom(new_zoom);
- if (rel_page != 0)
- ChangePage(rel_page);
- if (wScrollNotify != 0xFFFF) {
- int i;
- for (i = 0; i < count; i++)
- SendMessage(hWndDraw, msg, MAKELONG(wScrollNotify, 0), 0L);
- }
- return 0;
-}
-
-
-LRESULT CmdOpen (HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
-{
- extern FILE *select_filename(int, int);
- extern void open_dvi_file();
-
- if (dvi_file = select_filename(TRUE, TRUE)) {
- open_dvi_file();
- if (reconfig() == FALSE) {
- char buf[40];
- mane.shrinkfactor +=3;
- wsprintf(buf, "New shrink factor : %d\n", mane.shrinkfactor);
- UpdateStatusBar(buf, 0, 0);
- if (reconfig() == FALSE) {
- MessageBox(hWndMain, "Can't allocate page bitmap !\r\nPlease report this error.", NULL, MB_APPLMODAL | MB_ICONERROR | MB_OK);
- CleanExit(1);
- }
- };
-#if 0
- redraw_page();
-#else
- ChangeZoom(resource.shrinkfactor);
-#endif
- ChangePage(0);
- SetForegroundWindow(hwnd);
- }
- return 0;
-}
-
-LRESULT CmdOpenRecentFile (HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
-{
- extern void UpdateMainMenuUsedFiles(void);
-
- int nCount = wCommand - IDM_FILE_RECENT;
- char *new_name, *new_cwd, *last_sep, *p;
- char oldDir[260];
- int fa, i;
-
- new_name = strdup(p = lpLastUsedFiles[nCount]);
-
- /* shift the first files down to this one */
- for (i = nCount; i >= 1; i--)
- lpLastUsedFiles[i] = lpLastUsedFiles[i-1];
- lpLastUsedFiles[0] = p;
- UpdateMainMenuUsedFiles();
-
- if ((last_sep = strrchr(new_name, '/')) == NULL)
- last_sep = strrchr(new_name, '\\');
-
- if (!last_sep)
- return 0;
-
- *last_sep = '\0';
- new_cwd = new_name;
- new_name = last_sep+1;
-
- /* Should we check for new file existence ? */
- GetCurrentDirectory(sizeof(oldDir), oldDir);
- SetCurrentDirectory(new_cwd);
- if (((fa = GetFileAttributes(new_name)) != 0xFFFFFFFF)
- && ((fa & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)) {
- CloseCurrentFile();
- current_page = 0;
-#if 0
- MessageBox(hWndMain, oldDir, lpDataEx->dviname,
- MB_APPLMODAL | MB_ICONINFORMATION);
-#endif
- OpenCurrentFile(new_name);
- if (reconfig() == FALSE) {
- char buf[40];
- mane.shrinkfactor +=3;
- wsprintf(buf, "New shrink factor : %d\n", mane.shrinkfactor);
- UpdateStatusBar(buf, 0, 0);
- if (reconfig() == FALSE) {
- MessageBox(hWndMain, "Can't allocate page bitmap !\r\nPlease report this error.", NULL, MB_APPLMODAL | MB_ICONERROR | MB_OK);
- CleanExit(1);
- }
- };
-#if 0
- redraw_page();
-#endif
- ChangePage(0);
- SetForegroundWindow(hwnd);
- }
- else {
- MessageBox(hWndMain, "Can't find file !", new_name,
- MB_APPLMODAL | MB_ICONERROR);
- SetCurrentDirectory(oldDir);
- }
- free(new_cwd);
- return 0;
-}
-
-LRESULT CmdClose (HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
-{
- if (dvi_file)
- CloseDviFile();
- if (dvi_name) {
- free(dvi_name);
- dvi_name = NULL;
- set_icon_and_title("", NULL, NULL, 1);
- }
- redraw_page();
- return 0;
-}
-
-/* Choose a decent shrink factor, given the page size
- and the screen params */
-int ChooseShrink()
-{
- extern HWND hWndMain, hWndDraw;
- RECT rcTotal, rcDraw;
- int total_width, total_height, draw_width, draw_height;
- int usable_screen_width, usable_screen_height;
- int xNewSize, yNewSize;
- int shrink_x, shrink_y;
- char szBuf[80];
-
- /*
- Principle : get the size of the non-drawing area
- remove it from the size of the screen
- and calculate the best shrink factor of this size
- next resize the frame window
- */
- GetWindowRect(hWndMain, &rcTotal);
- GetWindowRect(hWndDraw, &rcDraw);
- total_width = rcTotal.right - rcTotal.left;
- total_height = rcTotal.bottom - rcTotal.top;
- draw_width = rcDraw.right - rcDraw.left;
- draw_height = rcDraw.bottom - rcDraw.top;
- usable_screen_width = maneHorzRes - (total_width - draw_width);
- usable_screen_height = maneVertRes - (total_height - draw_height);
-
- shrink_x = ROUNDUP(unshrunk_page_w, draw_width);
- shrink_y = ROUNDUP(unshrunk_page_h, draw_height);
- if (shrink_x > shrink_y) shrink_x = shrink_y;
-
- xNewSize = ROUNDUP(unshrunk_page_w,shrink_x)
- + (total_width - draw_width) + 1;
- yNewSize = ROUNDUP(unshrunk_page_h,shrink_x)
- + (total_height - draw_height) + 1;
-
- wsprintf(szBuf, "Shrink choosen %d (%d x %d)", shrink_x,
- xNewSize, yNewSize);
- UpdateStatusBar(szBuf, 0, 0);
- return shrink_x;
-}
-
-void ChangeZoom(int new_shrink)
-{
- char szBuf[20];
-
- if (new_shrink <= 0 || new_shrink == mane.shrinkfactor)
- return;
-
- mane.shrinkfactor = new_shrink;
- init_page();
-#if 0
- fprintf(stderr, "new_shrink (%d) != bak_shrink (%d)\n",
- new_shrink, bak_shrink);
-#endif
- if (new_shrink != 1 && new_shrink != bak_shrink) {
- bak_shrink = new_shrink;
-#ifdef GREY
- /* if (use_grey) init_pix(RGB(0,0,0), RGB(255,255,255)); */
- if (use_grey)
- init_pix(string_to_colorref(resource.fore_color),
- string_to_colorref(resource.back_color));
-#endif
- }
- if (reconfig() == FALSE) {
- char buf[40];
- mane.shrinkfactor += 1;
- wsprintf(buf, "Can't allocate bitmap for this shrink factor.");
- UpdateStatusBar(buf, 0, 0);
- init_page();
- if (reconfig() == FALSE) {
- MessageBox(hWndMain, "Not enough storage for page bitmap\r\n",
- NULL, MB_OK | MB_APPLMODAL | MB_ICONERROR);
- CleanExit(1);
- }
- }
- reset_fonts();
- /* In case the ScrollBars will disappear */
- SetScrollBars(hWndDraw);
- redraw_page();
- resource.shrinkfactor = mane.shrinkfactor;
- wsprintf(szBuf, "%2d", mane.shrinkfactor);
- UpdateStatusBar(szBuf, 4, 0);
-}
-
-LRESULT CmdZoomIn(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- ChangeZoom(mane.shrinkfactor - 1);
- return 0;
-}
-
-LRESULT CmdZoomOut(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- ChangeZoom(mane.shrinkfactor + 1);
- return 0;
-}
-
-LRESULT CmdTogglePS(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- resource._postscript = (resource._postscript ? 0 : 1);
- CheckMenuItem(hMenuMain, IDM_TOGGLEPS, (resource._postscript ? MF_CHECKED : MF_UNCHECKED));
- if (resource._postscript) scanned_page = scanned_page_bak;
- psp.toggle();
- redraw_page();
- return 0;
-}
-
-LRESULT CmdToggleGrid(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- char szBuf[80];
- float sep = 0.0;
-
- resource._grid_mode = (resource._grid_mode + 1) % 4;
- if (resource._grid_mode == 3) {
- sep = (float)ROUNDUP(unshrunk_paper_unit, shrink_factor) / 4.0;
- sprintf(szBuf, "Grid mode %4.2f pixels", sep);
- }
- else if (resource._grid_mode == 2) {
- sep = (float)ROUNDUP(unshrunk_paper_unit, shrink_factor) / 2.0;
- sprintf(szBuf, "Grid mode %4.2f pixels", sep);
- }
- else if (resource._grid_mode == 1) {
- sep = (float)ROUNDUP(unshrunk_paper_unit, shrink_factor);
- sprintf(szBuf, "Grid mode %4.2f pixels", sep);
- }
- else
- sprintf(szBuf, "Grid mode off");
-
- UpdateStatusBar(szBuf, 0, 0);
- CheckMenuItem(hMenuMain, IDM_TOGGLEGRID, (resource._grid_mode ? MF_CHECKED : MF_UNCHECKED));
- init_page();
- redraw_page();
- return 0;
-}
-
-/*
- Warning : ChangePage takes a relative count
- */
-void ChangePage(int count)
-{
- extern int total_pages;
- char szBuf[20];
- if (count == 0) {
- /* Explicit call to redraw the current page */
- redraw_page();
- }
- else {
- int next_page;
-#ifdef BOOK_MODE
- if (resource.book_mode) {
- if (count == 1 || count == -1) {
- /* in this case, should be 2 */
- next_page = current_page + 2*count;
- }
- /* ensure that the left page is even */
- current_page = (current_page % 2 ? current_page - 1 : current_page);
- }
- else {
- next_page = current_page + count;
- }
-#else
- next_page = current_page + count;
-#endif
-#if 1
- next_page = min(next_page, total_pages - 1);
- next_page = max(next_page, 0);
- if (current_page != next_page) {
- /* BEGIN CHUNK events.c 0 */
-#ifdef SRC_SPECIALS
- src_delete_all_specials();
-#endif
-/* END CHUNK events.c 0 */
- current_page = next_page;
- warn_spec_now = warn_spec;
- redraw_page();
- }
-#else
- if (0 <= next_page && next_page < total_pages) {
- current_page = next_page;
- warn_spec_now = warn_spec;
- redraw_page();
- }
-#endif
- }
-#ifdef BOOK_MODE
- if (resource.book_mode) {
- wsprintf(szBuf, "%5d-%5d of %5d", current_page+1, current_page+2, total_pages);
- }
- else {
- wsprintf(szBuf, "%5d of %5d", current_page+1, total_pages);
- }
-#else
- wsprintf(szBuf, "%5d of %5d", current_page+1, total_pages);
-#endif
- UpdateStatusBar(szBuf, 2, 0);
-}
-
-LRESULT CmdNextPage(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- ChangePage(+1);
- return 0;
-}
-
-LRESULT CmdPreviousPage(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- ChangePage(-1);
- return 0;
-}
-
-LRESULT CmdNext5(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- ChangePage(+5);
- return 0;
-}
-
-LRESULT CmdPrevious5(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- ChangePage(-5);
- return 0;
-}
-
-LRESULT CmdNext10(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- ChangePage(+10);
- return 0;
-}
-
-LRESULT CmdPrevious10(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- ChangePage(-10);
- return 0;
-}
-
-LRESULT CmdFirstPage(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- ChangePage(- current_page);
- return 0;
-}
-
-LRESULT CmdLastPage(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- ChangePage(total_pages - current_page - 1);
- return 0;
-}
-
-LRESULT CmdRedrawPage(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- warn_spec_now = warn_spec;
- redraw_page();
- return 0;
-}
-
-LRESULT CmdKeepPosition(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- char szBuf[80];
-
- resource.keep_flag = !resource.keep_flag;
- CheckMenuItem(hMenuMain, IDM_KEEPPOS, (resource.keep_flag ? MF_CHECKED : MF_UNCHECKED));
- wsprintf(szBuf, "Home position %s kept.", (resource.keep_flag ? "" : "not"));
- UpdateStatusBar(szBuf, 0, 0);
- return 0;
-}
-
-LRESULT CmdGotoPage(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- DialogBox(hInst, "DlgGotoPage", hwnd, (DLGPROC)DlgGotoPage);
- return 0;
-}
-
-LRESULT CmdSrcSpecials(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- /* BEGIN CHUNK events.c 2 */
-#ifdef SRC_SPECIALS
- if (src_evalMode) {
- if (src_warn_verbosity >= SRC_WARNINGS_MEDIUM) {
- Fprintf(stdout, "SRC specials OFF\n");
- }
- /* free src_arr */
- src_cleanup();
- src_evalMode = False;
- SetCursor(hCursArrow);
- }
- else {
- if (src_warn_verbosity >= SRC_WARNINGS_MEDIUM) {
- Fprintf(stdout, "SRC specials ON\n");
- }
- src_evalMode = True;
- /* used to have this too to make the mode clearer, but usage seems more coherent without it: */
- /* src_tickVisibility = True; */
- SetCursor(hCursSrc);
- }
- redraw_page();
-#endif
-/* END CHUNK events.c 2 */
- return 0;
-}
-
-#ifdef HTEX
-LRESULT CmdUrlBack(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- htex_goback();
-#if 0
- redraw_page();
-#endif
- return 0;
-}
-#endif
-
-LRESULT CmdViewLog(HWND hwnd, WORD wCommand,
- WORD wNotify, HWND hwndCtrl)
-{
- ShowWindow(hViewLog, SW_SHOW);
- bLogShown = TRUE;
- return 0;
-}
-
-void CleanUp()
-{
-#ifdef TRANSFORM
- extern HRGN hClipRgn;
-#endif
-
-#ifdef PS
-#ifdef TRANSFORM
- extern HANDLE hGsEvent;
-#endif
-#endif
-
- extern HDC hdcDrawSave;
-
-#if 0
- __asm int 3;
-#endif
-
- _fcloseall();
-
-#ifdef PS
- if (hGsDll) {
- ps_destroy();
- gs_dll_release();
- }
-#endif
-
-#ifdef HTEX
- htex_cleanup(0);
-#endif
-
- remove_temporary_dir();
-
-#if 0
- /* resources that should be freed */
- /*
- Colors
- */
- CRefFree(scan_fore_colors);
-#endif
-
- FreeOptions();
-
-#if 0
- MessageBox( NULL, "LogLoopThread finished", "", MB_OK|MB_ICONINFORMATION );
-#endif
-
- /* close any handle */
- fprintf(stderr, "\n");
- _flushall();
-
- fclose(stdin);
- fclose(stdout);
- fclose(stderr);
-
- if (dvi_file)
- Fclose(dvi_file);
-
- /* terminate thread */
- if (WaitForSingleObject(hViewLogThread, 2000) == WAIT_TIMEOUT) {
- /* This is really unclean. From 20/04/99, it seems that closing
- stdout and stderr is not enough to make the ReadFile()
- call return broken_pipe. So we have to make it the hard way. */
- // MessageBox( NULL, "ViewLog thread does not want to shut down...", "", MB_OK|MB_ICONINFORMATION );
- TerminateThread(hViewLogThread, 1);
- CloseHandleAndClear(&hViewLogThread);
- PostMessage(hViewLog, WM_QUIT, 0, 0);
- if (WaitForSingleObject(hLogLoopThread, 250) == WAIT_TIMEOUT) {
- TerminateThread(hLogLoopThread, 1);
- }
- CloseHandleAndClear(&hLogLoopThread);
- }
-
- CloseHandleAndClear(&hLogIn);
- CloseHandleAndClear(&hViewLogThread);
-
-
- /* Deallocate gdi resources */
- if (forePen && !DeleteObject(forePen))
- Win32Error("CleanUp/DeleteObject/forePen");
- if (foreBrush && !DeleteObject(foreBrush))
- Win32Error("CleanUp/DeleteObject/foreBrush");
- if (backBrush && !DeleteObject(backBrush))
- Win32Error("CleanUp/DeleteObject/backBrush");
- if (backTPicPen && !DeleteObject(backTPicPen))
- Win32Error("CleanUp/DeleteObject/backTPicPen");
- if (foreTPicPen && !DeleteObject(foreTPicPen))
- Win32Error("CleanUp/DeleteObject/foreTPicPen");
- if (foreTPicBrush && !DeleteObject(foreTPicBrush))
- Win32Error("CleanUp/DeleteObject/foreTPicBrush");
-
- if (resource.in_memory) {
- if (oldmaneDIB) {
- /* There is an old maneDIB, put it back in the DC
- and delete the current one */
- if ((maneDIB = SelectObject(maneDrawDC, oldmaneDIB)) == NULL)
- Win32Error("reconfig/SelectObject");
- if (DeleteObject(maneDIB) == FALSE)
- Win32Error("DeleteObject/maneDIB");
- }
-
- if (oldmagDIB) {
- /* There is an old magDIB, put it back in the DC
- and delete the current one */
- if ((magDIB = SelectObject(magMemDC, oldmagDIB)) == NULL)
- Win32Error("SelectObject/oldmagDIB");
- if (DeleteObject(magDIB) == FALSE)
- Win32Error("DeleteObject/magDIB");
- }
-
- if (maneDrawDC && !DeleteDC(maneDrawDC)) Win32Error("CleanUp/DeleteDC/maneDrawDC");
- if (magMemDC && !DeleteDC(magMemDC)) Win32Error("CleanUp/DeleteDC/magMemDC");
- }
-
- if (hdcDrawSave) DeleteDC(hdcDrawSave);
-
-#ifdef TRANSFORM
- if (hClipRgn)
- DeleteObject(hClipRgn);
-#endif
-}
-
-void CleanExit(int code)
-{
- CleanUp();
- ExitProcess(code);
-}
-/*
- Be warned: the string has to be used before this function is called
- a second time.
- */
-LPTSTR GetStringRes (int id)
-{
- static TCHAR buffer[MAX_PATH];
-
- buffer[0]=0;
- LoadString (GetModuleHandle (NULL), id, buffer, MAX_PATH);
- return buffer;
-}
-
-
-LRESULT CmdHelpTopics(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
-{
- ReadHelp (hwnd, SZAPPNAME".HTML");
- return 0;
-}
-
-#if 0
-LRESULT CmdHelpContents(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
-{
- BOOL bGotHelp;
- /* Not called in Windows 95 */
- bGotHelp = WinHelp (hwnd, SZAPPNAME".HLP", HELP_CONTENTS,(DWORD)0);
- if (!bGotHelp) {
- MessageBox (GetFocus(), GetStringRes(IDS_NO_HELP),
- szAppName, MB_OK|MB_ICONHAND);
- }
- return 0;
-}
-
-LRESULT CmdHelpSearch(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
-{
- /* Not called in Windows 95 */
- if (!WinHelp(hwnd, SZAPPNAME".HLP", HELP_PARTIALKEY, (DWORD)(LPSTR)"")) {
- MessageBox (GetFocus(), GetStringRes(IDS_NO_HELP),
- szAppName, MB_OK|MB_ICONHAND);
- }
- return 0;
-}
-
-LRESULT CmdHelpHelp(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
-{
- /* Not called in Windows 95 */
- if(!WinHelp(hwnd, (LPSTR)NULL, HELP_HELPONHELP, 0)) {
- MessageBox (GetFocus(), GetStringRes(IDS_NO_HELP),
- szAppName, MB_OK|MB_ICONHAND);
- }
- return 0;
-}
-#endif
-
-/*F+F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F
- Function: GetErrorMsg
- Summary: Accepts a Win32 error code and retrieves a human readable
- system message for it. Args: HRESULT hr
- SCODE error code. LPTSTR pszMsg
- Pointer string where message will be placed.
- UINT uiSize Max size of the msg string.
- Returns: BOOL TRUE if hr was error; FALSE if not.
-F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F-F*/
-BOOL GetErrorMsg(HRESULT hr, LPTSTR pszMsg, UINT uiSize)
-{
- BOOL bErr = FAILED(hr);
- DWORD dwSize;
- if (bErr) {
- memset(pszMsg, 0, uiSize * sizeof(TCHAR));
- dwSize = FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
- NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
- pszMsg, uiSize, NULL);
- if (dwSize>2) {
- /* Take out the trailing CRLF. */
- pszMsg[--dwSize] = 0;
- pszMsg[--dwSize] = 0;
- }
- }
- return bErr;
-}
-
-/*F+F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F
- Function: HrMsg
- Summary: HRESULT Error Message box. Takes standard result code,
- looks it up in the system tables, and shows a message
- box with the error code (in hex) and the associated
- system message. Args: HWND hWndOwner,
- Handle to owner parent window. LPTSTR pszTitle
- User message string (eg, designating the attempted function).
- Appears in dialog title bar. HRESULT hr,
- Standard result code. Returns: void
-F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F-F*/
-void HrMsg(HWND hWndOwner, LPTSTR pszTitle, HRESULT hr)
-{
- TCHAR szMsg[MAX_PATH];
- TCHAR szErrMsg[MAX_PATH];
- int iResult;
- wsprintf(szMsg, TEXT("Error=0x%X:\r\n"), hr);
- GetErrorMsg(hr, szErrMsg, MAX_PATH);
- lstrcat(szMsg, szErrMsg);
- iResult = MessageBox(hWndOwner, szMsg, pszTitle, MB_OK | MB_ICONEXCLAMATION);
- return;
-}
-
-/*
- We can replace the WinHelp() system by html files using this.
- */
-void ReadHelp(HWND hWndOwner, LPTSTR pszHelpFile)
-{
-#define NOBROWSE_ERROR_STR "Can't run browser."
-#define NOHTM_ERROR_STR "Can't find .HTM file."
-#define ERROR_TITLE_STR "-Error-"
- int iRes;
- LPSTR lpFullHelpFile = NULL;
- if (NULL != pszHelpFile) {
- /* First check if the .HTM help file is there at all. */
- lpFullHelpFile = kpse_var_expand("$TEXMFMAIN/doc/html/windvi/windvi.html");
- MessageBox(hWndOwner, lpFullHelpFile, "Help File",
- MB_OK | MB_ICONEXCLAMATION);
- if (!lpFullHelpFile || GetFileAttributes(lpFullHelpFile) == -1)
- lpFullHelpFile = kpse_find_file(pszHelpFile, kpse_texdoc_format, TRUE);
- if (lpFullHelpFile) {
- /* Use shell to invoke web browser on the HTML help file. */
- iRes = (int) ShellExecute(hWndOwner, TEXT("open"), lpFullHelpFile,
- NULL, NULL, SW_SHOWNORMAL);
- if (iRes <= 32) {
- /* If unable to browse then put up an error box. */
- Win32Error(TEXT(NOBROWSE_ERROR_STR));
- }
- }
- else {
- /* If the .HTM file doesn't exist then put up an error box. */
- iRes = MessageBox(hWndOwner, TEXT(NOHTM_ERROR_STR), TEXT(ERROR_TITLE_STR),
- MB_OK | MB_ICONEXCLAMATION);
- }
- }
- return;
-}
-
-/*
- Add Last Used Files to main menu
-*/
-
-#define RECENT_POSITION 8
-
-void UpdateMainMenuUsedFiles()
-{
- int nCount;
- TCHAR szTemp[MAX_PATH + 6];
- HMENU hMenu;
- MENUITEMINFO ItemInfo;
-
- /* Validate parameters. */
- if (!IsWindow(hWndMain)) {
- return;
- }
-
- if ((hMenu = GetSubMenu(GetMenu(hWndMain), 0)) == NULL)
- Win32Error("UpdateMainMenuUsedFiled/GetSubMenu");
-
- for (nCount = 0; nCount < iLastUsedFilesNum; nCount++) {
- /* Only add strings that are not null or zero length. */
- if ((lpLastUsedFiles[nCount] != NULL) && (lstrlen(lpLastUsedFiles[nCount]) != 0)) {
- /* Build recent file menu string. */
- wsprintf(szTemp, __TEXT("&%d %s"), nCount +1, lpLastUsedFiles[nCount]);
-
- /* Determine if replacing item or inserting.*/
- memset(&ItemInfo, 0, sizeof(MENUITEMINFO));
- ItemInfo.cbSize = sizeof(MENUITEMINFO);
- ItemInfo.fMask = MIIM_TYPE;
- GetMenuItemInfo(hMenu, RECENT_POSITION + nCount, TRUE, &ItemInfo);
- if (MFT_SEPARATOR == ItemInfo.fType) {
- /* Insert item. MIIM_ID */
- ItemInfo.fMask = MIIM_TYPE | MIIM_ID;
- ItemInfo.wID = IDM_FILE_RECENT + nCount;
- ItemInfo.fType = MFT_STRING;
- ItemInfo.dwTypeData = szTemp;
- ItemInfo.cch = lstrlen(ItemInfo.dwTypeData);
- InsertMenuItem(hMenu, RECENT_POSITION + nCount, TRUE, &ItemInfo);
- }
- else {
- /* Replace menu item. */
- ItemInfo.fMask = MIIM_TYPE | MIIM_STATE;
- ItemInfo.fState = MFS_ENABLED;
- ItemInfo.fType = MFT_STRING;
- ItemInfo.dwTypeData = szTemp;
- ItemInfo.cch = lstrlen(ItemInfo.dwTypeData);
- SetMenuItemInfo(hMenu, RECENT_POSITION + nCount, TRUE, &ItemInfo);
- }
- }
- }
- DrawMenuBar(hWndMain);
-}
-
-int GetSystemType()
-{
- OSVERSIONINFOEX osvi;
- BOOL bOsVersionInfoEx;
- int result = -1;
-
- /* Try calling GetVersionEx using the OSVERSIONINFOEX structure,
- which is supported on Windows NT versions 5.0 and later.
- If that fails, try using the OSVERSIONINFO structure,
- which is supported on earlier versions of Windows and Windows NT */
-
- ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
- osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
-
- if (! (bOsVersionInfoEx = GetVersionEx ( (OSVERSIONINFO *) &osvi) ) ) {
- /* If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO. */
- osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
- if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) {
- fprintf(stderr, "GetVersion() failed \n");
- MessageBox(NULL, "GetVersion() failed.", NULL, MB_APPLMODAL | MB_ICONHAND | MB_OK);
- return -1;
- }
- }
-
- switch (osvi.dwPlatformId) {
- case VER_PLATFORM_WIN32_NT:
- if (osvi.dwMajorVersion == 3)
- result = WINNT3;
- else if (osvi.dwMajorVersion == 4)
- result = WINNT4;
- else
- result = WINNT5;
- break;
- case VER_PLATFORM_WIN32_WINDOWS:
- if ((osvi.dwMajorVersion > 4) ||
- ((osvi.dwMajorVersion == 4) && (osvi.dwMinorVersion > 0)))
- result = WIN98;
- else
- result = WIN95;
- break;
- case VER_PLATFORM_WIN32s:
- result = WIN31;
- break;
- }
-#if 0
- fprintf (stderr, "version %d.%d (Build %d)\n",
- osvi.dwMajorVersion,
- osvi.dwMinorVersion,
- osvi.dwBuildNumber & 0xFFFF);
- if (bOsVersionInfoEx)
- fprintf (stderr, "Service Pack %d.%d\n",
- osvi.wServicePackMajor,
- osvi.wServicePackMinor);
-#endif
- return result;
-}
-
-void CloseHandleAndClear(HANDLE *h)
-{
- if (h && *h != INVALID_HANDLE_VALUE) {
- if (CloseHandle(*h) == FALSE) {
- Win32Error("CloseHandle");
- }
- *h = INVALID_HANDLE_VALUE;
- }
-}