X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=src%2Fdevice-msw.c;h=62536b7e5dffd0bc079b9870531d8855b8ec1d82;hp=c1bc745f329031669a595d048cea6f829359bccd;hb=14ac73276fa152e8f0b74602792afc0b9c3236c9;hpb=02f4d2761a98c5cb9d5b423d2361160a5d8c9ee4 diff --git a/src/device-msw.c b/src/device-msw.c index c1bc745..62536b7 100644 --- a/src/device-msw.c +++ b/src/device-msw.c @@ -50,6 +50,7 @@ Boston, MA 02111-1307, USA. */ /* win32 DDE management library globals */ #ifdef HAVE_DRAGNDROP DWORD mswindows_dde_mlid; +int mswindows_dde_enable; HSZ mswindows_dde_service; HSZ mswindows_dde_topic_system; HSZ mswindows_dde_item_open; @@ -179,17 +180,18 @@ mswindows_init_device (struct device *d, Lisp_Object props) #endif } +#ifdef HAVE_DRAGNDROP static void -mswindows_finish_init_device (struct device *d, Lisp_Object props) +mswindows_init_dde () { /* 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 # if !(defined(CYGWIN) || defined(MINGW)) CoInitialize (NULL); # endif mswindows_dde_mlid = 0; + mswindows_dde_enable = 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, @@ -202,6 +204,27 @@ mswindows_finish_init_device (struct device *d, Lisp_Object props) 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 + +void +init_mswindows_very_early() +{ +#ifdef HAVE_DRAGNDROP + /* Initializing dde when the device is created is too late - the + client will give up waiting. Instead we initialize here and tell + the client we're too busy until the rest of initialization has + happened. */ + mswindows_init_dde(); +#endif +} + +static void +mswindows_finish_init_device (struct device *d, Lisp_Object props) +{ +#ifdef HAVE_DRAGNDROP + /* Tell pending clients we are ready. */ + mswindows_dde_enable = 1; #endif } @@ -340,12 +363,6 @@ mswindows_device_system_metrics (struct device *d, return Qunbound; } -static unsigned int -mswindows_device_implementation_flags (void) -{ - return XDEVIMPF_PIXEL_GEOMETRY; -} - /************************************************************************/ /* printer helpers */ @@ -533,14 +550,6 @@ msprinter_mark_device (struct device *d) mark_object (DEVICE_MSPRINTER_DEVMODE (d)); } -static unsigned int -msprinter_device_implementation_flags (void) -{ - return ( XDEVIMPF_PIXEL_GEOMETRY - | XDEVIMPF_IS_A_PRINTER - | XDEVIMPF_NO_AUTO_REDISPLAY - | XDEVIMPF_FRAMELESS_OK ); -} /************************************************************************/ /* printer Lisp subroutines */ @@ -795,25 +804,25 @@ mswindows_get_default_margin (Lisp_Object prop) if (EQ (prop, Qright_margin)) return 1440; if (EQ (prop, Qtop_margin)) return 720; if (EQ (prop, Qbottom_margin)) return 720; - abort (); + ABORT (); return 0; } static int -plist_get_margin (Lisp_Object plist, Lisp_Object prop) +plist_get_margin (Lisp_Object plist, Lisp_Object prop, int mm_p) { Lisp_Object val = Fplist_get (plist, prop, make_int (mswindows_get_default_margin (prop))); if (!INTP (val)) invalid_argument ("Margin value must be an integer", val); - return MulDiv (XINT (val), 100, 144); + return MulDiv (XINT (val), mm_p ? 254 : 100, 144); } static Lisp_Object plist_set_margin (Lisp_Object plist, Lisp_Object prop, int margin, int mm_p) { - Lisp_Object val = make_int (MulDiv (margin, 144, mm_p ? 2450 : 100)); + Lisp_Object val = make_int (MulDiv (margin, 144, mm_p ? 254 : 100)); return Fcons (prop, Fcons (val, plist)); } @@ -857,15 +866,21 @@ mswindows_handle_page_setup_dialog_box (struct frame *f, Lisp_Object keys) { Lisp_Devmode *ldm = decode_devmode (device); PAGESETUPDLG pd; + TCHAR measure[2]; + int data; + + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_IMEASURE, + measure, sizeof(measure)); + data = (strcmp (measure, "0")); memset (&pd, 0, sizeof (pd)); pd.lStructSize = sizeof (pd); pd.hwndOwner = mswindows_get_selected_frame_hwnd (); pd.Flags = PSD_MARGINS; - pd.rtMargin.left = plist_get_margin (plist, Qleft_margin); - pd.rtMargin.top = plist_get_margin (plist, Qtop_margin); - pd.rtMargin.right = plist_get_margin (plist, Qright_margin); - pd.rtMargin.bottom = plist_get_margin (plist, Qbottom_margin); + pd.rtMargin.left = plist_get_margin (plist, Qleft_margin, !data); + pd.rtMargin.top = plist_get_margin (plist, Qtop_margin, !data); + pd.rtMargin.right = plist_get_margin (plist, Qright_margin, !data); + pd.rtMargin.bottom = plist_get_margin (plist, Qbottom_margin, !data); pd.hDevMode = devmode_to_hglobal (ldm); if (!PageSetupDlg (&pd)) @@ -1304,13 +1319,17 @@ console_type_create_device_mswindows (void) 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); + CONSOLE_IMPLEMENTATION_FLAGS (mswindows, XDEVIMPF_PIXEL_GEOMETRY); CONSOLE_HAS_METHOD (msprinter, init_device); CONSOLE_HAS_METHOD (msprinter, mark_device); CONSOLE_HAS_METHOD (msprinter, delete_device); CONSOLE_HAS_METHOD (msprinter, device_system_metrics); - CONSOLE_HAS_METHOD (msprinter, device_implementation_flags); + CONSOLE_IMPLEMENTATION_FLAGS (msprinter, (XDEVIMPF_PIXEL_GEOMETRY + | XDEVIMPF_IS_A_PRINTER + | XDEVIMPF_NO_AUTO_REDISPLAY + | XDEVIMPF_DONT_PREEMPT_REDISPLAY + | XDEVIMPF_FRAMELESS_OK)); }