backout 1996-01-21T00:22:24Z!voelker@cs.washington.edu
This commit is contained in:
parent
dd118a073d
commit
3c190163d2
3 changed files with 220 additions and 575 deletions
741
src/w32fns.c
741
src/w32fns.c
|
@ -45,13 +45,6 @@ extern struct scroll_bar *x_window_to_scroll_bar ();
|
|||
/* The colormap for converting color names to RGB values */
|
||||
Lisp_Object Vwin32_color_map;
|
||||
|
||||
/* Switch to control whether we inhibit requests for italicised fonts (which
|
||||
are synthesized, look ugly, and are trashed by cursor movement under NT). */
|
||||
Lisp_Object Vwin32_enable_italics;
|
||||
|
||||
/* Enable palette management. */
|
||||
Lisp_Object Vwin32_enable_palette;
|
||||
|
||||
/* The name we're using in resource queries. */
|
||||
Lisp_Object Vx_resource_name;
|
||||
|
||||
|
@ -618,7 +611,7 @@ x_set_frame_parameters (f, alist)
|
|||
if (NATNUMP (param_index)
|
||||
&& (XFASTINT (param_index)
|
||||
< sizeof (x_frame_parms)/sizeof (x_frame_parms[0])))
|
||||
(*x_frame_parms[XINT (param_index)].setter) (f, val, old_value);
|
||||
(*x_frame_parms[XINT (param_index)].setter)(f, val, old_value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -762,16 +755,18 @@ x_real_positions (f, xptr, yptr)
|
|||
int *xptr, *yptr;
|
||||
{
|
||||
POINT pt;
|
||||
RECT rect;
|
||||
|
||||
GetClientRect (FRAME_WIN32_WINDOW (f), &rect);
|
||||
AdjustWindowRect (&rect, f->output_data.win32->dwStyle,
|
||||
FRAME_EXTERNAL_MENU_BAR (f));
|
||||
|
||||
pt.x = rect.left;
|
||||
pt.y = rect.top;
|
||||
|
||||
ClientToScreen (FRAME_WIN32_WINDOW (f), &pt);
|
||||
{
|
||||
RECT rect;
|
||||
|
||||
GetClientRect(FRAME_WIN32_WINDOW(f), &rect);
|
||||
AdjustWindowRect(&rect, f->output_data.win32->dwStyle, FRAME_EXTERNAL_MENU_BAR(f));
|
||||
|
||||
pt.x = rect.left;
|
||||
pt.y = rect.top;
|
||||
}
|
||||
|
||||
ClientToScreen (FRAME_WIN32_WINDOW(f), &pt);
|
||||
|
||||
*xptr = pt.x;
|
||||
*yptr = pt.y;
|
||||
|
@ -821,91 +816,25 @@ x_report_frame_params (f, alistptr)
|
|||
}
|
||||
|
||||
|
||||
DEFUN ("win32-define-rgb-color", Fwin32_define_rgb_color, Swin32_define_rgb_color, 4, 4, 0,
|
||||
"Convert RGB numbers to a windows color reference and associate with\n\
|
||||
NAME (a string). This adds or updates a named color to win32-color-map,\n\
|
||||
making it available for use. The original entry's RGB ref is returned,\n\
|
||||
or nil if the entry is new.")
|
||||
(red, green, blue, name)
|
||||
Lisp_Object red, green, blue, name;
|
||||
#if 0
|
||||
DEFUN ("win32-rgb", Fwin32_rgb, Swin32_rgb, 3, 3, 0,
|
||||
"Convert RGB numbers to a windows color reference.")
|
||||
(red, green, blue)
|
||||
Lisp_Object red, green, blue;
|
||||
{
|
||||
Lisp_Object rgb;
|
||||
Lisp_Object oldrgb = Qnil;
|
||||
Lisp_Object entry;
|
||||
|
||||
CHECK_NUMBER (red, 0);
|
||||
CHECK_NUMBER (green, 0);
|
||||
CHECK_NUMBER (blue, 0);
|
||||
CHECK_STRING (name, 0);
|
||||
|
||||
XSET (rgb, Lisp_Int, RGB (XUINT (red), XUINT (green), XUINT (blue)));
|
||||
XSET (rgb, Lisp_Int, RGB(XUINT(red), XUINT(green), XUINT(blue)));
|
||||
|
||||
BLOCK_INPUT;
|
||||
|
||||
/* replace existing entry in win32-color-map or add new entry. */
|
||||
entry = Fassoc (name, Vwin32_color_map);
|
||||
if (NILP (entry))
|
||||
{
|
||||
entry = Fcons (name, rgb);
|
||||
Vwin32_color_map = Fcons (entry, Vwin32_color_map);
|
||||
}
|
||||
else
|
||||
{
|
||||
oldrgb = Fcdr (entry);
|
||||
Fsetcdr (entry, rgb);
|
||||
}
|
||||
|
||||
UNBLOCK_INPUT;
|
||||
|
||||
return (oldrgb);
|
||||
return (rgb);
|
||||
}
|
||||
|
||||
DEFUN ("win32-load-color-file", Fwin32_load_color_file, Swin32_load_color_file, 1, 1, 0,
|
||||
"Create an alist of color entries from an external file (ie. rgb.txt).\n\
|
||||
Assign this value to win32-color-map to replace the existing color map.\n\
|
||||
The file should define one named RGB color per line like so:\
|
||||
R G B name\n\
|
||||
where R,G,B are numbers between 0 and 255 and name is an arbitrary string.")
|
||||
(filename)
|
||||
Lisp_Object filename;
|
||||
{
|
||||
FILE *fp;
|
||||
Lisp_Object cmap = Qnil;
|
||||
Lisp_Object abspath;
|
||||
|
||||
CHECK_STRING (filename, 0);
|
||||
abspath = Fexpand_file_name (filename, Qnil);
|
||||
|
||||
fp = fopen (XSTRING (filename)->data, "rt");
|
||||
if (fp)
|
||||
{
|
||||
char buf[512];
|
||||
int red, green, blue;
|
||||
int num;
|
||||
|
||||
BLOCK_INPUT;
|
||||
|
||||
while (fgets (buf, sizeof (buf), fp) != NULL)
|
||||
{
|
||||
if (sscanf (buf, "%u %u %u %n]", &red, &green, &blue, &num) == 3)
|
||||
{
|
||||
char *name = buf + num;
|
||||
num = strlen (name) - 1;
|
||||
if (name[num] == '\n')
|
||||
name[num] = 0;
|
||||
cmap = Fcons (Fcons (build_string (name),
|
||||
make_number (RGB (red, green, blue))),
|
||||
cmap);
|
||||
}
|
||||
}
|
||||
fclose (fp);
|
||||
|
||||
UNBLOCK_INPUT;
|
||||
}
|
||||
|
||||
return cmap;
|
||||
}
|
||||
|
||||
#else
|
||||
/* The default colors for the win32 color map */
|
||||
typedef struct colormap_t
|
||||
{
|
||||
|
@ -1179,6 +1108,7 @@ DEFUN ("win32-default-color-map", Fwin32_default_color_map, Swin32_default_color
|
|||
|
||||
return (cmap);
|
||||
}
|
||||
#endif
|
||||
|
||||
Lisp_Object
|
||||
win32_to_x_color (rgb)
|
||||
|
@ -1231,121 +1161,6 @@ x_to_win32_color (colorname)
|
|||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
win32_regenerate_palette (FRAME_PTR f)
|
||||
{
|
||||
struct win32_palette_entry * pList;
|
||||
LOGPALETTE * p_palette;
|
||||
HPALETTE h_new_palette;
|
||||
int i;
|
||||
|
||||
/* don't bother trying to create palette if not supported */
|
||||
if (! FRAME_WIN32_DISPLAY_INFO (f)->has_palette)
|
||||
return;
|
||||
|
||||
p_palette = (LOGPALETTE *)
|
||||
xmalloc (sizeof (LOGPALETTE) +
|
||||
FRAME_WIN32_DISPLAY_INFO (f)->n_colors_in_use * sizeof (PALETTEENTRY));
|
||||
p_palette->palVersion = 0x300;
|
||||
p_palette->palNumEntries = FRAME_WIN32_DISPLAY_INFO (f)->n_colors_in_use;
|
||||
|
||||
pList = FRAME_WIN32_DISPLAY_INFO (f)->p_colors_in_use;
|
||||
for (i = 0; i < FRAME_WIN32_DISPLAY_INFO (f)->n_colors_in_use;
|
||||
i++, pList = pList->next)
|
||||
p_palette->palPalEntry[i] = pList->entry;
|
||||
|
||||
h_new_palette = CreatePalette ((LPLOGPALETTE) p_palette);
|
||||
|
||||
enter_crit (CRIT_GDI);
|
||||
|
||||
if (FRAME_WIN32_DISPLAY_INFO (f)->h_palette)
|
||||
DeleteObject (FRAME_WIN32_DISPLAY_INFO (f)->h_palette);
|
||||
FRAME_WIN32_DISPLAY_INFO (f)->h_palette = h_new_palette;
|
||||
|
||||
/* Realize display palette and garbage all frames. */
|
||||
ReleaseFrameDC (f, GetFrameDC (f));
|
||||
|
||||
leave_crit (CRIT_GDI);
|
||||
|
||||
xfree (p_palette);
|
||||
}
|
||||
|
||||
#define WIN32_COLOR(pe) RGB (pe.peRed, pe.peGreen, pe.peBlue)
|
||||
#define SET_WIN32_COLOR(pe, color) \
|
||||
do { \
|
||||
pe.peRed = GetRValue (color); \
|
||||
pe.peGreen = GetGValue (color); \
|
||||
pe.peBlue = GetBValue (color); \
|
||||
pe.peFlags = 0; \
|
||||
} while (0)
|
||||
|
||||
#if 0
|
||||
/* Keep these around in case we ever want to track color usage. */
|
||||
void
|
||||
win32_map_color (FRAME_PTR f, COLORREF color)
|
||||
{
|
||||
struct win32_palette_entry * pList = FRAME_WIN32_DISPLAY_INFO (f)->p_colors_in_use;
|
||||
|
||||
if (NILP (Vwin32_enable_palette))
|
||||
return;
|
||||
|
||||
/* check if color is already mapped */
|
||||
while (pList)
|
||||
{
|
||||
if (WIN32_COLOR (pList->entry) == color)
|
||||
{
|
||||
++pList->refcount;
|
||||
return;
|
||||
}
|
||||
pList = pList->next;
|
||||
}
|
||||
|
||||
/* not already mapped, so add to list and recreate Windows palette */
|
||||
pList = (struct win32_palette_entry *) xmalloc (sizeof (struct win32_palette_entry));
|
||||
SET_WIN32_COLOR (pList->entry, color);
|
||||
pList->refcount = 1;
|
||||
pList->next = FRAME_WIN32_DISPLAY_INFO (f)->p_colors_in_use;
|
||||
FRAME_WIN32_DISPLAY_INFO (f)->p_colors_in_use = pList;
|
||||
FRAME_WIN32_DISPLAY_INFO (f)->n_colors_in_use++;
|
||||
|
||||
/* set flag that palette must be regenerated */
|
||||
FRAME_WIN32_DISPLAY_INFO (f)->regen_palette = TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
win32_unmap_color (FRAME_PTR f, COLORREF color)
|
||||
{
|
||||
struct win32_palette_entry * pList = FRAME_WIN32_DISPLAY_INFO (f)->p_colors_in_use;
|
||||
struct win32_palette_entry **ppPrev = &FRAME_WIN32_DISPLAY_INFO (f)->p_colors_in_use;
|
||||
|
||||
if (NILP (Vwin32_enable_palette))
|
||||
return;
|
||||
|
||||
/* check if color is already mapped */
|
||||
while (pList)
|
||||
{
|
||||
if (WIN32_COLOR (pList->entry) == color)
|
||||
{
|
||||
if (--pList->refcount == 0)
|
||||
{
|
||||
*ppPrev = pList->next;
|
||||
xfree (pList);
|
||||
FRAME_WIN32_DISPLAY_INFO (f)->n_colors_in_use--;
|
||||
break;
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
ppPrev = &pList->next;
|
||||
pList = pList->next;
|
||||
}
|
||||
|
||||
/* set flag that palette must be regenerated */
|
||||
FRAME_WIN32_DISPLAY_INFO (f)->regen_palette = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Decide if color named COLOR is valid for the display associated with
|
||||
the selected frame; if so, return the rgb values in COLOR_DEF.
|
||||
If ALLOC is nonzero, allocate a new colormap cell. */
|
||||
|
@ -1358,49 +1173,18 @@ defined_color (f, color, color_def, alloc)
|
|||
int alloc;
|
||||
{
|
||||
register Lisp_Object tem;
|
||||
|
||||
|
||||
tem = x_to_win32_color (color);
|
||||
|
||||
|
||||
if (!NILP (tem))
|
||||
{
|
||||
if (!NILP (Vwin32_enable_palette))
|
||||
{
|
||||
struct win32_palette_entry * pEntry =
|
||||
FRAME_WIN32_DISPLAY_INFO (f)->p_colors_in_use;
|
||||
struct win32_palette_entry ** ppLast =
|
||||
&FRAME_WIN32_DISPLAY_INFO (f)->p_colors_in_use;
|
||||
|
||||
/* check if color is already mapped */
|
||||
while (pEntry)
|
||||
{
|
||||
if (WIN32_COLOR (pEntry->entry) == XUINT(tem))
|
||||
break;
|
||||
ppLast = &pEntry->next;
|
||||
pEntry = pEntry->next;
|
||||
}
|
||||
|
||||
if (pEntry == NULL && alloc)
|
||||
{
|
||||
/* not already mapped, so add to list */
|
||||
pEntry = (struct win32_palette_entry *)
|
||||
xmalloc (sizeof (struct win32_palette_entry));
|
||||
SET_WIN32_COLOR (pEntry->entry, XUINT(tem));
|
||||
pEntry->next = NULL;
|
||||
*ppLast = pEntry;
|
||||
FRAME_WIN32_DISPLAY_INFO (f)->n_colors_in_use++;
|
||||
|
||||
/* set flag that palette must be regenerated */
|
||||
FRAME_WIN32_DISPLAY_INFO (f)->regen_palette = TRUE;
|
||||
}
|
||||
}
|
||||
/* whether or not frame can display arbitrary RGB colors, force
|
||||
COLORREF value to snap to nearest color in system palette by
|
||||
simulating the PALETTE_RGB macro. */
|
||||
*color_def = XUINT (tem) | 0x2000000;
|
||||
*color_def = XUINT (tem);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Given a string ARG naming a color, compute a pixel value from it
|
||||
|
@ -2539,7 +2323,7 @@ win32_init_class (hinst)
|
|||
{
|
||||
WNDCLASS wc;
|
||||
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
|
||||
wc.lpfnWndProc = (WNDPROC) win32_wnd_proc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = WND_EXTRA_BYTES;
|
||||
|
@ -2643,6 +2427,26 @@ win_msg_worker (dw)
|
|||
return (0);
|
||||
}
|
||||
|
||||
HDC
|
||||
map_mode (hdc)
|
||||
HDC hdc;
|
||||
{
|
||||
if (hdc)
|
||||
{
|
||||
#if 0
|
||||
/* Make mapping mode be in 1/20 of point */
|
||||
|
||||
SetMapMode (hdc, MM_ANISOTROPIC);
|
||||
SetWindowExtEx (hdc, 1440, 1440, NULL);
|
||||
SetViewportExtEx (hdc,
|
||||
GetDeviceCaps (hdc, LOGPIXELSX),
|
||||
GetDeviceCaps (hdc, LOGPIXELSY),
|
||||
NULL);
|
||||
#endif
|
||||
}
|
||||
return (hdc);
|
||||
}
|
||||
|
||||
/* Convert between the modifier bits Win32 uses and the modifier bits
|
||||
Emacs uses. */
|
||||
unsigned int
|
||||
|
@ -2689,33 +2493,50 @@ win32_wnd_proc (hwnd, msg, wParam, lParam)
|
|||
switch (msg)
|
||||
{
|
||||
case WM_ERASEBKGND:
|
||||
enter_crit (CRIT_GDI);
|
||||
GetUpdateRect (hwnd, &wmsg.rect, FALSE);
|
||||
leave_crit (CRIT_GDI);
|
||||
my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
|
||||
return 1;
|
||||
case WM_PALETTECHANGED:
|
||||
/* ignore our own changes */
|
||||
if ((HWND)wParam != hwnd)
|
||||
{
|
||||
/* simply notify main thread it may need to update frames */
|
||||
my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
|
||||
HBRUSH hb;
|
||||
HANDLE oldobj;
|
||||
RECT rect;
|
||||
|
||||
GetClientRect (hwnd, &rect);
|
||||
|
||||
hb = CreateSolidBrush (GetWindowLong (hwnd, WND_BACKGROUND_INDEX));
|
||||
|
||||
oldobj = SelectObject ((HDC)wParam, hb);
|
||||
|
||||
FillRect((HDC)wParam, &rect, hb);
|
||||
|
||||
SelectObject((HDC)wParam, oldobj);
|
||||
|
||||
DeleteObject (hb);
|
||||
|
||||
return (0);
|
||||
}
|
||||
return 0;
|
||||
case WM_PAINT:
|
||||
{
|
||||
PAINTSTRUCT paintStruct;
|
||||
|
||||
enter_crit (CRIT_GDI);
|
||||
|
||||
BeginPaint (hwnd, &paintStruct);
|
||||
wmsg.rect = paintStruct.rcPaint;
|
||||
EndPaint (hwnd, &paintStruct);
|
||||
leave_crit (CRIT_GDI);
|
||||
|
||||
|
||||
my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
case WM_CREATE:
|
||||
{
|
||||
HDC hdc = my_get_dc (hwnd);
|
||||
|
||||
/* Make mapping mode be in 1/20 of point */
|
||||
|
||||
map_mode (hdc);
|
||||
|
||||
ReleaseDC (hwnd, hdc);
|
||||
}
|
||||
|
||||
return (0);
|
||||
case WM_KEYDOWN:
|
||||
case WM_SYSKEYDOWN:
|
||||
#if 0
|
||||
|
@ -2740,7 +2561,7 @@ win32_wnd_proc (hwnd, msg, wParam, lParam)
|
|||
|| wParam == VK_SHIFT
|
||||
|| wParam == VK_CONTROL
|
||||
|| wParam == VK_CAPITAL)
|
||||
goto dflt;
|
||||
break;
|
||||
|
||||
/* Anything we do not have a name for needs to be translated or
|
||||
returned as ascii keystroke. */
|
||||
|
@ -2803,8 +2624,7 @@ win32_wnd_proc (hwnd, msg, wParam, lParam)
|
|||
{
|
||||
WINDOWPLACEMENT wp;
|
||||
LPWINDOWPOS lppos = (WINDOWPOS *) lParam;
|
||||
|
||||
wp.length = sizeof (wp);
|
||||
|
||||
GetWindowPlacement (hwnd, &wp);
|
||||
|
||||
if (wp.showCmd != SW_SHOWMINIMIZED && ! (lppos->flags & SWP_NOSIZE))
|
||||
|
@ -2818,12 +2638,12 @@ win32_wnd_proc (hwnd, msg, wParam, lParam)
|
|||
|
||||
GetWindowRect (hwnd, &wr);
|
||||
|
||||
enter_crit (CRIT_MSG);
|
||||
enter_crit ();
|
||||
|
||||
dwXUnits = GetWindowLong (hwnd, WND_X_UNITS_INDEX);
|
||||
dwYUnits = GetWindowLong (hwnd, WND_Y_UNITS_INDEX);
|
||||
|
||||
leave_crit (CRIT_MSG);
|
||||
leave_crit ();
|
||||
|
||||
memset (&rect, 0, sizeof (rect));
|
||||
AdjustWindowRect (&rect, GetWindowLong (hwnd, GWL_STYLE),
|
||||
|
@ -3109,7 +2929,7 @@ This function is an internal primitive--use `make-frame' instead.")
|
|||
font = x_new_font (f, "-*-system-medium-r-normal-*-*-200-*-*-c-120-*-*");
|
||||
#endif
|
||||
if (! STRINGP (font))
|
||||
font = x_new_font (f, "-*-Fixedsys-*-r-*-*-12-90-*-*-c-*-*-*");
|
||||
font = x_new_font (f, "-*-terminal-medium-r-normal-*-*-180-*-*-c-120-*-*");
|
||||
UNBLOCK_INPUT;
|
||||
if (! STRINGP (font))
|
||||
font = build_string ("-*-system");
|
||||
|
@ -3297,50 +3117,54 @@ DEFUN ("unfocus-frame", Funfocus_frame, Sunfocus_frame, 0, 0, 0,
|
|||
return Qnil;
|
||||
}
|
||||
|
||||
XFontStruct *
|
||||
win32_load_font (dpyinfo,name)
|
||||
struct win32_display_info *dpyinfo;
|
||||
char *name;
|
||||
XFontStruct
|
||||
*win32_load_font (dpyinfo,name)
|
||||
struct win32_display_info *dpyinfo;
|
||||
char * name;
|
||||
{
|
||||
XFontStruct * font = NULL;
|
||||
BOOL ok;
|
||||
LOGFONT lf;
|
||||
|
||||
if (!name || !x_to_win32_font (name, &lf))
|
||||
return (NULL);
|
||||
|
||||
font = (XFontStruct *) xmalloc (sizeof (XFontStruct));
|
||||
if (!font) return (NULL);
|
||||
|
||||
BLOCK_INPUT;
|
||||
|
||||
font->hfont = CreateFontIndirect (&lf);
|
||||
|
||||
if (font->hfont == NULL)
|
||||
{
|
||||
ok = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
HDC hdc;
|
||||
HANDLE oldobj;
|
||||
|
||||
hdc = GetDC (dpyinfo->root_window);
|
||||
|
||||
oldobj = SelectObject (hdc, font->hfont);
|
||||
|
||||
ok = GetTextMetrics (hdc, &font->tm);
|
||||
|
||||
SelectObject (hdc, oldobj);
|
||||
|
||||
ReleaseDC (dpyinfo->root_window, hdc);
|
||||
|
||||
{
|
||||
LOGFONT lf;
|
||||
|
||||
if (!name || !x_to_win32_font(name, &lf))
|
||||
return (NULL);
|
||||
|
||||
font = (XFontStruct *) xmalloc (sizeof (XFontStruct));
|
||||
|
||||
if (!font) return (NULL);
|
||||
|
||||
BLOCK_INPUT;
|
||||
|
||||
font->hfont = CreateFontIndirect(&lf);
|
||||
}
|
||||
|
||||
if (font->hfont == NULL)
|
||||
{
|
||||
ok = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
HDC hdc;
|
||||
HANDLE oldobj;
|
||||
|
||||
hdc = my_get_dc (dpyinfo->root_window);
|
||||
|
||||
oldobj = SelectObject (hdc, font->hfont);
|
||||
|
||||
ok = GetTextMetrics (hdc, &font->tm);
|
||||
|
||||
SelectObject (hdc, oldobj);
|
||||
|
||||
ReleaseDC (dpyinfo->root_window, hdc);
|
||||
}
|
||||
|
||||
UNBLOCK_INPUT;
|
||||
|
||||
|
||||
if (ok) return (font);
|
||||
|
||||
win32_unload_font (dpyinfo, font);
|
||||
|
||||
win32_unload_font(dpyinfo, font);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
@ -3351,7 +3175,7 @@ win32_unload_font (dpyinfo, font)
|
|||
{
|
||||
if (font)
|
||||
{
|
||||
if (font->hfont) DeleteObject (font->hfont);
|
||||
if (font->hfont) DeleteObject(font->hfont);
|
||||
xfree (font);
|
||||
}
|
||||
}
|
||||
|
@ -3436,11 +3260,7 @@ x_to_win32_weight (lpw)
|
|||
{
|
||||
if (!lpw) return (FW_DONTCARE);
|
||||
|
||||
if (stricmp (lpw, "heavy") == 0)
|
||||
return (FW_HEAVY);
|
||||
else if (stricmp (lpw, "extrabold") == 0)
|
||||
return (FW_EXTRABOLD);
|
||||
else if (stricmp (lpw, "bold") == 0)
|
||||
if (stricmp (lpw, "bold") == 0)
|
||||
return (FW_BOLD);
|
||||
else if (stricmp (lpw, "demibold") == 0)
|
||||
return (FW_SEMIBOLD);
|
||||
|
@ -3448,81 +3268,22 @@ x_to_win32_weight (lpw)
|
|||
return (FW_MEDIUM);
|
||||
else if (stricmp (lpw, "normal") == 0)
|
||||
return (FW_NORMAL);
|
||||
else if (stricmp (lpw, "light") == 0)
|
||||
return (FW_LIGHT);
|
||||
else if (stricmp (lpw, "extralight") == 0)
|
||||
return (FW_EXTRALIGHT);
|
||||
else if (stricmp (lpw, "thin") == 0)
|
||||
return (FW_THIN);
|
||||
else
|
||||
return (FW_DONTCARE);
|
||||
}
|
||||
|
||||
|
||||
char *
|
||||
win32_to_x_weight (fnweight)
|
||||
int fnweight;
|
||||
{
|
||||
if (fnweight >= FW_HEAVY)
|
||||
return "heavy";
|
||||
else if (fnweight >= FW_EXTRABOLD)
|
||||
return "extrabold";
|
||||
else if (fnweight >= FW_BOLD)
|
||||
return "bold";
|
||||
else if (fnweight >= FW_SEMIBOLD)
|
||||
return "semibold";
|
||||
else if (fnweight >= FW_MEDIUM)
|
||||
return "medium";
|
||||
else if (fnweight >= FW_NORMAL)
|
||||
return "normal";
|
||||
else if (fnweight >= FW_LIGHT)
|
||||
return "light";
|
||||
else if (fnweight >= FW_EXTRALIGHT)
|
||||
return "extralight";
|
||||
else if (fnweight >= FW_THIN)
|
||||
return "thin";
|
||||
else
|
||||
return "*";
|
||||
}
|
||||
|
||||
LONG
|
||||
x_to_win32_charset (lpcs)
|
||||
char * lpcs;
|
||||
{
|
||||
if (!lpcs) return (0);
|
||||
|
||||
if (stricmp (lpcs, "ansi") == 0)
|
||||
return (ANSI_CHARSET);
|
||||
else if (stricmp (lpcs, "iso8859-1") == 0)
|
||||
return (ANSI_CHARSET);
|
||||
else if (stricmp (lpcs, "iso8859") == 0)
|
||||
return (ANSI_CHARSET);
|
||||
else if (stricmp (lpcs, "oem") == 0)
|
||||
return (OEM_CHARSET);
|
||||
#ifdef UNICODE_CHARSET
|
||||
else if (stricmp (lpcs, "unicode") == 0)
|
||||
return (UNICODE_CHARSET);
|
||||
else if (stricmp (lpcs, "iso10646") == 0)
|
||||
return (UNICODE_CHARSET);
|
||||
#endif
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
char *
|
||||
win32_to_x_charset (fncharset)
|
||||
int fncharset;
|
||||
{
|
||||
switch (fncharset)
|
||||
{
|
||||
case ANSI_CHARSET: return "ansi";
|
||||
case OEM_CHARSET: return "oem";
|
||||
case SYMBOL_CHARSET: return "symbol";
|
||||
#ifdef UNICODE_CHARSET
|
||||
case UNICODE_CHARSET: return "unicode";
|
||||
#endif
|
||||
}
|
||||
return "*";
|
||||
if (fnweight >= FW_BOLD)
|
||||
return ("bold");
|
||||
else if (fnweight >= FW_SEMIBOLD)
|
||||
return ("demibold");
|
||||
else if (fnweight >= FW_MEDIUM)
|
||||
return ("medium");
|
||||
else
|
||||
return ("normal");
|
||||
}
|
||||
|
||||
BOOL
|
||||
|
@ -3533,25 +3294,29 @@ win32_to_x_font (lplogfont, lpxstr, len)
|
|||
{
|
||||
if (!lpxstr) return (FALSE);
|
||||
|
||||
if (lplogfont)
|
||||
if (lplogfont)
|
||||
{
|
||||
int height = (lplogfont->lfHeight * 1440)
|
||||
/ one_win32_display_info.height_in;
|
||||
int width = (lplogfont->lfWidth * 1440)
|
||||
/ one_win32_display_info.width_in;
|
||||
|
||||
height = abs (height);
|
||||
_snprintf (lpxstr, len - 1,
|
||||
"-*-%s-%s-%c-*-*-%d-%d-*-*-%c-%d-*-%s-",
|
||||
"-*-%s-%s-%c-%s-%s-*-%d-*-*-%c-%d-*-*-",
|
||||
lplogfont->lfFaceName,
|
||||
win32_to_x_weight (lplogfont->lfWeight),
|
||||
lplogfont->lfItalic ? 'i' : 'r',
|
||||
abs (lplogfont->lfHeight),
|
||||
(abs (lplogfont->lfHeight) * 720) / one_win32_display_info.height_in,
|
||||
"*", "*",
|
||||
height,
|
||||
((lplogfont->lfPitchAndFamily & 0x3) == VARIABLE_PITCH) ? 'p' : 'c',
|
||||
lplogfont->lfWidth * 10,
|
||||
win32_to_x_charset (lplogfont->lfCharSet)
|
||||
);
|
||||
}
|
||||
else
|
||||
width);
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy (lpxstr, "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-", len - 1);
|
||||
}
|
||||
|
||||
|
||||
lpxstr[len - 1] = 0; /* just to be sure */
|
||||
return (TRUE);
|
||||
}
|
||||
|
@ -3565,119 +3330,56 @@ x_to_win32_font (lpxstr, lplogfont)
|
|||
|
||||
memset (lplogfont, 0, sizeof (*lplogfont));
|
||||
|
||||
lplogfont->lfCharSet = OEM_CHARSET;
|
||||
lplogfont->lfOutPrecision = OUT_DEFAULT_PRECIS;
|
||||
lplogfont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
|
||||
lplogfont->lfQuality = DEFAULT_QUALITY;
|
||||
|
||||
if (!lpxstr)
|
||||
return FALSE;
|
||||
|
||||
/* Provide a simple escape mechanism for specifying Windows font names
|
||||
* directly -- if font spec does not beginning with '-', assume this
|
||||
* format:
|
||||
* "<font name>[:height in pixels[:width in pixels[:weight]]]"
|
||||
*/
|
||||
if (lpxstr && *lpxstr == '-') lpxstr++;
|
||||
|
||||
if (*lpxstr == '-')
|
||||
{
|
||||
int fields;
|
||||
char name[50], weight[20], slant, pitch, pixels[10], height[10], width[10], remainder[20];
|
||||
char * encoding;
|
||||
|
||||
fields = sscanf (lpxstr,
|
||||
"-%*[^-]-%49[^-]-%19[^-]-%c-%*[^-]-%*[^-]-%9[^-]-%9[^-]-%*[^-]-%*[^-]-%c-%9[^-]-%19s",
|
||||
name, weight, &slant, pixels, height, &pitch, width, remainder);
|
||||
|
||||
if (fields == EOF) return (FALSE);
|
||||
|
||||
if (fields > 0 && name[0] != '*')
|
||||
{
|
||||
strncpy (lplogfont->lfFaceName,name, LF_FACESIZE);
|
||||
lplogfont->lfFaceName[LF_FACESIZE-1] = 0;
|
||||
}
|
||||
else
|
||||
lplogfont->lfFaceName[0] = 0;
|
||||
|
||||
fields--;
|
||||
|
||||
lplogfont->lfWeight = x_to_win32_weight((fields > 0 ? weight : ""));
|
||||
|
||||
fields--;
|
||||
|
||||
if (!NILP (Vwin32_enable_italics))
|
||||
lplogfont->lfItalic = (fields > 0 && slant == 'i');
|
||||
|
||||
fields--;
|
||||
|
||||
if (fields > 0 && pixels[0] != '*')
|
||||
lplogfont->lfHeight = atoi (pixels);
|
||||
|
||||
fields--;
|
||||
|
||||
if (fields > 0 && lplogfont->lfHeight == 0 && height[0] != '*')
|
||||
lplogfont->lfHeight = (atoi (height)
|
||||
* one_win32_display_info.height_in) / 720;
|
||||
|
||||
fields--;
|
||||
|
||||
lplogfont->lfPitchAndFamily =
|
||||
(fields > 0 && pitch == 'p') ? VARIABLE_PITCH : FIXED_PITCH;
|
||||
|
||||
fields--;
|
||||
|
||||
if (fields > 0 && width[0] != '*')
|
||||
lplogfont->lfWidth = atoi (width) / 10;
|
||||
|
||||
fields--;
|
||||
|
||||
/* Not all font specs include the registry field, so we allow for an
|
||||
optional registry field before the encoding when parsing
|
||||
remainder. Also we strip the trailing '-' if present. */
|
||||
{
|
||||
int fields;
|
||||
char name[50], weight[20], slant, pitch, height[10], width[10];
|
||||
|
||||
fields = (lpxstr
|
||||
? sscanf (lpxstr,
|
||||
"%*[^-]-%[^-]-%[^-]-%c-%*[^-]-%*[^-]-%*[^-]-%[^-]-%*[^-]-%*[^-]-%c-%[^-]",
|
||||
name, weight, &slant, height, &pitch, width)
|
||||
: 0);
|
||||
|
||||
if (fields == EOF) return (FALSE);
|
||||
|
||||
if (fields > 0 && name[0] != '*')
|
||||
{
|
||||
int len = strlen (remainder);
|
||||
if (len > 0 && remainder[len-1] == '-')
|
||||
remainder[len-1] = 0;
|
||||
strncpy (lplogfont->lfFaceName, name, LF_FACESIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
lplogfont->lfFaceName[0] = 0;
|
||||
}
|
||||
encoding = remainder;
|
||||
if (strncmp (encoding, "*-", 2) == 0)
|
||||
encoding += 2;
|
||||
lplogfont->lfCharSet = x_to_win32_charset (fields > 0 ? encoding : "");
|
||||
}
|
||||
else
|
||||
{
|
||||
int fields;
|
||||
char name[100], height[10], width[10], weight[20];
|
||||
|
||||
fields = sscanf (lpxstr,
|
||||
"%99[^:]:%9[^:]:%9[^:]:%19s",
|
||||
name, height, width, weight);
|
||||
|
||||
if (fields == EOF) return (FALSE);
|
||||
|
||||
if (fields > 0)
|
||||
{
|
||||
strncpy (lplogfont->lfFaceName,name, LF_FACESIZE);
|
||||
lplogfont->lfFaceName[LF_FACESIZE-1] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
lplogfont->lfFaceName[0] = 0;
|
||||
}
|
||||
|
||||
fields--;
|
||||
|
||||
if (fields > 0)
|
||||
lplogfont->lfHeight = atoi (height);
|
||||
|
||||
fields--;
|
||||
|
||||
if (fields > 0)
|
||||
lplogfont->lfWidth = atoi (width);
|
||||
|
||||
fields--;
|
||||
|
||||
lplogfont->lfWeight = x_to_win32_weight ((fields > 0 ? weight : ""));
|
||||
}
|
||||
|
||||
fields--;
|
||||
|
||||
lplogfont->lfWeight = x_to_win32_weight((fields > 0 ? weight : ""));
|
||||
|
||||
fields--;
|
||||
|
||||
lplogfont->lfItalic = (fields > 0 && slant == 'i');
|
||||
|
||||
fields--;
|
||||
|
||||
if (fields > 0 && height[0] != '*')
|
||||
lplogfont->lfHeight = (atoi (height) * one_win32_display_info.height_in) / 1440;
|
||||
|
||||
fields--;
|
||||
|
||||
lplogfont->lfPitchAndFamily = (fields > 0 && pitch == 'p') ? VARIABLE_PITCH : FIXED_PITCH;
|
||||
|
||||
fields--;
|
||||
|
||||
if (fields > 0 && width[0] != '*')
|
||||
lplogfont->lfWidth = (atoi (width) * one_win32_display_info.width_in) / 1440;
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
@ -3871,7 +3573,7 @@ even if they match PATTERN and FACE.")
|
|||
ef.numFonts = 0;
|
||||
|
||||
{
|
||||
ef.hdc = GetDC (FRAME_WIN32_WINDOW (f));
|
||||
ef.hdc = my_get_dc (FRAME_WIN32_WINDOW (f));
|
||||
|
||||
EnumFontFamilies (ef.hdc, NULL, (FONTENUMPROC) enum_font_cb1, (LPARAM)&ef);
|
||||
|
||||
|
@ -4057,11 +3759,9 @@ If omitted or nil, that stands for the selected frame's display.")
|
|||
HDC hdc;
|
||||
int cap;
|
||||
|
||||
hdc = GetDC (dpyinfo->root_window);
|
||||
if (dpyinfo->has_palette)
|
||||
cap = GetDeviceCaps (hdc, SIZEPALETTE);
|
||||
else
|
||||
cap = GetDeviceCaps (hdc, NUMCOLORS);
|
||||
hdc = my_get_dc (dpyinfo->root_window);
|
||||
|
||||
cap = GetDeviceCaps (hdc,NUMCOLORS);
|
||||
|
||||
ReleaseDC (dpyinfo->root_window, hdc);
|
||||
|
||||
|
@ -4140,8 +3840,10 @@ If omitted or nil, that stands for the selected frame's display.")
|
|||
HDC hdc;
|
||||
int cap;
|
||||
|
||||
hdc = GetDC (dpyinfo->root_window);
|
||||
hdc = my_get_dc (dpyinfo->root_window);
|
||||
|
||||
cap = GetDeviceCaps (hdc, VERTSIZE);
|
||||
|
||||
ReleaseDC (dpyinfo->root_window, hdc);
|
||||
|
||||
return make_number (cap);
|
||||
|
@ -4160,8 +3862,10 @@ If omitted or nil, that stands for the selected frame's display.")
|
|||
HDC hdc;
|
||||
int cap;
|
||||
|
||||
hdc = GetDC (dpyinfo->root_window);
|
||||
hdc = my_get_dc (dpyinfo->root_window);
|
||||
|
||||
cap = GetDeviceCaps (hdc, HORZSIZE);
|
||||
|
||||
ReleaseDC (dpyinfo->root_window, hdc);
|
||||
|
||||
return make_number (cap);
|
||||
|
@ -4310,22 +4014,12 @@ terminate Emacs if we can't open the connection.")
|
|||
unsigned int n_planes;
|
||||
unsigned char *xrm_option;
|
||||
struct win32_display_info *dpyinfo;
|
||||
Lisp_Object color_file = Qnil;
|
||||
|
||||
CHECK_STRING (display, 0);
|
||||
if (! NILP (xrm_string))
|
||||
CHECK_STRING (xrm_string, 1);
|
||||
|
||||
/* Allow color mapping to be defined externally; first look in user's
|
||||
HOME directory, then in Emacs etc dir for a file called rgb.txt. */
|
||||
color_file = build_string ("~/rgb.txt");
|
||||
if (NILP (color_file) || NILP (Ffile_readable_p (color_file)))
|
||||
color_file = concat2 (Vdoc_directory, build_string ("rgb.txt"));
|
||||
|
||||
Vwin32_color_map = Fwin32_load_color_file (color_file);
|
||||
|
||||
if (NILP (Vwin32_color_map))
|
||||
Vwin32_color_map = Fwin32_default_color_map ();
|
||||
Vwin32_color_map = Fwin32_default_color_map ();
|
||||
|
||||
if (! NILP (xrm_string))
|
||||
xrm_option = (unsigned char *) XSTRING (xrm_string)->data;
|
||||
|
@ -4345,7 +4039,8 @@ terminate Emacs if we can't open the connection.")
|
|||
if (dpyinfo == 0)
|
||||
{
|
||||
if (!NILP (must_succeed))
|
||||
fatal ("Cannot connect to server %s.\n", XSTRING (display)->data);
|
||||
fatal ("Cannot connect to server %s.\n",
|
||||
XSTRING (display)->data);
|
||||
else
|
||||
error ("Cannot connect to server %s", XSTRING (display)->data);
|
||||
}
|
||||
|
@ -4436,7 +4131,7 @@ DEFUN ("win32-select-font", Fwin32_select_font, Swin32_select_font, 0, 1, 0,
|
|||
cf.lpLogFont = &lf;
|
||||
|
||||
if (!ChooseFont (&cf) || !win32_to_x_font (&lf, buf, 100))
|
||||
return Qnil;
|
||||
return Qnil;
|
||||
|
||||
return build_string (buf);
|
||||
}
|
||||
|
@ -4524,14 +4219,6 @@ syms_of_win32fns ()
|
|||
"A array of color name mappings for windows.");
|
||||
Vwin32_color_map = Qnil;
|
||||
|
||||
DEFVAR_LISP ("win32-enable-italics", &Vwin32_enable_italics,
|
||||
"Non-nil enables selection of artificially italicized fonts.");
|
||||
Vwin32_enable_italics = Qnil;
|
||||
|
||||
DEFVAR_LISP ("win32-enable-palette", &Vwin32_enable_palette,
|
||||
"Non-nil enables Windows palette management to map colors exactly.");
|
||||
Vwin32_enable_palette = Qt;
|
||||
|
||||
init_x_parm_symbols ();
|
||||
|
||||
DEFVAR_LISP ("x-bitmap-file-path", &Vx_bitmap_file_path,
|
||||
|
@ -4607,8 +4294,6 @@ unless you set it to something else.");
|
|||
/* Win32 specific functions */
|
||||
|
||||
defsubr (&Swin32_select_font);
|
||||
defsubr (&Swin32_define_rgb_color);
|
||||
defsubr (&Swin32_load_color_file);
|
||||
}
|
||||
|
||||
#undef abort
|
||||
|
@ -4616,9 +4301,9 @@ unless you set it to something else.");
|
|||
void
|
||||
win32_abort()
|
||||
{
|
||||
MessageBox (NULL,
|
||||
"A fatal error has occurred - aborting!",
|
||||
"Emacs Abort Dialog",
|
||||
MB_OK | MB_ICONEXCLAMATION);
|
||||
abort();
|
||||
MessageBox (NULL,
|
||||
"A fatal error has occurred - aborting!",
|
||||
"Emacs Abort Dialog",
|
||||
MB_OK|MB_ICONEXCLAMATION);
|
||||
abort();
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ Boston, MA 02111-1307, USA. */
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define REG_ROOT "Software\\GNU\\Emacs"
|
||||
#define REG_ROOT "SOFTWARE\\GNU\\Emacs\\"
|
||||
|
||||
LPBYTE
|
||||
win32_get_string_resource (name, class, dwexptype)
|
||||
|
|
|
@ -75,23 +75,6 @@ struct win32_bitmap_record
|
|||
/* Record some info about this pixmap. */
|
||||
int height, width, depth;
|
||||
};
|
||||
|
||||
/* Palette book-keeping stuff for mapping requested colors into the
|
||||
system palette. Keep a ref-counted list of requested colors and
|
||||
regenerate the app palette whenever the requested list changes. */
|
||||
|
||||
extern Lisp_Object Vwin32_enable_palette;
|
||||
|
||||
struct win32_palette_entry {
|
||||
struct win32_palette_entry * next;
|
||||
PALETTEENTRY entry;
|
||||
#if 0
|
||||
unsigned refcount;
|
||||
#endif
|
||||
};
|
||||
|
||||
extern void win32_regenerate_palette(struct frame *f);
|
||||
|
||||
|
||||
/* For each display (currently only one on win32), we have a structure that
|
||||
records information about it. */
|
||||
|
@ -119,15 +102,6 @@ struct win32_display_info
|
|||
/* The cursor to use for vertical scroll bars. */
|
||||
Cursor vertical_scroll_bar_cursor;
|
||||
|
||||
/* color palette information */
|
||||
int has_palette;
|
||||
struct win32_palette_entry * p_colors_in_use;
|
||||
unsigned n_colors_in_use;
|
||||
HPALETTE h_palette;
|
||||
|
||||
/* deferred action flags checked when starting frame update */
|
||||
int regen_palette;
|
||||
|
||||
/* A table of all the fonts we have already loaded. */
|
||||
struct font_info *font_table;
|
||||
|
||||
|
@ -213,9 +187,6 @@ extern struct win32_display_info *win32_term_init ();
|
|||
|
||||
struct win32_output
|
||||
{
|
||||
/* Original palette (used to deselect real palette after drawing) */
|
||||
HPALETTE h_old_palette;
|
||||
|
||||
/* Position of the Win32 window (x and y offsets in root window). */
|
||||
int left_pos;
|
||||
int top_pos;
|
||||
|
@ -577,6 +548,10 @@ win32_fill_area (f,hdc,f->output_data.win32->background_pixel,x,y,nx,ny)
|
|||
extern XFontStruct *win32_load_font ();
|
||||
extern void win32_unload_font ();
|
||||
|
||||
extern HDC map_mode();
|
||||
|
||||
#define my_get_dc(hwnd) (map_mode (GetDC (hwnd)))
|
||||
|
||||
#define WM_EMACS_START (WM_USER + 1)
|
||||
#define WM_EMACS_KILL (WM_EMACS_START + 0x00)
|
||||
#define WM_EMACS_CREATEWINDOW (WM_EMACS_START + 0x01)
|
||||
|
@ -603,26 +578,11 @@ typedef struct Win32Msg {
|
|||
RECT rect;
|
||||
} Win32Msg;
|
||||
|
||||
/* Identifiers for array of critical sections; we need one for
|
||||
serializing access to hand-crafter message queue, and another
|
||||
for preventing palette changes during GDI calls. */
|
||||
enum win32_critical_section {
|
||||
CRIT_MSG, /* message queue */
|
||||
CRIT_GDI, /* GDI calls */
|
||||
CRIT_TOTAL /* num of critical sections */
|
||||
};
|
||||
|
||||
extern CRITICAL_SECTION critsect[CRIT_TOTAL];
|
||||
|
||||
extern void init_crit ();
|
||||
extern void enter_crit ();
|
||||
extern void leave_crit ();
|
||||
extern void delete_crit ();
|
||||
|
||||
#define enter_crit(index) EnterCriticalSection (&critsect[index])
|
||||
#define leave_crit(index) LeaveCriticalSection (&critsect[index])
|
||||
|
||||
extern HDC GetFrameDC (struct frame * f);
|
||||
extern int ReleaseFrameDC (struct frame * f, HDC hDC);
|
||||
|
||||
extern BOOL get_next_msg ();
|
||||
extern BOOL post_msg ();
|
||||
extern void wait_for_sync ();
|
||||
|
|
Loading…
Add table
Reference in a new issue