1 /* device functions for mswindows.
2 Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
3 Copyright (C) 1994, 1995 Free Software Foundation, Inc.
5 This file is part of XEmacs.
7 XEmacs is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with XEmacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* Synched up with: Not in FSF. */
26 Original authors: Jamie Zawinski and the FSF
27 Rewritten by Ben Wing and Chuck Thompson.
28 Rewritten for mswindows by Jonathan Harris, November 1997 for 21.0.
35 #include "console-msw.h"
36 #include "console-stream.h"
45 #define FONTENUMPROC FONTENUMEXPROC
49 /* win32 DDE management library globals */
51 DWORD mswindows_dde_mlid;
52 HSZ mswindows_dde_service;
53 HSZ mswindows_dde_topic_system;
54 HSZ mswindows_dde_item_open;
57 /* Control conversion of upper case file names to lower case.
58 nil means no, t means yes. */
59 Lisp_Object Vmswindows_downcase_file_names;
61 /* Control whether stat() attempts to determine file type and link count
62 exactly, at the expense of slower operation. Since true hard links
63 are supported on NTFS volumes, this is only relevant on NT. */
64 Lisp_Object Vmswindows_get_true_file_attributes;
66 Lisp_Object Qinit_pre_mswindows_win, Qinit_post_mswindows_win;
75 /************************************************************************/
77 /************************************************************************/
80 font_enum_callback_2 (ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme,
81 int FontType, struct font_enum_t *font_enum)
83 struct mswindows_font_enum *fontlist, **fonthead;
84 char fontname[MSW_FONTSIZE];
86 /* The enumerated font weights are not to be trusted because:
87 * a) lpelfe->elfStyle is only filled in for TrueType fonts.
88 * b) Not all Bold and Italic styles of all fonts (inluding some Vector,
89 * Truetype and Raster fonts) are enumerated.
90 * I guess that fonts for which Bold and Italic styles are generated
91 * 'on-the-fly' are not enumerated. It would be overly restrictive to
92 * disallow Bold And Italic weights for these fonts, so we just leave
93 * weights unspecified. This means that we have to weed out duplicates of
94 * those fonts that do get enumerated with different weights. */
96 if (FontType == 0 /*vector*/ || FontType == TRUETYPE_FONTTYPE)
97 /* Scalable, so leave pointsize blank */
98 sprintf (fontname, "%s::::%s", lpelfe->elfLogFont.lfFaceName,
101 /* Formula for pointsize->height from LOGFONT docs in Platform SDK */
102 sprintf (fontname, "%s::%d::%s", lpelfe->elfLogFont.lfFaceName,
103 MulDiv (lpntme->ntmTm.tmHeight - lpntme->ntmTm.tmInternalLeading,
104 72, DEVICE_MSWINDOWS_LOGPIXELSY (font_enum->d)),
107 fonthead = &DEVICE_MSWINDOWS_FONTLIST (font_enum->d);
108 fontlist = *fonthead;
110 if (!strcmp (fontname, fontlist->fontname))
111 return 1; /* found a duplicate */
113 fontlist = fontlist->next;
115 /* Insert entry at head */
116 fontlist = *fonthead;
117 *fonthead = xmalloc (sizeof (struct mswindows_font_enum));
118 if (*fonthead == NULL)
120 *fonthead = fontlist;
123 strcpy ((*fonthead)->fontname, fontname);
124 (*fonthead)->next = fontlist;
129 font_enum_callback_1 (ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme,
130 int FontType, struct font_enum_t *font_enum)
132 /* This function gets called once per facename per character set.
133 * We call a second callback to enumerate the fonts in each facename */
134 return EnumFontFamiliesEx (font_enum->hdc, &lpelfe->elfLogFont,
135 (FONTENUMPROC) font_enum_callback_2,
136 (LPARAM) font_enum, 0);
140 build_syscolor_string (int index)
148 clr = GetSysColor (index);
149 sprintf (buf, "#%02X%02X%02X",
153 return build_string (buf);
157 build_syscolor_cons (int index1, int index2)
159 Lisp_Object color1, color2;
162 color1 = build_syscolor_string (index1);
163 color2 = build_syscolor_string (index2);
164 RETURN_UNGCPRO (Fcons (color1, color2));
168 build_sysmetrics_cons (int index1, int index2)
170 return Fcons (index1 < 0 ? Qnil : make_int (GetSystemMetrics (index1)),
171 index2 < 0 ? Qnil : make_int (GetSystemMetrics (index2)));
176 /************************************************************************/
178 /************************************************************************/
181 mswindows_init_device (struct device *d, Lisp_Object props)
186 struct font_enum_t font_enum;
188 DEVICE_CLASS (d) = Qcolor;
189 DEVICE_INFD (d) = DEVICE_OUTFD (d) = -1;
193 d->device_data = xnew_and_zero (struct mswindows_device);
194 hdc = CreateCompatibleDC (NULL);
196 DEVICE_MSWINDOWS_LOGPIXELSX(d) = GetDeviceCaps(hdc, LOGPIXELSX);
197 DEVICE_MSWINDOWS_LOGPIXELSY(d) = GetDeviceCaps(hdc, LOGPIXELSY);
198 DEVICE_MSWINDOWS_PLANES(d) = GetDeviceCaps(hdc, PLANES);
199 /* #### SIZEPALETTE only valid if RC_PALETTE bit set in RASTERCAPS,
200 what should we return for a non-palette-based device? */
201 DEVICE_MSWINDOWS_CELLS(d) = GetDeviceCaps(hdc, SIZEPALETTE);
202 DEVICE_MSWINDOWS_HORZRES(d) = GetDeviceCaps(hdc, HORZRES);
203 DEVICE_MSWINDOWS_VERTRES(d) = GetDeviceCaps(hdc, VERTRES);
204 DEVICE_MSWINDOWS_HORZSIZE(d) = GetDeviceCaps(hdc, HORZSIZE);
205 DEVICE_MSWINDOWS_VERTSIZE(d) = GetDeviceCaps(hdc, VERTSIZE);
206 DEVICE_MSWINDOWS_BITSPIXEL(d) = GetDeviceCaps(hdc, BITSPIXEL);
208 DEVICE_MSWINDOWS_FONTLIST (d) = NULL;
209 logfont.lfCharSet = DEFAULT_CHARSET;
210 logfont.lfFaceName[0] = '\0';
211 logfont.lfPitchAndFamily = DEFAULT_PITCH;
214 EnumFontFamiliesEx (hdc, &logfont, (FONTENUMPROC) font_enum_callback_1,
215 (LPARAM) (&font_enum), 0);
218 /* Register the main window class */
219 wc.cbSize = sizeof (WNDCLASSEX);
220 wc.style = CS_OWNDC; /* One DC per window */
221 wc.lpfnWndProc = (WNDPROC) mswindows_wnd_proc;
223 wc.cbWndExtra = MSWINDOWS_WINDOW_EXTRA_BYTES;
224 wc.hInstance = NULL; /* ? */
225 wc.hIcon = LoadIcon (GetModuleHandle(NULL), XEMACS_CLASS);
226 wc.hCursor = LoadCursor (NULL, IDC_ARROW);
227 /* Background brush is only used during sizing, when XEmacs cannot
229 wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1);
230 wc.lpszMenuName = NULL;
232 wc.lpszClassName = XEMACS_CLASS;
233 wc.hIconSm = LoadImage (GetModuleHandle (NULL), XEMACS_CLASS,
234 IMAGE_ICON, 16, 16, 0);
235 RegisterClassEx (&wc);
237 InitCommonControls ();
242 mswindows_finish_init_device (struct device *d, Lisp_Object props)
244 /* Initialise DDE management library and our related globals. We execute a
245 * dde Open("file") by simulating a drop, so this depends on dnd support. */
246 #ifdef HAVE_DRAGNDROP
247 mswindows_dde_mlid = 0;
248 DdeInitialize (&mswindows_dde_mlid, (PFNCALLBACK)mswindows_dde_callback,
249 APPCMD_FILTERINITS|CBF_FAIL_SELFCONNECTIONS|CBF_FAIL_ADVISES|
250 CBF_FAIL_POKES|CBF_FAIL_REQUESTS|CBF_SKIP_ALLNOTIFICATIONS, 0);
252 mswindows_dde_service = DdeCreateStringHandle (mswindows_dde_mlid, XEMACS_CLASS, 0);
253 mswindows_dde_topic_system = DdeCreateStringHandle (mswindows_dde_mlid, SZDDESYS_TOPIC, 0);
254 mswindows_dde_item_open = DdeCreateStringHandle (mswindows_dde_mlid,
255 TEXT(MSWINDOWS_DDE_ITEM_OPEN), 0);
256 DdeNameService (mswindows_dde_mlid, mswindows_dde_service, 0L, DNS_REGISTER);
261 mswindows_delete_device (struct device *d)
263 struct mswindows_font_enum *fontlist, *next;
265 fontlist = DEVICE_MSWINDOWS_FONTLIST (d);
268 next = fontlist->next;
273 #ifdef HAVE_DRAGNDROP
274 DdeNameService (mswindows_dde_mlid, 0L, 0L, DNS_REGISTER);
275 DdeUninitialize (mswindows_dde_mlid);
278 free (d->device_data);
282 mswindows_device_system_metrics (struct device *d,
283 enum device_metrics m)
288 return Fcons (make_int (DEVICE_MSWINDOWS_HORZRES(d)),
289 make_int (DEVICE_MSWINDOWS_VERTRES(d)));
291 case DM_size_device_mm:
292 return Fcons (make_int (DEVICE_MSWINDOWS_HORZSIZE(d)),
293 make_int (DEVICE_MSWINDOWS_VERTSIZE(d)));
295 case DM_num_bit_planes:
296 /* this is what X means by bitplanes therefore we ought to be
297 consistent. num planes is always 1 under mswindows and
299 return make_int (DEVICE_MSWINDOWS_BITSPIXEL(d));
301 case DM_num_color_cells:
302 return make_int (DEVICE_MSWINDOWS_CELLS(d));
306 #define FROB(met, index1, index2) \
308 return build_syscolor_cons (index1, index2);
310 FROB (color_default, COLOR_WINDOW, COLOR_WINDOWTEXT);
311 FROB (color_select, COLOR_HIGHLIGHT, COLOR_HIGHLIGHTTEXT);
312 FROB (color_balloon, COLOR_INFOBK, COLOR_INFOTEXT);
313 FROB (color_3d_face, COLOR_3DFACE, COLOR_BTNTEXT);
314 FROB (color_3d_light, COLOR_3DLIGHT, COLOR_3DHILIGHT);
315 FROB (color_3d_dark, COLOR_3DSHADOW, COLOR_3DDKSHADOW);
316 FROB (color_menu, COLOR_MENU, COLOR_MENUTEXT);
317 FROB (color_menu_highlight, COLOR_HIGHLIGHT, COLOR_HIGHLIGHTTEXT);
318 FROB (color_menu_button, COLOR_MENU, COLOR_MENUTEXT);
319 FROB (color_menu_disabled, COLOR_MENU, COLOR_GRAYTEXT);
320 FROB (color_toolbar, COLOR_BTNFACE, COLOR_BTNTEXT);
321 FROB (color_scrollbar, COLOR_SCROLLBAR, COLOR_CAPTIONTEXT);
322 FROB (color_desktop, -1, COLOR_DESKTOP);
323 FROB (color_workspace, -1, COLOR_APPWORKSPACE);
327 #define FROB(met, index1, index2) \
329 return build_sysmetrics_cons (index1, index2);
331 FROB (size_cursor, SM_CXCURSOR, SM_CYCURSOR);
332 FROB (size_scrollbar, SM_CXVSCROLL, SM_CYHSCROLL);
333 FROB (size_menu, -1, SM_CYMENU);
334 FROB (size_icon, SM_CXICON, SM_CYICON);
335 FROB (size_icon_small, SM_CXSMICON, SM_CYSMICON);
338 case DM_size_workspace:
341 SystemParametersInfo (SPI_GETWORKAREA, 0, &rc, 0);
342 return Fcons (make_int (rc.right - rc.left),
343 make_int (rc.bottom - rc.top));
346 case DM_size_toolbar:
347 case DM_size_toolbar_button:
348 case DM_size_toolbar_border:
352 #define FROB(met, index) \
354 return make_int (GetSystemMetrics (index));
356 FROB (mouse_buttons, SM_CMOUSEBUTTONS);
357 FROB (swap_buttons, SM_SWAPBUTTON);
358 FROB (show_sounds, SM_SHOWSOUNDS);
359 FROB (slow_device, SM_SLOWMACHINE);
360 FROB (security, SM_SECURE);
365 /* Do not know such property */
370 mswindows_device_implementation_flags (void)
372 return XDEVIMPF_PIXEL_GEOMETRY;
376 /************************************************************************/
378 /************************************************************************/
381 syms_of_device_mswindows (void)
383 defsymbol (&Qinit_pre_mswindows_win, "init-pre-mswindows-win");
384 defsymbol (&Qinit_post_mswindows_win, "init-post-mswindows-win");
386 DEFVAR_LISP ("mswindows-downcase-file-names", &Vmswindows_downcase_file_names /*
387 Non-nil means convert all-upper case file names to lower case.
388 This applies when performing completions and file name expansion.*/ );
389 Vmswindows_downcase_file_names = Qnil;
391 DEFVAR_LISP ("mswindows-get-true-file-attributes", &Vmswindows_get_true_file_attributes /*
392 "Non-nil means determine accurate link count in file-attributes.
393 This option slows down file-attributes noticeably, so is disabled by
394 default. Note that it is only useful for files on NTFS volumes,
395 where hard links are supported.
397 Vmswindows_get_true_file_attributes = Qnil;
401 console_type_create_device_mswindows (void)
403 CONSOLE_HAS_METHOD (mswindows, init_device);
404 CONSOLE_HAS_METHOD (mswindows, finish_init_device);
405 /* CONSOLE_HAS_METHOD (mswindows, mark_device); */
406 CONSOLE_HAS_METHOD (mswindows, delete_device);
407 CONSOLE_HAS_METHOD (mswindows, device_system_metrics);
408 CONSOLE_HAS_METHOD (mswindows, device_implementation_flags);
412 vars_of_device_mswindows (void)