[前][次][番号順一覧][スレッド一覧]

sylpheed-jp:360

From: "Hiramatu, Masami" <zero@xxxxxxxxxx>
Date: Sun, 4 Feb 2001 12:54:12 +0900
Subject: [sylpheed-jp:00360] gdk_window_hogehoge_origin の動作

こんにちは、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>


[前][次][番号順一覧][スレッド一覧]