Linux'un yerel GUI API'si nedir?


441

Umarım bu aptalca bir soru olarak ortaya çıkmaz ama her zaman merak ettiğim bir şeydir. Hem Windows (Win32 API) hem de OS X (Cocoa) pencereleri, olayları ve diğer işletim sistemlerini işlemek için kendi API'larına sahiptir. Linux'un eşdeğeri hakkında hiçbir zaman net bir cevap alamadım.

Bazı insanların GTK + dediğini duydum, ancak GTK + çapraz platform, nasıl yerli olabilir?


46
Joni doğrudur: "Linux'ta grafik kullanıcı arayüzü işletim sisteminin bir parçası değildir ... X Pencere Sistemi [GUI yetenekleri] için bir ağ protokolü tanımlar. Gtk + (Gnome tarafından kullanılır) ve QT (tarafından kullanılan) KDE).
paulsm4

33
Aksine, David, bu mükemmel bir soruşturma
amphibient

7
Katılıyorum - çekirdek ve API iki İncil olan "Linux Programlama API" ve "Sistem Programlama ... Unix" okudum ve bu soru bana hiç olmadı :) Yanıtlar ilginç.
John Humphreys - w00te

10
Wine eklerseniz Win32 API de platformlar arası ..
Brendan Long

2
BTW Windows, WIN32 / WIN64 alt sistemlerine sahiptir; bunlar, diğer şeylerin yanı sıra 'Windows Look and Feel - aka WIN32' için de aynısını uygular. Bu alt sistemler NT çekirdeğinin üzerinde çalışır. Bunların API'ları farklıdır. Örneğin C: bir NT çekirdek nesnesi değil, bir WIN32 soyutlamasıdır. Bazı pencereleme işlevleri için aynıdır. Windows ayrıca kullanılabilir olan Unix alt sistemlerine de sahipti (X11'i bir dereceye kadar destekleyen).
Preha Sangha

Yanıtlar:


603

Linux'ta grafik kullanıcı arayüzü işletim sisteminin bir parçası değildir. Çoğu Linux masaüstünde bulunan grafiksel kullanıcı arabirimi , ekranlar, klavyeler ve işaretçi aygıtlarıyla başa çıkmak için bir aygıttan bağımsız bir yol tanımlayan X Pencere Sistemi adı verilen yazılım tarafından sağlanır .

X Window iletişim için bir ağ protokolü tanımlar ve bu protokolün nasıl "konuşulacağını" bilen herhangi bir program bunu kullanabilir. Diye bir C kütüphanesi vardır Xlib Xlib tür yani, daha kolay bu protokolü kullanan kolaylaştırır yerel GUI API. Xlib, bir X Window sunucusuna erişmenin tek yolu değildir; bir de XCB var .

Xlib'in üzerine kurulmuş GTK + ( GNOME tarafından kullanılır ) ve Qt ( KDE tarafından kullanılır ) gibi araç kiti kitaplıkları , programlanması daha kolay olduğu için kullanılır. Örneğin, uygulamalarda size tutarlı bir görünüm ve his verir, sürükle ve bırak kullanımını kolaylaştırır, modern bir masaüstü ortamına standart bileşenler sağlar, vb.

X'in dahili olarak ekranda çizme şekli uygulamaya bağlıdır. X.org'un cihaza bağlı bir kısmı ve cihaza bağlı bir kısmı vardır. Birincisi, pencereler gibi ekran kaynaklarını yönetirken, ikincisi genellikle bir çekirdek modülü olan grafik kartı sürücüsü ile iletişim kurar. İletişim, doğrudan bellek erişimi veya çekirdeğe yapılan sistem çağrıları üzerinden gerçekleşebilir. Sürücü komutları karttaki donanımın anlayacağı bir biçime çevirir.

2013 itibariyle, Wayland adında yeni bir pencere sistemi kullanılabilir olmaya başladı ve birçok dağıtım, bir noktada buna geçeceklerini söyledi, ancak hala net bir program yok. Bu sistem OpenGL / ES API'sini temel alır, bu da gelecekte OpenGL'nin Linux'ta "yerel GUI API'si" olacağı anlamına gelir. GTK + ve QT'yi Wayland'a taşımak için çalışmalar yapılıyor, böylece mevcut popüler uygulamalar ve masaüstü sistemleri minimum değişiklik gerektiriyor. Taşınamayan uygulamalar, OS X'in Xquartz aracılığıyla X11 uygulamalarını desteklemesi gibi, bir X11 sunucusu aracılığıyla desteklenecektir. GTK + portunun bir yıl içinde bitmesi bekleniyor , Qt 5'in zaten tam Wayland desteği var.

