Portál AbcLinuxu, 6. května 2025 01:31
Kdysi jsem si udělal takovou blbost na konfiguraci monitorů (tu). No už se nelíbí, je tam minimum ošetřovaných chyb a navíc je konfigurace hardcodovaná.
Začal jsem vylepšovat. První věcí bylo použít XCB místo Xlib, protože ošetřování chyb s Xlib je shit. Oproti minulému prográmku to bude mít profily (asi v XML konfiguráku), kdy bude možné pro různé kombinace zapojených výstupů mít extra profil.
Jsem strašně línej programátor a proto mám zatím v podstatě jen část, kde načítám aktuální konfiguraci, ale narazil jsem na nějaké problémy a potřeboval bych poradit a možná i kdyby někdo zkompiloval, spustil a hodil sem výstup z programu (bude přiložen v komentářích jako příloha).
O co jde? Tu je specifikace pro randr. Ta říká, že když zavolám RRGetCrtcInfo či RRGetOutputInfo s jiným timestampem, než dostanu v RRGetScreenResources, tak bych měl v odpovědi dostat "status" s InvalidConfigTime, jinak mám dostat Success. Bohužel u mě se to z nějakého důvodu chová tak, že když schválně nastavím timestamp na menší hodnotu, tak pro RRGetCrtcInfo mi to VŽDY ve statusu vrátí Success (0). Pro RRGetOutputInfo se mi ve statusu vrátí vždy NÁHODNÉ číslo - to se liší po každém startu programu, ale zůstává stejné po dobu, co program běží, nezávisle na správném/špatném timestampu. A to mě opravdu zaráží, protože jsem hlavně tohle potřeboval pro ošetřování chyb, abych mohl restartovat načítání prostředků (protože se konfigurace monitorů může změnit mezi RRGetScreenResources() a RRGetOutputInfo() a já nechcu žádný race conditions). V kódu jsem k těm místům napsal nějaký FIXME.
Kdyby se našel nějaký dobrý človíček, co by program zkompiloval (cmake . && make) a spustil (./monitorwatcher) a vypsal jsem výstup. Potřebuje to ke kompilaci xcb, xcb-randr a při spuštění samozřejmě zapnutou podporu randr v ovladači. Mnou popisované chování se děje s intel ovladačem, rád bych i výstupi s nouveau, ati driverem či nejnovějším nvidia ovladačem s podporou randr. Moc budu vděčný ^^.
A proč se tím vůbec zabývám? Jedině gnome 3 (které je pro mě totálně nepoužitelné) se zdá umí jakési profily a tak trochu inteligentně přepínat výstupy podle toho, co je zapojeno. Konfigurátko v KDE je totální nepoužitelná sranda, obzvláště když zapnu externí monitor a přístě nabootuju, když je odpojený, nebo ho jen stačí vytáhnout - KDE dementně aktivuje externí výstup, aniž by něco bylo připojeno a interní display neaktivue - šup do konzole, strašná legrace. Pak jsem hledal něco použitelného, ale nic ...
# spustím druhý X server na tty8 X :1 & # přepnu se zpět do tty7 a spustím xrandr pro druhý server DISPLAY=:1 xrandr
Následuje zásek, zaseknutá xka samozřejmě vlastní klávesnici a myš a mně zbývá hard reset. Sranda. Alespoň mě to donutilo nastavit kernel.sysrq = 1
v /etc/sysctl.conf. Zkouším ještě jednou se svým prográmkem - opět zásek. Xka jsou bastl, který nefunguje a už mě to deptá. Ještě že Alt+SysRq+K tentokrát fungovalo :D
Jinak po patchnutí xserveru mi už RRGetOutputInfo ve statusu vrací 0 a ve svém programu ho BUDU kontrolovat a nefunkční xservery se můžou klouzat. Patch jsem poslal, ale není hold můj problém, když v některých distribucích nebudou schopni opravit nefunkční věc.
Tak já děkuji všem za výstupy. Momentálně je RRGetOutputInfo rozbité v Ubuntu 12.04, Mint, ArchLinuxu, zdá se být ok ve Fedoře 13 a asi Gentoo. Na program asi kašlu, dokud to nebude opraveno, částečně i kvůli mému druhému problému.
Zdá se, že randr je prostě v xorg rozbitý, nebo rozbitý v intel ovladači, já fakt nevím. Při jakékoliv změně se mi rozjebe nastavení DPMS. Né jen xrandr udělátkem, ale i když změním výstup nějakým tím randr voláním. Prostě mi z toho brzo asi jebne a přemýšlím, jestli má smysl vůbec ztrácet čas, nebo se na to vysrat a prostě na notebook nainstalovat stoletou vistu. Protože já jsem zjistil, že na počítači fakt nic nedělám (resp. dělám blbosti) a jen z nudy čumim na filmy a brouzdám po netu. V linuxu se pak z nudy snažím programovat/opravovat kraviny a pak zjistím, že je to k hovnu. Pro vistu má intel alespoň funkční ovladač s podporou profilů rozložení monitorů, jejich automatickým přepínáním po vytažení displeje, kdy se mi nestane, že ani jeden není zaplý, jako v (ne)milovaném kde či gnome a navíc se nemusím patlat s udělátkem.
No ještě kdyby měl někdo náladu a chtěl zkusit, jestli se mu taky jebe nastavení dpms s externím displejem.
# vypnout dpms xset -dpms # info, včetně info, jestli je DPMS zapnuto xset q # vypnu extení, zapnu interní xrandr -s 1280x800 --output HDMI1 --off --output LVDS1 --auto --primary # několikrát zkusím vypsat dpms (for I in {1..10}; do sleep 2; xset q; done) | grep DPMS # pokud se vypíše enabled, tak je to rozbitý # zapnu zase externí xrandr -s 1280x1024 --output HDMI1 --auto --primary --output LVDS1 --off # několikrát zkusím vypsat dpms (for I in {1..10}; do sleep 2; xset q; done) | grep DPMS # pokud se vypíše enabled, tak je to rozbitý
Tiskni
Sdílej:
RandR info:
first_event = 101
first_error = 167
major_opcode = 150
major_version = 1
minor_version = 3
CRTC status = 0
CRTC status = 0
OUTPUT status = 7
OUTPUT status = 7
OUTPUT status = 7
CRTC 0:
id: 64
position: 0x0
size: 1366x768
mode: 68
rotation: 1
rotations: 63
num_outputs: 1
possible_outputs: 3
CRTC 1:
id: 63
position: 0x0
size: 0x0
mode: 0
rotation: 1
rotations: 63
num_outputs: 0
possible_outputs: 2
OUTPUT 0:
id: 65
crtc: 64
mm_width: 353
mm_height: 198
connection: 0
name: LVDS1
OUTPUT 1:
id: 66
crtc: 0
mm_width: 0
mm_height: 0
connection: 1
name: VGA1
OUTPUT 2:
id: 67
crtc: 0
mm_width: 0
mm_height: 0
connection: 1
name: DP1
[lukas@orochi build]$ ./monitorwatcher RandR info: first_event = 123 first_error = 178 major_opcode = 153 major_version = 1 minor_version = 3 CRTC status = 0 CRTC status = 0 OUTPUT status = 63 OUTPUT status = 63 OUTPUT status = 63 OUTPUT status = 63 CRTC 0: id: 582 position: 0x0 size: 1680x1050 mode: 587 rotation: 1 rotations: 63 num_outputs: 1 possible_outputs: 4 CRTC 1: id: 583 position: 0x0 size: 0x0 mode: 0 rotation: 0 rotations: 63 num_outputs: 0 possible_outputs: 4 OUTPUT 0: id: 584 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: DVI-I-0 OUTPUT 1: id: 585 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: VGA-0 OUTPUT 2: id: 586 crtc: 582 mm_width: 434 mm_height: 271 connection: 0 name: DVI-I-1 OUTPUT 3: id: 593 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: HDMI-0 [lukas@orochi build]$ ./monitorwatcher RandR info: first_event = 123 first_error = 178 major_opcode = 153 major_version = 1 minor_version = 3 CRTC status = 0 CRTC status = 0 OUTPUT status = 63 OUTPUT status = 63 OUTPUT status = 63 OUTPUT status = 63 CRTC 0: id: 582 position: 0x0 size: 1680x1050 mode: 587 rotation: 1 rotations: 63 num_outputs: 1 possible_outputs: 4 CRTC 1: id: 583 position: 0x0 size: 0x0 mode: 0 rotation: 0 rotations: 63 num_outputs: 0 possible_outputs: 4 OUTPUT 0: id: 584 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: DVI-I-0 OUTPUT 1: id: 585 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: VGA-0 OUTPUT 2: id: 586 crtc: 582 mm_width: 434 mm_height: 271 connection: 0 name: DVI-I-1 OUTPUT 3: id: 593 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: HDMI-0
RandR info: first_event = 100 first_error = 165 major_opcode = 149 major_version = 1 minor_version = 3 CRTC status = 0 CRTC status = 0 OUTPUT status = 0 OUTPUT status = 0 OUTPUT status = 0 OUTPUT status = 0 OUTPUT status = 0 OUTPUT status = 0 OUTPUT status = 0 CRTC 0: id: 63 position: 0x0 size: 1280x1024 mode: 72 rotation: 1 rotations: 63 num_outputs: 1 possible_outputs: 7 CRTC 1: id: 64 position: 0x0 size: 0x0 mode: 0 rotation: 1 rotations: 63 num_outputs: 0 possible_outputs: 7 OUTPUT 0: id: 65 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: VGA1 OUTPUT 1: id: 66 crtc: 63 mm_width: 376 mm_height: 301 connection: 0 name: HDMI1 OUTPUT 2: id: 67 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: DP1 OUTPUT 3: id: 68 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: HDMI2 OUTPUT 4: id: 69 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: HDMI3 OUTPUT 5: id: 70 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: DP2 OUTPUT 6: id: 71 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: DP3
RandR info: first_event = 100 first_error = 165 major_opcode = 149 major_version = 1 minor_version = 3 CRTC status = 0 CRTC status = 0 OUTPUT status = 0 OUTPUT status = 0 OUTPUT status = 0 OUTPUT status = 0 CRTC 0: id: 63 position: 0x0 size: 1366x768 mode: 69 rotation: 1 rotations: 63 num_outputs: 1 possible_outputs: 4 CRTC 1: id: 64 position: 0x0 size: 0x0 mode: 0 rotation: 1 rotations: 63 num_outputs: 0 possible_outputs: 4 OUTPUT 0: id: 65 crtc: 63 mm_width: 344 mm_height: 194 connection: 0 name: LVDS1 OUTPUT 1: id: 66 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: VGA1 OUTPUT 2: id: 67 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: HDMI1 OUTPUT 3: id: 68 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: DP1 druhé spuštění: RandR info: first_event = 100 first_error = 165 major_opcode = 149 major_version = 1 minor_version = 3 CRTC status = 0 CRTC status = 0 OUTPUT status = 0 OUTPUT status = 0 OUTPUT status = 0 OUTPUT status = 0 CRTC 0: id: 63 position: 0x0 size: 1366x768 mode: 69 rotation: 1 rotations: 63 num_outputs: 1 possible_outputs: 4 CRTC 1: id: 64 position: 0x0 size: 0x0 mode: 0 rotation: 1 rotations: 63 num_outputs: 0 possible_outputs: 4 OUTPUT 0: id: 65 crtc: 63 mm_width: 344 mm_height: 194 connection: 0 name: LVDS1 OUTPUT 1: id: 66 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: VGA1 OUTPUT 2: id: 67 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: HDMI1 OUTPUT 3: id: 68 crtc: 0 mm_width: 0 mm_height: 0 connection: 1 name: DP1
RandR info:
first_event = 101
first_error = 164
major_opcode = 149
major_version = 1
minor_version = 3
CRTC status = 0
CRTC status = 0
OUTPUT status = 31
CRTC 0:
id: 63
position: 0x0
size: 1280x1024
mode: 66
rotation: 1
rotations: 63
num_outputs: 1
possible_outputs: 1
CRTC 1:
id: 64
position: 0x0
size: 0x0
mode: 0
rotation: 1
rotations: 63
num_outputs: 0
possible_outputs: 1
OUTPUT 0:
id: 65
crtc: 63
mm_width: 338
mm_height: 270
connection: 0
name: VGA1
RandR info:
first_event = 101
first_error = 164
major_opcode = 149
major_version = 1
minor_version = 3
CRTC status = 0
CRTC status = 0
OUTPUT status = 31
CRTC 0:
id: 63
position: 0x0
size: 1280x1024
mode: 66
rotation: 1
rotations: 63
num_outputs: 1
possible_outputs: 1
CRTC 1:
id: 64
position: 0x0
size: 0x0
mode: 0
rotation: 1
rotations: 63
num_outputs: 0
possible_outputs: 1
OUTPUT 0:
id: 65
crtc: 63
mm_width: 338
mm_height: 270
connection: 0
name: VGA1
Linux myhost 3.4.3-1-ARCH #1 SMP PREEMPT Mon Jun 18 08:07:54 UTC 2012 i686 GNU/LinuxISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.