每乙個xlib程式都必須包含這個標頭檔案
#include
1. int main(void) ;
15. xnextevent(display, &event);
16. }
接下來就是進入事件迴圈了。獲得事件,處理或丟棄。上面講到,呼叫xmapwindow
函式後,x server
會發出乙個mapnotify
事件給客戶端,這時客戶端就已經有相應操作了,就是畫視窗,所以事件迴圈裡並沒有寫出來。
17. return 0;
18. }
至此,整個程式結束。
編譯:g++ -lx11 -o x11_test x11_test.cxx
執行,螢幕上就顯示乙個最簡單的視窗了。
如果我們想看看mapnotify
事件到底是怎麼回事,就這樣寫:
while(1)
//sleep(3);
return 0;
執行發現,視窗一閃而過。也就是說,客戶端一接收到這個事件就顯示視窗,一顯示視窗就break
了。把注釋拿掉,則顯示視窗3
秒鐘後才消失。
這裡看到,接收到的事件由xnextevent
函式從訊息佇列裡獲得,把事件放到event.type
裡並從佇列裡刪除該訊息
。當隊列為空也就是沒有下乙個事件被接收時,xnextevent「flushes the output buffer」
,也就是視窗最終被顯示,並且程式就一直停留在xnextevent
裡直到有下乙個事件,除非有跳出迴圈的語句。
繼續改程式:
while(1)
xdrawline(display, win, gc, 10, 160, 180, 20);
//xflush(display);
sleep(3);
return 0;
跳出迴圈後,用xdrawline
畫一條線。這時執行程式,視窗上並沒有出現直線。因為視窗的資訊改變了,就需要xflush
函式來flush
一下,讓視窗重畫。而之前之所以沒有xflush
函式,是因為xnextevent
函式隱式地呼叫xflush
了,而且呼叫後並沒有改變視窗資訊。
繼續改,新增事件:
xselectinput(display, win, exposuremask|keypressmask|structurenotifymask);
while(1)
;
xnextevent(display, &event);
switch(event.type)
case expose:
case keypress:
}
default: break;
}
}
return 0;
事件型別structurenotifymask
對應事件configurenotify
,即改變視窗狀態,比如尺寸,位置等;exposuremask
對應事件expose
(我不知道怎麼解釋這個事件),本例中是在這裡設定視窗顏色,畫字串並設定字串顏色;keypressmask
對應keypress
,即鍵盤響應,本例是當escape
鍵按下時,退出視窗。退出視窗時,需要釋放或者說銷毀gc
,最開始曾開啟display
,在這裡需要關閉和x server
的連線,於是也就銷毀了相關資源,關閉了視窗。
在這種迴圈的寫法中,退出switch
,並沒有退出整個迴圈,xnextevent
仍然在顯示視窗,所以不需要我們自己呼叫xflush
。
有這樣乙個**:http://tronche.com/gui/x/xlib-tutorial/
,通俗易懂。
運用X11 API的小例子
file x11 test.cxx include 每乙個xlib程式都必須包含這個標頭檔案 include 1.int main void 15.xnextevent display,event 16.接下來就是進入事件迴圈了。獲得事件,處理或丟棄。上面講到,呼叫xmapwindow 函式後,x ...
運用xlib進行事件響應 X11 API 的小例子
引用自 file x11 test.cxx include 每乙個xlib 程式都必須包含這個標頭檔案 include 1.int main void 15.xnextevent display,event 16.接下來就是進入事件迴圈了。獲得事件,處理或丟棄。上面講到,呼叫xmapwindow函式...
關於x64彙編呼叫api的問題
以radasm為例子 win32彙編呼叫api比較簡單 invoke api名字,引數 64位的就不會了 用ida看了一下生成的彙編 下面是個例子 call cs getcurrentprocess mov r9d,0ch nsize mov r8,rdi lpbuffer mov rdx,rsi ...