WXConsoleSpawner: Odgadywanie czy program wymaga terminala
09.04.2022 | aktual.: 09.04.2022 11:49
Są osoby, które zarzuciły mi brak zdolności programistycznych. Dlatego postanowiłem nie podejmować się trudnych zadań, a jedynie tworzyć coś do udowodnienia, że się da. Może zachęci to kogoś, by zrobił to porządnie ;‑) ?
Jednym z powodów krytyki systemów GNU/Linux jest konieczność użycia konsoli. Użytkownik próbuje odpalić program z internetu (np. sterowniki drukarki), a gdy nic to nie daje, zaczyna szukać. I tam znajduje info, że trzeba uruchomić jakiś emulator terminala, przejść do katalogu z programem, nadać bit wykonywalności i odpalić w emulatorze terminala.
Ponieważ środowiska graficzne same się zapytają o konieczność nadania bitu wykonywalności, to pozostaje kwestia emulatora terminala w odniesieniu do programów konsolowych. Z pomocą może przyjść WXConsoleSpawner.
Program próbuje rozpoznać, czy uruchomiony przez niego proces to aplikacja konsolowa czy graficzna. Stosuje taki algorytm:
1. Jeżeli program będzie starać się odczytać z domyślnego wejścia, to jest to program konsolowy. W tym przypadku zakończ.
2. Gdy program będzie złączony z pewnymi bibliotekami systemu graficznego X (Xlib/Xcb), to jest to program graficzny i zakończ
3. Gdy program będzie mieć otwarte gniazdo systemu graficznego Wayland, to jest to program graficzny i zakończ
4. Gdy program się zakończy, to najprawdopodobniej jest to program konsolowy lub użytkownik musi zobaczyć logi (przecież nie udało się nam wykryć typu aplikacji, więc nie ma mowy o wyświetleniu okna), więc wyświetlamy odpowiedni komunikat
Metoda nie działa w przypadku programów wymagających X‑ów, ale nie złączonych z Xlib/Xcb (Xeyes, itd.). Nie działa także w przypadku skryptów, co posiłkują się np. kdialog, itd. Wiem... Gry często korzystają ze skryptów do uruchomienia ich, ale to narzędzie nie jest do gier, tylko małych programów (najczęściej instalatorów) pobranych z internetu. Co do gier, to po ich instalacji, powinna być pozycja w menu. Spróbuję to rozwiązać, posiłkując się mechanizmem cgroup, ale to strasznie może skomplikować sprawę.
Na zakończenie mały filmik;