Sorunları daha da karmaşıklaştırmak için Ubuntu, Wayland ile algıladıkları sorunlar nedeniyle Mir adında yeni bir sistem geliştirdiklerini açıkladı . Bu pencere sistemi ayrıca OpenGL / ES API'sini temel alır.


95
+1. Bir işletim sisteminin ne zaman bir GUI'ye sahip olması gerektiğinden, işletim sistemi değilse bir OS değil mi? Saçmalık.
David Hammen

42
Windows bile başlangıçta sadece DOS üzerinde çalışan bir programdı.
dan04

2
+1 @DavidHammen Bunun bana yönlendirilip yönlendirilmediğinden emin değilim, ama% 100 haklısın. Terminolojim tam olarak doğru değildi. Ne gerektiğini söylediler bunu sık kolay kullanım için mi bunu yapmak ek bileşenlerin hepsi bir OS'nin düşünebilir şekilde tam bir işletim sistemi değil, farklı satıcılardan, vb bileşenlerin bir yığma değil olmasıydı
Chris Thompson

3
@ChrisThompson - hmm ... belki çok yaşlıyım ama bir GUI'yi bir işletim sisteminin temel parçası olarak hiç düşünmedim. Ve GUI'siz bir işletim sistemini hiç bir zaman "farklı satıcıların bileşenlerinin bir araya gelmesi" olarak düşünmedim. Ama hey, bir işletim sistemini neyin oluşturduğuna dair fikrimi oluşturduğumdan beri belki de işler devam etti :)
George Hawkins

2
Bir cevap bir topluluk wiki değilse, dilbilgisini / biçimlendirmeyi geliştirmek veya bağlantı eklemek dışında hiçbir içeriği değiştirmeyeceğim. İçeriğin düzeltilmesi veya güncellenmesi gerekiyorsa, itibarı içeriğe bağlı olan kişinin sorumluluğundadır. Bununla birlikte, onlara bir şeylerin düzeltilmesi veya güncellenmesi gerektiğini düşündüğümden haberdar olmaları için yorum yapma lehine yapacağım .
Dürüst Abe

84

Linux bir çekirdek, tam bir işletim sistemi değil. Pencereleme sağlamak için Linux üzerinde çalışan farklı pencereleme sistemleri ve gui'leri vardır. Tipik olarak X11 , Linux dağıtımları tarafından kullanılan pencereleme sistemidir.


6
Bunun üzerine inşa edilmişlerdir. X11 sunucudur, KDE, Gnome vb. İse daha üst düzey API'ler, ortak pencere düzenleri vb
Mark

7
X11, tüm bu şeyleri ve çizimden ekrana vb. İşleyen ve grafik sürücüleri ile iletişim kuran gerçek düşük seviyeli katmandır. Gnome / KDE daha sonra X11'i kontrol edin. Bu üst düzeyde ve bir milyar detayı görmezden geliyor.
slugonamission

3
Teşekkürler. bir soru daha: wikipedia, X11'in "yazılımın genelleştirilmiş bir komut kümesi kullanmak üzere yazıldığı ve aygıtın bağımsızlığını ve X'i uygulayan herhangi bir bilgisayarda programların yeniden kullanılmasına izin veren bir donanım soyutlama katmanı oluşturduğunu" açıklıyor. sorum şu: X11 neden donanım etkileşimi sağlıyor (HAL), Linux Çekirdeği bunu sağlamalı ve X11 Çekirdek üzerinde çalışmalı mı? Başka bir deyişle, Çekirdek vekili olması gerektiğinde X11 neden donanım aygıtlarına ulaşıyor?
amphibient

1
Ben düşünüyorum bu durumda HALbir yanlış kullanılan terimdir. Gerçekten söyledikleri X11, pencereleri görüntülemek için sistemden bağımsız bir yol sağlar. Darwin için X11 (Mac OS - şu anda Mountain Lion ile daha karmaşık ...), MS Windows ve Linux sürümleri var.
Chris Thompson

4
X11 bir ağ protokolüdür. Soyutlama, platform A'da X11 istemcilerini (pencereler, uygulamalar, vb.) Bazı ağ ekipmanı üzerinden B platformunda görüntüleyebilen programlar yazmayı içerir. Uygulamanız yerel olarak, uzaktan, iç içe bir sunucuda, VNC vb. Yapan sanal bir sunucuda çalışabilir. Donanım soyutlaması (yerel platformda) bu özelliğin bir yan etkisidir, ancak X11 ve çekirdek (ortalama bir Unix sisteminde donanım soyutlaması yapan şeydir).
Alexios

