อ่าน 5 นาที
เอ็กซ์ลิบ
Xlib (หรือที่รู้จักกันในชื่อlibX11 ) เป็นไลบรารีไคลเอ็นต์โปรโตคอลX Window Systemที่เขียนด้วยภาษาโปรแกรม Cประกอบด้วยฟังก์ชันสำหรับการโต้ตอบกับเซิร์ฟเวอร์ X
เอ็กซ์ลิบ
| เอ็กซ์ลิบ | |
|---|---|
| นักพัฒนา | มูลนิธิ X.Org |
| ปล่อย | กันยายน พ.ศ. 2528 [ 1 ] |
| เวอร์ชันเสถียร | 1.8.13 [ 2 ] |
| เขียนเป็น | ซี |
| พิมพ์ | ห้องสมุด |
| เว็บไซต์ | www.x.org |
| ที่เก็บข้อมูล |
|

Xlib (หรือที่รู้จักกันในชื่อlibX11 ) เป็นไลบรารีไคลเอ็นต์โปรโตคอลX Window Systemที่เขียนด้วยภาษาโปรแกรม Cประกอบด้วยฟังก์ชันสำหรับการโต้ตอบกับเซิร์ฟเวอร์ X ฟังก์ชันเหล่านี้ช่วยให้นักเขียนโปรแกรมสามารถเขียนโปรแกรมได้โดยไม่ต้องรู้รายละเอียดของโปรโตคอล X
มีแอปพลิเคชันเพียงไม่กี่ตัวที่ใช้ Xlib โดยตรง แต่ส่วนใหญ่จะใช้ไลบรารีอื่นๆ ที่ใช้ฟังก์ชันของ Xlib เพื่อจัดเตรียมชุดเครื่องมือสำหรับวิดเจ็ต :
- X Toolkit Intrinsics (Xt)
- ชุดวิดเจ็ต Athena (Xaw)
- ลวดลาย
- เอฟแอลทีเค
- จีทีเค
- Qt (เวอร์ชัน X11)
- Tk
- SDL (Simple DirectMedia Layer)
- SFML (Simple and Fast Multimedia Library)
Xlib ซึ่งเปิดตัวสู่สาธารณะครั้งแรกในเดือนกันยายน พ.ศ. 2528 [ 1 ]ถูกใช้ในGUIสำหรับระบบปฏิบัติการที่คล้าย Unix หลายระบบ การนำ Xlib กลับมาใช้งานใหม่ได้รับการแนะนำในปี พ.ศ. 2550 โดยใช้XCB [ 3 ]
ประเภทข้อมูล
ประเภทข้อมูลหลักใน Xlib คือ โครงสร้าง Display[ 4 ]และประเภทของตัวระบุ
โดยทั่วไปแล้ว จอแสดงผลคืออุปกรณ์ทางกายภาพหรือเสมือนจริงที่ใช้ในการประมวลผลกราฟิกDisplayโครงสร้างของไลบรารี Xlib ประกอบด้วยข้อมูลเกี่ยวกับจอแสดงผล แต่ที่สำคัญกว่านั้นคือ ข้อมูลที่เกี่ยวข้องกับช่องทางการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ ตัวอย่างเช่น ในระบบปฏิบัติการแบบ UnixDisplayโครงสร้างจะประกอบด้วยตัวจัดการไฟล์ของซ็อกเก็ตของช่องทางการสื่อสารนี้ (สามารถเรียกใช้ได้โดยใช้ConnectionNumberมาโคร) ฟังก์ชัน Xlib ส่วนใหญ่มีDisplayโครงสร้างเป็นอาร์กิวเมนต์ เนื่องจากฟังก์ชันเหล่านั้นทำงานกับช่องทางการสื่อสารหรือเกี่ยวข้องกับช่องทางการสื่อสารเฉพาะ โดยเฉพาะอย่างยิ่ง ฟังก์ชัน Xlib ทั้งหมดที่โต้ตอบกับเซิร์ฟเวอร์จำเป็นต้องมีโครงสร้างนี้สำหรับการเข้าถึงช่องทางการสื่อสาร ฟังก์ชันอื่นๆ บางฟังก์ชันจำเป็นต้องมีโครงสร้างนี้ แม้ว่าจะทำงานในเครื่องก็ตาม เนื่องจากฟังก์ชันเหล่านั้นทำงานกับข้อมูลที่เกี่ยวข้องกับช่องทางการสื่อสารเฉพาะ การดำเนินการประเภทนี้รวมถึงการดำเนินการกับคิวเหตุการณ์ ซึ่งจะอธิบายไว้ด้านล่าง
หน้าต่าง แผนที่สี ฯลฯ ถูกจัดการโดยเซิร์ฟเวอร์ ซึ่งหมายความว่าข้อมูลเกี่ยวกับการใช้งานจริงทั้งหมดจะถูกจัดเก็บไว้ในเซิร์ฟเวอร์ ไคลเอนต์จะดำเนินการกับวัตถุเหล่านี้โดยใช้ตัวระบุ ของวัตถุ ไคลเอนต์ไม่สามารถดำเนินการกับวัตถุโดยตรงได้ แต่สามารถร้องขอให้เซิร์ฟเวอร์ดำเนินการโดยระบุตัวระบุของวัตถุเท่านั้น
ชนิดข้อมูลWindows, Pixmap, Font, Colormap, ฯลฯ ล้วนเป็นตัวระบุ ซึ่งเป็นจำนวนเต็ม 32 บิต (เช่นเดียวกับในโปรโตคอล X11 เอง) ไคลเอนต์ 'สร้าง' หน้าต่างโดยการร้องขอให้เซิร์ฟเวอร์สร้างหน้าต่าง การดำเนินการนี้ทำได้โดยการเรียกใช้ฟังก์ชัน Xlib ซึ่งจะส่งคืนตัวระบุสำหรับหน้าต่าง นั่นคือตัวเลข จากนั้นไคลเอนต์สามารถใช้ตัวระบุนี้เพื่อร้องขอการดำเนินการอื่นๆ บนหน้าต่างเดียวกันไปยังเซิร์ฟเวอร์ได้
ตัวระบุเหล่านี้มีเอกลักษณ์เฉพาะสำหรับเซิร์ฟเวอร์นั้นๆ ส่วนใหญ่สามารถใช้โดยแอปพลิเคชันต่างๆ เพื่ออ้างอิงถึงวัตถุเดียวกันได้ ตัวอย่างเช่น แอปพลิเคชันสองตัวที่เชื่อมต่อกับเซิร์ฟเวอร์เดียวกันจะใช้ตัวระบุเดียวกันเพื่ออ้างอิงถึงหน้าต่างเดียวกัน แอปพลิเคชันทั้งสองนี้ใช้ช่องทางการสื่อสารที่แตกต่างกันสองช่องทาง ดังนั้นจึงมี โครงสร้าง การแสดงผล ที่แตกต่างกันสองแบบ อย่างไรก็ตาม เมื่อพวกเขาร้องขอการดำเนินการกับตัวระบุเดียวกัน การดำเนินการเหล่านั้นจะถูกกระทำกับวัตถุเดียวกัน
พิธีการและกิจกรรมต่างๆ
ฟังก์ชัน Xlib ที่ส่งคำขอไปยังเซิร์ฟเวอร์โดยปกติจะไม่ส่งคำขอเหล่านั้นทันที แต่จะเก็บไว้ในบัฟเฟอร์ที่เรียกว่าบัฟเฟอร์คำขอคำว่าคำขอในที่นี้หมายถึงคำขอจากไคลเอ็นต์ที่ส่งไปยังเซิร์ฟเวอร์ บัฟเฟอร์คำขอสามารถมีคำขอทุกประเภทไปยังเซิร์ฟเวอร์ ไม่ใช่เฉพาะคำขอที่มีผลต่อหน้าจอเท่านั้น บัฟเฟอร์คำขอจะถูกล้าง (กล่าวคือ คำขอทั้งหมดที่ดำเนินการไปแล้วจะถูกส่งไปยังเซิร์ฟเวอร์) หลังจากเรียกใช้ฟังก์ชันXSyncหรือXFlushหลังจากเรียกใช้ฟังก์ชันที่ส่งค่ากลับจากเซิร์ฟเวอร์ (ฟังก์ชันเหล่านี้จะบล็อกจนกว่าจะได้รับคำตอบ) และในเงื่อนไขอื่นๆ อีกบางประการ
Xlib จะจัดเก็บเหตุการณ์ที่ได้รับไว้ในคิว แอปพลิเคชันไคลเอ็นต์สามารถตรวจสอบและดึงเหตุการณ์จากคิวได้ ในขณะที่เซิร์ฟเวอร์ X ส่งเหตุการณ์แบบอะซิงโครนัส แอปพลิเคชันที่ใช้ไลบรารี Xlib จำเป็นต้องเรียกฟังก์ชัน Xlib อย่างชัดเจนเพื่อเข้าถึงเหตุการณ์ในคิว ฟังก์ชันบางอย่างอาจทำให้เกิดการบล็อก ในกรณีนี้ ฟังก์ชันเหล่านั้นจะทำการล้างบัฟเฟอร์คำขอด้วย
แทนที่จะเป็นเช่นนั้น ข้อผิดพลาดจะถูกรับและจัดการแบบอะซิงโครนัส: แอปพลิเคชันสามารถจัดเตรียมตัวจัดการข้อผิดพลาดที่จะถูกเรียกใช้เมื่อใดก็ตามที่ได้รับข้อความแสดงข้อผิดพลาดจากเซิร์ฟเวอร์
เนื้อหาภายในหน้าต่างจะไม่ได้รับการเก็บรักษาไว้หากหน้าต่างหรือส่วนใดส่วนหนึ่งของหน้าต่างถูกซ่อนไว้ ในกรณีนี้ แอปพลิเคชันจะได้รับการแจ้งExposeเตือนเมื่อหน้าต่างหรือส่วนใดส่วนหนึ่งของหน้าต่างถูกทำให้มองเห็นได้อีกครั้ง จากนั้นแอปพลิเคชันจะต้องวาดเนื้อหาในหน้าต่างขึ้นมาใหม่
ฟังก์ชัน
ฟังก์ชันต่างๆ ในไลบรารี Xlib สามารถจัดกลุ่มได้ดังนี้:
- การดำเนินการบนการเชื่อมต่อ (
XOpenDisplay,XCloseDisplay, ...); - คำขอไปยังเซิร์ฟเวอร์ รวมถึงคำขอสำหรับการดำเนินการ (
XCreateWindow,XCreateGC,...) และคำขอสำหรับข้อมูล (XGetWindowProperty, ...); และ - การดำเนินการที่เกิดขึ้นเฉพาะในฝั่งไคลเอ็นต์: การดำเนินการกับคิวเหตุการณ์ (
XNextEvent,XPeekEvent, ...) และการดำเนินการอื่นๆ กับข้อมูลภายในเครื่อง (XLookupKeysym,XParseGeometry,XSetRegion,XCreateImage,XSaveContext, ...)
ตัวอย่าง


