Cài đặt và sử dụng các hàm X (Xlib) trên Window32

Một phần của tài liệu NGHIÊN CỨUCHUYỂN đổi PHẦN mềm GRASS từ nền UNIX lên WINDOWS (Trang 147 - 152)

Để thực hiện các thao tác đồ họa trên MONITOR, Grass sử dụng hệ thống thư viện cơ

bản nhất của Unix, đĩ là XLIB. Hệ thống hàm X của Xlib nĩi theo nghĩa nào đĩ, tương tự như các hàm đồ họa API trên hệđiều hành Window.

Khi MONITOR được yêu cầu vẽ cái gì đĩ ra màn hình thì Driver của nĩ sẽ sử dụng thư

viện các hàm vẽ của nĩ mà bao bọc bên trong đĩ là thư viện các hàm X.

Vắ dụ:

intdraw_line (intcur_x, intcur_y, intx, inty) {

ẦẦẦẦẦẦẦẦ..

XDrawLine(dpy, bkupmap, gc, cur_x, cur_y, x, y); needs_flush = 1;

return 0; }

KHOA CNTT Ờ

ĐH KHTN

Cấu trúc dữ liệu của các hàm X rất phức tạp, được tổ chức theo nhiều xâu kép nối với nhau, tạo thành một dãy các phần tử NT_WINDOW, cùng với các khái niệm Display, Screen v.vẦ

Ngồi ra, cịn phải xử lý chuyển các sự kiện của XWindow sang sự kiện của Window, xử lý cấu trúc dữ liệu của các cửa sổẦ.

Vì thế, việc viết lại hệ thống các hàm X của XWindow trên nền MS Window là một cơng việc vơ cùng phức tạp, khĩ khăn nếu khơng muốn nĩi là nan giải (!).

Tuy nhiên, khơng phải bài tốn khĩ nào cũng khơng cĩ lời giải. Rất may mắn cho chúng ta, nhĩm phát triển dự án Cygwin, trong nỗ lực cố gắng xây dựng một mơi trường giả lập Linux thật hồn hảo trên Window, cùng với mong muốn Grass5 cũng cĩ thể chạy trên nền Window thơng qua Cygwin, đã phát triển hệ thống các hàm thư viện giả lập hệ thống XLIB của Unix trên Window. (Open Source)

Source code nằm trong thư mục src\ display\ devices\ windows\ libW11\

Trong thư mục này cĩ các thư mục con sau:

X11\ : Chứa các file tiêu đề (.h) mơ tả thư viện Xlib Muốn sử dụng Xlib, chỉ cần include các file này.

w32\ : Chứa source code chắnh của các thư viện Xlib, sẽđược dịch thành DLL wrap\ : là thư mục chứa lớp bao bọc của xlib, chúng ta sẽ sử dụng các hàm X

thơng qua lớp này, khơng gọi trực tiếp xuống thư viện Xlib

Tuy nhiên, mặc dù các hàm thư viện xlib này được viết bằng WinAPI, nhưng chúng chỉ được xây dựng để chạy trên nền Cygwin, và chúng chỉ là bộ thư viện cơ sở cấp thấp. Chúng được viết giả lập lại các hàm X trên Unix, nhưng chúng ta khơng thể gọi sử dụng trực tiếp các hàm này được. Muốn sử dụng được, chúng ta phải cần đến một

KHOA CNTT Ờ

ĐH KHTN

lớp bao bọc bên trên các hàm này, lớp này sẽ xử lý, khởi tạo sơ bộ những yếu tố cần thiết để sẵn sàng gọi đến bộ thư viện X này.

Cụ thể là, source code bộ thư viện xlib.c sẽđược chúng ta chủđộng đĩng gĩi lại thành một thư viện động DLL tên là libG11.dll, sau đĩ chúng ta sẽ dùng các file khác cài đặt lại prototype của các hàm X, cĩ xử lý sơ bộ trước khi lại gọi xuống chắnh các hàm X

đĩ trong thư viện động libG11.dll.

Vắ dụ:

Thư viện Xlib.c (đã xây dựng thành libG11.dll) cĩ hàm XopenDisplay(int a, int b, int c);

Để sử dụng hàm này, ta khơng gọi trực tiếp từ thư viện libG11.dll mà ta phải xây dựng một hàm khác cùng tên, làm các xử lý sơ bộ, trước khi gọi làm hàm thật sự của Xlib, như sau:

void XOpenDisplay(int a, int b, int c) {

// Các xử lý sơ bộ (adsbygoogle = window.adsbygoogle || []).push({});

int test = Set_Atom(_register_class(..)); //chỉ là vắ dụ

//Sau đĩ mới gọi các hàm Xlib trong libG11.dll LoadDLL_XOpenDisplay(a, b, c);

}

Trên đây chỉ là minh họa thuật giải, cịn cụ thể, xem trong các file wrap\wrap.c & wrap\xwrappers.gen

Ghi chú:

Load một hàm thư viện từ DLL ngồi cách sử dụng file .lib trong Setting của VC++, ta cịn cĩ thể load trực tiếp từ file .DLL mà khơng cần file .lib, bằng các hàm sau:

LoadLibrary();

GetProcAddress();

KHOA CNTT Ờ

ĐH KHTN

Vắ dụ:

Load một hàm thư viện:

staticvoid* _lib;

// hàm sau load một hàm tên ỘnameỢ trong DLL lên để sử dụng

void* _loadfunc(char *name) {

void *f = NULL;

_lib = LoadLibrary(ỘlibG11.dllỢ); // load thư viện libG11.dll

f = GetProcAddress(_lib,name); // đọc con trỏ hàm ỘnameỢ

return f; // trả về con trỏ hàm của hàm ỘnameỢ

}

Gọi thực hiện một hàm thư viện:

//khai báo dạng thức hàm của hàm XOpenDisplay trong thư viện

typedefDisplay * (proto_XOpenDisplay)(constchar *name);

//khai báo con trỏ hàm XOpenDisplay

staticproto_XOpenDisplay *func_XOpenDisplay = NULL;

Display * XOpenDisplay(constchar *name) {

//load hàm thư viện XOpenDisplay lên

func_XOpenDisplay=(proto_XOpenDisplay *)_loadfunc("XOpenDisplay");

//gọi thực hiện nĩ

return (func_XOpenDisplay)(name); } (adsbygoogle = window.adsbygoogle || []).push({});

KHOA CNTT Ờ

ĐH KHTN

Mơ Hình Xây Dựng Thư Viện XLIB:

USER / GRASS

XLIBLIBRARY

Wrap.c

libG11.dll

ntutil.c xlib.c event.c

Hình 3 - 5 Kiến trúc thư viện XLIB

KHOA CNTT Ờ

ĐH KHTN

Chương 4 : Tng Kết

Một phần của tài liệu NGHIÊN CỨUCHUYỂN đổi PHẦN mềm GRASS từ nền UNIX lên WINDOWS (Trang 147 - 152)