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でくくったから影響も限定的だろうと。
最近痛感しているんだが、オープンソースってやっぱり最高。