gdk_screen_get_default() возвращает ноль

Пожалуйста, помогите с этой программой для начинающих для получения атрибутов экрана gdk. У меня есть небольшая программа на C++ для определения подключенных дисплеев. Я использую С++ на Linux Debian. gdk_screen_get_default() не возвращает объект Screen. Если я не проверяю объект экрана, возникает следующая ошибка.

Ошибка (процесс: 8023): Gdk-CRITICAL **: gdk_screen_get_monitor_geometry: утверждение «GDK_IS_SCREEN (экран)» не удалось

Я просмотрел связанные сообщения и сослался на это для приведенного ниже фрагмента кода.

Спасибо за вашу помощь. Любые указатели/рекомендации по решению этой проблемы будут полезны.

У меня подключен один монитор и настройки дисплея

$ echo $XDG_CURRENT_DESKTOP
GNOME

$ echo $DISPLAY
:0

КОД

    #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;
        }
    }

27 апреля 2017 г. ИЗМЕНЕНИЕ: РЕШЕНО

  #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;
  }

person PaperMoon    schedule 26.04.2017    source источник
comment
Пожалуйста, отметьте вопрос как принятый вместо того, чтобы редактировать заголовок. Спасибо! :)   -  person Alfabravo    schedule 07.06.2017


Ответы (1)


Отвечая на мой собственный вопрос.

Наконец-то разобрался с разрешением. 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. 
person PaperMoon    schedule 27.04.2017