API GUI gốc của Linux là gì?


441

Tôi hy vọng đây không phải là một câu hỏi ngu ngốc nhưng nó luôn là điều tôi băn khoăn. Cả Windows (Win32 API) và OS X (Ca cao) đều có API riêng để xử lý các cửa sổ, sự kiện và các nội dung khác của HĐH. Tôi chưa bao giờ thực sự có câu trả lời rõ ràng về tương đương của Linux.

Tôi đã nghe một số người nói GTK +, nhưng GTK + là nền tảng chéo, làm thế nào nó có thể là bản địa?


46
Joni đã đúng: "Trong Linux, giao diện người dùng đồ họa không phải là một phần của hệ điều hành ... X Window System định nghĩa một giao thức mạng cho [khả năng GUI]. Các thư viện của Bộ công cụ như Gtk + (được sử dụng bởi Gnome) và QT (được sử dụng bởi KDE), được xây dựng trên đỉnh Xlib. "
paulsm4

33
ngược lại, David, đây là một cuộc điều tra tuyệt vời
lưỡng cư

7
Tôi đồng ý - Tôi đã đọc "API lập trình Linux" và "Lập trình hệ thống ... Unix" là hai cuốn kinh thánh về kernel & API và câu hỏi này không bao giờ xảy ra với tôi :) Câu trả lời rất thú vị.
John Humphreys - w00te

10
API Win32 cũng đa nền tảng nếu bạn bao gồm Wine ..
Brendan Long

2
BTW Windows có các hệ thống con WIN32 / WIN64 thực hiện rất nhiều hệ thống tương tự cho 'Windows Look and Feel - hay còn gọi là WIN32' trong số những thứ khác. Các hệ thống con này hoạt động trên nhân NT. Các API cho chúng là khác nhau. Ví dụ C: là một bản tóm tắt WIN32, không phải là một hạt nhân NT. Tương tự cho một số chức năng cửa sổ. Windows cũng có các hệ thống con Unix có sẵn (hỗ trợ X11 ở một mức độ nào đó).
Preet Sangha

Câu trả lời:


603

Trong Linux, giao diện người dùng đồ họa không phải là một phần của hệ điều hành. Giao diện người dùng đồ họa được tìm thấy trên hầu hết các máy tính để bàn Linux được cung cấp bởi phần mềm có tên X Window System , định nghĩa một cách độc lập thiết bị để xử lý màn hình, bàn phím và thiết bị con trỏ.

X Window định nghĩa một giao thức mạng để liên lạc và bất kỳ chương trình nào biết cách "nói" giao thức này đều có thể sử dụng nó. Có một thư viện C được gọi là Xlib mà làm cho nó dễ dàng hơn để sử dụng giao thức này, vì vậy Xlib là loại các GUI API bản địa. Xlib không phải là cách duy nhất để truy cập máy chủ X Window; Ngoài ra còn có XCB .

Các thư viện của bộ công cụ như GTK + (được sử dụng bởi Gnome ) và Qt (được sử dụng bởi KDE ), được xây dựng trên Xlib, được sử dụng vì chúng dễ lập trình hơn. Ví dụ, chúng cung cấp cho bạn giao diện nhất quán trên các ứng dụng, giúp sử dụng kéo và thả dễ dàng hơn, cung cấp các thành phần tiêu chuẩn cho môi trường máy tính để bàn hiện đại, v.v.

Làm thế nào X vẽ trên màn hình nội bộ phụ thuộc vào việc thực hiện. X.org có một phần độc lập với thiết bị và một phần phụ thuộc vào thiết bị. Cái trước quản lý tài nguyên màn hình như windows, trong khi cái sau giao tiếp với trình điều khiển card đồ họa, thường là mô-đun kernel. Giao tiếp có thể xảy ra qua truy cập bộ nhớ trực tiếp hoặc thông qua các cuộc gọi hệ thống đến kernel. Trình điều khiển dịch các lệnh thành một hình thức mà phần cứng trên thẻ hiểu được.

Kể từ năm 2013, một hệ thống cửa sổ mới có tên Wayland bắt đầu có thể sử dụng được và nhiều bản phân phối cho biết họ sẽ di chuyển đến một lúc nào đó, mặc dù vẫn chưa có lịch trình rõ ràng. Hệ thống này dựa trên API OpenGL / ES, có nghĩa là trong tương lai OpenGL sẽ là "API GUI gốc" trong Linux. Công việc đang được thực hiện để chuyển GTK + và QT sang Wayland, do đó các ứng dụng và hệ thống máy tính để bàn phổ biến hiện nay sẽ cần những thay đổi tối thiểu. Các ứng dụng không thể chuyển được sẽ được hỗ trợ thông qua máy chủ X11, giống như OS X hỗ trợ các ứng dụng X11 thông qua Xquartz. Cổng GTK + dự kiến ​​sẽ hoàn thành trong vòng một năm , trong khi Qt 5 đã có hỗ trợ Wayland hoàn chỉnh.

Để làm phức tạp thêm vấn đề, Ubuntu đã tuyên bố họ đang phát triển một hệ thống mới có tên Mir vì những vấn đề họ nhận thấy với Wayland. Hệ thống cửa sổ này cũng dựa trên API OpenGL / ES.


95
+1. Từ khi nào một hệ điều hành phải có GUI, ngụ ý rằng nếu nó không phải là một hệ điều hành? Vô lý.
David Hammen

42
Ngay cả Windows ban đầu chỉ là một chương trình chạy trên DOS.
dan04

2
+1 @DavidHammen Tôi không chắc liệu điều đó có nhắm vào tôi hay không, nhưng bạn đúng 100%. Thuật ngữ của tôi không chính xác. Điều tôi nên nói là nó không phải là một hệ điều hành đầy đủ theo cách bạn thường nghĩ về một HĐH với tất cả các thành phần bổ sung giúp dễ sử dụng, mà là một tập hợp các thành phần từ các nhà cung cấp khác nhau, v.v.
Chris Thompson

3
@ChrisThndry - hmm ... có lẽ tôi đã quá già nhưng tôi chưa bao giờ nghĩ GUI là một phần cốt lõi của HĐH. Và tôi chưa bao giờ nghĩ về một HĐH mà không có GUI chỉ đơn giản là "một tập hợp các thành phần từ các nhà cung cấp khác nhau, v.v." Nhưng có lẽ mọi thứ đã được chuyển từ khi tôi hình thành ý kiến ​​của mình về hệ điều hành :)
George Hawkins

2
Trừ khi câu trả lời là wiki cộng đồng, tôi sẽ không thay đổi bất kỳ nội dung nào, ngoài việc cải thiện ngữ pháp / định dạng hoặc thêm liên kết. Nếu nội dung cần được sửa chữa hoặc cập nhật, đó là trách nhiệm của người có danh tiếng bị ràng buộc với nội dung. Tuy nhiên tôi sẽ ủng hộ họ bình luận, để họ nhận thức được rằng tôi nghĩ cần phải sửa chữa hoặc cập nhật.
thật Abe

84

Linux là một kernel, không phải là một hệ điều hành đầy đủ. Có các hệ thống cửa sổ khác nhau và gui chạy trên Linux để cung cấp cửa sổ. Điển hình là X11 là hệ thống cửa sổ được sử dụng bởi các bản phân phối Linux.


6
Chúng được xây dựng trên nó. X11 là máy chủ, trong khi KDE, Gnome, v.v. là người quản lý máy tính để bàn, cung cấp API cấp cao hơn, bố cục cửa sổ chung, v.v.
Đánh dấu

7
X11 là lớp cấp thấp thực tế xử lý tất cả những thứ này và xử lý việc vẽ lên màn hình, v.v. (và giao tiếp với trình điều khiển đồ họa). Gnome / KDE sau đó kiểm soát X11. Đó là về nó ở mức cao và bỏ qua một tỷ và một chi tiết.
slugonamission

3
cảm ơn. một câu hỏi nữa: wikipedia giải thích rằng X11 "tạo ra một lớp trừu tượng phần cứng nơi phần mềm được viết để sử dụng một bộ lệnh tổng quát, cho phép độc lập thiết bị và sử dụng lại các chương trình trên bất kỳ máy tính nào thực hiện X." Câu hỏi của tôi là: tại sao X11 cung cấp tương tác phần cứng (HAL), Linux Kernel có nên cung cấp điều đó và X11 hoạt động trên Kernel không? Nói cách khác, tại sao X11 tiếp cận các thiết bị phần cứng khi Kernel phải là proxy của nó?
lưỡng cư

1
Tôi nghĩ trong trường hợp HALnày là một thuật ngữ được sử dụng không chính xác. Thực sự những gì họ nói là X11 cung cấp một phương tiện độc lập với hệ thống để hiển thị các cửa sổ. Có các phiên bản X11 cho Darwin (Mac OS - hiện tại thực sự phức tạp hơn với Mountain Lion ...), MS Windows và Linux.
Chris Thompson

4
X11 là một giao thức mạng. Trừu tượng liên quan đến việc viết các chương trình trên nền tảng A có thể hiển thị các máy khách X11 (windows, ứng dụng, v.v.) trên nền tảng B qua một số thiết bị mạng. Ứng dụng của bạn có thể chạy cục bộ, từ xa, trong một máy chủ lồng nhau, trong một máy chủ ảo chỉ có VNC, v.v. Sự trừu tượng hóa phần cứng (trên nền tảng cục bộ) là tác dụng phụ của tính năng này, nhưng nó cũng làm mờ ranh giới giữa X11 và hạt nhân (đó là những gì trừu tượng hóa phần cứng trên một hệ thống Unix trung bình).
Alexios

59

Wayland cũng đáng được nhắc đến vì nó chủ yếu được gọi là "kẻ giết người X11 trong tương lai".

Cũng lưu ý rằng Android và một số hệ điều hành di động khác không bao gồm X11 mặc dù chúng có nhân Linux, vì vậy theo nghĩa đó, X11 không có nguồn gốc từ tất cả các hệ thống Linux.

Là đa nền tảng không có gì để làm với bản địa. Ca cao cũng đã được chuyển sang các nền tảng khác thông qua GNUStep nhưng nó vẫn có nguồn gốc từ OS X / macOS.


2
Sơ đồ kiến ​​trúc cấp cao cho Wayland giống như của X, ngoại trừ "Bộ tổng hợp" và "Máy chủ" trong sơ đồ X được hợp nhất trong sơ đồ Wayland. Điều còn thiếu là một lời giải thích hợp lý tại sao sự tích hợp này không thể hoạt động vào X.
Kaz

1
tốt, tôi sẽ nói rằng không dễ để thay đổi thiết kế cơ bản của một cơ sở mã hơn 20 năm tuổi. Cũng lưu ý rằng một vấn đề khác với X11 là hầu hết các chức năng của nó như kết xuất phông chữ hiện không được sử dụng. Plus X11 vẫn sẽ cần thiết trong các máy chủ và siêu máy tính, tính minh bạch của mạng là quá tốt để từ bỏ.
không có

3
@gokcehan wayland không bỏ qua tính minh bạch của mạng, đó là một huyền thoại. Nó không được thực hiện chưa , cũng giống như nhiều thứ khác ở Wayland. wayland.freedesktop.org/faq.html#heading_toc_j_8 blog.martin-graesslin.com/blog/2011/08/... , vv
whitequark

8
+! để đề cập đến Android thiếu X11. Android có lẽ là ví dụ phản biện thuyết phục nhất với lập luận rằng "x11 là GUI linux linux". Chứng minh rằng Linux có thể có x11 hoặc Android vì GUI "bản địa" của nó cho người mới bắt đầu thấy rằng Linux thực sự chỉ là một hạt nhân và không phải lúc nào cũng có GUI.
Trevor Boyd Smith

"Đa nền tảng không liên quan gì đến bản địa" là một điểm tuyệt vời. Tôi đã sử dụng mô hình đó rất thường xuyên trong nhiều năm chuyển qua nền tảng chéo. Đáng chú ý nhất là vào những năm 90, tôi đã bán một khung cho phép bạn biên dịch mã được viết cho khung PowerPlant Metrowerks bằng cách sử dụng MFC dưới mui xe. . .
Andy Dent

23

Nói đúng ra, API của Linux bao gồm các lệnh gọi hệ thống của nó . Đây là tất cả các hàm kernel có thể được gọi bởi chương trình chế độ người dùng (không phải kernel). Đây là một giao diện cấp thấp cho phép các chương trình thực hiện những việc như mở và đọc tệp. Xem http://en.wikipedia.org/wiki/System_call để biết giới thiệu chung.

Một hệ thống Linux thực sự cũng sẽ có toàn bộ "chồng" phần mềm khác chạy trên nó, để cung cấp giao diện người dùng đồ họa và các tính năng khác. Mỗi yếu tố của ngăn xếp này sẽ cung cấp API riêng.


3
Câu trả lời này được viết khi câu hỏi là "API gốc của linux là gì?" (kể từ đó, "GUI" đã được chèn vào câu hỏi).
nibot

Đây vẫn là câu trả lời đúng cho câu hỏi hiện tại là một câu hỏi không mạch lạc vì không có hệ thống nào đứng đầu Linux, kể cả GNU và X11, là "bản địa" theo bất kỳ ý nghĩa nào.
Jim Balter

20

Để hỗ trợ cho những gì đã được đề cập, có một cái nhìn tổng quan rất tốt về ngăn xếp đồ họa Linux tại blog này: http://blog.mecheye.net/2012/06/the-linux-graphics-stack/

Điều này giải thích X11 / Wayland vv và làm thế nào tất cả khớp với nhau. Ngoài những gì đã được đề cập, tôi nghĩ rằng đáng để thêm một chút về các API sau mà bạn có thể sử dụng cho đồ họa trong Linux:

Mesa - "Mesa có nhiều thứ, nhưng một trong những điều quan trọng mà nó cung cấp mà nó nổi tiếng nhất là việc triển khai OpenGL. Đây là một triển khai mã nguồn mở của API OpenGL."

Cairo - "cairo là một thư viện vẽ được sử dụng bởi các ứng dụng như Firefox trực tiếp hoặc thông qua các thư viện như GTK +, để vẽ các hình dạng vector."

DRM (Trình quản lý kết xuất trực tiếp) - Tôi hiểu điều này ít nhất nhưng về cơ bản, trình điều khiển hạt nhân cho phép bạn viết đồ họa trực tiếp lên bộ đệm khung mà không cần thông qua X


habrahabr.ru/post/148954 - (bằng tiếng Nga) bản dịch của bài đăng đó nếu có ai cần
Boris Burkov


5

XWindows có lẽ là gần nhất với những gì có thể được gọi là 'bản địa' :)


3
đó có phải là điều tương tự như x11?
DavidColson

1
Nhưng nếu bạn sử dụng trực tiếp, bạn sẽ thấy nó không hoàn toàn là một api GUI ... Linux chỉ không có 1 api GUI gốc. Nhưng gần như tất cả các API GUI (ít nhất là các API phổ biến trên máy tính để bàn ngày nay) đều chạy trên X. Nếu bạn bắt đầu viết một ứng dụng bằng X cũ đơn giản ngày hôm nay, nó sẽ trông hoàn toàn không phù hợp với bất kỳ bản phân phối hiện đại nào, vì vậy tôi sẽ nói GUI gốc phụ thuộc vào phân phối - gtk / gnome cho ubfox, kde cho người khác.
Axel

1

Thứ gần nhất với Win32 trong linux sẽ là libc, vì bạn đề cập đến không chỉ UI mà cả các sự kiện và "các công cụ os khác"


5
libc (thư viện chuẩn C) là giao diện cho các cuộc gọi hệ điều hành. Đó là cái thứ hai (các cuộc gọi hệ điều hành) trên Linux, gần như dịch sang Win32 trên Windows. Bạn không thể thực sự (hoặc hoàn toàn?) Chương trình cho các phiên bản Windows hiện tại mà không cần sử dụng API Win32, nhưng bạn có thể lập trình cho cả Windows và Linux mà không cần sử dụng thư viện C tiêu chuẩn của trình biên dịch tương ứng, chỉ bằng cách sao chép trực tiếp mã tòa nhà cao tầng. Điều đó không được khuyến khích và nó làm cho mã của bạn hoàn toàn không thể truy cập được đối với các HĐH khác, nhưng điều đó là có thể làm được.
một CVn

UI không phải là một phần của libc - miễn là bạn không nghĩ về printf / scanf và tương tự như là một UI ... libc chỉ là thư viện chuẩn C. Và nó cũng không thực sự là một giao diện cho các cuộc gọi hệ điều hành. Nó cung cấp các chức năng cho tập tin i / o, quản lý bộ nhớ, xử lý chuỗi, v.v. và sử dụng nội bộ các cuộc gọi hệ thống. Để thực hiện các cuộc gọi hệ thống như ioctlmình, bạn phải bao gồm một cái gì đó từ sys/.
Axel

Câu hỏi không phải lúc nào cũng chỉ định "GUI".
jv110

Có lẽ bạn nói về Xlibkhông libc.
i486

1

Các hoạt động đồ họa hạt nhân linux nằm trong /include/linux/fb.h dưới dạng struct fb_ops. Cuối cùng, đây là những tiện ích bổ sung như X11, Wayland hoặc DRM xuất hiện để tham khảo. Vì các hoạt động này chỉ dành cho thẻ video, không phải là thiết bị đầu cuối vectơ hoặc raster hoặc thiết bị đầu cuối định hướng tty, tính hữu dụng của chúng như GUI bị hạn chế; điều đó không hoàn toàn đúng khi bạn cần những tiện ích bổ sung đó để có được đầu ra đồ họa nếu bạn không phiền khi sử dụng một số trình biên dịch để bỏ qua tòa nhà chọc trời khi cần thiết.


0

GUI là một khả năng trừu tượng hóa ở mức độ cao, vì vậy hầu hết mọi thứ từ máy chủ XOrg đến OpenGL đều được chuyển qua nhiều nền tảng, bao gồm cả nền tảng Windows. Nhưng nếu bằng API GUI, bạn có nghĩa là API đồ họa * nix thì bạn có thể đang lang thang trong "Cơ sở hạ tầng kết xuất trực tiếp".


0

Con đường

Như bạn có thể nghe thấy, wayland là sự lựa chọn đặc trưng của nhiều bản phân phối ngày nay, vì giao thức của nó đơn giản hơn X.

Bộ công cụ của wayland

Các thư viện công cụ hoặc gui mà wayland gợi ý là:

  • QT 5
  • GTK +
  • LSD
  • Bừa bộn
  • EFL

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.