DFB的焦點切換

      DFB一般用在嵌入式系統中,所以窗口管理器的實現特別簡單,特別是default,我用的就是這個窗口管理器,所以也就有了侷限性,這幾天遇到了一個窗口的焦點問題,就看了下Directfb的源碼,勉強理出了個頭緒。

      default窗口管理器的代碼在wm/default下,當應用程序新建一個窗口時,窗口管理器會把這個窗口入棧,可以查看wm_add_window這個函數,其中有兩個關鍵的函數,insert_window和update_focus,註釋寫得很清楚,一個是窗口入棧,一個是將焦點切換到新窗口上,update_focus的註釋寫的比較有意思,Possiby switch focus to the new window,不知道我是不是可以理解爲,不一定能將焦點切換到新窗口上,事實也確實如此,我看了下update_focus函數,wm切換焦點的過程是這樣的:

1、獲取entered_window,就是新窗口跳出來之前,鼠標進入的窗口,定義爲before,然後獲取window_at_pointer,就是當前鼠標所在位置的窗口,定義爲after。

2、給before發送leave event,然後把焦點切換到after,再發送enter event到after窗口,焦點就從before切換到了after。

      這樣問題就出來了,如果before和after是同一個窗口,焦點就不會切換到新窗口,問題就出在window_at_pointer這裏,這裏的本意應該是獲取新窗口,而不是鼠標所在位置的窗口,如果窗口是全屏的,自然不會有問題,鼠標所在位置的窗口就是新窗口,如果不是全屏的,那鼠標所在位置的窗口就有可能是父窗口,所以只要將window_at_pointer這個函數稍加改動就可以解決問題。

      既然新窗口已經入棧,那棧頂的窗口就是新窗口,只需要把棧頂的窗口取出來即可,window_at_pointer這個函數裏已經有現成的代碼,如下:

其中fusion_vector_foreach_reverse是一個for循環的宏,從棧頂開始往下遍歷,這樣就很明顯了,只要把if語句裏的幾句話提出來放到if前面即可。

 

發佈了52 篇原創文章 · 獲贊 17 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章