void Win32TrayItem::CreateTrayIcon(std::string &iconPath, std::string &caption) { UserWindow* uw = NULL; std::vector<UserWindow*>& windows = UserWindow::GetWindows(); std::vector<UserWindow*>::iterator i = windows.begin(); if (i != windows.end()) { uw = *i; } Win32UserWindow* wuw = dynamic_cast<Win32UserWindow*> (uw); NOTIFYICONDATA* notifyIconData = new NOTIFYICONDATA; notifyIconData->cbSize = sizeof(NOTIFYICONDATA); notifyIconData->hWnd = wuw->GetWindowHandle(); notifyIconData->uID = Win32MenuItemImpl::nextMenuUID(); notifyIconData->uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; notifyIconData->uCallbackMessage = TI_TRAY_CLICKED; notifyIconData->hIcon = (HICON) LoadImage( ::GetModuleHandle(NULL), iconPath.c_str(), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR | LR_LOADFROMFILE); lstrcpy(notifyIconData->szTip, caption.c_str()); Shell_NotifyIcon(NIM_ADD, notifyIconData); this->trayIconData = notifyIconData; }
/*static*/ LRESULT CALLBACK Win32MenuItemImpl::handleMenuClick(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { if(message == WM_COMMAND) { int wmId = LOWORD(wParam); if(wmId == webInspectorMenuItemID) { Win32UserWindow *wuw = Win32UserWindow::FromWindow(hWnd); if(wuw) { wuw->ShowWebInspector(); return true; } else { return false; } } else { return invokeCallback(wmId); } } return FALSE; }
void Win32UIBinding::SetMenu(SharedPtr<MenuItem>) { // Notify all windows that the app menu has changed. std::vector<UserWindow*>& windows = UserWindow::GetWindows(); std::vector<UserWindow*>::iterator i = windows.begin(); while (i != windows.end()) { Win32UserWindow* wuw = dynamic_cast<Win32UserWindow*>(*i); if (wuw != NULL) wuw->AppMenuChanged(); i++; } }
void Win32UIBinding::SetIcon(SharedString icon_path) { // Notify all windows that the app icon has changed // TODO this kind of notification should really be placed in UIBinding.. std::vector<UserWindow*>& windows = UserWindow::GetWindows(); std::vector<UserWindow*>::iterator i = windows.begin(); while (i != windows.end()) { Win32UserWindow* wuw = dynamic_cast<Win32UserWindow*>(*i); if (wuw != NULL) wuw->AppIconChanged(); i++; } }
/*static*/ LRESULT CALLBACK Win32UserWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { Win32UserWindow *window = Win32UserWindow::FromWindow(hWnd); if (window && (window->messageHandlers.size() > 0) && (window->messageHandlers.find(message) != window->messageHandlers.end())) { SharedBoundMethod handler = window->messageHandlers[message]; ValueList args; handler->Call(args); return 0; } switch (message) { case WM_DESTROY: return DefWindowProc(hWnd, message, wParam, lParam); case WM_CLOSE: window->Close(); window->FireEvent(CLOSED); return DefWindowProc(hWnd, message, wParam, lParam); case WM_GETMINMAXINFO: { if(window) { MINMAXINFO *mmi = (MINMAXINFO*) lParam; mmi->ptMaxTrackSize.x = window->GetMaxWidth(); mmi->ptMaxTrackSize.y = window->GetMaxHeight(); mmi->ptMinTrackSize.x = window->GetMinWidth(); mmi->ptMinTrackSize.y = window->GetMinHeight(); } } break; case WM_SIZE: if (!window->web_view) break; window->ResizeSubViews(); if (wParam == SIZE_MAXIMIZED) { window->FireEvent(MAXIMIZED); } else if (wParam == SIZE_MINIMIZED) { window->FireEvent(MINIMIZED); } else if (wParam == SIZE_RESTORED) { window->FireEvent(RESIZED); } break; case WM_SETFOCUS: window->FireEvent(FOCUSED); return DefWindowProc(hWnd, message, wParam, lParam); case WM_KILLFOCUS: window->FireEvent(UNFOCUSED); return DefWindowProc(hWnd, message, wParam, lParam); case WM_MOVE: window->FireEvent(MOVED); return DefWindowProc(hWnd, message, wParam, lParam); case WM_SHOWWINDOW: window->FireEvent(((BOOL)wParam) ? SHOWN : HIDDEN); return DefWindowProc(hWnd, message, wParam, lParam); case TI_TRAY_CLICKED: { UINT uMouseMsg = (UINT) lParam; if(uMouseMsg == WM_LBUTTONDOWN) { Win32TrayItem::InvokeLeftClickCallback(hWnd, message, wParam, lParam); } else if (uMouseMsg == WM_RBUTTONDOWN) { Win32TrayItem::ShowTrayMenu(hWnd, message, wParam, lParam); } } break; default: LRESULT handled = Win32MenuItemImpl::handleMenuClick(hWnd, message, wParam, lParam); if(! handled) { return DefWindowProc(hWnd, message, wParam, lParam); } } return 0; }
/*static*/ LRESULT CALLBACK Win32UserWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { Win32UserWindow *window = Win32UserWindow::FromWindow(hWnd); switch (message) { case WM_DESTROY: return DefWindowProc(hWnd, message, wParam, lParam); case WM_CLOSE: if (window->Close()) return DefWindowProc(hWnd, message, wParam, lParam); else return 0; case WM_GETMINMAXINFO: if (window) { window->GetMinMaxInfo((MINMAXINFO*) lParam); } break; case WM_SIZE: if (window->webView) { window->ResizeSubViews(); window->FireEvent(Event::RESIZED); if (wParam == SIZE_MAXIMIZED) { window->FireEvent(Event::MAXIMIZED); } else if (wParam == SIZE_MINIMIZED) { window->FireEvent(Event::MINIMIZED); } } break; case WM_SETFOCUS: window->FireEvent(Event::FOCUSED); window->Focus(); // Focus the WebView and not the main window. return 0; case WM_KILLFOCUS: window->FireEvent(Event::UNFOCUSED); return DefWindowProc(hWnd, message, wParam, lParam); case WM_MOVE: window->FireEvent(Event::MOVED); return DefWindowProc(hWnd, message, wParam, lParam); case WM_SHOWWINDOW: window->FireEvent(((BOOL)wParam) ? Event::SHOWN : Event::HIDDEN); return DefWindowProc(hWnd, message, wParam, lParam); case WM_MENUCOMMAND: { HMENU nativeMenu = (HMENU) lParam; UINT position = (UINT) wParam; UINT itemId = GetMenuItemID(nativeMenu, position); if (itemId == WEB_INSPECTOR_MENU_ITEM_ID) { Win32UserWindow* inspectorWindow = Win32UserWindow::FromWindow(hWnd); if (inspectorWindow) inspectorWindow->ShowInspector(false); break; } else if (Win32MenuItem::HandleClickEvent(nativeMenu, position)) { break; } else { return DefWindowProc(hWnd, message, wParam, lParam); } } default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
static LRESULT CALLBACK UserWindowWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { Win32UserWindow* window = Win32UserWindow::FromWindow(hWnd); if (!window) return DefWindowProc(hWnd, message, wParam, lParam); LRESULT handled = 0; if (window->HasTransparentBackground()) { if (message == WM_ERASEBKGND) { handled = 1; } else if (message == WM_TIMER && wParam == window->GetTimer()) { window->UpdateBitmap(); handled = 1; } else { IWebView* webView = window->GetWebView(); if (webView) { handled = webView->forwardingWindowProc( reinterpret_cast<OLE_HANDLE>(hWnd), message, wParam, lParam); // WebKit sometimes causes WM_PAINT messages to fire. We need to ensure // we call DefWindowProc in this case, otherwise Windows will assume // that it was not handled and continue to flood us with WM_PAINT messages. if (message == WM_PAINT) { // Calling UpdateBitmap here, assures smooth resizing. window->UpdateBitmap(); handled = 0; } } } } switch (message) { case WM_CLOSE: if (!window->Close()) handled = 1; break; case WM_GETMINMAXINFO: window->GetMinMaxInfo((MINMAXINFO*) lParam); handled = 1; break; case WM_SIZE: window->FireEvent(Event::RESIZED); if (wParam == SIZE_MAXIMIZED) { window->FireEvent(Event::MAXIMIZED); window->ResizeSubViews(); } else if (wParam == SIZE_MINIMIZED) { window->FireEvent(Event::MINIMIZED); } else { window->ResizeSubViews(); } handled = 1; break; case WM_SETFOCUS: // The focus event will be fired by the UIDelegate window->Focus(); // Focus the WebView and not the main window. handled = 1; break; case WM_MOVE: window->FireEvent(Event::MOVED); break; case WM_SHOWWINDOW: window->FireEvent(((BOOL)wParam) ? Event::SHOWN : Event::HIDDEN); break; case WM_MENUCOMMAND: { HMENU nativeMenu = (HMENU) lParam; UINT position = (UINT) wParam; UINT itemId = GetMenuItemID(nativeMenu, position); if (itemId == WEB_INSPECTOR_MENU_ITEM_ID) { handled = 1; window->ShowInspector(false); } else { handled = Win32MenuItem::HandleClickEvent(nativeMenu, position); } } break; } if (!handled) return DefWindowProc(hWnd, message, wParam, lParam); else return handled; }