|
sylpheed-jp:360
From: "Hiramatu, Masami" <zero@xxxxxxxxxx>
こんにちは、Zerow_jpです。
前回のpatchで不十分だった点がありまして、ドキュメントなどが本家にも
ないようなのでここに書きますが、
gdk_window_get_origin()
widgetそのもののwindowの左上端の座標を得る。
gdk_window_get_root_origin()
widgetの外枠であるwmの管理するwindowの左上の座標を得る。
gdk_window_get_deskrelative_origin()
?)get_originとほとんど一緒。X11の仮想解像度向け?
いろいろ試してみた結果、上のような動作をすることが確認できました。
それで、widgetを移動させる場合をみますと、
gtk_widget_set_uposition()
widgetの外枠であるwmの管理するwindowの左上の座標を設定する。
ただし、一度gtk_widget_hide()して、gtk_widget_showしないと反映されない。
また、アイコン化されているときは、widgetそのものの左上の座標を設定する。
gdk_window_move()
widgetそのものの左上端の座標を設定する。
という違いがあるようです。(sawmill上にて確認)
また、一部wm(sawmill等)の中に仮想ワークスペースと呼ばれる機能があり、
これを使用した場合、get_hogehoge_originでとって来た座標位置が負の値に
なったり、実際の画面の解像度より大きくなる場合があります。この状態だと
popupをかけても今見ている画面に表示されないので、gtk_screen_width/height
で得た解像度を利用して、現在見ている画面上に表示させる工夫が必要に
なります。
-----
--- mainwindow.c.orig Sun Feb 4 12:00:49 2001
+++ mainwindow.c Sun Feb 4 12:07:25 2001
@@ -1036,8 +1036,12 @@
gint x, y;
gint sx, sy;
GtkWidget *widget;
-
- gtkut_widget_get_uposition(mainwin->window, &x, &y);
+ sx = gdk_screen_width();
+ sy = gdk_screen_height();
+
+ gdk_window_get_origin(mainwin->window->window, &x, &y);
+ x %= sx; if(x < 0) x += sx;
+ y %= sy; if(y < 0) y += sy;
gdk_window_move(mainwin->window->window, x, y);
gdk_window_raise(mainwin->window->window);
@@ -1046,23 +1050,31 @@
switch (mainwin->type) {
case SEPARATE_FOLDER:
widget = mainwin->win.sep_folder.folderwin;
- gdk_window_get_deskrelative_origin(widget->window, &x, &y);
+ gdk_window_get_origin(widget->window, &x, &y);
+ x %= sx; if(x < 0) x += sx;
+ y %= sy; if(y < 0) y += sy;
gdk_window_move(widget->window, x, y);
gdk_window_raise(widget->window);
break;
case SEPARATE_MESSAGE:
widget = mainwin->win.sep_message.messagewin;
- gdk_window_get_deskrelative_origin(widget->window, &x, &y);
+ gdk_window_get_origin(widget->window, &x, &y);
+ x %= sx; if(x < 0) x += sx;
+ y %= sy; if(y < 0) y += sy;
gdk_window_move(widget->window, x, y);
gdk_window_raise(widget->window);
break;
case SEPARATE_BOTH:
widget = mainwin->win.sep_both.folderwin;
- gdk_window_get_deskrelative_origin(widget->window, &x, &y);
+ gdk_window_get_origin(widget->window, &x, &y);
+ x %= sx; if(x < 0) x += sx;
+ y %= sy; if(y < 0) y += sy;
gdk_window_move(widget->window, x, y);
gdk_window_raise(widget->window);
widget = mainwin->win.sep_both.messagewin;
- gdk_window_get_deskrelative_origin(widget->window, &x, &y);
+ gdk_window_get_origin(widget->window, &x, &y);
+ x %= sx; if(x < 0) x += sx;
+ y %= sy; if(y < 0) y += sy;
gdk_window_move(widget->window, x, y);
gdk_window_raise(widget->window);
break;
-----
--
Zerow_jp (平松 雅巳)
Zerow_jp <zero@xxxxxxxxxx>
|