![]() | English tiếng Việt |
| Xvnkb Vdict Vdesk Misc Contact |
CƠ CHẾ LÀM VIỆC CỦA xvnkb 0.2.xTÁC GIẢ: Đào Hải LâmTHAM KHẢO: Unix/Linux programming & X-Window programming SƠ LƯỢC VỀ SHARED LIBS & PRELOAD LIBSa) Shared libsMột chương trình khi được compiled và linked với một shared libs thì tất cả các function mà nó dùng trong shared libs đó được lưu bên trong nó ở dạng function pointers. Khi hệ thống load chương trình này lên sẽ thực hiện các bước sau:
+-------------------+ +-------------+
| (Aplication) | | [glibc] |
,--+-------------------+ +-------------+
| | ... | | ... |
| +-------------------+ | ... |
| | printf |------. | ... |
function | +-------------------+ | +-------------+
table < | ... | `--------->| printf |
(*) | +-------------------+ +-------------+
| | XNextEvent |------. | ... |
| +-------------------+ | +-------------+
| | ... | |
| | ... | | +-------------+
`--+-------------------+ | | [Xlib] |
| | | +-------------+
| | | | ... |
| +-------------+
`--------->| XNextEvent |
+-------------+
| ... |
+-------------+
(*) Tạm gọi bảng các function pointers này là function table cho ... dễ nhớ và dễ hiểu ;) Ngược lại, nếu chương trình được linked với các static libs thì sẽ không có các function pointers mà code của các function đó sẽ được chèn vào bên trong chương trình và trở thành 1 phần code của chương trình. b) Preload libsKhi hệ thống load 1 app vào memory, nó sẽ kiểm tra xem biến môi
trường (1) Ví dụ:
+-------------------+ +-------------+
| (Aplication) | | [glibc] |
+-------------------+ +-------------+
| ... | | ... |
+-------------------+ | ... |
| printf |------. | ... |
+-------------------+ | +-------------+
| ... | `--------->| printf |
+-------------------+ +-------------+
| XNextEvent |------. | ... |
+-------------------+ | +-------------+
| ... | |
| ... | | +~~~~~~~~~~~~~~~~~~~~~+
+-------------------+ | | [xvnkb.so] |
| | | +~~~~~~~~~~~~~~~~~~~~~+
| | | | ... |
| +~~~~~~~~~~~~~~~~~~~~~+
`---->| XNextEvent |
| ... |
| ... |
| call Xlib:XNextVent }-.
+~~~~~~~~~~~~~~~~~~~~~+ |
|
+-------------+ |
| [Xlib] | |
+-------------+ |
| ... | |
+-------------+ |
| XNextEvent |<---'
+-------------+
| ... |
+-------------+
Với cách trên Unix/Linux (2) đã cung cấp cho chúng ta 1 cách rất dễ dàng để có thể "nạp chống" (3) các function của ta lên trên các function của hệ thống; Cho phép ta xử lý trước/sau các dữ liệu vào/ra function của hệ thống (4). (+) Xem thêm các sample programs về shared libs & preload libs tại: http://xvnkb.sourceforge.net/preload (+) Chú thích:
"CHẶN" VÀ XỬ LÝ EVENTSĐể nhận được các events từ X Server, hầu hết (tất cả?) các X Apps
đều gọi function
+--------------+
| X Server |
+------+-------+
|
|
v
+----------+
| xvnkb.so |
+---+----------+---+
| XNextEvent |
|(pre/post process)|
+------------------+
^ |
| |
request | | return
for events | | events
| v
+----------+
| X app |
+----------+
SEND STRING VỀ CHO CHƯƠNG TRÌNHTrong X-Window, 1 key code có thể tương ứng với 1 chuỗi ký tự (string).
Do đó, khi nhận được 1 key event, các X Apps thường gọi Ví dụ:
(+) Xem file xvnkb.c để nắm thêm chi tiết Ngoài ra, khi nhận được string từ XLookupString, các chương trình sẽ
dựa vào LANG/Locale để chuyển đổi (convert) sang dạng cần thiết để
hiển thị (display) hay xử lý. Vì vậy, nếu ta đặt VAI TRÒ CỦA xvnkb GUITrong NHẬN XÉTVới cách "chặn events" và "send string" như trên, xvnkb làm việc rất
hiệu quả. So với cách làm việc của HẠN CHẾ
|