โปรแกรมต่อไปนี้สร้างหน้าต่างที่มีสี่เหลี่ยมสีดำเล็กๆ อยู่ตรงกลาง:
/* แอปพลิเคชัน Xlib อย่างง่ายสำหรับการสร้างหน้าต่างและวาดกล่องในนั้น gcc input.c -o output -lX11 */ #include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main ( void ) { Display * display ; Window window ; XEvent event ; char * msg = "Hello, World!" ; int s ; // เปิดการเชื่อมต่อกับเซิร์ฟเวอร์display = XOpenDisplay ( NULL ); if ( display == NULL ) { fprintf ( stderr , "ไม่สามารถเปิดจอแสดงผล\n " ); exit ( 1 ); } s = DefaultScreen ( display ); // สร้างหน้าต่าง window = XCreateSimpleWindow ( display , RootWindow ( display , s ), 10 , 10 , 200 , 200 , 1 , BlackPixel ( display , s ), WhitePixel ( display , s )); // เลือกประเภทของเหตุการณ์ที่เราสนใจXSelectInput ( display , window , ExposureMask | KeyPressMask ); // แมป (แสดง) หน้าต่างXMapWindow ( display , window ); // ลูปเหตุการณ์for (;;) { XNextEvent ( display , & event ); // วาดหรือวาดหน้าต่างใหม่if ( event . type == Expose ) { XFillRectangle ( display , window , DefaultGC ( display , s ), 20 , 20 , 10 , 10 );XDrawString ( display , window , DefaultGC ( display , s ), 50 , 50 , msg , strlen ( msg )); } // ออกเมื่อกดปุ่มif ( event . type == KeyPress ) break ; } // ปิดการเชื่อมต่อกับเซิร์ฟเวอร์XCloseDisplay ( display ); return 0 ; }ไคลเอนต์สร้างการเชื่อมต่อกับเซิร์ฟเวอร์โดยการเรียกเมธอด `connect` XOpenDisplayจากนั้นร้องขอการสร้างหน้าต่างด้วยXCreateSimpleWindowเมธอด `window` จำเป็นต้องเรียกXMapWindowเมธอด `window` แยกต่างหากเพื่อแมปหน้าต่าง กล่าวคือ เพื่อทำให้หน้าต่างปรากฏบนหน้าจอ
สี่เหลี่ยมจะถูกวาดโดยการเรียกใช้ฟังก์ชันXFillRectangleการดำเนินการนี้สามารถทำได้หลังจากสร้างหน้าต่างแล้วเท่านั้น อย่างไรก็ตาม การดำเนินการเพียงครั้งเดียวอาจไม่เพียงพอ เนื่องจากเนื้อหาของหน้าต่างอาจไม่ได้รับการเก็บรักษาไว้เสมอไป ตัวอย่างเช่น หากหน้าต่างถูกปิดบังแล้วเปิดออกอีกครั้ง เนื้อหาของหน้าต่างอาจต้องถูกวาดใหม่ โปรแกรมจะได้รับแจ้งว่าหน้าต่างหรือส่วนใดส่วนหนึ่งของหน้าต่างต้องถูกวาดใหม่โดยการรับExposeเหตุการณ์
ดังนั้น การวาดเนื้อหาของหน้าต่างจึงเกิดขึ้นภายในลูปที่จัดการเหตุการณ์ก่อนเข้าสู่ลูปนี้ เหตุการณ์ที่แอปพลิเคชันสนใจจะถูกเลือก ในกรณีนี้คือ `event-on- XSelectInputwindow` ลูปเหตุการณ์จะรอเหตุการณ์ที่เข้ามา: หากเหตุการณ์นี้เป็นการกดปุ่ม แอปพลิเคชันจะปิดลง หากเป็นเหตุการณ์การแสดงผล เนื้อหาของหน้าต่างจะถูกวาด ฟังก์ชันXNextEventจะบล็อกและล้างบัฟเฟอร์คำขอหากไม่มีเหตุการณ์ใดอยู่ในคิว
ห้องสมุดอื่นๆ
Xlib ไม่รองรับปุ่ม เมนู แถบเลื่อน ฯลฯวิดเจ็ต เหล่านี้ มีให้ใช้งานโดยไลบรารีอื่นๆ ซึ่งใช้ Xlib อีกทีหนึ่ง โดยมีไลบรารีอยู่สองประเภท:
- ไลบรารีเหล่านี้สร้างขึ้นบนพื้นฐานของ ไลบรารี X Toolkit Intrinsics (Xt) ซึ่งให้การสนับสนุนวิดเจ็ต แต่ไม่ได้จัดหาวิดเจ็ตใด ๆ โดยเฉพาะ วิดเจ็ตเฉพาะจะถูกจัดหาโดย ไลบรารี ชุดวิดเจ็ต ที่ใช้ Xt เช่นXawและMotif
- ไลบรารีที่ให้ชุดวิดเจ็ตโดยใช้ Xlib โดยตรง โดยไม่ต้องใช้ไลบรารี Xt เช่น GTK , Qt , FLTKและfpGUIเวอร์ชันX
โดยทั่วไป แอปพลิเคชันที่ใช้ไลบรารีวิดเจ็ตเหล่านี้จะระบุเนื้อหาของหน้าต่างก่อนเข้าสู่ลูปหลัก และไม่จำเป็นต้องจัดการExposeเหตุการณ์และวาดเนื้อหาของหน้าต่าง ใหม่โดยชัดเจน
ไลบรารีXCBเป็นทางเลือกแทน Xlib โดยมีเป้าหมายหลักสองประการคือ การลดขนาดของไลบรารีและการเข้าถึงโปรโตคอล X11 โดยตรง มีการดัดแปลง Xlib เพื่อให้สามารถใช้ XCB เป็นเลเยอร์ระดับต่ำได้
ลิงก์ภายนอก
- เอกสารการเขียนโปรแกรมอย่างเป็นทางการของมูลนิธิ X.Orgรวมถึงเวอร์ชันล่าสุดของXlib - อินเทอร์เฟซภาษา C สำหรับ Xในหลายรูปแบบ
- บทแนะนำสั้นๆ เกี่ยวกับ Xlib
- หน้าคู่มือการใช้งานสำหรับฟังก์ชันทั้งหมดของ Xlib
- หน้าเว็บของ Kenton Lee เกี่ยวกับ X Window และ Motif ถูกเก็บถาวรเมื่อวันที่ 20 พฤษภาคม 2013 ที่Wayback Machine
- บทแนะนำการใช้งาน Xlib ที่ละเอียดขึ้น
- การใช้ Xlib ในการสร้างโมดูลสกรีนเซฟเวอร์
- Nye, Adrian (1990). คู่มือการเขียนโปรแกรม Xlibคู่มือฉบับสมบูรณ์สำหรับระบบ X Window เล่ม 1. O'Reilly Media. ISBN 0-937175-11-0.
- Nye, Adrian (1990). คู่มืออ้างอิง Xlibคู่มือฉบับสมบูรณ์สำหรับระบบ X Window เล่ม 2. O'Reilly Media. ISBN 0-937175-12-9.
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ เอ็กซ์ลิบ
Xlib (หรือที่รู้จักกันในชื่อlibX11 ) เป็นไลบรารีไคลเอ็นต์โปรโตคอลX Window Systemที่เขียนด้วยภาษาโปรแกรม Cประกอบด้วยฟังก์ชันสำหรับการโต้ตอบกับเซิร์ฟเวอร์ X
ประเภทข้อมูล
ประเภทข้อมูลหลักใน Xlib คือ โครงสร้าง Display [ 4 ] และประเภทของตัวระบุ
พิธีการและกิจกรรมต่างๆ
ฟังก์ชัน Xlib ที่ส่งคำขอไปยังเซิร์ฟเวอร์โดยปกติจะไม่ส่งคำขอเหล่านั้นทันที แต่จะเก็บไว้ในบัฟเฟอร์ที่เรียกว่า บัฟเฟอร์คำขอ คำว่า คำขอ ในที่นี้หมายถึงคำขอจากไคลเอ็นต์ที่ส่งไปยังเซิร์ฟเวอร์ บัฟเฟอร์คำขอสามารถมีคำขอทุกประเภทไปยังเซิร์ฟเวอร์...
ฟังก์ชัน
ฟังก์ชันต่างๆ ในไลบรารี Xlib สามารถจัดกลุ่มได้ดังนี้: