Mercurial > emacs
view src/w32xfns.c @ 20516:d33438261904
Some comment, doc and bug fixes.
(ps-print-version): New version number (3.05.3) and doc fix.
(ps-output-string-prim, ps-begin-job, ps-control-character)
(ps-plot-region): Bug fix.
(ps-print-control-characters): New custom var.
(ps-string-escape-codes, ps-string-control-codes): New var.
(ps-color-device, ps-font-lock-face-attributes, ps-eval-switch)
(ps-flatten-list, ps-flatten-list-1): New fn.
(ps-setup): Update current setup.
(ps-begin-file): Adjust PostScript header file.
(ps-plot, ps-face-attribute-list): Little programming improvement.
(ps-print-prologue-1): Replace NumberOfZebra by ZebraHeight.
(ps-print-without-faces, ps-print-with-faces): Little reprogramming.
(ps-plot-with-face): Get color only on color screen device.
(ps-build-reference-face-lists): Handle obsolete
font-lock-face-attributes.
(ps-print-ensure-fontified): Little programming setting.
(ps-generate-postscript-with-faces): Adjust initializations, get color
only on color screen device.
(ps-generate): Replace (if A B) by (and A B).
(ps-do-despool): Dynamic evaluation for ps-lpr-switches,
Replace (if A B) by (and A B).
(color-instance-rgb-components, ps-color-values): Replace
pixel-components by color-instance-rgb-components.
(ps-xemacs-face-kind-p): Replace face-font by face-font-instance,
replace x-font-properties by font-instance-properties.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Thu, 25 Dec 1997 18:33:52 +0000 |
parents | 639881f2750d |
children | ae5e3b23c7e2 |
line wrap: on
line source
/* Functions taken directly from X sources for use with the Microsoft W32 API. Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation. This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <signal.h> #include <config.h> #include <stdio.h> #include "lisp.h" #include "frame.h" #include "blockinput.h" #include "w32term.h" #include "windowsx.h" #define myalloc(cb) GlobalAllocPtr (GPTR, cb) #define myfree(lp) GlobalFreePtr (lp) CRITICAL_SECTION critsect; extern HANDLE keyboard_handle; HANDLE input_available = NULL; void init_crit () { InitializeCriticalSection (&critsect); /* For safety, input_available should only be reset by get_next_msg when the input queue is empty, so make it a manual reset event. */ keyboard_handle = input_available = CreateEvent (NULL, TRUE, FALSE, NULL); } void delete_crit () { DeleteCriticalSection (&critsect); if (input_available) { CloseHandle (input_available); input_available = NULL; } } void select_palette (FRAME_PTR f, HDC hdc) { if (!NILP (Vw32_enable_palette)) f->output_data.w32->old_palette = SelectPalette (hdc, one_w32_display_info.palette, FALSE); else f->output_data.w32->old_palette = NULL; if (RealizePalette (hdc)) { Lisp_Object frame, framelist; FOR_EACH_FRAME (framelist, frame) { SET_FRAME_GARBAGED (XFRAME (frame)); } } } void deselect_palette (FRAME_PTR f, HDC hdc) { if (f->output_data.w32->old_palette) SelectPalette (hdc, f->output_data.w32->old_palette, FALSE); } /* Get a DC for frame and select palette for drawing; force an update of all frames if palette's mapping changes. */ HDC get_frame_dc (FRAME_PTR f) { HDC hdc; enter_crit (); hdc = GetDC (f->output_data.w32->window_desc); select_palette (f, hdc); return hdc; } int release_frame_dc (FRAME_PTR f, HDC hdc) { int ret; deselect_palette (f, hdc); ret = ReleaseDC (f->output_data.w32->window_desc, hdc); leave_crit (); return ret; } typedef struct int_msg { W32Msg w32msg; struct int_msg *lpNext; } int_msg; int_msg *lpHead = NULL; int_msg *lpTail = NULL; int nQueue = 0; BOOL get_next_msg (lpmsg, bWait) W32Msg * lpmsg; BOOL bWait; { BOOL bRet = FALSE; enter_crit (); /* The while loop takes care of multiple sets */ while (!nQueue && bWait) { leave_crit (); WaitForSingleObject (input_available, INFINITE); enter_crit (); } if (nQueue) { bcopy (&(lpHead->w32msg), lpmsg, sizeof (W32Msg)); { int_msg * lpCur = lpHead; lpHead = lpHead->lpNext; myfree (lpCur); } nQueue--; bRet = TRUE; } if (nQueue == 0) ResetEvent (input_available); leave_crit (); return (bRet); } BOOL post_msg (lpmsg) W32Msg * lpmsg; { int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg)); if (!lpNew) return (FALSE); bcopy (lpmsg, &(lpNew->w32msg), sizeof (W32Msg)); lpNew->lpNext = NULL; enter_crit (); if (nQueue++) { lpTail->lpNext = lpNew; } else { lpHead = lpNew; } lpTail = lpNew; SetEvent (input_available); leave_crit (); return (TRUE); } BOOL prepend_msg (W32Msg *lpmsg) { int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg)); if (!lpNew) return (FALSE); bcopy (lpmsg, &(lpNew->w32msg), sizeof (W32Msg)); enter_crit (); nQueue++; lpNew->lpNext = lpHead; lpHead = lpNew; leave_crit (); return (TRUE); } /* * XParseGeometry parses strings of the form * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where * width, height, xoffset, and yoffset are unsigned integers. * Example: "=80x24+300-49" * The equal sign is optional. * It returns a bitmask that indicates which of the four values * were actually found in the string. For each value found, * the corresponding argument is updated; for each value * not found, the corresponding argument is left unchanged. */ static int read_integer (string, NextString) register char *string; char **NextString; { register int Result = 0; int Sign = 1; if (*string == '+') string++; else if (*string == '-') { string++; Sign = -1; } for (; (*string >= '0') && (*string <= '9'); string++) { Result = (Result * 10) + (*string - '0'); } *NextString = string; if (Sign >= 0) return (Result); else return (-Result); } int XParseGeometry (string, x, y, width, height) char *string; int *x, *y; unsigned int *width, *height; /* RETURN */ { int mask = NoValue; register char *strind; unsigned int tempWidth, tempHeight; int tempX, tempY; char *nextCharacter; if ((string == NULL) || (*string == '\0')) return (mask); if (*string == '=') string++; /* ignore possible '=' at beg of geometry spec */ strind = (char *)string; if (*strind != '+' && *strind != '-' && *strind != 'x') { tempWidth = read_integer (strind, &nextCharacter); if (strind == nextCharacter) return (0); strind = nextCharacter; mask |= WidthValue; } if (*strind == 'x' || *strind == 'X') { strind++; tempHeight = read_integer (strind, &nextCharacter); if (strind == nextCharacter) return (0); strind = nextCharacter; mask |= HeightValue; } if ((*strind == '+') || (*strind == '-')) { if (*strind == '-') { strind++; tempX = -read_integer (strind, &nextCharacter); if (strind == nextCharacter) return (0); strind = nextCharacter; mask |= XNegative; } else { strind++; tempX = read_integer (strind, &nextCharacter); if (strind == nextCharacter) return (0); strind = nextCharacter; } mask |= XValue; if ((*strind == '+') || (*strind == '-')) { if (*strind == '-') { strind++; tempY = -read_integer (strind, &nextCharacter); if (strind == nextCharacter) return (0); strind = nextCharacter; mask |= YNegative; } else { strind++; tempY = read_integer (strind, &nextCharacter); if (strind == nextCharacter) return (0); strind = nextCharacter; } mask |= YValue; } } /* If strind isn't at the end of the string the it's an invalid geometry specification. */ if (*strind != '\0') return (0); if (mask & XValue) *x = tempX; if (mask & YValue) *y = tempY; if (mask & WidthValue) *width = tempWidth; if (mask & HeightValue) *height = tempHeight; return (mask); } /* x_sync is a no-op on W32. */ void x_sync (f) void *f; { }