Список разрешений в Linux
Модератор: Модераторы
-
immortal1977
- новенький
- Сообщения: 16
- Зарегистрирован: 14.07.2008 15:52:23
- Откуда: Новоуральск
Список разрешений в Linux
Подскажите пожалуйста, как можно в линуксе получить список всех поддерживаемых разрешений экрана?
Ubuntu 10.04, Lazarus 0.9.28.
Ubuntu 10.04, Lazarus 0.9.28.
- coyot.rush
- постоялец
- Сообщения: 309
- Зарегистрирован: 14.08.2009 08:59:48
-
immortal1977
- новенький
- Сообщения: 16
- Зарегистрирован: 14.07.2008 15:52:23
- Откуда: Новоуральск
Хм... Xorg в данном случае не рулит. У меня в Xorg.conf прописана только максимальное разрешение для моего монитора, однако я могу запустить квагу и выбрать например 640x480. Хотелось бы программное решение 
- coyot.rush
- постоялец
- Сообщения: 309
- Зарегистрирован: 14.08.2009 08:59:48
Хм... Xorg в данном случае не рулит. У меня в Xorg.conf прописана только максимальное разрешение для моего монитора, однако я могу запустить квагу и выбрать например 640x480. Хотелось бы программное решение
Програмное решение есть у betatester .
Оффтопик
:roll: предложу пользоваться нормальными ос
Чем же Linux, не нормален
Имхо по мне Win7 копипастили с Linux and BSD
Offtop
coyot.rush
И в чём же, по вашему, эта копипаста заключается?
coyot.rush
И в чём же, по вашему, эта копипаста заключается?
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
.wOvAN
список "нормальных ос" можно увидеть? )
А вообще стоит посмотреть на udev, на данный момент он отвечает за железо в большинстве дистрибутивов
список "нормальных ос" можно увидеть? )
А вообще стоит посмотреть на udev, на данный момент он отвечает за железо в большинстве дистрибутивов
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
За разрешение экрана в иксах отвечает расширение XRandR. Практически наверняка оно рулится и через hal/dbus, надо только разобраться какие методы и с какими параметрами вызывать...
Win7 - нет такой операционной системы. есть Windows Seven
Ух ты! холивар)))
immortal1977, можно запустить xrandr без параметров и отпарсить вывод.. все поддерживаемые монитором(ами) разрешения будут выведены в столбец, вместе с частотами и прочей инфой.
immortal1977, можно запустить xrandr без параметров и отпарсить вывод.. все поддерживаемые монитором(ами) разрешения будут выведены в столбец, вместе с частотами и прочей инфой.
- coyot.rush
- постоялец
- Сообщения: 309
- Зарегистрирован: 14.08.2009 08:59:48
Offtop
Имхо, в семерке как в Llinux+X Window System графическая подсистема вынесена из Ring0 в Ring3 (DirectX10,11). Есть даже менеджер окон
Есть монтирование дисков...
Может и так , но она идет как NT 6.1 а виста как NT 6.0 Это все лишь хитрый ход M$
coyot.rush
И в чём же, по вашему, эта копипаста заключается?
Имхо, в семерке как в Llinux+X Window System графическая подсистема вынесена из Ring0 в Ring3 (DirectX10,11). Есть даже менеджер окон
Есть монтирование дисков...
Win7 - нет такой операционной системы. есть Windows Seven
Может и так , но она идет как NT 6.1 а виста как NT 6.0 Это все лишь хитрый ход M$
-
immortal1977
- новенький
- Сообщения: 16
- Зарегистрирован: 14.07.2008 15:52:23
- Откуда: Новоуральск
B4rr4cuda писал(а):Ух ты! холивар)))
immortal1977, можно запустить xrandr без параметров и отпарсить вывод.. все поддерживаемые монитором(ами) разрешения будут выведены в столбец, вместе с частотами и прочей инфой.
Про XRandR я знаю, к сожалению не подходит. Как я уже сказал, в Xorg.conf у меня только максимальное разрешение, да еще включен по дефолту TwinView, и того:
Screen 0: minimum 1680 x 1050, current 2704 x 1050, maximum 2704 x 1050, т.е. за максимальное разрешение по горизонтали посчиталась сумма двух рабочих столов, что не есть гуд.
ЗЫ.
.wOvAN писал(а):предложу пользоваться нормальными ос.
Уже пользуюсь
да еще включен по дефолту 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 я не проверял как-то. В коде опущены некоторые проверки, и возможно где забыл деинициализацию чего-то сделать, т.к. не очень удобно из своей большой библиотеки было выдирать по кусочкам код на работе
-
immortal1977
- новенький
- Сообщения: 16
- Зарегистрирован: 14.07.2008 15:52:23
- Откуда: Новоуральск
Даже не знаю как вас благодарить - после небольшой доработки вашего кода напильником, все заработало. Огромное спасибо.
Даже не знаю как вас благодарить - после небольшой доработки вашего кода напильником, все заработало. Огромное спасибо.
А какой из вариантов?
