Список разрешений в Linux

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Список разрешений в Linux

Сообщение immortal1977 » 07.10.2010 14:03:33

Подскажите пожалуйста, как можно в линуксе получить список всех поддерживаемых разрешений экрана?
Ubuntu 10.04, Lazarus 0.9.28.
immortal1977
новенький
 
Сообщения: 16
Зарегистрирован: 14.07.2008 15:52:23
Откуда: Новоуральск

Re: Список разрешений в Linux

Сообщение coyot.rush » 07.10.2010 18:32:42

яндекс рулит :wink:
Разрешение экрана и частота монитора в Xorg http://www.helplinux.ru/kb:std:xorg-freq
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Список разрешений в Linux

Сообщение immortal1977 » 07.10.2010 19:20:09

Хм... Xorg в данном случае не рулит. У меня в Xorg.conf прописана только максимальное разрешение для моего монитора, однако я могу запустить квагу и выбрать например 640x480. Хотелось бы программное решение :?
immortal1977
новенький
 
Сообщения: 16
Зарегистрирован: 14.07.2008 15:52:23
Откуда: Новоуральск

Re: Список разрешений в Linux

Сообщение .wOvAN » 07.10.2010 21:58:37

:roll: предложу пользоваться нормальными ос.
.wOvAN
постоялец
 
Сообщения: 118
Зарегистрирован: 16.04.2010 06:36:12

Re: Список разрешений в Linux

Сообщение coyot.rush » 07.10.2010 22:12:01

Хм... Xorg в данном случае не рулит. У меня в Xorg.conf прописана только максимальное разрешение для моего монитора, однако я могу запустить квагу и выбрать например 640x480. Хотелось бы программное решение :?

Програмное решение есть у betatester .

Оффтопик
:roll: предложу пользоваться нормальными ос


Чем же Linux, не нормален :?:
Имхо по мне Win7 копипастили с Linux and BSD :twisted:
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Список разрешений в Linux

Сообщение Mr.Smart » 07.10.2010 22:21:07

Offtop
coyot.rush
И в чём же, по вашему, эта копипаста заключается?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Список разрешений в Linux

Сообщение Padre_Mortius » 07.10.2010 22:32:29

.wOvAN
список "нормальных ос" можно увидеть? )

А вообще стоит посмотреть на udev, на данный момент он отвечает за железо в большинстве дистрибутивов
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Список разрешений в Linux

Сообщение Sergei I. Gorelkin » 07.10.2010 22:56:20

За разрешение экрана в иксах отвечает расширение XRandR. Практически наверняка оно рулится и через hal/dbus, надо только разобраться какие методы и с какими параметрами вызывать...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Список разрешений в Linux

Сообщение hinst » 07.10.2010 23:13:35

Win7 - нет такой операционной системы. есть Windows Seven
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Список разрешений в Linux

Сообщение B4rr4cuda » 08.10.2010 01:28:48

Ух ты! холивар)))
immortal1977, можно запустить xrandr без параметров и отпарсить вывод.. все поддерживаемые монитором(ами) разрешения будут выведены в столбец, вместе с частотами и прочей инфой.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Список разрешений в Linux

Сообщение coyot.rush » 08.10.2010 11:01:19

Offtop
coyot.rush
И в чём же, по вашему, эта копипаста заключается?

Имхо, в семерке как в Llinux+X Window System графическая подсистема вынесена из Ring0 в Ring3 (DirectX10,11). Есть даже менеджер окон 8)
Есть монтирование дисков...
Win7 - нет такой операционной системы. есть Windows Seven

Может и так , но она идет как NT 6.1 а виста как NT 6.0 Это все лишь хитрый ход M$
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Список разрешений в Linux

Сообщение immortal1977 » 08.10.2010 11:31:37

B4rr4cuda писал(а):Ух ты! холивар)))
immortal1977, можно запустить xrandr без параметров и отпарсить вывод.. все поддерживаемые монитором(ами) разрешения будут выведены в столбец, вместе с частотами и прочей инфой.


Про XRandR я знаю, к сожалению не подходит. Как я уже сказал, в Xorg.conf у меня только максимальное разрешение, да еще включен по дефолту TwinView, и того:
Screen 0: minimum 1680 x 1050, current 2704 x 1050, maximum 2704 x 1050, т.е. за максимальное разрешение по горизонтали посчиталась сумма двух рабочих столов, что не есть гуд.

ЗЫ.
.wOvAN писал(а):предложу пользоваться нормальными ос.

Уже пользуюсь :) Ubuntu 10.04LTS единственная ос на винте :D
immortal1977
новенький
 
Сообщения: 16
Зарегистрирован: 14.07.2008 15:52:23
Откуда: Новоуральск

Re: Список разрешений в Linux

Сообщение Andru » 08.10.2010 16:26:49

да еще включен по дефолту TwinView

Проблема в том, что программисты NVidia хоть и справляются с реализацией OpenGL в своем драйвере, но поддержка пр. технологий в Linux у них полное говно. Извечное забивание на XRandR, одна из "фич".