59

Wayland , daha çok "gelecekteki X11 katili" olarak anıldığından da bahsetmeye değer.

Ayrıca Android ve diğer bazı mobil işletim sistemlerinin Linux çekirdeği olmasına rağmen X11 içermediğini unutmayın, bu nedenle X11 tüm Linux sistemlerine özgü değildir.

Çapraz platform olmanın yerli olmayla bir ilgisi yoktur. Kakao da GNUStep üzerinden başka platformlara taşındı ancak hala OS X / macOS'a özgü.


2
Wayland'ın üst düzey mimari diyagramı, X diyagramındaki "Compositor" ve "Server" öğelerinin Wayland diyagramında birleştirilmesi dışında X ile aynıdır. Eksik olan, bu entegrasyonun neden X ile çalışılamayacağına dair makul bir açıklama.
Kaz

1
20 yaşından büyük bir kod tabanının temel tasarımını değiştirmenin kolay olmadığını söyleyebilirim. Ayrıca X11 ile ilgili bir başka sorunun, yazı tipi oluşturma gibi işlevlerinin çoğunun bugün kullanılmadığına dikkat edin. Artı X11 hala sunucularda ve süper bilgisayarlarda gerekli olacak, ağ şeffaflığı vazgeçilemeyecek kadar iyi.
yok

3
@ gokcehan wayland ağ şeffaflığını atlamıyor, bu bir efsane. Henüz uygulanmadı , tıpkı Wayland'deki diğer birçok şey gibi. wayland.freedesktop.org/faq.html#heading_toc_j_8 blog.martin-graesslin.com/blog/2011/08/… vb.
whitequark

8
+! Android'in X11 eksikliğinden bahsettiği için. Android, "x11 yerel linux GUI" argümanı için muhtemelen en ikna edici örnek. Linux'un "yerli" GUI olduğu için x11 veya Android'e sahip olabileceğini göstermek, yeni başlayanlara Linux'un gerçekten sadece bir çekirdek olduğunu ve her zaman GUI'ye sahip olmadığını gösterir.
Trevor Boyd Smith

"Çapraz platform olmanın yerli olmakla bir ilgisi yok" mükemmel bir nokta. Bu modeli yıllarca çapraz platform taşımam boyunca çok sık kullandım. En önemlisi, 90'larda, başlık altında MFC kullanarak Metrowerks PowerPlant çerçevesine yazılan kodu çapraz derlemenizi sağlayan bir çerçeve sattım. (Herkes küçümsemeden önce, makroların altına girdiğinizde, MFC oldukça makul.) Ayrıca Win32 veya Mac Toolbox API'sının derlendiğimiz, diğer platformlarda gerektiği gibi yeniden uygulandığı spesifikasyon olduğu birden fazla taşıma işim oldu. .
Andy Dent

23

Açıkça söylemek gerekirse, Linux'un API'si sistem çağrılarından oluşur . Bunlar, kullanıcı modu (çekirdek olmayan) bir program tarafından çağrılabilen çekirdek işlevleridir. Bu, programların açık ve okunan dosyalar gibi şeyler yapmasına izin veren çok düşük seviyeli bir arayüzdür. Genel bir giriş için bkz. Http://en.wikipedia.org/wiki/System_call .

Gerçek bir Linux sistemi, grafiksel bir kullanıcı arayüzü ve diğer özellikler sağlamak için üzerinde çalışan diğer tüm yazılımların "yığınına" sahip olacaktır. Bu yığının her bir öğesi kendi API'sını sunacaktır.


3
Bu cevap "linux'un yerel API'sı nedir?" (o zamandan beri, soruya "GUI" eklendi).
nibot

Şu anda tutarsız bir soruya hala doğru cevap, çünkü GNU ve X11 dahil olmak üzere Linux'un üstünde yer alan sistemlerin hiçbiri anlamlı bir anlamda "yerli" değil.
Jim Balter

20

Daha önce bahsedilenlere yardımcı olmak için bu blogda Linux grafik yığınına çok iyi bir genel bakış var: http://blog.mecheye.net/2012/06/the-linux-graphics-stack/

Bu, X11 / Wayland vb. Ve hepsinin nasıl bir araya geldiğini açıklıyor. Daha önce bahsedilenlere ek olarak, Linux'ta grafikler için kullanabileceğiniz aşağıdaki API'ler hakkında biraz eklemeye değer olduğunu düşünüyorum:

Mesa - "Mesa pek çok şey, ama en ünlüsü sağladığı en önemli şeylerden biri OpenGL uygulamasıdır. OpenGL API'sının açık kaynaklı bir uygulamasıdır."

Kahire - "Kahire, doğrudan Firefox gibi uygulamalar tarafından veya vektör şekilleri çizmek için GTK + gibi kütüphaneler aracılığıyla kullanılan bir çizim kütüphanesidir."

DRM (Direct Rendering Manager) - Bunu en az anlıyorum ama temelde X'i geçmeden doğrudan çerçeve arabelleğine grafik yazmanıza izin veren çekirdek sürücüleri


habrahabr.ru/post/148954 - Herkesin ihtiyacı varsa bu yazının çevirisi
Boris Burkov


5

XWindows muhtemelen 'yerli' olarak adlandırılabilecek olana en yakın olan :)


3
bu x11 ile aynı şey mi?
DavidColson

1
Ancak doğrudan kullanırsanız, bunun bir GUI api olmadığını göreceksiniz ... Linux'un sadece 1 yerel GUI api'si yok. Ancak neredeyse tüm bu GUI API'leri (en azından bugün masaüstü linux'da yaygın olanları) X'in üstünde çalışır. Bugün eski X'i kullanarak bir uygulama yazmaya başlarsanız, herhangi bir modern dağıtımda tamamen yersiz görünecektir, bu yüzden yerel GUI dağıtım bağımlı olduğunu - ubuntu için gtk / gnome, diğerleri için kde.
Axel

1

Linux'ta Linux'a en yakın şey, sadece kullanıcı arayüzünden değil, etkinliklerden ve "diğer işletim sistemlerinden" bahsettiğiniz gibi libc olacaktır.


5
libc (C standart kitaplığı) işletim sistemi sistem çağrıları için bir arabirimdir. Linux'ta ikincisi (işletim sistemi sistem çağrıları) kabaca Windows'ta Win32'ye dönüşür. Win32 API'sini kullanarak bir düzeyde olmadan geçerli Windows sürümleri için gerçekten (veya hiç?) Program yapamazsınız, ancak doğrudan derleyiciyi kopyalayarak ilgili derleyicinin standart C kitaplığını kullanmadan hem Windows hem de Linux için programlayabilirsiniz. to-syscalls kodu. Tavsiye edilmez ve kodunuzu diğer işletim sistemlerine tamamen aktarılamaz hale getirir, ancak bunu yapmak mümkündür.
CVn

UI libc'nin bir parçası değildir - printf / scanf ve benzerlerini bir UI olarak düşünmediğiniz sürece ... libc sadece C standart kütüphanesidir. Ve bu aslında işletim sistemi sistem çağrıları için bir arayüz de değil. Dosya g / Ç, bellek yönetimi, dize işleme vb. İçin işlevler sağlar ve dahili olarak sistem çağrılarını kullanır. Sizin gibi sistem çağrıları yapmak ioctliçin, bir şey eklemeniz gerekir sys/.
Axel

Soru her zaman "GUI" yi belirtmedi.
jv110

Belki konuşmak Xlibdeğil libc.
i486

1

Linux çekirdeği grafik işlemleri finc_ops yapısı olarak /include/linux/fb.h dizinindedir. Sonunda X11, Wayland veya DRM gibi eklentilerin referans aldığı budur. Bu işlemler vektör veya raster basılı kopya veya tty yönelimli terminal aygıtları için olmadığından, GUI olarak kullanımları sınırlıdır; Sistem çağrısını gerektiği gibi atlamak için bazı montajcıları kullanmak istemiyorsanız, grafik çıktısı almak için bu eklentilere ihtiyacınız olduğu tamamen doğru değildir.


0

GUI, üst düzey bir yetenek soyutlamasıdır, bu nedenle XOrg sunucusundan OpenGL'ye neredeyse her şey, Windows platformu da dahil olmak üzere çapraz platformda taşınır. Ancak GUI API ile * nix grafik API'sini kastediyorsanız, "Doğrudan İşleme Altyapısı" çevresinde dolaşıyor olabilirsiniz.


0

Wayland

Duyabileceğiniz gibi, wayland bugünlerde birçok dağıtımın öne çıkan seçimi, çünkü protokolü X'den daha basit.

Wayland araç setleri

Wayland'ın önerdiği araç setleri veya GUI kütüphaneleri :

  • QT 5
  • GTK +
  • l.s.d.
  • Dağınıklık
  • EFL

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.