dia.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:7k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: dia.c 271 2005-08-09 08:31:35Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../../common/common.h"
  24. #if defined(TARGET_PALMOS)
  25. #include "pace.h"
  26. #include "dia.h"
  27. #ifdef HAVE_SONY_SDK
  28. #undef CPU_TYPE
  29. #define CPU_TYPE CPU_68K
  30. #include <Libraries/SonySilkLib.h>
  31. #include <SonySystemResources.h>
  32. #include <SonySystemFtr.h>
  33. static UInt16 Sony = sysInvalidRefNum;
  34. #endif
  35. bool_t SwapLandscape = 0;
  36. bool_t SwapPortrait = 0;
  37. static bool_t NativeLandscape = 0;
  38. static UInt32 HasPIN = 0;
  39. static UInt32 Event = 0;
  40. void DIA_Init()
  41. {
  42. UInt16 card;
  43. LocalID db;
  44. FtrGet(pinCreator, pinFtrAPIVersion, &HasPIN);
  45. if (HasPIN >= pinAPIVersion1_0)
  46. Event = sysNotifyDisplayResizedEvent;
  47. #ifdef HAVE_SONY_SDK
  48. else
  49. {
  50. UInt32 Ver;
  51. if (SysLibFind(sonySysLibNameSilk, &Sony) == sysErrLibNotFound)
  52. SysLibLoad(sysFileTLibrary, sonySysFileCSilkLib, &Sony);
  53. if (Sony != sysInvalidRefNum && (FtrGet(sonySysFtrCreator,sonySysFtrNumVskVersion,&Ver)!=errNone ||
  54. SysLibOpen(Sony)!=errNone))
  55. Sony = sysInvalidRefNum;
  56. if (Sony != sysInvalidRefNum)
  57. Event = sysNotifyDisplayChangeEvent;
  58. }
  59. #endif
  60. DIASet(0,DIA_SIP); // before notify, so no event is generated (no form exits yet)
  61. if (HasPIN < pinAPIVersion1_1)
  62. {
  63. video Desktop;
  64. QueryDesktop(&Desktop);
  65. NativeLandscape = Desktop.Width > Desktop.Height;
  66. }
  67. if (QueryPlatform(PLATFORM_MODEL)==MODEL_ZODIAC)
  68. SwapPortrait = 1;
  69. if (Event && SysCurAppDatabase(&card, &db)==errNone)
  70. SysNotifyRegister(card, db, Event, NULL, sysNotifyNormalPriority, 0);
  71. }
  72. void DIA_Done()
  73. {
  74. UInt16 card;
  75. LocalID db;
  76. if (Event && SysCurAppDatabase(&card, &db)==errNone)
  77. SysNotifyUnregister(card, db, Event, sysNotifyNormalPriority);
  78. DIASet(DIA_TASKBAR,DIA_TASKBAR);
  79. #ifdef HAVE_SONY_SDK
  80. if (Sony != sysInvalidRefNum)
  81. {
  82. VskSetState(Sony, vskStateEnable, 0);
  83. SysLibClose(Sony);
  84. Sony = sysInvalidRefNum;
  85. }
  86. #endif
  87. }
  88. #ifdef HAVE_SONY_SDK
  89. static void SonyAllow()
  90. {
  91. if (VskGetAPIVersion(Sony) >= 3)
  92. VskSetState(Sony, vskStateEnable, vskResizeHorizontally|vskResizeVertically);
  93. else
  94. VskSetState(Sony, vskStateEnable, vskResizeVertically);
  95. }
  96. #endif
  97. bool_t DIAHandleEvent(FormType* Form,EventType* Event)
  98. {
  99. switch (Event->eType)
  100. {
  101. case winEnterEvent:
  102. if (Event->data.winEnter.enterWindow != (WinHandle)Form || Form != FrmGetActiveForm())
  103. break;
  104. case frmOpenEvent:
  105. if (HasPIN >= pinAPIVersion1_0)
  106. {
  107.         WinSetConstraintsSize(FrmGetWindowHandle(Form),160,4096,4096,160,4096,4096);
  108.             PINSetInputTriggerState(pinInputTriggerEnabled);
  109.             SysSetOrientationTriggerState(sysOrientationTriggerEnabled);
  110. }
  111. #ifdef HAVE_SONY_SDK
  112. if (Sony != sysInvalidRefNum)
  113. SonyAllow();
  114. #endif
  115. break;
  116. default:
  117. break;
  118. }
  119. return 0;
  120. }
  121. void DIALoad(FormType* Form)
  122. {
  123. if (HasPIN >= pinAPIVersion1_0 && Form)
  124. {
  125. FrmSetDIAPolicyAttr(Form, frmDIAPolicyCustom);
  126. DIASet(DIAGet(DIA_SIP),DIA_SIP); // don't allow pinAPI 1.1 to restore last known state
  127. }
  128. #ifdef HAVE_SONY_SDK
  129. if (Sony != sysInvalidRefNum)
  130. SonyAllow();
  131. #endif
  132. }
  133. void DIAResizedNotify(SysNotifyParamType* Notify)
  134. {
  135. if (Notify->notifyType==Event && HasPIN < pinAPIVersion1_1)
  136. {
  137. EventType Event;
  138. memset(&Event,0,sizeof(Event));
  139. Event.eType = winDisplayChangedEvent;
  140. EvtAddUniqueEventToQueue(&Event, 0, 1);
  141. }
  142. }
  143. void DIASet(int State,int Mask)
  144. {
  145. if (HasPIN >= pinAPIVersion1_0)
  146. {
  147. if (Mask & DIA_SIP)
  148. {
  149. if (State & DIA_SIP)
  150. PINSetInputAreaState(pinInputAreaOpen);
  151. else
  152. PINSetInputAreaState(pinInputAreaClosed);
  153. }
  154. if (Mask & DIA_TASKBAR)
  155. {
  156. if (State & DIA_TASKBAR)
  157. StatShow();
  158. else
  159. StatHide();
  160. }
  161. }
  162. #ifdef HAVE_SONY_SDK
  163. else
  164. if (Sony != sysInvalidRefNum)
  165. {
  166.         UInt16 Allow;
  167.         if (VskGetState(Sony, vskStateEnable, &Allow)!=errNone || Allow==0)
  168. SonyAllow();
  169. if ((Mask & DIA_ALL)!=DIA_ALL)
  170. State |= DIAGet(DIA_ALL) & ~Mask;
  171. if (State & DIA_SIP)
  172. VskSetState(Sony, vskStateResize, vskResizeMax);
  173. else
  174. if (State & DIA_TASKBAR)
  175. VskSetState(Sony, vskStateResize, vskResizeMin);
  176. else
  177. VskSetState(Sony, vskStateResize, vskResizeNone);
  178. }
  179. #endif
  180. }
  181. bool_t DIASupported()
  182. {
  183. #ifdef HAVE_SONY_SDK
  184. if (Sony != sysInvalidRefNum) return 1;
  185. #endif
  186. return HasPIN >= pinAPIVersion1_0;
  187. }
  188. int DIAGet(int Mask)
  189. {
  190. int State=0;
  191. if (HasPIN >= pinAPIVersion1_0)
  192. {
  193. UInt32 Value;
  194. if ((Mask & DIA_SIP) && PINGetInputAreaState() == pinInputAreaOpen)
  195. State |= DIA_SIP;
  196. if (Mask & DIA_TASKBAR && (StatGetAttribute(statAttrBarVisible,&Value)!=errNone || Value!=0))
  197. State |= DIA_TASKBAR;
  198. }
  199. #ifdef HAVE_SONY_SDK
  200. else
  201. if (Sony != sysInvalidRefNum)
  202. {
  203. UInt16 Value;
  204. if (VskGetState(Sony, vskStateResize, &Value)==errNone)
  205. switch (Value) 
  206. {
  207. case vskResizeMax:
  208. State = DIA_SIP|DIA_TASKBAR;
  209. break;
  210. case vskResizeNone:
  211. State = 0;
  212. break;
  213. case vskResizeMin:
  214. default:
  215. State = DIA_TASKBAR;
  216. break;
  217. }
  218. State &= Mask;
  219. }
  220. #endif
  221. return State;
  222. }
  223. static NOINLINE int DirSwap(int Dir)
  224. {
  225. if ((SwapLandscape && (Dir & DIR_SWAPXY)) ||
  226. (SwapPortrait && !(Dir & DIR_SWAPXY)))
  227. Dir ^= DIR_MIRRORUPDOWN|DIR_MIRRORLEFTRIGHT;
  228. return Dir;
  229. }
  230. int SetOrientation(int Dir)
  231. {
  232. if (HasPIN >= pinAPIVersion1_1)
  233. {
  234. UInt16 i;
  235. Dir = DirSwap(Dir);
  236. if (Dir & DIR_SWAPXY)
  237. i = (UInt16)((Dir & DIR_MIRRORUPDOWN) ? sysOrientationReverseLandscape : sysOrientationLandscape);
  238. else
  239. i = (UInt16)((Dir & DIR_MIRRORUPDOWN) ? sysOrientationReversePortrait : sysOrientationPortrait);
  240. if (SysSetOrientation(i)==errNone)
  241. return ERR_NONE;
  242. }
  243. return ERR_NOT_SUPPORTED;
  244. }
  245. int GetOrientation()
  246. {
  247. int Dir = 0;
  248. if (HasPIN >= pinAPIVersion1_1)
  249. {
  250. switch (SysGetOrientation())
  251. {
  252. case sysOrientationPortrait: Dir = 0; break;
  253. case sysOrientationLandscape: Dir = DIR_SWAPXY | DIR_MIRRORLEFTRIGHT; break;
  254. case sysOrientationReversePortrait: Dir = DIR_MIRRORUPDOWN | DIR_MIRRORLEFTRIGHT; break;
  255. case sysOrientationReverseLandscape: Dir = DIR_SWAPXY | DIR_MIRRORUPDOWN; break;
  256. }
  257. Dir = DirSwap(Dir);
  258. }
  259. else
  260. if (NativeLandscape)
  261. Dir = DIR_SWAPXY | DIR_MIRRORLEFTRIGHT;
  262. return Dir;
  263. }
  264. void AdjustOrientation(video* p, bool_t Combine)
  265. {
  266. }
  267. void DIAGetState(diastate* State)
  268. {
  269.     WinGetDisplayExtent(&State->Width, &State->Height);
  270. State->Direction = 0;
  271. if (HasPIN >= pinAPIVersion1_1)
  272. State->Direction =SysGetOrientation();
  273. }
  274. bool_t GetHandedness()
  275. {
  276. return PrefGetPreference(prefVersion) >= 12 && PrefGetPreference(prefHandednessChoice)==1;
  277. }
  278. #endif