(g2-UU+5B73): Add `=decomposition@hanyo-denshi'.
[chise/xemacs-chise.git.1] / src / device-msw.c
index c1bc745..62536b7 100644 (file)
@@ -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;
-}
-
 \f
 /************************************************************************/
 /*                          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 );
-}
 \f
 /************************************************************************/
 /*                      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));
 }