2009-05-07 17 views
4

GNOMEの複数の画面に複数の壁紙を表示するための小さなプロジェクトを開発中です。 GNOME自体や他の何かによって行われます)。私はそれの主要な部分をどうやって行うのかを考え出しました(ImageMagickコンポーネントを使って、好奇心をそそる)。私は設定システムを自動化しようとしています。Linuxでの画面の幅と高さをプログラムで確認する(Xinerama、TwinView、BigDesktop)

これを行うには、個々の画面のサイズを判断する方法が必要です。誰かが私にそれを探すためのヒントを与えることができますか?私はXサーバ自体に情報があると推測しますが、私のプログラムがどのようにそれを求めることができるのか分かりません。

+0

wallpapozは、あなたが開発しているものを行うことができます。 http://wallpapoz.akbarhome.com/ – dmityugov

答えて

6

この情報を取得できるのは libXinerama APIのようです。私はそれについての詳細な情報はまだ見つけていない。

一般的なX.orgのプログラミング情報はhere(PDFファイル)です。 libXineramaによって提供される機能に関する情報は、here(オンラインマニュアルページであり、多くの情報は含まれていません)に記載されています。

ここでは、Xineramaに接続された各モニタのディメンションとオフセットを取得するために、これらのリファレンスから取り上げた小さなC++プログラムを示します。 nVidia TwinViewでも動作します。私は現在、BigDesktopシステムでそれをテストするATIカードを持っていませんが、それもうまくいくと思います。

#include <cstdlib> 
#include <iostream> 

#include <X11/extensions/Xinerama.h> 

using std::cout; 
using std::endl; 

int main(int argc, char *argv[]) { 
    bool success=false; 
    Display *d=XOpenDisplay(NULL); 
    if (d) { 
     int dummy1, dummy2; 
     if (XineramaQueryExtension(d, &dummy1, &dummy2)) { 
      if (XineramaIsActive(d)) { 
       int heads=0; 
       XineramaScreenInfo *p=XineramaQueryScreens(d, &heads); 
       if (heads>0) { 
        for (int x=0; x<heads; ++x) 
         cout << "Head " << x+1 << " of " << heads << ": " << 
          p[x].width << "x" << p[x].height << " at " << 
          p[x].x_org << "," << p[x].y_org << endl; 
        success=true; 
       } else cout << "XineramaQueryScreens says there aren't any" << endl; 
       XFree(p); 
      } else cout << "Xinerama not active" << endl; 
     } else cout << "No Xinerama extension" << endl; 
     XCloseDisplay(d); 
    } else cout << "Can't open display" << endl; 

    return (success ? EXIT_SUCCESS : EXIT_FAILURE); 
} 
1

私は常に "xdpyinfo"コマンドを使用して画面サイズを決定します。あなたが外部からこのコマンドを実行して、テキスト処理を経由して寸法をつかむか、あなたはすぐにxdpyinfoのコードをダウンロードできることができますいずれか

screen #0: 
    dimensions: 1280x800 pixels (339x212 millimeters) 
    resolution: 96x96 dots per inch 
    depths (7): 24, 1, 4, 8, 15, 16, 32 
    root window id: 0xac 
    depth of root window: 24 planes 
    ... 

:それは何かのように言うところのために、出力の第二または第三のページを見て、その後、コマンドを実行します。その出力行を生成するC呼び出しをコピーします。がんばろう!

+2

'少なくともツインビューの下では、このトリックをやっていない愚か者。ここで試してみると、スクリーン#0の寸法は、両方のスクリーンの合計寸法です。 –

5

は、内部的にはlibXrandrのAPIを使用しています

GdkScreen *screen; 
int num_monitors; 
int i; 

screen = gdk_screen_get_default(); 
num_monitors = gdk_screen_get_n_monitors(); 

for (i = 0; i < num_monitors; i++) { 
    GdkRectangle rect; 

    gdk_screen_get_monitor_geometry (screen, i, &rect); 
    printf ("monitor %d: offsets (%d, %d), size (%d, %d)\n", 
     i, 
     rect.x, rect.y, 
     rect.width, rect.height); 
} 

のようなものを試してみてください。 Xineramaは多かれ少なかれ廃止されていますが、まだ動作しています。 RANDRこれはツインビューのために働くX.

+0

ありがとう、私はチャンスを持って次回その試してみましょう。 –

+0

こんにちは@HeadGeekとFederico、Linuxに複数のディスプレイがある場合はどうなりますか?このコードはすべてのモニタを取得しますか? 'gdk_screen_get_default'は、デフォルト表示のデフォルト画面を取得します。独自のモニタを持つ他のディスプレイは存在しないのですか? – Noitidart

2

で複数のモニタを処理するための新しい方法ですが、私は他の人をテストしていません:

#!/usr/bin/python 
# Print some information about the X environment, the monitor setup, currently active window and cursor position 
import gtk.gdk 

screen = gtk.gdk.screen_get_default() 
print "X default screen size: %d x %d" % (screen.get_width(), screen.get_height()) 
print "xid of root window: %d" % screen.get_root_window().xid 

monitors = int(screen.get_n_monitors()) 
print "== %d monitors ==" % monitors 
for m in range(0, monitors): 
    print " - geometry of monitor %d: %s" % (m, screen.get_monitor_geometry(m)) 

window = screen.get_active_window() 
win_x, win_y, win_w, win_h, win_bit_depth = window.get_geometry() 
print "active window on monitor: %d" % screen.get_monitor_at_point((win_x+(win_w/2)),(win_y+(win_h/2))) 
print "window geometry (x,y,w,h): %d, %d, %d, %d" % (win_x,win_y,win_w,win_h) 

display = gtk.gdk.display_get_default() 
pointer = display.get_pointer() 
print "cursor position (x, y): %d, %d" % (pointer[1], pointer[2]) 
print "cursor on monitor: %d" % screen.get_monitor_at_point(pointer[1],pointer[2]) 
関連する問題