summaryrefslogtreecommitdiff
path: root/Build/source/texk/windvi/windraw.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/windvi/windraw.c')
-rw-r--r--Build/source/texk/windvi/windraw.c1578
1 files changed, 0 insertions, 1578 deletions
diff --git a/Build/source/texk/windvi/windraw.c b/Build/source/texk/windvi/windraw.c
deleted file mode 100644
index 67726684b23..00000000000
--- a/Build/source/texk/windvi/windraw.c
+++ /dev/null
@@ -1,1578 +0,0 @@
-#include "wingui.h"
-#include "xdvi-config.h"
-#include "gsdll.h"
-#include "version.h"
-
-#ifndef WIN32
-#include "WWWLib.h"
-#include "WWWInit.h"
-#endif
-
-#ifdef HTEX
-/* Application name and version for w3c-libwww routines.
- This is what will show up in httpd's agent_log files.
-*/
-#ifdef Omega
-char *HTAppName = "owindvi";
-#else
-char *HTAppName = "windvi";
-#endif
-char *HTAppVersion = XDVERSION;
-
-/* Create the anchor information stuff at the bottom of the page */
-
-/* Anchor search: a dialog box */
-/* anchorinfo = Ascii text widget */
-
-char anchorsearchstring[1024];
-char anchorask[] = "Access new URL:";
-
-#endif
-
-#define mask_mag(ev) ((ev & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) && !(ev & (MK_SHIFT | MK_CONTROL)))
-#define mask_sethome(ev) ((ev & MK_LBUTTON) && (ev & MK_SHIFT))
-#define mask_srcspecial(ev) ((ev & MK_RBUTTON) && (ev & MK_SHIFT))
-#define mask_opennewframe(ev) ((ev & MK_LBUTTON) && (ev & MK_CONTROL))
-
-/*****************************************************************************
- Drawing child window
- ****************************************************************************/
-HWND hWndDraw;
-BOOL bDrawKeep = FALSE;
-HDC hdcDrawSave = 0;
-static HRGN hrgnScroll = 0;
-
-LRESULT CALLBACK DrawProc(HWND, UINT, WPARAM, LPARAM);
-
-/* Drawing window message table definition. */
-MSD rgmsdDraw[] =
-{
- {WM_CREATE, MsgDrawCreate },
- /* {WM_SIZE, MsgDrawSize }, */
- {WM_HSCROLL, MsgDrawHScroll },
- {WM_VSCROLL, MsgDrawVScroll },
- {WM_MOUSEMOVE, MsgDrawMousemove },
- /* {WM_COMMAND, MsgDrawCommand }, */
- {WM_PAINT, MsgDrawPaint },
- /* {WM_ERASEBKGND, MsgDrawEraseBkgnd}, */
- /* {WM_NCPAINT, MsgDrawNCPaint }, */
- {WM_LBUTTONDOWN,MsgDrawEnterMagL },
- {WM_LBUTTONUP, MsgDrawQuitMagL },
- {WM_MBUTTONDOWN,MsgDrawEnterMagM },
- {WM_MBUTTONUP, MsgDrawQuitMagL },
- {WM_RBUTTONDOWN,MsgDrawEnterMagR },
- {WM_RBUTTONUP, MsgDrawQuitMagL }
-};
-
-MSDI msdiDraw =
-{
- sizeof(rgmsdDraw) / sizeof(MSD),
- rgmsdDraw,
- edwpWindow
-};
-
-/* Drawing window command table definition. */
-CMD rgcmdDraw[] =
-{
- {IDM_FILEOPEN, CmdStub}
-};
-
-CMDI cmdiDraw =
-{
- sizeof(rgcmdDraw) / sizeof(CMD),
- rgcmdDraw,
- edwpNone
-};
-
-/*****************************************************************************
- Magnifying child window
- ****************************************************************************/
-HWND hWndMagnify;
-HDC magDC, magMemDC;
-BOOL bMagDisp = FALSE; /* Mag. Glass is displayed */
-BOOL bSetHome = FALSE; /* User is setting home position */
-BOOL bSrcSpecial = FALSE; /* User wants to jump to the next src special */
-
-int magWidth, magHeight;
-
-LRESULT CALLBACK MagnifyProc(HWND, UINT, WPARAM, LPARAM);
-
-/* Magnifying window message table definition. */
-MSD rgmsdMagnify[] =
-{
- {WM_CREATE, MsgMagnifyCreate },
- /* {WM_SIZE, MsgMagnifySize },
- {WM_HSCROLL, MsgMagnifyHScroll },
- {WM_VSCROLL, MsgMagnifyVScroll },
- {WM_MOUSEMOVE, MsgMagnifyMousemove },
- {WM_COMMAND, MsgMagnifyCommand }, */
- /* {WM_ERASEBKGND, MsgMagnifyEraseBkgnd}, */
- {WM_PAINT, MsgMagnifyPaint }
-};
-
-MSDI msdiMagnify =
-{
- sizeof(rgmsdMagnify) / sizeof(MSD),
- rgmsdMagnify,
- edwpWindow
-};
-
-/* Magnifying window command table definition. */
-CMD rgcmdMagnify[] =
-{
- {IDM_FILEOPEN, CmdStub}
-};
-
-CMDI cmdiMagnify =
-{
- sizeof(rgcmdMagnify) / sizeof(CMD),
- rgcmdMagnify,
- edwpNone
-};
-
-/*
-
- Magnifying glass
-
- */
-BOOL CreateMagnify(HWND hwndParent)
-{
- extern HBRUSH foreBrush, backBrush;
- extern HPEN forePen;
-
- hWndMagnify = CreateWindow("MagnifyGlass",
- NULL,
- WS_BORDER | WS_POPUP | WS_DISABLED,
- /* | WS_CLIPSIBLINGS, */
- 0, 0, 50, 50,
- hwndParent,
- NULL,
- hInst,
- NULL);
- if (hWndMagnify == NULL) {
- Win32Error("CreateWindow/Magnify");
- return FALSE;
- }
- alt.win = hWndMagnify;
- magDC = GetDC(hWndMagnify);
-
-#if 1
-#ifdef TRANSFORM
- if (IS_NT)
- SetGraphicsMode(magDC, GM_ADVANCED);
-#endif
-#endif
-
- if (resource.in_memory) {
- magMemDC = CreateCompatibleDC(magDC);
-#ifdef TRANSFORM
- if (IS_NT)
- SetGraphicsMode(magDC, GM_ADVANCED);
-#endif
- }
- else {
- magMemDC = magDC;
- }
-
- SetBkMode(magDC, OPAQUE);
- SetBkColor(magDC, back_Pixel);
-
- return TRUE;
-}
-
-
-LRESULT CALLBACK MagnifyProc(HWND hwnd, UINT uMessage,
- WPARAM wparam, LPARAM lparam)
-{
- return DispMessage(&msdiMagnify, hwnd, uMessage, wparam, lparam);
-}
-
-LRESULT MsgMagnifyCreate(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- RECT r;
-#if 0
- GetClientRect(hwnd, &r);
- if (wparam) FillRect((HDC)wparam, &r, backBrush);
-#endif
- return 0;
-}
-
-LRESULT MsgMagnifyEraseBkgnd(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- RECT r;
- GetClientRect(hwnd, &r);
- FillRect((HDC)wparam, &r, backBrush);
- return TRUE;
-}
-
-LRESULT MsgMagnifyPaint(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- PAINTSTRUCT ps;
- POINT ptOrg = { 0, 0};
-
- BeginPaint(hwnd, &ps);
-
- GetWindowOrgEx(maneDrawDC, &ptOrg);
-
- if (resource.in_memory) {
- HBRUSH oldBrush;
-#if 0
- oldBrush = SelectObject(magDC, foreBrush);
-#endif
- /* We have to paint in ps.rcPaint, from memory dib. */
- if (!BitBlt(magDC,
- ps.rcPaint.left, ps.rcPaint.top,
- ps.rcPaint.right - ps.rcPaint.left,
- ps.rcPaint.bottom - ps.rcPaint.top,
- magMemDC,
- ps.rcPaint.left,
- ps.rcPaint.top, SRCCOPY))
- Win32Error("Draw Magnify/BitBlt");
-#if 0
- SelectObject(magDC, oldBrush);
-#endif
- }
- else {
- /* We have to paint directly onto the screen */
- extern void redraw(struct WindowRec *);
- RECT altRect;
-
- /* swapping to mag. glass device contexts */
- foreGC = ruleGC = highGC = ps.hdc;
-
- alt.base_x = (xMousePos + xCurrentScroll + ptOrg.x)*mane.shrinkfactor - magWidth;
- alt.base_y = (yMousePos + yCurrentScroll + ptOrg.y)*mane.shrinkfactor - magHeight;
- alt.min_x = ps.rcPaint.left;
- alt.min_y = ps.rcPaint.top;
- alt.max_x = ps.rcPaint.right;
- alt.max_y = ps.rcPaint.bottom;
- alt.width = ps.rcPaint.right - ps.rcPaint.left;
- alt.height = ps.rcPaint.bottom - ps.rcPaint.bottom;
-#if 0
- fprintf(stderr, "Painting in base (%d %d) (%d %d) - (%d %d)\n",
- alt.base_x, alt.base_y, alt.min_x, alt.min_y, alt.max_x, alt.max_y);
-#endif
-#if 1
- /* draw background */
- {
- RECT rectBg;
- rectBg.left = max(0, alt.min_x);
- rectBg.top = max(0, alt.min_y);
- rectBg.right = min(alt.max_x, unshrunk_paper_w - alt.base_x);
- rectBg.bottom = min(alt.max_y, unshrunk_paper_h - alt.base_y);
- FillRect(magDC, &rectBg, backBrush);
- }
-#if 0
- draw_rulers(alt.width, alt.height, magDC);
-#endif
-#endif
- allowDrawingChars = TRUE;
- redraw(&alt);
-
- if (resource.reverse) {
- PatBlt(foreGC, alt.min_x, alt.min_y, alt.max_x, alt.max_y, DSTINVERT);
- }
- /* and back to drawing window dcs */
- foreGC = ruleGC = highGC = maneDrawDC;
- }
-
- EndPaint(hwnd, &ps);
- return 0;
-}
-
-/*
- Process messages for the about box.
- */
-
-LRESULT CALLBACK DrawProc(HWND hwnd, UINT uMessage,
- WPARAM wparam, LPARAM lparam)
-{
- return DispMessage(&msdiDraw, hwnd, uMessage, wparam, lparam);
-}
-
-/*
- CreateDraw(hWndParent) : creates the drawing window (child with
- scrollbars).
- */
-BOOL CreateDraw(HWND hwndParent)
-{
- hWndDraw = CreateWindowEx(WS_EX_CLIENTEDGE,
- TEXT("ClientDrawClass"),
- NULL,
- WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
- | WS_HSCROLL | WS_VSCROLL,
- -100, -100, 10, 10,
- hwndParent,
- NULL,
- hInst,
- NULL);
- if (hWndDraw == NULL) {
- Win32Error("CreateWindowEx");
- return FALSE;
- }
-
- /* Initialize all graphic related variables */
-
- InitGlobalsDraw();
-
- SizeClientWindow(hWndDraw);
- SetScrollBars(hWndDraw);
- SetCursor(hCursArrow);
- ShowWindow(hWndDraw, SW_SHOW);
-
- make_temporary_dir(&temporary_dir); /* For storing temporary files... */
-
- if (dvi_name) {
- char *title_name;
- char *icon_name;
-
- /*
- * Open the dvi file and set titles
- */
- set_directory_dvifile();
-#ifdef HTEX
-#ifndef WIN32
- {
- char *cp = getenv("WWWBROWSER");
- if (cp) browser = cp;
- }
- HTProfile_newPreemptiveClient(HTAppName, HTAppVersion);
- HTCacheMode_setEnabled(NO);
-
-#if 0
- /* Optionally, turn on tracing of WWW library calls. */
- if (debug & DBG_HYPER) {
- WWWTRACE = SHOW_STREAM_TRACE;
- }
-#endif
-#endif /* WIN32 */
-
-#if T1
- /* At this point DISP, our_visual, our_depth and our_colormap must
- be defined, and they are */
- init_t1();
-#endif
-
- /* Open the input file. Turn filename into URL first if needed */
- URL_aware = TRUE;
-
- if (!(URLbase || htex_is_url(dvi_name))) {
- char *new_name;
- int n;
-
- n = strlen(dvi_name);
- new_name = dvi_name;
- /* Find the right filename */
- if (n < sizeof(".dvi")
- || strcmp(dvi_name + n - sizeof(".dvi") + 1, ".dvi") != 0) {
- dvi_name = xmalloc((unsigned) n + sizeof(".dvi"));
- Strcpy(dvi_name, new_name);
- Strcat(dvi_name, ".dvi");
- /* Atempt $dvi_name.dvi */
- dvi_file = xfopen(dvi_name, OPEN_MODE);
- if (dvi_file == NULL) {
- /* Didn't work, revert to original $dvi_name */
- free(dvi_name);
- dvi_name = new_name;
- }
- }
-
- /* Turn filename into URL */
- /* Escape dangers, esp. # from emacs */
-#ifdef WIN32
- new_name = xmalloc((unsigned) strlen(dvi_name)+6);
- strcat(strcpy(new_name,"file:"),dvi_name);
- free(dvi_name);
- dvi_name = new_name;
-#else
- new_name=HTEscape(dvi_name,URL_PATH);
- free(dvi_name);
- dvi_name = xmalloc((unsigned) strlen(new_name)+6);
- strcat(strcpy(dvi_name,"file:"),new_name);
-#endif
- /* Now we have the right filename, in a URL */
- }
-
-#if 0
- __asm int 3;
-#endif
- detach_anchor();
- if (!open_www_file()) {
- fprintf(stderr,"Could not open dvi file. Exiting.\n");
- Exit(1);
- }
- htex_reinit();
- URL_aware = FALSE;
-#else
- open_dvi_file();
-#endif /* not HTEX */
-
-#ifdef XFORM
- reset_xform_stack();
-#endif
-#ifdef SRC_SPECIALS
- src_delete_all_specials();
-#endif
- if (curr_page) {
- current_page = (*curr_page ? atoi(curr_page) : total_pages) - 1;
- if (current_page < 0 || current_page >= total_pages) usage();
- }
-#if 1
- set_icon_and_title (dvi_name, &icon_name, &title_name, 1);
-#endif
-
- {
- int new_shrink;
- if (resource.shrinkfactor <= 0)
- new_shrink = ChooseShrink();
- else
- new_shrink = resource.shrinkfactor;
-
- reconfig();
- ChangeZoom(new_shrink);
-#if 0
- redraw_page();
- ChangePage(0);
- /* FIXME : why 2 calls ? */
- redraw_page();
-#endif
- ChangePage(0);
- }
- }
-
- return TRUE;
-}
-
-#if 0
-LRESULT MsgDrawCommand(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- return 0;
-}
-
-LRESULT MsgDrawNCPaint(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- fprintf(stderr, "NC Paint hwnd = %x, wparam = %x, lparam = %x\n",
- hwnd, wparam, lparam);
- /* return DefWindowProc(hwnd, uMessage, wparam, lparam); */
- return 0;
-}
-#endif
-
-LRESULT MsgDrawMousemove(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- char szBuf[80]; /* Array for formatting mouse coordinates */
- RECT altRect, oldRect;
- extern void redraw(struct WindowRec *);
- extern double p2u_factor;
- extern const char *pos_format;
-#if 0
- HRGN hrgnMag;
- RECT clipRect;
-#endif
- int xDelta, yDelta;
- POINT ptOrg = { 0, 0};
-
- GetWindowOrgEx(maneDrawDC, &ptOrg);
-
- xMousePos = LOWORD(lparam);
- yMousePos = HIWORD(lparam);
-
- if (bMagDisp && mask_mag(wparam)) {
- POINT absPos;
- /* redraw mag. glass content */
-
- /* adjust magnifying glass position */
- GetWindowRect(hWndMagnify, &oldRect);
- absPos.x = xMousePos - magWidth - 1;
- absPos.y = yMousePos - magHeight - 1;
- ClientToScreen(hwnd, &absPos);
- if (SetWindowPos(hWndMagnify, HWND_TOPMOST,
- absPos.x, absPos.y,
- magWidth*2/* +2 */, magHeight*2 /* +2 */,
- SWP_NOACTIVATE | SWP_NOSIZE /* | SWP_SHOWWINDOW */
- /* | SWP_NOCOPYBITS */
- | SWP_NOOWNERZORDER | SWP_NOZORDER) == 0)
- Win32Error("SetWindowPos");
- UpdateWindow(hwnd);
-#if 1
- /* UpdateWindow(hWndMagnify); */
- /* Need to redisplay the toolbar too ! */
- UpdateWindow(hWndToolbar);
-#endif
- /*
- Redraw the in-memory bitmap for the mag. glass
- */
- alt.base_x = (xMousePos + xCurrentScroll)*mane.shrinkfactor - magWidth;
- alt.base_y = (yMousePos + yCurrentScroll)*mane.shrinkfactor - magHeight;
- GetClientRect(alt.win, &altRect);
- alt.min_x = altRect.left;
- alt.min_y = altRect.top;
- alt.width = altRect.right - altRect.left;
- alt.height = altRect.bottom - altRect.top;
- alt.max_x = altRect.right;
- alt.max_y = altRect.bottom;
-
- /* Better than invalidating the whole rectangle, scroll the window */
- xDelta = (oldRect.left - absPos.x)*mane.shrinkfactor;
- yDelta = (oldRect.top - absPos.y)*mane.shrinkfactor;
-
-#if 0
- /* FIXME : the whol mag glass is redrawn, not only the part invalidated
- or is this because the laptop has no advanced graphic feature ? */
- fprintf(stderr, "scrolling by %d %d\n", xDelta, yDelta);
-#endif
- if (xDelta || yDelta) {
- RECT prcUpdate;
- if (ScrollWindowEx(hWndMagnify,
- xDelta, yDelta,
- NULL, NULL, NULL, &prcUpdate,
- SW_INVALIDATE | SW_ERASE ) == ERROR)
- Win32Error("ScrollWindowEx");
-#if 0
- fprintf(stderr, "prcUpdate : (%d %d) - (%d %d) mag (%d %d)\n",
- prcUpdate.left, prcUpdate.top,
- prcUpdate.right, prcUpdate.bottom, magWidth, magHeight);
-#endif
- }
-
- if (resource.in_memory) {
-#if 0
- SelectObject(magMemDC, backBrush);
-#endif
- if (!FillRect(magMemDC, &altRect, backBrush))
- Win32Error("FillRect Magnifying Glass");
-#if 0
- /* FIXME : it would be nice to see the page's border in the mag. glass */
- PatBlt(magMemDC,
- max(alt.min_x, -alt.base_x),
- max(alt.min_y, -alt.base_y),
- min(alt.max_x, ),
- min(alt.max_y, ),
- WHITENESS);
-#endif
- redraw(&alt);
- /* FIXME : how to put these rulers once for all and bitblt
- on top of them ? */
-#if 0
- draw_rulers(alt.width, alt.height, magMemDC);
-#endif
- }
- UpdateWindow(hWndMagnify);
- }
- sprintf(szBuf, pos_format,
- (xMousePos + xCurrentScroll + ptOrg.x) * mane.shrinkfactor * p2u_factor,
- (yMousePos + yCurrentScroll + ptOrg.y) * mane.shrinkfactor * p2u_factor);
- UpdateStatusBar(szBuf, 6, 0);
- return 0;
-}
-
-void
-EnterMag(HWND hwnd, int xMousePos, int yMousePos)
-{
- RECT rcClient, rcPage, rcClip, rcMag;
- POINT ptClientUL, ptClientLR;
- POINT mousePos, absPos, wndOrg;
-
- extern int numColors;
- HWND hWndTop = GetTopWindow(NULL);
-
- /* Retrieve the page dimensions */
- rcPage.left = 0;
- rcPage.top = 0;
- rcPage.right = page_w - 1;
- rcPage.bottom = page_h - 1;
-
- /* Get Window origin */
- GetWindowOrgEx(maneDrawDC, &wndOrg);
-
- mousePos.x = xMousePos + wndOrg.x;
- mousePos.y = yMousePos + wndOrg.y;
-
- if (!PtInRect(&rcPage, mousePos)) {
- return;
- }
-
- if (1 /* hWndTop == hWndMain */) {
- RECT rc;
-#if 0
- fprintf(stderr, "Entering mag and saving main window\n");
-#endif
- GetClientRect(hWndMain,&rc);
- BitBlt(hdcDrawSave, 0,0,rc.right,rc.bottom,
- maneDC, 0,0,SRCCOPY);
- bDrawKeep = TRUE;
- }
-
- /* FIXME: this causes a redisplay bug if xdvi is not the topmost
- window */
- bMagDisp = TRUE;
-
- /* Capture mouse input */
- SetCapture(hwnd);
- /* Retrieve the screen coordinates of the client area,
- and convert them into client coordinates. */
- GetClientRect(hwnd, &rcClient);
- /* Intersect both rectangles. The mag. glass will be limited
- to the actual visible part of the page. */
- IntersectRect(&rcClip, &rcClient, &rcPage);
- ptClientUL.x = rcClip.left;
- ptClientUL.y = rcClip.top;
- /* Add one to the right and bottom sides, because the
- coordinates retrieved by GetClientRect do not
- include the far left and lowermost pixels. */
- ptClientLR.x = rcClip.right;
- ptClientLR.y = rcClip.bottom;
-
- /* FIXME : GetWindowOrgEx() to translate the points */
- ClientToScreen(hwnd, &ptClientUL);
- ClientToScreen(hwnd, &ptClientLR);
- /* Copy the client coordinates of the client area
- to the rcClip structure. Confine the mouse cursor
- to the client area by passing the rcClip structure
- to the ClipCursor function. */
-#if 0
- fprintf(stderr, "Org %d %d\n", wndOrg.x, wndOrg.y);
-#endif
- SetRect(&rcClip,
- ptClientUL.x - wndOrg.x,
- ptClientUL.y - wndOrg.y,
- ptClientLR.x - wndOrg.x,
- ptClientLR.y - wndOrg.y);
- ClipCursor(&rcClip);
- /* Calculates the new position and size of the magnifying glass */
- mousePos.x = xMousePos - magWidth - 1;
- mousePos.y = yMousePos - magHeight - 1;
- /* ClientToScreen(hwnd, &mousePos); */
- rcMag.left = mousePos.x + 1;
- rcMag.top = mousePos.y + 1;
- /* FIXME : +1 ? */
- rcMag.right = rcMag.left + 2*magWidth + 1;
- rcMag.bottom = rcMag.top + 2*magHeight + 1;
-
- if (resource.in_memory) {
- 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");
- }
-
- magDIB = CreateDIB(magMemDC, 2*magWidth, 2*magHeight, 16, NULL, NULL);
- if ((oldmagDIB = SelectObject(magMemDC, magDIB)) == NULL)
- Win32Error("SelectObject/magDIB");
-
- if (!FillRect(magMemDC, &rcMag, backBrush))
- Win32Error("FillRect magMemDC background");
-
- foreGC = ruleGC = highGC = magMemDC;
- }
-
- /* redraw mag. glass content */
- absPos.x = xMousePos - magWidth - 1;
- absPos.y = yMousePos - magHeight - 1;
- ClientToScreen(hwnd, &absPos);
- if (SetWindowPos(hWndMagnify, HWND_TOPMOST,
- absPos.x,
- absPos.y, magWidth*2/*+2*/, magHeight*2/*+2*/,
- SWP_NOACTIVATE | SWP_SHOWWINDOW
- | SWP_NOOWNERZORDER | SWP_NOZORDER) == 0)
- Win32Error("SetWindowPos");
- /* ShowWindow(hWndMagnify, SW_SHOW); */
-}
-
-LRESULT MsgDrawEnterMagL(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- if (bSkipFirstClick) {
- bSkipFirstClick = FALSE;
- return 0;
- }
-
- if (bMagDisp || bSetHome)
- return 0;
-
- if (mask_sethome(wparam)) {
- RECT rcClip, rcPage, rcClient;
- POINT ptClientUL, ptClientLR;
- bSetHome = TRUE;
- SetCursor(hCursCross);
- SetCapture(hwnd);
- /* Retrieve the screen coordinates of the client area,
- and convert them into client coordinates. */
- GetClientRect(hwnd, &rcClient);
- /* Retrieve the page dimensions */
- rcPage.top = rcPage.left = 0;
- rcPage.right = page_w - 1;
- rcPage.bottom = page_h - 1;
- /* Intersect both rectangles. The mag. glass will be limited
- to the actual visible part of the page. */
- IntersectRect(&rcClip, &rcClient, &rcPage);
- ptClientUL.x = rcClip.left;
- ptClientUL.y = rcClip.top;
- /* Add one to the right and bottom sides, because the
- coordinates retrieved by GetClientRect do not
- include the far left and lowermost pixels. */
- ptClientLR.x = rcClip.right;
- ptClientLR.y = rcClip.bottom;
- ClientToScreen(hwnd, &ptClientUL);
- ClientToScreen(hwnd, &ptClientLR);
- /* Copy the client coordinates of the client area
- to the rcClip structure. Confine the mouse cursor
- to the client area by passing the rcClip structure
- to the ClipCursor function. */
- SetRect(&rcClip, ptClientUL.x, ptClientUL.y,
- ptClientLR.x, ptClientLR.y);
- ClipCursor(&rcClip);
- UpdateStatusBar("Setting home position...", 0, 0);
- }
- else {
-#ifdef HTEX
- int x, y;
- if (mask_opennewframe(wparam)) {
- HTeXnext_extern = 1;
- }
- else {
- HTeXnext_extern = 0;
- }
- if (pointerlocate(&x, &y)) {
- /* Only do this if there's actually an href right there */
- int ret;
- /* screen_to_page(&mane,x,y,&page,&px,&py); */
- ret = htex_handleref(current_page, x, y);
- HTeXnext_extern = 0;
- if (ret == 1) return 0;
- }
-#endif
- magWidth = mg_size[0].w / 2;
- magHeight = mg_size[0].h / 2;
- EnterMag(hwnd, LOWORD(lparam), HIWORD(lparam));
- }
- return 0;
-}
-
-LRESULT MsgDrawEnterMagM(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
-#if 0
- /* Allow to open a new frame only if not running in single
- instance mode ! */
- if (!resource.single_flag) {
- int x, y;
- if (pointerlocate(&x, &y)) {
- /* Only do this if there's actually an href right there */
- int ret;
- /* screen_to_page(&mane,x,y,&page,&px,&py); */
- HTeXnext_extern = 1;
- ret = htex_handleref(current_page, x, y);
- HTeXnext_extern = 0;
- if (ret == 1) return 0;
- }
- }
-#endif
- if (bSkipFirstClick) {
- bSkipFirstClick = FALSE;
- return 0;
- }
-
- if (bMagDisp || bSetHome)
- return 0;
-
- magWidth = mg_size[1].w / 2;
- magHeight = mg_size[1].h / 2;
- EnterMag(hwnd, LOWORD(lparam), HIWORD(lparam));
-
- return 0;
-}
-
-LRESULT MsgDrawEnterMagR(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- if (bSkipFirstClick) {
- bSkipFirstClick = FALSE;
- return 0;
- }
- if (bMagDisp || bSetHome)
- return 0;
-
-#ifdef SRC_SPECIALS
- if (mask_srcspecial(wparam)) {
- if (src_evalMode) {
- int x, y;
- POINT ptOrg = { 0, 0};
- GetWindowOrgEx(maneDrawDC, &ptOrg);
- x = min(xMousePos + xCurrentScroll + ptOrg.x, (unsigned)page_w)/* * mane.shrinkfactor */;
- y = min(yMousePos + yCurrentScroll + ptOrg.y, (unsigned)page_h)/* * mane.shrinkfactor */;
- src_find_special(1, x, y);
- }
- }
- else
-#endif
- {
- magWidth = mg_size[2].w / 2;
- magHeight = mg_size[2].h / 2;
- EnterMag(hwnd, LOWORD(lparam), HIWORD(lparam));
- }
- return 0;
-}
-
-LRESULT MsgDrawQuitMagL(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- POINT ptOrg = { 0, 0};
-
- GetWindowOrgEx(maneDrawDC, &ptOrg);
-
- if (bSetHome) {
- char szBuf[128];
- /* Restore cursor */
- bSetHome = FALSE;
- ClipCursor(NULL);
- ReleaseCapture();
- SetCursor(hCursArrow);
- 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);
- }
- else if (bMagDisp) {
- /* removes the window */
- foreGC = ruleGC = highGC = maneDrawDC;
- ShowWindow(hWndMagnify, SW_HIDE);
- bMagDisp = FALSE;
- UpdateWindow(hWndDraw);
- /* restores the old shrink factor and redisplay page */
- ClipCursor(NULL);
- ReleaseCapture();
- }
- return 0;
-}
-
-LRESULT MsgDrawCreate(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- HDC hDC = GetDC(hwnd);
- HBITMAP hBitmap;
- int width, height;
-
- /* Scroll Bars */
- xMinScroll = 0;
- xMaxScroll = page_w;
- /* mane.base_x = */xCurrentScroll = 0;
-
- yMinScroll = 0;
- yMaxScroll = page_h;
- /* mane.base_y = */yCurrentScroll = yMinScroll;
-
- fScroll = FALSE;
- fSize = FALSE;
-
- /* When the main window is created, allocate a memory context */
- /* of the appropriate size */
- hdcDrawSave = CreateCompatibleDC(hDC);
- /* Create a bitmap buffer for hdcMemSave that is */
- /* the same size as the physical screen */
- width = GetDeviceCaps(hDC, HORZRES);
- height = GetDeviceCaps(hDC, VERTRES);
- hBitmap = CreateCompatibleBitmap(hDC, width, height);
- SelectObject(hdcDrawSave, hBitmap);
- DeleteObject(hBitmap);
- ReleaseDC(hwnd,hDC);
-
-#if 0
- /* Scrolled Region */
- if (hrgnScroll ==0)
- hrgnScroll = CreateRectRgn(0, 0, 10, 10);
-#endif
- return 0;
-}
-
-LRESULT MsgDrawHScroll(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- RECT r;
- int xDelta;
- int xNewPos;
- int yDelta = 0;
-
- bDrawKeep = FALSE;
-
- GetClientRect(hwnd, &r);
-
- switch (LOWORD(wparam)) {
- case SB_TOP:
- xNewPos = xMinScroll;
- break;
- case SB_BOTTOM:
- xNewPos = xMaxScroll;
- break;
- case SB_PAGEUP:
- xNewPos = xCurrentScroll - (((r.right - r.left) * 2) / 3);
- break;
- case SB_PAGEDOWN:
- xNewPos = xCurrentScroll + (((r.right - r.left) * 2) / 3);
- break;
- case SB_LINEUP:
- xNewPos = xCurrentScroll - 5;
- break;
- case SB_LINEDOWN:
- xNewPos = xCurrentScroll + 5;
- break;
- case SB_THUMBPOSITION:
- xNewPos = HIWORD(wparam);
- break;
- default:
- xNewPos = xCurrentScroll;
- }
-
-
- xNewPos = max(xMinScroll, xNewPos);
- xNewPos = min(xMaxScroll - max(r.right - 1, 0), xNewPos);
-
-#if 0
- fprintf(stderr, "r.right = %d [%d %d %d]\n",
- r.right, xMinScroll, xCurrentScroll, xMaxScroll);
- fprintf(stderr, "xNewPos = %d\n", xNewPos);
-#endif
-
- if (xNewPos == xCurrentScroll)
- return 0;
-
- fScroll = TRUE;
-
- xDelta = xNewPos - xCurrentScroll;
- /* mane.base_x = */xCurrentScroll = xNewPos;
- ScrollWindowEx(hwnd, -xDelta, -yDelta, NULL, NULL,
- (HRGN)NULL, (LPRECT)NULL,
- SW_INVALIDATE | SW_ERASE);
-#if 1
- UpdateWindow(hwnd);
-#endif
- si.cbSize = sizeof(si);
- si.fMask = SIF_POS;
- si.nPos = xCurrentScroll;
- SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
- return 0;
-}
-
-LRESULT MsgDrawVScroll(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- RECT r;
-
- int xDelta = 0;
- int yNewPos;
- int yDelta;
-
- bDrawKeep = FALSE;
-
- GetClientRect(hwnd, &r);
- if (yCurrentScroll == yMinScroll
- && current_page > 0
- && (LOWORD(wparam) == SB_TOP
- || LOWORD(wparam) == SB_PAGEUP
- /* || LOWORD(wparam) == SB_LINEUP */)) {
- ChangePage(-1);
- wparam = MAKEWORD(SB_BOTTOM, HIWORD(wparam));
- }
- else if (yCurrentScroll == yMaxScroll - max(r.bottom - 1, 0)
- && current_page < total_pages - 1
- && (LOWORD(wparam) == SB_BOTTOM
- || LOWORD(wparam) == SB_PAGEDOWN
- /* || LOWORD(wparam) == SB_LINEDOWN */)) {
- ChangePage(+1);
- wparam = MAKEWORD(SB_TOP, HIWORD(wparam));
- }
- switch (LOWORD(wparam)) {
- case SB_TOP:
- yNewPos = yMinScroll;
- break;
- case SB_BOTTOM:
- yNewPos = yMaxScroll;
- break;
- case SB_PAGEUP:
- yNewPos = yCurrentScroll - (((r.bottom - r.top) * 2) / 3);
- break;
- case SB_PAGEDOWN:
- yNewPos = yCurrentScroll + (((r.bottom - r.top) * 2) / 3);
- break;
- case SB_LINEUP:
- yNewPos = yCurrentScroll - 5;
- break;
- case SB_LINEDOWN:
- yNewPos = yCurrentScroll + 5;
- break;
- case SB_THUMBPOSITION:
- yNewPos = HIWORD(wparam);
- break;
- default:
- yNewPos = yCurrentScroll;
- }
- yNewPos = max(yMinScroll, yNewPos);
- yNewPos = min(yMaxScroll - max(r.bottom - 1, 0), yNewPos);
-
- if (yNewPos == yCurrentScroll)
- return 0;
-
- fScroll = TRUE;
-
- yDelta = yNewPos - yCurrentScroll;
- /* mane.base_y = */yCurrentScroll = yNewPos;
- ScrollWindowEx(hwnd, -xDelta, -yDelta, NULL, NULL,
- (HRGN)NULL, (LPRECT)NULL,
- SW_INVALIDATE | SW_ERASE);
-#if 0
- UpdateWindow(hwnd);
-#endif
-
- si.cbSize = sizeof(si);
- si.fMask = SIF_POS;
- si.nPos = yCurrentScroll;
- SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
- return 0;
-}
-
-LRESULT MsgDrawEraseBkgnd(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- RECT r;
- HDC hdc = (HDC)wparam;
-
- if (isPrinting) return TRUE;
-
- GetClientRect(hwnd, &r);
-
- if (resource.in_memory) {
- FillRect(hdc, &r, GetStockObject (LTGRAY_BRUSH));
- }
- else {
-
- if (debug & DBG_EVENT)
- fprintf(stderr, "Erasing background with colors %x\n", back_Pixel);
-
- FillRect(hdc, &r, GetStockObject (LTGRAY_BRUSH));
- if (dvi_file) {
- r.bottom = min(page_h - yCurrentScroll, r.bottom);
- r.right = min(page_w - xCurrentScroll, r.right);
-
- if (debug & DBG_EVENT)
- fprintf(stderr, "Erasing background, Page is in (%d x %d)\n",
- r.right, r.bottom);
-
- FillRect(hdc, &r, backBrush);
-
- }
- }
- return TRUE;
-}
-
-/*
- We have 2 alternatives :
-
- - using a page for the text and BitBlt'ing this page onto the screen
- But there is a serious drawback : at scale 1 and 600dpi, a color
- page is about 34Mb... Not anybody can afford this easily. At least
- not W9x users. So we have to do banding. Anyway, this is needed for
- printing. This is the only way to guarantee that the file will be
- printed on any printer.
-
- - directly drawing on the screen. This is rather efficient for the display.
-
- We choose among these 2 methods thanks to the resource.in_memory flag.
-*/
-
-void DrawInMemory(HDC hdcDest, HDC hdcFrom, LPRECT lprcPaint)
-{
- unsigned int rop;
- RECT rcGSPaint;
- extern void reset_xfrm_stack(void);
-
- /* If no file open, just return */
- if (!dvi_name || !*dvi_name)
- return;
-
- if (!bMagDisp) {
- mane.base_x = xCurrentScroll;
- mane.base_y = yCurrentScroll;
- mane.min_x = lprcPaint->left;
- mane.min_y = lprcPaint->top;
- mane.max_x = lprcPaint->right;
- mane.max_y = lprcPaint->bottom;
- mane.width = lprcPaint->right - lprcPaint->left;
- mane.height = lprcPaint->bottom - lprcPaint->top;
-
- /*
- We have the page in memory. This page consist of all the pk chars
- and rules/boxes.
-
- As pictures are drawn one onto the other, we need some kind of
- transparent blt. AFAIK, the special rop code used here does the
- trick. But it is slow.
-
- */
-
-#ifdef TRANSFORM
- /* FIXME : there should be a global stack in case
- such transformations would span over several pages. */
- if (resource.use_xform)
- reset_xfrm_stack();
-#endif
-
- /* Erasing background */
- {
- RECT r;
- r.left = mane.min_x;
- r.top = mane.min_y;
- r.right = min(page_w - xCurrentScroll, mane.max_x);
- r.bottom = min(page_h - yCurrentScroll, mane.max_y);
- FillRect(hdcFrom, &r, backBrush);
- }
-
- /* First pass for specials */
- allowDrawingChars = FALSE;
-
- redraw(&mane);
-
-#if PS
- if (resource._postscript && psToDisplay) {
- rop = /* 0x008E1D7C */ SRCCOPY;
-
- /* if gs is active, try to make it paint its picture */
- if (gs_device) {
- rcGSPaint.left = lprcPaint->left+xCurrentScroll;
- rcGSPaint.right = lprcPaint->right+xCurrentScroll;
- rcGSPaint.top = lprcPaint->top+yCurrentScroll;
- rcGSPaint.bottom = lprcPaint->bottom+yCurrentScroll;
-#if 0
- fprintf(stderr, "gs: redrawing\n");
-#endif
- (*pgsdll_draw)(gs_device, hdcFrom, lprcPaint, &rcGSPaint);
- }
- }
- else
-#endif
- rop = SRCCOPY;
-
- allowDrawingChars = TRUE;
-
- redraw(&mane);
- }
-
- /* We have to paint in lprcPaint. */
- if (!BitBlt(hdcDest,
- lprcPaint->left, lprcPaint->top,
- lprcPaint->right - lprcPaint->left,
- lprcPaint->bottom - lprcPaint->top,
- hdcFrom,
- lprcPaint->left+xCurrentScroll,
- lprcPaint->top+yCurrentScroll, SRCCOPY)) {
- Win32Error("Draw Page/BitBlt");
- fprintf(stderr, "BitBlt page failed\nRectangle to be painted : l = %d t = %d r = %d b = %d\n",
- lprcPaint->left, lprcPaint->top,
- lprcPaint->right, lprcPaint->bottom);
- fprintf(stderr, "Rectangle to be updated : l = %d t = %d r = %d b = %d\n",
- lprcPaint->left, lprcPaint->top,
- lprcPaint->right, lprcPaint->bottom);
- fprintf(stderr, "Rectangle for page : l = %d t = %d r = %d b = %d\n",
- 0, 0, page_w - xCurrentScroll, page_h - yCurrentScroll);
- fprintf(stderr, "Page width = %d\nPage height = %d\nScroll %d %d\n",
- page_w, page_h, xCurrentScroll, yCurrentScroll);
- }
-}
-
-
-void DrawOnScreen(HDC hdcDest, HDC hdcFrom, LPRECT lprcPaint)
-{
- extern void reset_xfrm_stack(void);
- /*
- We want to draw directly onto the screen.
- */
-
- mane.base_x = xCurrentScroll;
- mane.base_y = yCurrentScroll;
- mane.min_x = lprcPaint->left;
- mane.min_y = lprcPaint->top;
- mane.max_x = lprcPaint->right;
- mane.max_y = lprcPaint->bottom;
- mane.width = lprcPaint->right - lprcPaint->left;
- mane.height = lprcPaint->bottom - lprcPaint->top;
-
- /* If no file open, just return */
- if (!dvi_name || !*dvi_name)
- return;
-
-#ifdef TRANSFORM
- /* FIXME : there should be a global stack in case
- such transformations would span over several pages. */
- if (resource.use_xform)
- reset_xfrm_stack();
-#endif
-
- /*
- FIXME : remove this and process directly.
- */
-
- /* First pass for specials */
- allowDrawingChars = FALSE;
-
- redraw(&mane);
-
-#if PS
- if (resource._postscript && psToDisplay) {
- /* if gs is active, try to make it paint its picture */
- if (gs_device) {
-#if 0
- fprintf(stderr, "gs: redrawing\n");
- fprintf(stderr, "repaint : %d %d %d %d\n",
- lprcPaint->left, lprcPaint->top,
- lprcPaint->right, lprcPaint->bottom);
-#endif
- (*pgsdll_lock_device)(gs_device, 1);
- (*pgsdll_draw)(gs_device, hdcDest, lprcPaint, lprcPaint);
- (*pgsdll_lock_device)(gs_device, 0);
- }
- }
-
- allowDrawingChars = TRUE;
-
-#if 0
- fprintf(stderr, "repaint : %d %d %d %d ps = %d\n",
- lprcPaint->left, lprcPaint->top,
- lprcPaint->right, lprcPaint->bottom, psToDisplay);
-#endif
- redraw(&mane);
-#endif
-
- if (resource.reverse) {
- PatBlt(hdcDest, lprcPaint->left, lprcPaint->top, lprcPaint->right, lprcPaint->bottom, DSTINVERT);
- }
-
-}
-
-void DoDrawPaint(HDC hdcDest, HDC hdcFrom, LPRECT lprcPaint)
-{
- RECT rcToPaint, rcPage;
-
- rcPage.left = 0;
- rcPage.right = page_w - xCurrentScroll;
- rcPage.top = 0;
- rcPage.bottom = page_h - yCurrentScroll;
-
- IntersectRect(&rcToPaint, lprcPaint, &rcPage);
-
- if (resource.in_memory)
- DrawInMemory(hdcDest, hdcFrom, &rcToPaint);
- else
- DrawOnScreen(hdcDest, hdcFrom, &rcToPaint);
-}
-
-LRESULT MsgDrawPaint(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
-{
- PAINTSTRUCT ps;
-
- /* No redrawing while printing. Should not happen, but who knows ? */
- HDC hDC = BeginPaint(hwnd, &ps);
-
- if (!isPrinting) {
-
- /* FIXME : Is there anyway to optimize this
- wrt to the mag. glass moving ? */
- if (bDrawKeep || bMagDisp) {
- /* Repaint from the memory context */
- BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top,
- (ps.rcPaint.right - ps.rcPaint.left),
- (ps.rcPaint.bottom - ps.rcPaint.top),
- hdcDrawSave, ps.rcPaint.left,ps.rcPaint.top, SRCCOPY);
- }
- else {
- /* New data, so need to do some work */
- RECT rc;
- HWND hWndTop = GetTopWindow(NULL);
-#if 0
- fprintf(stderr, "Redrawing (%d, %d) - (%d x %d)\n",
- ps.rcPaint.left, ps.rcPaint.top,
- ps.rcPaint.right - ps.rcPaint.left,
- ps.rcPaint.bottom - ps.rcPaint.top);
-#endif
- DoDrawPaint(maneDC, maneDrawDC, &(ps.rcPaint));
- /* The screen has been redrawn manually; now update */
- /* the memory context and set fKeep=TRUE. */
- if (hWndTop == hWndMain /* || hWndTop == hWndDraw || hWndTop == hWndMagnify */) {
- GetClientRect(hwnd,&rc);
- BitBlt(hdcDrawSave, 0,0,rc.right,rc.bottom,
- hDC, 0,0,SRCCOPY);
- bDrawKeep = TRUE;
- }
- else {
-#if 0
- fprintf(stderr, "Active window is *not* draw window\n");
-#endif
- }
- }
- }
- EndPaint(hwnd, &ps);
- return 0;
-}
-
-/*
- FUNCTION: InitGlobalsDraw()
- PURPOSE : Initialize all graphic-relative variables needed.
- Can be done only after hWndDraw has been created.
- Must be done before trying to open a dvi file.
-*/
-
-void InitGlobalsDraw()
-{
- extern void initcolor(void);
- extern void init_xfrm_stack(void);
-
- currwin.win = mane.win = hWndDraw;
-
- /* It has its own_dc */
- maneDC = GetDC(hWndDraw);
-
- maneHorzRes = GetDeviceCaps(maneDC, HORZRES);
- maneVertRes = GetDeviceCaps(maneDC, VERTRES);
- maneLogPixelsX = GetDeviceCaps(maneDC, LOGPIXELSX);
- maneLogPixelsY = GetDeviceCaps(maneDC, LOGPIXELSY);
- maneBitsPixel = GetDeviceCaps(maneDC, BITSPIXEL);
- maneSizePalette = GetDeviceCaps(maneDC, SIZEPALETTE);
- maneColorRes = GetDeviceCaps(maneDC, COLORRES);
- maneRasterCaps = GetDeviceCaps(maneDC, RASTERCAPS);
-
-#ifdef GREY
- if (maneBitsPixel >= 8 && use_grey) {
- numColors = 16;
- }
- else {
- numColors = 1;
- }
-#else
- numColors = 1;
-#endif
-
- if (!(maneRasterCaps & RC_BITBLT)) {
- MessageBox(hWndMain,
- "Can't use the BitBlt() function\r\non your display. Exiting...",
- NULL, MB_OK | MB_ICONERROR | MB_APPLMODAL);
- CleanExit(1);
- }
- if (!(maneRasterCaps & RC_STRETCHDIB)) {
- MessageBox(hWndMain,
- "Can't use the StretchDIBits() function\r\non your display. Exiting...",
- NULL, MB_OK | MB_ICONERROR | MB_APPLMODAL);
- CleanExit(1);
- }
- if (!(maneRasterCaps & RC_BITMAP64)) {
- MessageBox(hWndMain,
- "Device does not support >64k bitmaps. Exiting...",
- NULL, MB_OK | MB_ICONERROR | MB_APPLMODAL);
- CleanExit(1);
- }
-#if 0
- fprintf(stderr, "Caps = %x\n", maneRasterCaps);
- fprintf(stderr, "Hres = %d, Yres = %d, lpx = %d, lpy = %d\n",
- maneHorzRes, maneVertRes, maneLogPixelsX, maneLogPixelsY);
- fprintf(stderr, "bits/pix = %d, size palette = %d, colorres = %d\n",
- maneBitsPixel, maneSizePalette, maneColorRes);
-#endif
-
-#if 0
- /* Device context for drawing and the associated bitmap. */
- if ((imageDC = CreateCompatibleDC(maneDC)) == NULL)
- Win32Error("CreateCompatibleDC imageDC");
-#endif
-
- if (resource.in_memory) {
- maneDrawMemDC = CreateCompatibleDC(maneDC);
- if (maneDrawMemDC == NULL)
- Win32Error("CreateCompatibleDC maneDrawMemDC");
-
- foreGC = ruleGC = highGC = maneDrawDC = maneDrawMemDC;
-
- grid1GC = grid2GC = grid3GC = maneDrawDC;
- foreGC2 = NULL; /* not used under Win32 */
- }
- else {
- foreGC = ruleGC = highGC = maneDrawDC = GetDC(hWndDraw);
- grid1GC = grid2GC = grid3GC = foreGC;
- magMemDC = foreGC2 = NULL; /* not used under Win32 */
- }
-
-#ifdef TRANSFORM
- if (IS_NT)
- SetGraphicsMode(maneDrawDC, GM_ADVANCED);
-
- if (resource.use_xform) {
- if (IS_WIN95) {
- fprintf(stderr, "The xform feature is not available under Win95.\n");
- fprintf(stderr, "Use the View -> Options dialog box to configure\n");
- fprintf(stderr, "or run `windvi +xform' to reset the option.\n");
- }
- else {
- init_xfrm_stack();
- }
- }
-#endif
-
- SetStretchBltMode(foreGC, COLORONCOLOR);
- SetStretchBltMode(maneDC, COLORONCOLOR);
-
- initcolor();
-
-
- /* This little image is not used anymore. We are doing
- everything straight in bitmaps */
- image = XCreateImage(DISP, maneDrawDC, numColors, XYBitmap, 0,
- (char *)NULL, 0, 0, BMBITS, 0);
-
-
- bmi1.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi1.bmiHeader.biPlanes = 1;
- bmi1.bmiHeader.biBitCount = 1;
- bmi1.bmiHeader.biCompression = BI_RGB;
- bmi1.bmiHeader.biXPelsPerMeter = 0;
- bmi1.bmiHeader.biYPelsPerMeter = 0;
- bmi1.bmiHeader.biClrUsed = 0;
- bmi1.bmiHeader.biClrImportant = 0;
-
- bmi4.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi4.bmiHeader.biPlanes = 1;
- bmi4.bmiHeader.biBitCount = 4;
- bmi4.bmiHeader.biCompression = BI_RGB;
- bmi4.bmiHeader.biXPelsPerMeter = 0;
- bmi4.bmiHeader.biYPelsPerMeter = 0;
- bmi4.bmiHeader.biClrUsed = 0;
- bmi4.bmiHeader.biClrImportant = 0;
-
- bmi8.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi8.bmiHeader.biPlanes = 1;
- bmi8.bmiHeader.biBitCount = 8;
- bmi8.bmiHeader.biCompression = BI_RGB;
- bmi8.bmiHeader.biXPelsPerMeter = 0;
- bmi8.bmiHeader.biYPelsPerMeter = 0;
- bmi8.bmiHeader.biClrUsed = 0;
- bmi8.bmiHeader.biClrImportant = 0;
-
- bmi24.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi24.bmiHeader.biPlanes = 1;
- bmi24.bmiHeader.biBitCount = 24;
- bmi24.bmiHeader.biCompression = BI_RGB;
- bmi24.bmiHeader.biXPelsPerMeter = 0;
- bmi24.bmiHeader.biYPelsPerMeter = 0;
- bmi24.bmiHeader.biClrUsed = 0;
- bmi24.bmiHeader.biClrImportant = 0;
-
-
- /*
- Setting geometry
- */
- /* Where to create the window ?
- Thanks to suggestions by Stanley A. Sawyer <sawyer@math.wustl.edu>
- this code has been improved.
- -------------------------------------------------------------------------
- The main window will be loaded at (xval,yval) (the upper-left (UL)
- corner of the window) with widths (xsize,ysize).
- The physical screen size is stored in global variables (maxx,maxy).
- The code below first checks if there is an instance of a program of
- type ``window class=vshowclass'' already running. If so, the new window
- is cascaded off the old by v4size pixels at the UL corner.
- ``FindWindow()'' seems to find the last-run instance, so that the
- result can be a nice cascade of windows.
- If there are no pre-existing instances, the code then checks for a
- Taskbar on either the left-hand-side or the top of the screen. If the
- Taskbar is in either position, (xval,yval) is set to avoid overlaying
- them. If not, the default xval=yval=10 is used.
- The code can be improved by checking the Taskbar position if the
- previous instance window is too far from the UL corner of the screen,
- but the following should work fine in most cases.
- -------------------------------------------------------------------------
- */
- /*
- FIXME : should we implement several policies
- - user might want to open the new window exactly
- on top of the previous one,
- - or cascade windows,
- - or ...
- */
- {
- int off_x, off_y, width, height;
- int v4size = 25; /* cascading by this number of pixels */
- RECT rectDesktop, r;
- extern BOOL bPrevInstance;
- extern RECT rectWndPrev;
- APPBARDATA abd = { sizeof(APPBARDATA), NULL };
- int abd_width = 0, abd_height = 0;
-
- GetWindowRect(hWndMain, &r);
- off_x = r.left;
- off_y = r.top;
- width = r.right - r.left;
- height = r.bottom - r.top;
-
- /* Get APPBAR information */
- abd.cbSize = sizeof(APPBARDATA);
- if (SHAppBarMessage(ABM_GETTASKBARPOS, &abd)) {
- /* The Taskbar is at positions */
- /* abd.rc.left, abd.rc.right, abd.rc.top, abd.rc.bottom */
- /* The variable at the long screen boundary is negative, */
- /* which locates the Taskbar. */
-#if 0
- fprintf(stderr, "Appbar : (%d %d) -- (%d %d)\n",
- abd.rc.left, abd.rc.top,
- abd.rc.right, abd.rc.bottom);
-#endif
- if (abd.rc.left<0 && abd.rc.right < maneHorzRes/2) {
- abd_width = abd.rc.right;
- }
- else if (abd.rc.top<0 && abd.rc.bottom < maneVertRes/2) {
- abd_height = abd.rc.bottom;
- }
- }
-
- if (bPrevInstance && !resource.single_flag) {
- /* if there is a previous instance, rely on it. */
- off_x = (rectWndPrev.left> maneHorzRes / 3)
- ? 10 + v4size
- : rectWndPrev.left+v4size;
- off_y = (rectWndPrev.top > maneVertRes / 3)
- ? 10 + v4size
- : rectWndPrev.top+v4size;
- width = rectWndPrev.right - rectWndPrev.left;
- height = rectWndPrev.bottom - rectWndPrev.top;
-#if 0
- fprintf(stderr, "Prev inst : @(%d,%d) (%d x %d)\n",
- off_x, off_y, width, height);
-#endif
- }
-
- else if (geometry) {
- RECT r;
- int flag = XParseGeometry(geometry, &off_x, &off_y,
- &width, &height);
-#ifndef WIN32
- if (flag & (XValue | YValue))
- size_hints.flags |= USPosition;
- if (flag & (WidthValue | HeightValue))
- size_hints.flags |= USSize;
-#endif
- if (flag & XNegative) off_x += maneHorzRes - width;
- if (flag & YNegative) off_y += maneVertRes - height;
- }
- else {
- /*
- if no geometry has been given, make the main window big enough.
- */
- width = (int)(maneVertRes - abd_height * 0.618);
- height = maneVertRes - abd_height;
-#if 0
- fprintf(stderr, "Nothing : @(%d,%d) (%d x %d)\n",
- off_x, off_y, width, height);
-#endif
- }
- if (!(MoveWindow(hWndMain,
- off_x, off_y,
- width, height,
- TRUE)))
- Win32Error("no Geometry/MoveWindow");
- }
-
-}