2017-04-26 37 views
2

請幫助這個初學者的程序獲取gdk屏幕屬性。我有一個小型C++程序來查找連接的顯示單元。我在Linux Debian上使用C++。 gdk_screen_get_default()不返回Screen對象。如果我不檢查屏幕對象,則會發生以下錯誤。gdk_screen_get_default()返回null

錯誤 (進程:8023):GDK-CRITICAL **:gdk_screen_get_monitor_geometry:斷言 'GDK_IS_SCREEN(屏幕)' 失敗

我通過相關帖子去了,簡稱爲this以下代碼片段。

感謝您的幫助。任何解決此問題的指針/指南都會有所幫助。

我有一臺顯示器連接和顯示設置

$ echo $XDG_CURRENT_DESKTOP 
GNOME 

$ echo $DISPLAY 
:0 

CODE

#include <gdk/gdk.h> 
    #include <iostream> 

    /* 
    GTK version 3.14.5 
    g++ getScreenInfo.cpp -o getScreenInfo `pkg-config gtk+-3.0 --cflags --libs` 
    */ 

    int main() 
    { 
     GdkScreen *screen; 
     screen = gdk_screen_get_default();   
     int num_monitors; 
     int i; 

     if (screen) 
     { 
      num_monitors = gdk_screen_get_n_monitors(screen); 

      for (i = 0; i < num_monitors; i++) 
      { 
       GdkRectangle rect; 
       gdk_screen_get_monitor_geometry (screen, i, &rect); 
       std::cout << "monitor " << i << ": coordinates (" << rect.x << "," 
       << rect.y << ", size (" << rect.width << "," << rect.height << ")" 
       << std::endl; 
      } 
     }else 
     { 
      std::cout << "Couldn't obtain default screen object" << std::endl; 
     } 
    } 

2017年4月27日編輯:議決

#include <iostream> 
    #include <gdk/gdk.h> 
    #include <gtk/gtk.h> 

    /* 
    GTK version 3.14.5 

    To compile: 

    g++ getScreenInfo.cpp -o getScreenInfo `pkg-config gtk+-3.0 --cflags --libs` 

    */ 

    int main(int argc, char *argv[]) 
    { 
    gtk_init(&argc, &argv); 

    GdkScreen *screen = gdk_screen_get_default(); 



    int num_monitors; 
    int i; 

    if (screen) 
    { 
     num_monitors = gdk_screen_get_n_monitors(screen); 

     for (i = 0; i < num_monitors; i++) 
     { 
      GdkRectangle rect; 
      gdk_screen_get_monitor_geometry (screen, i, &rect); 
      std::cout << "monitor " << i << ": offsets (" << rect.x << "," 
      << rect.y << ", size (" << rect.width << "," << rect.height << ")" 
      << std::endl; 
     } 
    } 
    else 
    { 
     std::cout << "Couldn't obtain default screen object" << std::endl; 
    } 

    // To query primary display properties 

    guint monitor = gdk_screen_get_primary_monitor(screen); 
    GdkRectangle screen_geometry = { 0, 0, 0, 0 }; 
    gdk_screen_get_monitor_geometry(screen, monitor, &screen_geometry); 
    std::cout << screen_geometry.x << std::endl; 
    std::cout << screen_geometry.y << std::endl; 
    std::cout << screen_geometry.width << std::endl; 
    std::cout << screen_geometry.height << std::endl; 
    } 
+1

請將問題標記爲接受而不是編輯標題。謝謝! :) – Alfabravo

回答

2

回答我的問題。

最後,想出了決議。在獲取屏幕前,gtk_init()缺失。補充說明並分別包含gtk/gtk.h和現在的代碼看起來像

int main(int argc, char *argv[]) 
{ 
    gtk_init(&argc, &argv);     // <---- added this 

    GdkScreen *screen = gdk_screen_get_default(); 

    : 
    followed by rest of the code shared in the problem description above.