Есть два способа получить список разрешений - XRandR и xf86vmode. Второй требует установку доп. библиотеки(и dev-пакета под вашими убунтами). Хотя вроде бы стоит по умолчанию во многих дистрибутивах.
Способ №1:
Код: Выделить всё
uses
  X, XLib, XUtil, XRandr;

type
  zglPResolutionList = ^zglTResolutionList;
  zglTResolutionList = record
    Count  : Integer;
    Width  : array of Integer;
    Height : array of Integer;
end;

var
  scr_ResList   : zglTResolutionList;
  scr_Display   : PDisplay;
  scr_ModeCount : LongInt;
  scr_ModeList  : PXRRScreenSize;
  wnd_Root      : TWindow;

procedure scr_GetResList;
  var
    i : Integer;
    tmp_Settings : PXRRScreenSize;
  function Already( Width, Height : Integer ) : Boolean;
    var
      j : Integer;
  begin
    Result := FALSE;
    for j := 0 to scr_ResList.Count - 1 do
      if ( scr_ResList.Width[ j ] = Width ) and ( scr_ResList.Height[ j ] = Height ) Then Result := TRUE;
  end;
begin
  tmp_Settings := scr_ModeList;
  for i := 0 to scr_ModeCount - 1 do
    begin
      if not Already( tmp_Settings.Width, tmp_Settings.Height ) Then
        begin
          INC( scr_ResList.Count );
          SetLength( scr_ResList.Width, scr_ResList.Count );
          SetLength( scr_ResList.Height, scr_ResList.Count );
          scr_ResList.Width[ scr_ResList.Count - 1 ]  := tmp_Settings.Width;
          scr_ResList.Height[ scr_ResList.Count - 1 ] := tmp_Settings.Height;
        end;
      INC( tmp_Settings );
    end;
end;

  // Где-то в коде
  scr_Display := XOpenDisplay( nil );
  wnd_Root    := DefaultRootWindow( scr_Display );
  scr_ModeList := XRRSizes( scr_Display, XRRRootToScreen( scr_Display, wnd_Root ), @scr_ModeCount );
  scr_GetResList();
  // Потом список дергаем из scr_ResList


Способ №2:
Код: Выделить всё
uses
  X, XLib, XUtil, xf86vmode, UnixType;

type
  zglPResolutionList = ^zglTResolutionList;
  zglTResolutionList = record
    Count  : Integer;
    Width  : array of Integer;
    Height : array of Integer;
end;

var
  scr_ResList   : zglTResolutionList;
  scr_Display   : PDisplay;
  scr_Default   : cint;
  scr_ModeCount : LongWord;
  scr_ModeList  : PPXF86VidModeModeInfo;

procedure scr_GetResList;
  var
    i : Integer;
    tmp_Settings : TXF86VidModeModeInfo;
  function Already( Width, Height : Integer ) : Boolean;
    var
      j : Integer;
  begin
    Result := FALSE;
    for j := 0 to scr_ResList.Count - 1 do
      if ( scr_ResList.Width[ j ] = Width ) and ( scr_ResList.Height[ j ] = Height ) Then Result := TRUE;
  end;
begin
  for i := 0 to scr_ModeCount - 1 do
    begin
      tmp_Settings := PXF86VidModeModeInfo( Ptr( scr_ModeList^ ) + i * SizeOf( TXF86VidModeModeInfo ) )^;
      if not Already( tmp_Settings.hdisplay, tmp_Settings.vdisplay ) Then
        begin
          INC( scr_ResList.Count );
          SetLength( scr_ResList.Width, scr_ResList.Count );
          SetLength( scr_ResList.Height, scr_ResList.Count );
          scr_ResList.Width[ scr_ResList.Count - 1 ]  := tmp_Settings.hdisplay;
          scr_ResList.Height[ scr_ResList.Count - 1 ] := tmp_Settings.vdisplay;
        end;
    end;
end;

  // Где-то в коде
  scr_Display := XOpenDisplay( nil );
  scr_Default := DefaultScreen( scr_Display );

  XF86VidModeGetAllModeLines( scr_Display, scr_Default, @scr_ModeCount, @scr_ModeList );
  scr_GetResList();
  // Потом список дергаем из scr_ResList


Правда на TwinView я не проверял как-то. В коде опущены некоторые проверки, и возможно где забыл деинициализацию чего-то сделать, т.к. не очень удобно из своей большой библиотеки было выдирать по кусочкам код на работе :)
Аватара пользователя
Andru
новенький
 
Сообщения: 13
Зарегистрирован: 28.09.2010 10:42:53

Re: Список разрешений в Linux

Сообщение immortal1977 » 08.10.2010 21:13:56

Даже не знаю как вас благодарить - после небольшой доработки вашего кода напильником, все заработало. Огромное спасибо.
immortal1977
новенький
 
Сообщения: 16
Зарегистрирован: 14.07.2008 15:52:23
Откуда: Новоуральск

Re: Список разрешений в Linux

Сообщение Andru » 08.10.2010 21:59:41

Даже не знаю как вас благодарить - после небольшой доработки вашего кода напильником, все заработало. Огромное спасибо.

А какой из вариантов? :)
Аватара пользователя
Andru
новенький
 
Сообщения: 13
Зарегистрирован: 28.09.2010 10:42:53

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru