Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: app_emwin1 app_emwin2_pos lpc4088_ebb_gui_emwin
EwWindow.cpp
00001 #include "mbed.h" 00002 00003 #include "EwWindow.h" 00004 00005 #include "GUI.h" 00006 #include "WM.h" 00007 00008 static void _callback(WM_MESSAGE* pMsg); 00009 static void _register(GUI_HWIN hWin, EwWindow* win, void (*callbackFunc)(WM_MESSAGE* pMsg, EwWindow* w)); 00010 static void _deregister(GUI_HWIN hWin); 00011 00012 #define EW_MAX_NUM_WINDOWS (100) 00013 00014 typedef void (*callbackFunc)(WM_MESSAGE* pMsg, EwWindow* w); 00015 00016 static GUI_HWIN _regHandles[EW_MAX_NUM_WINDOWS] = {0}; 00017 static EwWindow* _regWindows[EW_MAX_NUM_WINDOWS] = {0}; 00018 static callbackFunc _regCallbacks[EW_MAX_NUM_WINDOWS] = {0}; 00019 00020 00021 int EwWindow::_guiWidgetId = GUI_ID_USER; 00022 00023 EwWindow::EwWindow(EwWindow* parent) { 00024 init(0, 0, 0, 0, parent); 00025 } 00026 00027 EwWindow::EwWindow(int x, int y, int width, int height, EwWindow* parent) { 00028 init(x, y, width, height, parent); 00029 } 00030 00031 EwWindow::~EwWindow() { 00032 00033 _deregister(_hWnd); 00034 00035 WM_DeleteWindow(_hWnd); 00036 } 00037 00038 void EwWindow::setParent(EwWindow* parent) { 00039 WM_HWIN hParent = 0; 00040 if (parent != NULL) { 00041 hParent = parent->_hWnd; 00042 } 00043 00044 WM_AttachWindow(_hWnd, hParent); 00045 } 00046 00047 void EwWindow::bringToBottom() { 00048 WM_BringToBottom(_hWnd); 00049 } 00050 00051 void EwWindow::bringToTop() { 00052 WM_BringToTop(_hWnd); 00053 } 00054 00055 void EwWindow::disable() { 00056 WM_DisableWindow(_hWnd); 00057 } 00058 00059 void EwWindow::enable() { 00060 WM_EnableWindow(_hWnd); 00061 } 00062 00063 bool EwWindow::hasTransparency() { 00064 return (WM_GetHasTrans(_hWnd) == 1); 00065 } 00066 00067 int EwWindow::getX() { 00068 return WM_GetWindowOrgX(_hWnd); 00069 } 00070 00071 int EwWindow::getY() { 00072 return WM_GetWindowOrgY(_hWnd); 00073 } 00074 00075 int EwWindow::getWidth() { 00076 return WM_GetWindowSizeX(_hWnd); 00077 } 00078 00079 int EwWindow::getHeight() { 00080 return WM_GetWindowSizeY(_hWnd); 00081 } 00082 00083 bool EwWindow::hasInput() { 00084 return (WM_HasCaptured(_hWnd) == 1); 00085 } 00086 00087 bool EwWindow::hasFocus() { 00088 return (WM_HasFocus(_hWnd) == 1); 00089 } 00090 00091 bool EwWindow::getStayOnTop() { 00092 return (WM_GetStayOnTop(_hWnd) == 1); 00093 } 00094 00095 void EwWindow::hide() { 00096 WM_HideWindow(_hWnd); 00097 } 00098 00099 void EwWindow::invalidate() { 00100 WM_InvalidateWindow(_hWnd); 00101 } 00102 00103 bool EwWindow::isCompletelyCovered() { 00104 return (WM_IsCompletelyCovered(_hWnd) == 1); 00105 } 00106 00107 bool EwWindow::isCompletelyVisible() { 00108 return (WM_IsCompletelyVisible(_hWnd) == 1); 00109 } 00110 00111 bool EwWindow::isEnabled() { 00112 return (WM_IsEnabled(_hWnd) == 1); 00113 } 00114 00115 bool EwWindow::isVisible() { 00116 return (WM_IsVisible(_hWnd) == 1); 00117 } 00118 00119 void EwWindow::makeModal() { 00120 WM_MakeModal(_hWnd); 00121 } 00122 00123 void EwWindow::moveTo(int x, int y) { 00124 WM_MoveChildTo(_hWnd, x, y); 00125 } 00126 00127 void EwWindow::moveToAbs(int x, int y) { 00128 WM_MoveTo(_hWnd, x, y); 00129 } 00130 00131 void EwWindow::move(int dx, int dy) { 00132 WM_MoveWindow(_hWnd, dx, dy); 00133 } 00134 00135 void EwWindow::repaint() { 00136 WM_Paint(_hWnd); 00137 } 00138 00139 void EwWindow::repaintAll() { 00140 WM_PaintWindowAndDescs(_hWnd); 00141 } 00142 00143 void EwWindow::resize(int dx, int dy) { 00144 WM_ResizeWindow(_hWnd, dx, dy); 00145 } 00146 00147 void EwWindow::resizeTo(int width, int height) { 00148 WM_SetSize(_hWnd, width, height); 00149 } 00150 00151 void EwWindow::setHasTransparency(bool has) { 00152 if (has) { 00153 WM_SetHasTrans(_hWnd); 00154 } else { 00155 WM_ClrHasTrans(_hWnd); 00156 } 00157 } 00158 00159 void EwWindow::setStayOnTop(bool onTop) { 00160 WM_SetStayOnTop(_hWnd, (onTop ? 1 : 0)); 00161 } 00162 00163 void EwWindow::show() { 00164 WM_ShowWindow(_hWnd); 00165 } 00166 00167 void EwWindow::setFocus() { 00168 WM_SetFocus(_hWnd); 00169 } 00170 00171 void EwWindow::update() { 00172 WM_Update(_hWnd); 00173 } 00174 00175 void EwWindow::updateAll() { 00176 WM_UpdateWindowAndDescs(_hWnd); 00177 } 00178 00179 ewColor_t EwWindow::setDesktopColor(ewColor_t c) { 00180 return WM_SetDesktopColor(c); 00181 } 00182 00183 bool EwWindow::paintEvent() { 00184 return false; 00185 } 00186 00187 bool EwWindow::touchEvent(int x, int y, EwTouchState_t state) { 00188 return false; 00189 } 00190 00191 bool EwWindow::focusEvent(bool gotFocus) { 00192 return false; 00193 } 00194 00195 bool EwWindow::resizedEvent() { 00196 return false; 00197 } 00198 00199 void EwWindow::_setNewHandle(GUI_HWIN hWnd, void (*callbackFunc)(WM_MESSAGE* pMsg, EwWindow* w)) { 00200 _deregister(_hWnd); 00201 WM_DeleteWindow(_hWnd); 00202 00203 _hWnd = hWnd; 00204 _register(_hWnd, this, callbackFunc); 00205 } 00206 00207 GUI_HWIN EwWindow::_getHandle(EwWindow* w) { 00208 GUI_HWIN h = 0; 00209 WM_CALLBACK *pCb; 00210 00211 if (w) { 00212 h = w->_hWnd; 00213 pCb = WM_GetCallback(h); 00214 00215 // If the windows is a frame window return its client window instead 00216 // since the main window handle shouldn't be used when adding child 00217 // windows 00218 if (pCb == FRAMEWIN_Callback) { 00219 h = WM_GetClientWindow(h); 00220 } 00221 00222 } 00223 00224 return h; 00225 } 00226 00227 void EwWindow::init(int x, int y, int width, int height, EwWindow* parent) { 00228 00229 // TODO: flags 00230 00231 if (parent) { 00232 _hWnd = WM_CreateWindowAsChild(x, y, width, height, _getHandle(parent), 00233 (WM_CF_SHOW | WM_CF_MEMDEV), _callback, 0); 00234 } else { 00235 _hWnd = WM_CreateWindow(x, y, width, height, (WM_CF_SHOW | WM_CF_MEMDEV), 00236 _callback, 0); 00237 } 00238 00239 _register(_hWnd, this, NULL); 00240 } 00241 00242 static void _callback(WM_MESSAGE* pMsg) { 00243 00244 GUI_PID_STATE* pState; 00245 EwTouchState_t touchState; 00246 00247 bool msgHandled = false; 00248 00249 00250 for (int i = 0; i < EW_MAX_NUM_WINDOWS; i++) { 00251 if (_regHandles[i] == pMsg->hWin) { 00252 00253 // callback is overriden 00254 if (_regCallbacks[i] != NULL) { 00255 _regCallbacks[i](pMsg, _regWindows[i]); 00256 00257 // it is the responsibility of the overriden callback function 00258 // to handle all messages or forward those that aren't handled 00259 // to default handler. 00260 msgHandled = false; 00261 } 00262 00263 else { 00264 00265 switch (pMsg->MsgId) { 00266 case WM_PAINT: 00267 msgHandled = _regWindows[i]->paintEvent(); 00268 break; 00269 case WM_TOUCH: 00270 pState = (GUI_PID_STATE*)pMsg->Data.p; 00271 if (pState->Pressed == 1) { 00272 touchState = TouchStatePressed; 00273 } 00274 else if (pState->Pressed == 0) { 00275 touchState = TouchStateReleased; 00276 } 00277 else { 00278 touchState = TouchStateReleasedOutside; 00279 } 00280 00281 msgHandled = _regWindows[i]->touchEvent(pState->x, pState->y, touchState); 00282 00283 break; 00284 case WM_SET_FOCUS: 00285 msgHandled = _regWindows[i]->focusEvent(pMsg->Data.v == 1); 00286 break; 00287 case WM_SIZE: 00288 msgHandled = _regWindows[i]->resizedEvent(); 00289 break; 00290 00291 default: 00292 msgHandled = false; 00293 } 00294 00295 00296 } 00297 00298 00299 00300 break; 00301 } 00302 } 00303 00304 if (!msgHandled) { 00305 WM_DefaultProc(pMsg); 00306 } 00307 } 00308 00309 static void _register(GUI_HWIN hWin, EwWindow* win, void (*callbackFunc)(WM_MESSAGE* pMsg, EwWindow* w)) { 00310 for (int i = 0; i < EW_MAX_NUM_WINDOWS; i++) { 00311 if (_regWindows[i] == NULL) { 00312 _regWindows[i] = win; 00313 _regHandles[i] = hWin; 00314 _regCallbacks[i] = callbackFunc; 00315 00316 if (callbackFunc != NULL) { 00317 WM_SetCallback(hWin, _callback); 00318 } 00319 00320 break; 00321 } 00322 } 00323 } 00324 00325 static void _deregister(GUI_HWIN hWin) { 00326 00327 for (int i = 0; i < EW_MAX_NUM_WINDOWS; i++) { 00328 if (_regHandles[i] == hWin) { 00329 _regWindows[i] = NULL; 00330 _regHandles[i] = 0; 00331 _regCallbacks[i] = NULL; 00332 break; 00333 } 00334 } 00335 } 00336
Generated on Tue Jul 12 2022 19:57:49 by
