專利名稱:一種手機(jī)圖形系統(tǒng)中的窗口管理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及手機(jī)圖形系統(tǒng)技術(shù),更具體的說,涉及一種手機(jī)圖形系統(tǒng)中 的窗口管理方法。
背景技術(shù):
使用GUI (Graphical User Interface,圖形用戶接口 )對(duì)提高產(chǎn)品與用戶 之間的交互性非常重要,特別是在手機(jī)領(lǐng)域, 一個(gè)漂亮而易于使用的GUI 甚至有可能決定一款產(chǎn)品的成敗。隨著手機(jī)產(chǎn)業(yè)的發(fā)展,越來越多的手機(jī)采 用PC機(jī)上的圖形系統(tǒng)或者修改PC機(jī)上的圖形系統(tǒng)(后文稱之為類PC機(jī)圖 形系統(tǒng))作為自己的圖形系統(tǒng)。由于PC機(jī)上的圖形系統(tǒng)具有強(qiáng)大的功能, 為手機(jī)生成漂亮的GUI提供了強(qiáng)大的支持。
一般PC機(jī)圖形系統(tǒng)或類PC機(jī)圖形系統(tǒng)都采用了圖1所示的C/S (Client/Server,客戶機(jī)/服務(wù)器)體系結(jié)構(gòu)。每個(gè)帶GUI界面的應(yīng)用程序作 為客戶機(jī),與一個(gè)圖形服務(wù)器進(jìn)行交互。圖形服務(wù)器接受用戶的按鍵、鼠標(biāo)、 觸摸屏等設(shè)備的輸入后,在內(nèi)部按照一定格式轉(zhuǎn)換成輸入事件,然后與窗口 管理器交互,窗口管理器決定這個(gè)輸入事件應(yīng)該由哪個(gè)窗口處理(一般是焦 點(diǎn)窗口 ),然后圖形服務(wù)器根據(jù)窗口管理器的決定把輸入事件發(fā)送給該窗口 對(duì)應(yīng)的客戶機(jī),客戶機(jī)收到消息后對(duì)用戶的這個(gè)輸入事件進(jìn)行處理。窗口管 理器用來維護(hù)當(dāng)前所有客戶機(jī)的頂層窗口之間的Z序(即窗口之間的遮擋關(guān) 系,在顯示時(shí),Z序值低的窗口會(huì)遮擋住與它重疊的Z序值高的窗口)和當(dāng) 前的焦點(diǎn)窗口,只有焦點(diǎn)窗口才能獲得用戶的輸入事件。在圖形系統(tǒng)的具體 實(shí)現(xiàn)中,窗口管理器和圖形服務(wù)器有的是合在一起,有的是獨(dú)立分開的,但 不影響窗口的管理的處理流程,因此,后文都以窗口管理器和圖形服務(wù)器獨(dú) 立分開為例說明。
在PC機(jī)圖形系統(tǒng)或類PC機(jī)圖形系統(tǒng)中,其窗口管理算法如下1) 客戶機(jī)創(chuàng)建一個(gè)頂層窗口都會(huì)通過圖形服務(wù)器向窗口管理器申請(qǐng)一
個(gè)唯一的標(biāo)識(shí)ID;
2) 當(dāng)客戶機(jī)要顯示一個(gè)頂層窗口時(shí),整個(gè)系統(tǒng)會(huì)執(zhí)行以下操作a)客 戶機(jī)向圖形服務(wù)器發(fā)送顯示本窗口的請(qǐng)求,圖形服務(wù)器轉(zhuǎn)發(fā)給窗口管理器, 窗口管理器收到該請(qǐng)求后執(zhí)行頂層窗口的Z序調(diào)整操作,把這個(gè)窗口的Z 序值降低(即把本窗口顯示在其它窗口前面);b)客戶機(jī)向圖形服務(wù)器發(fā) 送為本窗口獲取焦點(diǎn)的請(qǐng)求,圖形服務(wù)器轉(zhuǎn)發(fā)給窗口管理器,窗口管理器收
到該請(qǐng)求后執(zhí)行焦點(diǎn)切換操作,設(shè)置該窗口為焦點(diǎn)窗口,這樣以后用戶的按 鍵等輸入就會(huì)被窗口管理器送給這個(gè)窗口進(jìn)行處理。
以上算法在以下情況時(shí)會(huì)出現(xiàn)焦點(diǎn)混亂假設(shè)客戶機(jī)A的優(yōu)先級(jí)高于 客戶機(jī)B,如果客戶機(jī)B要顯示頂層窗口,就在客戶機(jī)B已向圖形服務(wù)器 發(fā)送顯示頂層窗口的請(qǐng)求,還未向圖形服務(wù)器發(fā)送為本窗口獲取焦點(diǎn)的請(qǐng)求 之前,客戶機(jī)A突然也想顯示自己的頂層窗口。由于客戶機(jī)A優(yōu)先級(jí)高, 操作系統(tǒng)會(huì)優(yōu)先調(diào)度客戶機(jī)A執(zhí)行,客戶機(jī)A把自己的頂層窗口顯示在最 前面同時(shí)系統(tǒng)的焦點(diǎn)凈皮i殳置在客戶機(jī)A的頂層窗口上,假i殳這時(shí)用戶沒有 輸入,客戶機(jī)A由于無事可干,就進(jìn)入阻塞狀態(tài)。操作系統(tǒng)就恢復(fù)對(duì)客戶 機(jī)B的執(zhí)行,客戶機(jī)B就繼續(xù)執(zhí)行向圖形服務(wù)器發(fā)送為窗口獲取焦點(diǎn)的請(qǐng) 求,由于窗口管理器只負(fù)責(zé)管理窗口,并不負(fù)責(zé)管理客戶機(jī)的優(yōu)先級(jí),于是 窗口管理器又把焦點(diǎn)窗口設(shè)置到客戶機(jī)B的頂層窗口上。這時(shí)就會(huì)出現(xiàn)客 戶機(jī)A的底層窗口顯示在最前面,但焦點(diǎn)卻在客戶機(jī)B的頂層窗口上。
上文描述的焦點(diǎn)混亂情況在PC機(jī)上并不為人重視,因?yàn)?) PC機(jī)上帶 GUI界面的應(yīng)用程序間一般是同優(yōu)先級(jí),如果客戶機(jī)是同優(yōu)先級(jí)就不會(huì)出現(xiàn) 上述情況;2)即使由于客戶機(jī)間不同優(yōu)先級(jí)導(dǎo)致出現(xiàn)了焦點(diǎn)混亂,由于PC 機(jī)可以同時(shí)顯示多個(gè)頂層窗口以及具有任務(wù)欄,可以通過鼠標(biāo)點(diǎn)擊相應(yīng)的頂 層窗口或者點(diǎn)擊任務(wù)欄上相應(yīng)的頂層窗口對(duì)應(yīng)的程序圖標(biāo)把焦點(diǎn)恢復(fù)回去。 但是在手機(jī)上的應(yīng)用會(huì)出現(xiàn)優(yōu)先級(jí)不同的情況,因此可能會(huì)出現(xiàn)焦點(diǎn)混亂, 并且手機(jī)上出現(xiàn)焦點(diǎn)混亂后,就會(huì)造成假死機(jī)的現(xiàn)象,有比較嚴(yán)重的后果。 因?yàn)槭謾C(jī)屏幕小, 一次只能顯示一個(gè)頂層窗口并且也沒有類似任務(wù)欄的東 西,在焦點(diǎn)混亂情況下,用戶才艮據(jù)看到的頂層窗口進(jìn)行輸入操作,結(jié)果輸入
卻被送到其它頂層窗口去了 ,這些輸入對(duì)那些窗口來說一般都是不正確的事 件,因此被直接丟棄。這樣,就出現(xiàn)了手機(jī)對(duì)用戶輸入不響應(yīng)的情況,就好 像手機(jī)死機(jī)了一樣。由于無法看到其它頂層窗口和任務(wù)欄,手機(jī)用戶就無法
像PC機(jī)用戶那樣恢復(fù)焦點(diǎn), 一般只有通過類似按"掛機(jī)鍵"這樣的熱鍵重
新回到手機(jī)的主界面來解決。這種方式用戶操作很不方便,并且有較多負(fù)作 用(例如按掛機(jī)鍵后,手機(jī)會(huì)把所有打開的應(yīng)用給關(guān)閉)。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是提供一種手機(jī)圖形系統(tǒng)中的窗口管理方法, 可以避免出現(xiàn)焦點(diǎn)所在窗口與當(dāng)前顯示在前的窗口不統(tǒng)一的情況。
為了解決上述技術(shù)問題,本發(fā)明提供了 一種手機(jī)圖形系統(tǒng)中的窗口管理
方法,包括
設(shè)置第一數(shù)據(jù)結(jié)構(gòu),用于存放所有發(fā)送了顯示窗口請(qǐng)求的窗口標(biāo)識(shí),該 數(shù)據(jù)結(jié)構(gòu)采用具有后進(jìn)先出特性的堆棧來實(shí)現(xiàn),該數(shù)據(jù)結(jié)構(gòu)中棧頂?shù)拇翱跇?biāo) 識(shí)為當(dāng)前處于頂層的窗口的窗口標(biāo)識(shí);
窗口管理器在處理焦點(diǎn)獲取請(qǐng)求時(shí),判斷只有發(fā)送請(qǐng)求的窗口的窗口標(biāo) 識(shí)為所述第一數(shù)據(jù)結(jié)構(gòu)中棧頂?shù)拇翱跇?biāo)識(shí),才進(jìn)行焦點(diǎn)切換。
進(jìn)一步地,上述方法還可具有以下特點(diǎn),所述方法還包括設(shè)置第二數(shù) 據(jù)結(jié)構(gòu),用于存放已經(jīng)發(fā)送了獲取焦點(diǎn)請(qǐng)求且非當(dāng)前頂層窗口的窗口標(biāo)識(shí); 窗口管理器在處理其它會(huì)導(dǎo)致當(dāng)前頂層窗口失去焦點(diǎn)的請(qǐng)求時(shí),優(yōu)先從所述 第 一數(shù)據(jù)結(jié)構(gòu)和第二數(shù)據(jù)結(jié)構(gòu)的交集中選擇窗口進(jìn)行切換。
進(jìn)一步地,上述方法還可具有以下特點(diǎn),窗口管理器在處理其它會(huì)導(dǎo)致 當(dāng)前頂層窗口失去焦點(diǎn)的請(qǐng)求時(shí),若所述第一數(shù)據(jù)結(jié)構(gòu)中無窗口標(biāo)識(shí),則在 Z序鏈表中從表頭開始尋找第一個(gè)可以擁有焦點(diǎn)的窗口進(jìn)行切換。
進(jìn)一步地,上述方法還可具有以下特點(diǎn),客戶機(jī)請(qǐng)求顯示窗口的流程包 括以下步驟(a)客戶機(jī)向窗口管理器發(fā)送窗口顯示請(qǐng)求,所述請(qǐng)求中包 含了要顯示的窗口標(biāo)識(shí);(b)窗口管理器收到窗口顯示請(qǐng)求后,調(diào)整Z序 鏈表值,將該窗口顯示在頂層;(c)窗口管理器將該窗口的標(biāo)識(shí)放到第一 數(shù)據(jù)結(jié)構(gòu)中保存。
進(jìn)一步地,上述方法還可具有以下特點(diǎn),在所述步驟(c)中,所述窗 口管理器先查看該請(qǐng)求顯示的窗口是否可以擁有焦點(diǎn),如果可以擁有焦點(diǎn), 則將該窗口的標(biāo)識(shí)存入第一數(shù)據(jù)結(jié)構(gòu)中,否則,不做處理。
進(jìn)一步地,上述方法還可具有以下特點(diǎn),客戶機(jī)請(qǐng)求獲取焦點(diǎn)的流程包 括以下步驟(e)客戶機(jī)向窗口管理器發(fā)送為窗口獲取焦點(diǎn)的請(qǐng)求,請(qǐng)求 中包含要獲取焦點(diǎn)的窗口標(biāo)識(shí);(f)窗口管理器收到獲取焦點(diǎn)的請(qǐng)求后, 判斷發(fā)送該獲取焦點(diǎn)請(qǐng)求的窗口的標(biāo)識(shí)是否為第一數(shù)據(jù)結(jié)構(gòu)中棧頂?shù)拇翱?標(biāo)識(shí),即判斷該窗口是否為發(fā)送過顯示窗口請(qǐng)求且當(dāng)前處于頂層的窗口,如 果是,則執(zhí)行焦點(diǎn)窗口切換操作,否則將該窗口標(biāo)識(shí)放入所述第二數(shù)據(jù)結(jié)構(gòu) 中。
進(jìn)一步地,上述方法還可具有以下特點(diǎn),窗口管理器處理其它會(huì)導(dǎo)致焦 點(diǎn)切換的請(qǐng)求的處理流程包括以下步驟(m)窗口管理器收到請(qǐng)求后,判 斷該請(qǐng)求是否會(huì)導(dǎo)致焦點(diǎn)切換,且將要失去焦點(diǎn)的窗口標(biāo)識(shí)是否為所述第一 數(shù)據(jù)結(jié)構(gòu)中棧頂?shù)拇翱跇?biāo)識(shí),如果是,將所述第一數(shù)據(jù)結(jié)構(gòu)中的棧頂值出棧; (n)判斷所述第一數(shù)據(jù)結(jié)構(gòu)是否為空,如果是,執(zhí)行步驟(o),否則,執(zhí) 行步驟(p) ; (o)在Z序鏈表中從表頭開始尋找第一個(gè)可以擁有焦點(diǎn)的窗 口,以該窗口為切換的目的窗口,執(zhí)行焦點(diǎn)切換操作;(p)根據(jù)所述第一 數(shù)據(jù)結(jié)構(gòu)中當(dāng)前棧頂?shù)拇翱跇?biāo)識(shí)查找所述第二數(shù)據(jù)結(jié)構(gòu),若在所述第二數(shù)據(jù) 結(jié)構(gòu)中找到相同的窗口標(biāo)識(shí),則以該窗口為目的窗口執(zhí)行切換焦點(diǎn)窗口操 作,同時(shí)調(diào)整Z序鏈表值,將該窗口顯示在頂層,并刪除所述第二數(shù)據(jù)結(jié)構(gòu) 中的該窗口標(biāo)識(shí)。
進(jìn)一步地,上述方法還可具有以下特點(diǎn),在所述步驟(m)中,如果窗 口管理器判斷該請(qǐng)求不會(huì)導(dǎo)致焦點(diǎn)切換,則進(jìn)行相應(yīng)處理;如果窗口管理器 判斷該請(qǐng)求會(huì)導(dǎo)致焦點(diǎn)切換但是將要失去焦點(diǎn)的窗口標(biāo)識(shí)不是所述第一數(shù) 據(jù)結(jié)構(gòu)中棧頂?shù)拇翱跇?biāo)識(shí),則轉(zhuǎn)到步驟(n)。
進(jìn)一步地,上述方法還可具有以下特點(diǎn),所述會(huì)導(dǎo)致焦點(diǎn)切換的請(qǐng)求是 指窗口的銷毀、隱藏或升高窗口 Z序的操作。
與現(xiàn)有技術(shù)相比較,本發(fā)明在執(zhí)行焦點(diǎn)切換時(shí)不是直接就把焦點(diǎn)窗口切 換到需要請(qǐng)求的頂層窗口上,而是要判斷請(qǐng)求焦點(diǎn)的窗口是否顯示在最前面 的窗口,保證了焦點(diǎn)窗口與用戶能夠看到的最前面的頂層窗口的一致,從而 避免了上文所說的焦點(diǎn)混亂情況的發(fā)生,本發(fā)明的方法即使在多重嵌套的情
況下依然能夠正常工作。使PC或類PC的圖形系統(tǒng)更適用于手機(jī)領(lǐng)域。
圖1為本發(fā)明所涉及的圖形系統(tǒng)的結(jié)構(gòu)示意圖2為創(chuàng)建窗口的流程圖3為顯示窗口的流程圖4為獲取焦點(diǎn)的流程圖5為窗口管理器端的處理流程圖6a-6c為實(shí)施例中顯示窗口及獲取焦點(diǎn)時(shí)Structl和Struct2的結(jié)構(gòu)示
圖7為實(shí)施例中窗口管理器處理其它請(qǐng)求時(shí)Structl和Struct2的結(jié)構(gòu)示圖。
具體實(shí)施例方式
本發(fā)明仍然采用如圖1所示的c/s結(jié)構(gòu),文中所述窗口是指窗口管理器
所感知的窗口,不包括客戶機(jī)內(nèi)部管理的窗口,所述頂層窗口是指顯示在最
前面的窗口。在操作過程中還涉及到以下的數(shù)據(jù)結(jié)構(gòu)
Z序單向鏈表(以下簡(jiǎn)稱Z序鏈表),用于表示窗口Z序的數(shù)據(jù)結(jié)構(gòu), 所有窗口的標(biāo)識(shí)都保存在Z序鏈表中(窗口標(biāo)識(shí)唯一代表了一個(gè)窗口),最 先放入Z序鏈表的窗口標(biāo)識(shí)的Z序值最大,最后放入Z序鏈表的窗口標(biāo)識(shí) 的Z序值最小,也就是說越靠近鏈表頭,Z序值越小,Z序值最小的窗口即 鏈表頭的窗口顯示在最前面;
堆棧l (Structl),用于存放所有發(fā)送了顯示窗口請(qǐng)求并且可以獲得焦 點(diǎn)的窗口標(biāo)識(shí),該數(shù)據(jù)結(jié)構(gòu)采用具有后進(jìn)先出特性的堆棧來實(shí)現(xiàn),棧頂?shù)拇?口標(biāo)識(shí)為當(dāng)前處于頂層的窗口標(biāo)識(shí);
鏈表2(Struct2),用于存放已經(jīng)發(fā)送了獲取焦點(diǎn)請(qǐng)求但是并不是當(dāng)前 頂層窗口的窗口標(biāo)識(shí)。
為了避免出現(xiàn)焦點(diǎn)所在窗口與當(dāng)前顯示在前的頂層窗口不統(tǒng)一的情況, 窗口管理器在處理焦點(diǎn)獲取請(qǐng)求時(shí),判斷只有發(fā)送請(qǐng)求的窗口的窗口標(biāo)識(shí)為 堆棧l棧頂?shù)拇翱跇?biāo)識(shí),才進(jìn)行焦點(diǎn)切換。
另外,為了保證發(fā)送過獲取焦點(diǎn)請(qǐng)求的窗口能優(yōu)先獲得焦點(diǎn),窗口管理 器在處理其它會(huì)導(dǎo)致當(dāng)前頂層窗口失去焦點(diǎn)的請(qǐng)求時(shí),優(yōu)先從堆棧1和鏈表 2的交集中選擇窗口進(jìn)行切換。
以下對(duì)各流程進(jìn)行分別說明。
客戶機(jī)創(chuàng)建窗口的流程如圖2所示,包括以下步驟
步驟210,客戶機(jī)通過圖形服務(wù)器向窗口管理器發(fā)送請(qǐng)求,申請(qǐng)一個(gè)窗
步驟220,窗口管理器收到請(qǐng)求后,為該窗口分配窗口標(biāo)識(shí),建立該窗 口標(biāo)識(shí)與客戶機(jī)之間的映射關(guān)系,并把這個(gè)新的窗口標(biāo)識(shí)預(yù)設(shè)為最大Z序, 放到Z序鏈表中的相應(yīng)位置中,即將該窗口標(biāo)識(shí)放在Z序鏈表中Z序值最 大的位置上,將該窗口標(biāo)識(shí)返回給發(fā)送請(qǐng)求的客戶機(jī);
窗口管理器為該窗口分配窗口標(biāo)識(shí)的流程見圖5,可以采取從計(jì)數(shù)器取 值的方式,例如從計(jì)數(shù)器取值后將計(jì)數(shù)器加一,將取出的計(jì)數(shù)器的值作為窗 o標(biāo)識(shí)。
步驟230,客戶機(jī)將收到的窗口管理器建立的窗口標(biāo)識(shí)保存在創(chuàng)建的窗 口的內(nèi)部變量中。
但是,窗口創(chuàng)建了并不意味著窗口就能顯示在頂層,需要客戶機(jī)發(fā)出顯 示窗口的請(qǐng)求窗口才能顯示在頂層,客戶機(jī)請(qǐng)求顯示窗口的流程如圖3所
示,包括以下步驟
步驟310,客戶機(jī)從窗口內(nèi)部變量中獲取該窗口標(biāo)識(shí),并通過圖形服務(wù) 器向窗口管理器發(fā)送窗口顯示請(qǐng)求,該請(qǐng)求中包含了要顯示的窗口標(biāo)識(shí);
步驟320,窗口管理器收到窗口顯示請(qǐng)求后,執(zhí)行調(diào)整系統(tǒng)中整個(gè)窗口 的Z序值的操作,把該窗口的Z序值降低,以便讓該窗口可以顯示出來;
具體地,窗口管理器收到客戶機(jī)顯示窗口的請(qǐng)求后,先從請(qǐng)求中獲取發(fā) 送請(qǐng)求窗口的窗口標(biāo)識(shí),然后將該窗口標(biāo)識(shí)調(diào)整到Z序鏈表的表頭即Z序 值最小的位置上,使該窗口成為顯示在屏幕最前面的頂層窗口,即把本窗口 顯示出來。
步驟330,窗口管理器查看請(qǐng)求顯示的窗口是否可以擁有焦點(diǎn)(窗口是 否擁有焦點(diǎn)由客戶機(jī)決定,通常情況下窗口缺省可以擁有焦點(diǎn)),如果可以 擁有焦點(diǎn),則將該窗口的標(biāo)識(shí)放到棧數(shù)據(jù)結(jié)構(gòu)Structl中保存,否則,不做 任何處理,執(zhí)行下一步;
步驟340,執(zhí)行由于窗口 Z序調(diào)整后需要做的操作(例如通知相關(guān)窗口 其顯示區(qū)域發(fā)送變化)。
客戶機(jī)請(qǐng)求獲取焦點(diǎn)的流程如圖4所示,包括以下步驟
步驟410,客戶機(jī)通過圖形服務(wù)器向窗口管理器發(fā)送為窗口獲取焦點(diǎn)的 請(qǐng)求,請(qǐng)求中包含要獲取焦點(diǎn)的窗口標(biāo)識(shí);
通常情況下,客戶機(jī)在向窗口管理器發(fā)送顯示窗口的請(qǐng)求后,會(huì)繼續(xù)發(fā) 送獲取焦點(diǎn)請(qǐng)求。
步驟420,窗口管理器收到獲取焦點(diǎn)的請(qǐng)求后,從請(qǐng)求中獲取發(fā)送請(qǐng)求 窗口的窗口標(biāo)識(shí),判斷發(fā)送該獲取焦點(diǎn)請(qǐng)求的窗口的標(biāo)識(shí)是否等于Structl 中棧頂?shù)拇翱诘臉?biāo)識(shí),即判斷該窗口是否為發(fā)送過顯示窗口請(qǐng)求且目前處于 最前面的窗口,如果相等,則執(zhí)行焦點(diǎn)窗口切換操作,如果不相等,則把這 個(gè)請(qǐng)求的窗口的標(biāo)識(shí)放入到另 一個(gè)數(shù)據(jù)結(jié)構(gòu)Struct2的末尾。
圖5為窗口管理器處理流程,除以上三個(gè)請(qǐng)求外,對(duì)于客戶機(jī)發(fā)送的其 他請(qǐng)求,處理步驟如下
步驟510,窗口管理器收到請(qǐng)求后,判斷該請(qǐng)求是否會(huì)導(dǎo)致焦點(diǎn)切換(例 如銷毀窗口、隱藏窗口、升高窗口Z序等),如果是,執(zhí)行下一步,否貝'J, 進(jìn)行其他處理;
步驟520,判斷將要失去焦點(diǎn)的窗口標(biāo)識(shí)是否等于Structl棧頂?shù)闹?,?果是,將Structl的棧頂值出棧后執(zhí)行下一步,否則,則直接執(zhí)行下一步;
步驟530,判斷Structl是否為空,如果是,執(zhí)行步驟540,否則,執(zhí)行 步驟550;
步驟540,在Z序鏈表中尋找一個(gè)Z序值最小,并且可以擁有焦點(diǎn)的窗 口作為新的焦點(diǎn)窗口,即/人表頭開始第一個(gè)可以擁有焦點(diǎn)的窗口 ,以該窗口 為切換的目的窗口,執(zhí)行焦點(diǎn)切換操作;
步驟550,根據(jù)Structl中的棧頂所標(biāo)識(shí)的窗口標(biāo)識(shí)去查找數(shù)據(jù)結(jié)構(gòu) Struct2,在Struct2中是否找到相同的窗口標(biāo)識(shí),如果是,執(zhí)行步驟560,否 則,系統(tǒng)報(bào)錯(cuò);
步驟560,執(zhí)行切換焦點(diǎn)窗口操作,把Structl中的棧頂所表示的窗口切 換成當(dāng)前焦點(diǎn)窗口,同時(shí)調(diào)整Z序鏈表序值,將Stuctl棧頂所表示窗口顯示 在頂層,刪除Struct2中對(duì)應(yīng)的元素,并向新焦點(diǎn)窗口所在的客戶機(jī)發(fā)送焦 點(diǎn)獲取成功的響應(yīng)。
上述焦點(diǎn)切換操作是指,向獲得焦點(diǎn)的窗口所在的客戶機(jī)發(fā)送焦點(diǎn)獲取 成功的消息,向失去焦點(diǎn)的窗口所在的客戶機(jī)發(fā)送失去焦點(diǎn)的消息,同時(shí)窗 口管理器內(nèi)部記錄下當(dāng)前的焦點(diǎn)窗口的窗口標(biāo)識(shí)。
下面結(jié)合附圖對(duì)本發(fā)明所提供的窗口管理算法進(jìn)行說明。
假設(shè)有客戶機(jī)A和B,客戶機(jī)A的優(yōu)先級(jí)低于客戶機(jī)B,并且假設(shè)客 戶機(jī)A和B的頂層窗口標(biāo)識(shí)分別為0和1,窗口管理器運(yùn)行的優(yōu)先級(jí)最低, A先開始執(zhí)行顯示窗口 O的過程。
(1) A發(fā)出顯示窗口 O的請(qǐng)求;
(2) B由于某種原因被激活,于是B馬上搶占CPU, B分別發(fā)出顯示
窗口 1、為窗口 l獲取焦點(diǎn)的請(qǐng)求;
(3) 以上三個(gè)請(qǐng)求順序到達(dá)窗口管理器,窗口管理器首先執(zhí)行顯示窗 口O的請(qǐng)求,按照?qǐng)D5的算法實(shí)現(xiàn)流程,執(zhí)行完該請(qǐng)求后Z序鏈表、堆棧l 和鏈表2為圖6a所示,此時(shí),Z序鏈表只有"0"這個(gè)元素,堆棧1只有"0" 這個(gè)元素,鏈表2為空;
(4) 窗口管理器再執(zhí)行顯示窗口 1的請(qǐng)求,按照?qǐng)D5的算法實(shí)現(xiàn)流程, 執(zhí)行完該請(qǐng)求后Z序鏈表、堆棧1和鏈表2為圖6b所示,此時(shí),Z序鏈表 只有"0" 、 'T,兩個(gè)元素,且"1"在"0"的前面,表示窗口 l顯示在窗 口0的前面,堆棧l有"0" "1"兩個(gè)元素,棧頂在l,鏈表2為空;
(5) 窗口管理器然后執(zhí)行為窗口 1獲取焦點(diǎn)的請(qǐng)求,按照?qǐng)D5的算法 實(shí)現(xiàn)流程,執(zhí)行完該請(qǐng)求后Z序鏈表、堆棧1和鏈表2不變,但此時(shí)的焦點(diǎn) 窗口在窗口 1;
(6) 假設(shè)客戶機(jī)B由于用戶沒有輸入就被掛起,此時(shí)A繼續(xù)運(yùn)行發(fā)出 為窗口O獲取焦點(diǎn)的請(qǐng)求,A被阻塞等待獲取結(jié)果;
(7) 窗口管理器被激活執(zhí)行為窗口 0獲取焦點(diǎn)的請(qǐng)求,按照?qǐng)D5的算 法實(shí)現(xiàn)流程,執(zhí)行完該請(qǐng)求后Z序鏈表、堆棧1和鏈表2為圖6c所示,Z 序鏈表、堆棧l不變,此時(shí)的焦點(diǎn)窗口仍在窗口 1,鏈表2有個(gè)元素"0", 可以看到,窗口l顯示在最前面,而焦點(diǎn)窗口也是窗口 1,并沒被奪走;
(8) 如果用戶輸入了隱藏當(dāng)前窗口的命令,這個(gè)事件被送給當(dāng)前焦點(diǎn) 窗口 (即窗口 1),窗口 l發(fā)出隱藏窗口 1的請(qǐng)求;
(9) 窗口管理器收到該請(qǐng)求后發(fā)現(xiàn)這會(huì)導(dǎo)致失去焦點(diǎn),并且窗口 1就 是堆棧1的棧頂,于是刪除棧頂值,此時(shí)如圖7所示(注意這時(shí)窗口 1因?yàn)?隱藏,其Z序值也要升高,窗口管理器會(huì)把窗口0顯示出來);
(10) 窗口管理器繼續(xù)處理這個(gè)請(qǐng)求,發(fā)現(xiàn)需要尋找一個(gè)新的焦點(diǎn)窗口, 按照?qǐng)D5的算法,就找到窗口0,于是設(shè)置窗口 0為當(dāng)前焦點(diǎn)窗口,同時(shí)向 窗口 O所在的客戶機(jī)A發(fā)送窗口 O獲取焦點(diǎn)成功的相應(yīng)信息,客戶機(jī)A就 繼續(xù)運(yùn)4亍。此時(shí),窗口O顯示在最前面,而焦點(diǎn)窗口也是窗口O。
從以上實(shí)施例可以看出,本發(fā)明在發(fā)生進(jìn)程優(yōu)先級(jí)狀態(tài)下也能保證窗
口的顯示與焦點(diǎn)的一致性,并且能夠按照顯示順序順次恢復(fù)焦點(diǎn),從而消除 了手機(jī)由于焦點(diǎn)混亂造成的假死機(jī)現(xiàn)象。
權(quán)利要求
1、一種手機(jī)圖形系統(tǒng)中的窗口管理方法,其特征在于,設(shè)置第一數(shù)據(jù)結(jié)構(gòu),用于存放所有發(fā)送了顯示窗口請(qǐng)求的窗口標(biāo)識(shí),該數(shù)據(jù)結(jié)構(gòu)采用具有后進(jìn)先出特性的堆棧來實(shí)現(xiàn),該數(shù)據(jù)結(jié)構(gòu)中棧頂?shù)拇翱跇?biāo)識(shí)為當(dāng)前處于頂層的窗口的窗口標(biāo)識(shí);窗口管理器在處理焦點(diǎn)獲取請(qǐng)求時(shí),判斷只有發(fā)送請(qǐng)求的窗口的窗口標(biāo)識(shí)為所述第一數(shù)據(jù)結(jié)構(gòu)中棧頂?shù)拇翱跇?biāo)識(shí),才進(jìn)行焦點(diǎn)切換。
2、 如權(quán)利要求l所述的方法,其特征在于,設(shè)置第二數(shù)據(jù)結(jié)構(gòu),用于存放已經(jīng)發(fā)送了獲取焦點(diǎn)請(qǐng)求且非當(dāng)前頂層窗 口的窗口標(biāo)識(shí);窗口管理器在處理其它會(huì)導(dǎo)致當(dāng)前頂層窗口失去焦點(diǎn)的請(qǐng)求時(shí),優(yōu)先從 所述第一數(shù)據(jù)結(jié)構(gòu)和第二數(shù)據(jù)結(jié)構(gòu)的交集中選擇窗口進(jìn)行切換。
3、 如權(quán)利要求2所述的方法,其特征在于,窗口管理器在處理其它會(huì)導(dǎo)致當(dāng)前頂層窗口失去焦點(diǎn)的請(qǐng)求時(shí),若所述 第一數(shù)據(jù)結(jié)構(gòu)中無窗口標(biāo)識(shí),則在Z序鏈表中從表頭開始尋找第一個(gè)可以擁 有焦點(diǎn)的窗口進(jìn)行切換。
4、 如權(quán)利要求l所述的方法,其特征在于,客戶機(jī)請(qǐng)求顯示窗口的流 程包括以下步驟(a) 客戶機(jī)向窗口管理器發(fā)送窗口顯示請(qǐng)求,所述請(qǐng)求中包含了要顯 示的窗口標(biāo)識(shí);(b) 窗口管理器收到窗口顯示請(qǐng)求后,調(diào)整Z序鏈表值,將該窗口顯 示在頂層^(c) 窗口管理器將該窗口的標(biāo)識(shí)放到第一數(shù)據(jù)結(jié)構(gòu)中保存。
5、 如權(quán)利要求4所述的方法,其特征在于,在所述步驟(c)中,所述窗口管理器先查看該請(qǐng)求顯示的窗口是否可以擁有焦點(diǎn),如果可以 擁有焦點(diǎn),則將該窗口的標(biāo)識(shí)存入第一數(shù)據(jù)結(jié)構(gòu)中,否則,不做處理。
6、 如權(quán)利要求2所述的方法,其特征在于,客戶機(jī)請(qǐng)求獲取焦點(diǎn)的流 程包括以下步驟(e) 客戶機(jī)向窗口管理器發(fā)送為窗口獲取焦點(diǎn)的請(qǐng)求,請(qǐng)求中包含要 獲取焦點(diǎn)的窗口標(biāo)識(shí);(f) 窗口管理器收到獲取焦點(diǎn)的請(qǐng)求后,判斷發(fā)送該獲取焦點(diǎn)請(qǐng)求的 窗口的標(biāo)識(shí)是否為第 一數(shù)據(jù)結(jié)構(gòu)中棧頂?shù)拇翱跇?biāo)識(shí),即判斷該窗口是否為發(fā) 送過顯示窗口請(qǐng)求且當(dāng)前處于頂層的窗口,如果是,則執(zhí)行焦點(diǎn)窗口切換操 作,否則將該窗口標(biāo)識(shí)放入所述第二數(shù)據(jù)結(jié)構(gòu)中。
7、 如權(quán)利要求2或3或6所述的方法,其特征在于,窗口管理器處理 其它會(huì)導(dǎo)致焦點(diǎn)切換的請(qǐng)求的處理流程包括以下步驟(m)窗口管理器收到請(qǐng)求后,判斷該請(qǐng)求是否會(huì)導(dǎo)致焦點(diǎn)切換,且將 要失去焦點(diǎn)的窗口標(biāo)識(shí)是否為所述第一數(shù)據(jù)結(jié)構(gòu)中棧頂?shù)拇翱跇?biāo)識(shí),如果 是,將所述第一數(shù)據(jù)結(jié)構(gòu)中的棧頂值出棧;(n)判斷所述第一數(shù)據(jù)結(jié)構(gòu)是否為空,如果是,執(zhí)行步驟(o),否則, 執(zhí)行步驟(p );(o)在Z序鏈表中從表頭開始尋找第一個(gè)可以擁有焦點(diǎn)的窗口,以該 窗口為切換的目的窗口,執(zhí)行焦點(diǎn)切換操作;(p)根據(jù)所述第一數(shù)據(jù)結(jié)構(gòu)中當(dāng)前桟頂?shù)拇翱跇?biāo)識(shí)查找所述第二數(shù)據(jù) 結(jié)構(gòu),若在所述第二數(shù)據(jù)結(jié)構(gòu)中找到相同的窗口標(biāo)識(shí),則以該窗口為目的窗 口執(zhí)行切換焦點(diǎn)窗口操作,同時(shí)調(diào)整Z序鏈表值,將該窗口顯示在頂層,并 刪除所述第二數(shù)據(jù)結(jié)構(gòu)中的該窗口標(biāo)識(shí)。
8、 如權(quán)利要求7所述的方法,其特征在于,在所述步驟(m)中,如果窗口管理器判斷該請(qǐng)求不會(huì)導(dǎo)致焦點(diǎn)切換,則進(jìn)行相應(yīng)處理; 如果窗口管理器判斷該請(qǐng)求會(huì)導(dǎo)致焦點(diǎn)切換但是將要失去焦點(diǎn)的窗口 標(biāo)識(shí)不是所述第一數(shù)據(jù)結(jié)構(gòu)中棧頂?shù)拇翱跇?biāo)識(shí),則轉(zhuǎn)到步驟(n)。
9、 如權(quán)利要求7所述的方法,其特征在于,所述會(huì)導(dǎo)致焦點(diǎn)切換的請(qǐng)求是指窗口的銷毀、隱藏或升高窗口 Z序的操作。
全文摘要
本發(fā)明公開了一種手機(jī)圖形系統(tǒng)中的窗口管理方法,可以避免出現(xiàn)焦點(diǎn)所在窗口與當(dāng)前顯示在前的窗口不統(tǒng)一的情況。所述方法包括設(shè)置第一數(shù)據(jù)結(jié)構(gòu),用于存放所有發(fā)送了顯示窗口請(qǐng)求的窗口標(biāo)識(shí),該數(shù)據(jù)結(jié)構(gòu)采用具有后進(jìn)先出特性的堆棧來實(shí)現(xiàn),該數(shù)據(jù)結(jié)構(gòu)中棧頂?shù)拇翱跇?biāo)識(shí)為當(dāng)前處于頂層的窗口的窗口標(biāo)識(shí);窗口管理器在處理焦點(diǎn)獲取請(qǐng)求時(shí),判斷只有發(fā)送請(qǐng)求的窗口的窗口標(biāo)識(shí)為所述第一數(shù)據(jù)結(jié)構(gòu)中棧頂?shù)拇翱跇?biāo)識(shí),才進(jìn)行焦點(diǎn)切換。采用本發(fā)明方法,保證了焦點(diǎn)窗口與用戶能夠看到的最前面的頂層窗口的一致。本方法即使在多重嵌套的情況下依然能夠正常工作,使PC或類PC的圖形系統(tǒng)更適用于手機(jī)領(lǐng)域。
文檔編號(hào)H04M1/725GK101184300SQ20071019556
公開日2008年5月21日 申請(qǐng)日期2007年12月6日 優(yōu)先權(quán)日2007年12月6日
發(fā)明者古幼鵬 申請(qǐng)人:中興通訊股份有限公司