poedit for Mac OS Xの不具合

DocBookからxml2poでpotファイルを作って、poeditでpoを翻訳しているんだけど、職場も自宅もデュアルヘッド環境で作業をしているので、サブモニタにウインドウを開いたまま終了すると、例えば電車の中でMacBookの内蔵モニタで作業をしようとすると、ウインドウが無いはずのサブモニタに表示される=どこかに行っちゃう。そしてどうやっても内蔵モニタに表示出来ない。

~/Library/Preferences/net.poedit.Poedit.cfgを見ると、

frame_x=1427
frame_y=33

とか記録されていて、1280しかwidthの無いMacBookではこりゃあかんわ、ということになる。

さて、コード。

poedit-1.4.1/src/edframe.cpp
537     // NB: setting the position & size has to be the last thing done, otherwise
538     //     it's not done correctly on wxMac:
539     int posx = cfg->Read(_T("frame_x"), -1);
540     int posy = cfg->Read(_T("frame_y"), -1);
541     int width = cfg->Read(_T("frame_w"), 780);
542     int height = cfg->Read(_T("frame_h"), 570);
543 
544     // NB: if this is the only Poedit frame opened, place it at remembered
545     //     position, but don't do that if there already are other frames,
546     //     because they would overlap and nobody could recognize that there are
547     //     many of them
548     if (ms_instances.GetCount() == 0)
549         Move(posx, posy);
550     SetClientSize(width, height);
551     if (cfg->Read(_T("frame_maximized"), long(0)))
552         Maximize();

やっぱり、記録されたposxとposyを読み出して、そのままMove()してやがる…。

じゃあ、修正。

diff -u src/edframe.cpp.orig src/edframe.cpp
--- src/edframe.cpp.orig	2008-04-05 22:16:40.000000000 +0900
+++ src/edframe.cpp	2008-08-16 23:27:58.000000000 +0900
@@ -48,6 +48,9 @@
 #include <wx/aboutdlg.h>
 #include <wx/iconbndl.h>
 #include <wx/clipbrd.h>
+#ifdef __WXMAC__
+#include <wx/display.h>
+#endif
 
 #ifdef USE_SPELLCHECKING
 
@@ -546,7 +549,28 @@
     //     because they would overlap and nobody could recognize that there are
     //     many of them
     if (ms_instances.GetCount() == 0)
+#ifdef __WXMAC__
+        // if a system has dual-head, recorded posx/posy will be larger than sum_width/sum_height
+        // when the system is configured with single-head. e.g. MacBook with external display
+        {
+            int sum_width = 0;
+            int sum_height = 0;
+            for (unsigned int i = 0; i < wxDisplay::GetCount(); i++)
+            {
+                wxDisplay display(i);
+                wxRect rect = display.GetGeometry();
+                sum_width += (int)rect.width;
+                sum_height += (int)rect.height;
+            }
+            if (posx > sum_width)
+                posx = sum_width - 100;
+            if (posy > sum_height)
+                posy = sum_height - 100;
+#endif
         Move(posx, posy);
+#ifdef __WXMAC__
+        }
+#endif
     SetClientSize(width, height);
     if (cfg->Read(_T("frame_maximized"), long(0)))
         Maximize();

poeditのお作法は分からないしcppもいまいち分かってないので適当だけど、おかしかったら誰か直してくれるだろ(^^ゞ
自分のマシンではこれで直ったし、#ifdefでくくったから影響も限定的だろうと。

最近痛感しているんだが、オープンソースってやっぱり最高。

タイトルとURLをコピーしました