運用xlib進行事件響應 X11 API 的小例子

2021-06-06 23:53:09 字數 2732 閱讀 6158

引用自:

file: x11_test.cxx

#include

每乙個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

有這樣乙個**:,通俗易懂。

spring進行事務管理

用jdbc的事務管理器 datasourcetransactionmanager 而啟用事務註解中的transaction manager值必須是trasactionmanager,若配置的事務管理器的id為trasactionmanager,nametransaction manager可以不寫 ...

運用chain進行跳轉

struts2裡的result的chain,可以將action串成乙個鏈,從而實現自定義的跳轉,redirect型別的url會變更,chain不會變更,這個是最大的差別,chain裡的值棧物件會被自動壓入新的action裡。看 struct.xml aaction baction a.jsp b.j...

Spring 使用註解方式進行事物管理

spring 使用註解方式進行事物管理 當標於類前時,標示類中所有方法都進行事物處理 例子 transactional public class testservicebean implements testservice 當類中某些方法不需要事物時 transactional public cla...