Mercurial > hg > xemacs-beta
diff src/device-msw.c @ 428:3ecd8885ac67 r21-2-22
Import from CVS: tag r21-2-22
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:28:15 +0200 |
parents | |
children | 8de8e3f6228a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/device-msw.c Mon Aug 13 11:28:15 2007 +0200 @@ -0,0 +1,345 @@ +/* device functions for mswindows. + Copyright (C) 1994, 1995 Board of Trustees, University of Illinois. + Copyright (C) 1994, 1995 Free Software Foundation, Inc. + +This file is part of XEmacs. + +XEmacs 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. + +XEmacs 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 XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Synched up with: Not in FSF. */ + +/* Authorship: + + Original authors: Jamie Zawinski and the FSF + Rewritten by Ben Wing and Chuck Thompson. + Rewritten for mswindows by Jonathan Harris, November 1997 for 21.0. +*/ + + +#include <config.h> +#include "lisp.h" + +#include "console-msw.h" +#include "console-stream.h" +#include "events.h" +#include "faces.h" +#include "frame.h" +#include "sysdep.h" + +/* win32 DDE management library globals */ +#ifdef HAVE_DRAGNDROP +DWORD mswindows_dde_mlid; +HSZ mswindows_dde_service; +HSZ mswindows_dde_topic_system; +HSZ mswindows_dde_item_open; +#endif + +/* Control conversion of upper case file names to lower case. + nil means no, t means yes. */ +Lisp_Object Vmswindows_downcase_file_names; + +/* Control whether stat() attempts to determine file type and link count + exactly, at the expense of slower operation. Since true hard links + are supported on NTFS volumes, this is only relevant on NT. */ +Lisp_Object Vmswindows_get_true_file_attributes; + +Lisp_Object Qinit_pre_mswindows_win, Qinit_post_mswindows_win; + + +/************************************************************************/ +/* helpers */ +/************************************************************************/ + +static Lisp_Object +build_syscolor_string (int index) +{ + DWORD clr; + char buf[16]; + + if (index < 0) + return Qnil; + + clr = GetSysColor (index); + sprintf (buf, "#%02X%02X%02X", + GetRValue (clr), + GetGValue (clr), + GetBValue (clr)); + return build_string (buf); +} + +static Lisp_Object +build_syscolor_cons (int index1, int index2) +{ + Lisp_Object color1, color2; + struct gcpro gcpro1; + GCPRO1 (color1); + color1 = build_syscolor_string (index1); + color2 = build_syscolor_string (index2); + RETURN_UNGCPRO (Fcons (color1, color2)); +} + +static Lisp_Object +build_sysmetrics_cons (int index1, int index2) +{ + return Fcons (index1 < 0 ? Qnil : make_int (GetSystemMetrics (index1)), + index2 < 0 ? Qnil : make_int (GetSystemMetrics (index2))); +} + + + +/************************************************************************/ +/* methods */ +/************************************************************************/ + +static void +mswindows_init_device (struct device *d, Lisp_Object props) +{ + WNDCLASSEX wc; + HDC hdc; + + DEVICE_CLASS (d) = Qcolor; + DEVICE_INFD (d) = DEVICE_OUTFD (d) = -1; + init_baud_rate (d); + init_one_device (d); + + d->device_data = xnew_and_zero (struct mswindows_device); + hdc = CreateCompatibleDC (NULL); + assert (hdc!=NULL); + DEVICE_MSWINDOWS_LOGPIXELSX(d) = GetDeviceCaps(hdc, LOGPIXELSX); + DEVICE_MSWINDOWS_LOGPIXELSY(d) = GetDeviceCaps(hdc, LOGPIXELSY); + DEVICE_MSWINDOWS_PLANES(d) = GetDeviceCaps(hdc, PLANES); + /* #### SIZEPALETTE only valid if RC_PALETTE bit set in RASTERCAPS, + what should we return for a non-palette-based device? */ + DEVICE_MSWINDOWS_CELLS(d) = GetDeviceCaps(hdc, SIZEPALETTE); + DEVICE_MSWINDOWS_HORZRES(d) = GetDeviceCaps(hdc, HORZRES); + DEVICE_MSWINDOWS_VERTRES(d) = GetDeviceCaps(hdc, VERTRES); + DEVICE_MSWINDOWS_HORZSIZE(d) = GetDeviceCaps(hdc, HORZSIZE); + DEVICE_MSWINDOWS_VERTSIZE(d) = GetDeviceCaps(hdc, VERTSIZE); + DEVICE_MSWINDOWS_BITSPIXEL(d) = GetDeviceCaps(hdc, BITSPIXEL); + DeleteDC (hdc); + + mswindows_enumerate_fonts (d); + + /* Register the main window class */ + wc.cbSize = sizeof (WNDCLASSEX); + wc.style = CS_OWNDC; /* One DC per window */ + wc.lpfnWndProc = (WNDPROC) mswindows_wnd_proc; + wc.cbClsExtra = 0; + wc.cbWndExtra = MSWINDOWS_WINDOW_EXTRA_BYTES; + /* This must match whatever is passed to CreateWIndowEx, NULL is ok + for this. */ + wc.hInstance = NULL; + wc.hIcon = LoadIcon (GetModuleHandle(NULL), XEMACS_CLASS); + wc.hCursor = LoadCursor (NULL, IDC_ARROW); + /* Background brush is only used during sizing, when XEmacs cannot + take over */ + wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1); + wc.lpszMenuName = NULL; + + wc.lpszClassName = XEMACS_CLASS; + wc.hIconSm = LoadImage (GetModuleHandle (NULL), XEMACS_CLASS, + IMAGE_ICON, 16, 16, 0); + RegisterClassEx (&wc); + +#ifdef HAVE_WIDGETS + xzero (wc); + /* Register the main window class */ + wc.cbSize = sizeof (WNDCLASSEX); + wc.lpfnWndProc = (WNDPROC) mswindows_control_wnd_proc; + wc.lpszClassName = XEMACS_CONTROL_CLASS; + wc.hInstance = NULL; + RegisterClassEx (&wc); +#endif + +#ifdef HAVE_TOOLBARS + InitCommonControls (); +#endif +} + +static void +mswindows_finish_init_device (struct device *d, Lisp_Object props) +{ + /* Initialize DDE management library and our related globals. We execute a + * dde Open("file") by simulating a drop, so this depends on dnd support. */ +#ifdef HAVE_DRAGNDROP + mswindows_dde_mlid = 0; + DdeInitialize (&mswindows_dde_mlid, (PFNCALLBACK)mswindows_dde_callback, + APPCMD_FILTERINITS|CBF_FAIL_SELFCONNECTIONS|CBF_FAIL_ADVISES| + CBF_FAIL_POKES|CBF_FAIL_REQUESTS|CBF_SKIP_ALLNOTIFICATIONS, 0); + + mswindows_dde_service = DdeCreateStringHandle (mswindows_dde_mlid, XEMACS_CLASS, 0); + mswindows_dde_topic_system = DdeCreateStringHandle (mswindows_dde_mlid, SZDDESYS_TOPIC, 0); + mswindows_dde_item_open = DdeCreateStringHandle (mswindows_dde_mlid, + TEXT(MSWINDOWS_DDE_ITEM_OPEN), 0); + DdeNameService (mswindows_dde_mlid, mswindows_dde_service, 0L, DNS_REGISTER); +#endif +} + +static void +mswindows_delete_device (struct device *d) +{ + struct mswindows_font_enum *fontlist, *next; + + fontlist = DEVICE_MSWINDOWS_FONTLIST (d); + while (fontlist) + { + next = fontlist->next; + free (fontlist); + fontlist = next; + } + +#ifdef HAVE_DRAGNDROP + DdeNameService (mswindows_dde_mlid, 0L, 0L, DNS_REGISTER); + DdeUninitialize (mswindows_dde_mlid); +#endif + + free (d->device_data); +} + +static Lisp_Object +mswindows_device_system_metrics (struct device *d, + enum device_metrics m) +{ + switch (m) + { + case DM_size_device: + return Fcons (make_int (DEVICE_MSWINDOWS_HORZRES(d)), + make_int (DEVICE_MSWINDOWS_VERTRES(d))); + break; + case DM_size_device_mm: + return Fcons (make_int (DEVICE_MSWINDOWS_HORZSIZE(d)), + make_int (DEVICE_MSWINDOWS_VERTSIZE(d))); + break; + case DM_num_bit_planes: + /* this is what X means by bitplanes therefore we ought to be + consistent. num planes is always 1 under mswindows and + therefore useless */ + return make_int (DEVICE_MSWINDOWS_BITSPIXEL(d)); + break; + case DM_num_color_cells: + return make_int (DEVICE_MSWINDOWS_CELLS(d)); + break; + + /*** Colors ***/ +#define FROB(met, index1, index2) \ + case DM_##met: \ + return build_syscolor_cons (index1, index2); + + FROB (color_default, COLOR_WINDOW, COLOR_WINDOWTEXT); + FROB (color_select, COLOR_HIGHLIGHT, COLOR_HIGHLIGHTTEXT); + FROB (color_balloon, COLOR_INFOBK, COLOR_INFOTEXT); + FROB (color_3d_face, COLOR_3DFACE, COLOR_BTNTEXT); + FROB (color_3d_light, COLOR_3DLIGHT, COLOR_3DHILIGHT); + FROB (color_3d_dark, COLOR_3DSHADOW, COLOR_3DDKSHADOW); + FROB (color_menu, COLOR_MENU, COLOR_MENUTEXT); + FROB (color_menu_highlight, COLOR_HIGHLIGHT, COLOR_HIGHLIGHTTEXT); + FROB (color_menu_button, COLOR_MENU, COLOR_MENUTEXT); + FROB (color_menu_disabled, COLOR_MENU, COLOR_GRAYTEXT); + FROB (color_toolbar, COLOR_BTNFACE, COLOR_BTNTEXT); + FROB (color_scrollbar, COLOR_SCROLLBAR, COLOR_CAPTIONTEXT); + FROB (color_desktop, -1, COLOR_DESKTOP); + FROB (color_workspace, -1, COLOR_APPWORKSPACE); +#undef FROB + + /*** Sizes ***/ +#define FROB(met, index1, index2) \ + case DM_##met: \ + return build_sysmetrics_cons (index1, index2); + + FROB (size_cursor, SM_CXCURSOR, SM_CYCURSOR); + FROB (size_scrollbar, SM_CXVSCROLL, SM_CYHSCROLL); + FROB (size_menu, -1, SM_CYMENU); + FROB (size_icon, SM_CXICON, SM_CYICON); + FROB (size_icon_small, SM_CXSMICON, SM_CYSMICON); +#undef FROB + + case DM_size_workspace: + { + RECT rc; + SystemParametersInfo (SPI_GETWORKAREA, 0, &rc, 0); + return Fcons (make_int (rc.right - rc.left), + make_int (rc.bottom - rc.top)); + } + /* + case DM_size_toolbar: + case DM_size_toolbar_button: + case DM_size_toolbar_border: + */ + + /*** Features ***/ +#define FROB(met, index) \ + case DM_##met: \ + return make_int (GetSystemMetrics (index)); + + FROB (mouse_buttons, SM_CMOUSEBUTTONS); + FROB (swap_buttons, SM_SWAPBUTTON); + FROB (show_sounds, SM_SHOWSOUNDS); + FROB (slow_device, SM_SLOWMACHINE); + FROB (security, SM_SECURE); +#undef FROB + + } + + /* Do not know such property */ + return Qunbound; +} + +static unsigned int +mswindows_device_implementation_flags (void) +{ + return XDEVIMPF_PIXEL_GEOMETRY; +} + + +/************************************************************************/ +/* initialization */ +/************************************************************************/ + +void +syms_of_device_mswindows (void) +{ + defsymbol (&Qinit_pre_mswindows_win, "init-pre-mswindows-win"); + defsymbol (&Qinit_post_mswindows_win, "init-post-mswindows-win"); +} + +void +console_type_create_device_mswindows (void) +{ + CONSOLE_HAS_METHOD (mswindows, init_device); + CONSOLE_HAS_METHOD (mswindows, finish_init_device); +/* CONSOLE_HAS_METHOD (mswindows, mark_device); */ + CONSOLE_HAS_METHOD (mswindows, delete_device); + CONSOLE_HAS_METHOD (mswindows, device_system_metrics); + CONSOLE_HAS_METHOD (mswindows, device_implementation_flags); +} + +void +vars_of_device_mswindows (void) +{ + DEFVAR_LISP ("mswindows-downcase-file-names", &Vmswindows_downcase_file_names /* +Non-nil means convert all-upper case file names to lower case. +This applies when performing completions and file name expansion. +*/ ); + Vmswindows_downcase_file_names = Qnil; + + DEFVAR_LISP ("mswindows-get-true-file-attributes", &Vmswindows_get_true_file_attributes /* +Non-nil means determine accurate link count in file-attributes. +This option slows down file-attributes noticeably, so is disabled by +default. Note that it is only useful for files on NTFS volumes, +where hard links are supported. +*/ ); + Vmswindows_get_true_file_attributes = Qnil; +}