Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: libxrandr: изменение параметров подключенных мониторов  (Прочитано 1156 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Пишу приложение на C++/Qt со следующим функционалом: установить разрешение и ориентацию для монитора. все ок работает, написал. однако стала задача расширить функционал и включить поддержку двух мониторов.
что именно надо:
1) определить подключенные мониторы
2) установить для каждого свое разрешение
3) установить для каждого свою ориентацию

подскажите как это сделать
« Последнее редактирование: 02 Марта 2013, 20:30:27 от FluffyMan »

Оффлайн quiet_readonly

  • Участник
  • *
  • Сообщений: 133
    • Просмотр профиля
Сердцем чую, XRRSetScreenSize и XRRSetScreenConfig это. Число дисплеев можно получить с помощью Xinerama (#include <X11/extensions/Xinerama.h>), вызов XineramaQueryScreens.

Использование этих вызовов можно глянуть на github или сделать бочку apt-get source kde-workspace-bin, после чего найти распаковать скачанный архив с исходниками и найти там модуль kcm_display (QtCreator и KDevelop оба могут открывать CMakeLists.txt как проект).

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
в XRRSetScreenConfig нет параметра, отвечающего за расположение экрана относительно другого экрана(

Оффлайн quiet_readonly

  • Участник
  • *
  • Сообщений: 133
    • Просмотр профиля
в XRRSetScreenConfig нет параметра, отвечающего за расположение экрана относительно другого экрана(
Хм, тогда не знаю. Можно пошуровать среди расширений X11 (#include <X11/extensions/*>) или спросить на stackoverflow.

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
а вообще мою задачу какими путями еще можно выполнить? кроме как с помощью либы xrandr?
« Последнее редактирование: 03 Марта 2013, 16:39:26 от FluffyMan »

Оффлайн quiet_readonly

  • Участник
  • *
  • Сообщений: 133
    • Просмотр профиля
а вообще мою задачу какими путями еще можно выполнить? кроме как с помощью либы xrandr?
С помощью gdk можно прочитать информацию о дисплеях, здесь упоминалось.

В остальном - понятия не имею.

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
ясно, спасибо. буду осваивать забугорный stackoverflow :)

Пользователь решил продолжить мысль 03 Марта 2013, 21:12:03:
нашел исходники утилиты xrandr, которая, собственно и использует libxrandr. но никак не могу разобраться в ней. может быть Вы поможете? хотя бы куда смотреть?

исходник прикрепил

Пользователь решил продолжить мысль 04 Марта 2013, 12:36:51:
нашел небольшой мануал на эту тему, однако из него непонятно, как все таки изменить параметры ОТДЕЛЬНО ВЗЯТОГО монитора - http://www.opengl.org/wiki/Programming_OpenGL_in_Linux:_Changing_the_Screen_Resolution

помогите разобраться
« Последнее редактирование: 04 Марта 2013, 12:36:51 от FluffyMan »

Оффлайн FluffyMan

  • Автор темы
  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
решено. изменить положение, ориентацию и режим (из списка определившихся разрешений) можно так:
XRROutputInfo *output_first_info = XRRGetOutputInfo(dpy, sr, sr->outputs[X]);
XRRSetCrtcConfig(dpy, sr, output_first_info->crtc, CurrentTime, XM, YM, sr->modes[M].id, R, &sr->outputs[X], 1);

где X - номер монитора, параметры которого меняем
XM, YM - координаты расположения в виртуальном экране
M - номер режима

получить список всех известных режимов для каждого из подключенных мониторов можно так:
       int jj = 0;
        for (int i = 0; i < sr->noutput; i++)
        {
            XRROutputInfo *output_info = XRRGetOutputInfo (dpy, sr, sr->outputs[i]);
            XRRCrtcInfo *crtc_info = XRRGetCrtcInfo(dpy, sr, output_info->crtc);

            for (int j = jj; j < output_info->nmode; j++)
            {
                qDebug() << output_info->name << sr->modes[j].name << j;

                jj++;
            }
        }

 

Страница сгенерирована за 0.077 секунд. Запросов: 25.