Example #1
0
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;
	}
Example #3
0
	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++;
		}
	}
Example #4
0
	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++;
		}
	}
Example #5
0
/*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;
}