/********************************************************************** * EVENT_FocusOut * * Note: only top-level windows get FocusOut events. */ static void EVENT_FocusOut( HWND hwnd, XEvent *xev ) { XFocusChangeEvent *event = &xev->xfocus; HWND hwnd_tmp; Window focus_win; int revert; XIC xic; if (!hwnd) return; TRACE( "win %p xwin %lx detail=%s\n", hwnd, event->window, focus_details[event->detail] ); if (event->detail == NotifyPointer) return; if (ximInComposeMode) return; x11drv_thread_data()->last_focus = hwnd; if ((xic = X11DRV_get_ic( hwnd ))) { wine_tsx11_lock(); XUnsetICFocus( xic ); wine_tsx11_unlock(); } if (hwnd != GetForegroundWindow()) return; SendMessageW( hwnd, WM_CANCELMODE, 0, 0 ); /* don't reset the foreground window, if the window which is getting the focus is a Wine window */ wine_tsx11_lock(); XGetInputFocus( thread_display(), &focus_win, &revert ); if (focus_win) { if (XFindContext( thread_display(), focus_win, winContext, (char **)&hwnd_tmp ) != 0) focus_win = 0; } wine_tsx11_unlock(); if (!focus_win) { /* Abey : 6-Oct-99. Check again if the focus out window is the Foreground window, because in most cases the messages sent above must have already changed the foreground window, in which case we don't have to change the foreground window to 0 */ if (hwnd == GetForegroundWindow()) { TRACE( "lost focus, setting fg to 0\n" ); SetForegroundWindow( 0 ); } } }
void X11DRV_SetupXIM(void) { Display *display = thread_display(); if (!open_xim( display )) XRegisterIMInstantiateCallback( display, NULL, NULL, NULL, open_xim_callback, NULL ); }
static void update_desktop_fullscreen( unsigned int width, unsigned int height) { Display *display = thread_display(); XEvent xev; if (!display || root_window == DefaultRootWindow( display )) return; xev.xclient.type = ClientMessage; xev.xclient.window = root_window; xev.xclient.message_type = x11drv_atom(_NET_WM_STATE); xev.xclient.serial = 0; xev.xclient.display = display; xev.xclient.send_event = True; xev.xclient.format = 32; if (width == max_width && height == max_height) xev.xclient.data.l[0] = _NET_WM_STATE_ADD; else xev.xclient.data.l[0] = _NET_WM_STATE_REMOVE; xev.xclient.data.l[1] = x11drv_atom(_NET_WM_STATE_FULLSCREEN); xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 1; TRACE("action=%li\n", xev.xclient.data.l[0]); XSendEvent( display, DefaultRootWindow(display), False, SubstructureRedirectMask | SubstructureNotifyMask, &xev ); xev.xclient.data.l[1] = x11drv_atom(_NET_WM_STATE_MAXIMIZED_VERT); xev.xclient.data.l[2] = x11drv_atom(_NET_WM_STATE_MAXIMIZED_HORZ); XSendEvent( display, DefaultRootWindow(display), False, SubstructureRedirectMask | SubstructureNotifyMask, &xev ); }
static BOOL CALLBACK update_windows_on_desktop_resize( HWND hwnd, LPARAM lparam ) { struct x11drv_win_data *data; Display *display = thread_display(); struct desktop_resize_data *resize_data = (struct desktop_resize_data *)lparam; int mask = 0; if (!(data = X11DRV_get_win_data( hwnd ))) return TRUE; /* update the full screen state */ update_net_wm_states( display, data ); if (resize_data->old_virtual_rect.left != virtual_screen_rect.left) mask |= CWX; if (resize_data->old_virtual_rect.top != virtual_screen_rect.top) mask |= CWY; if (mask && data->whole_window) { XWindowChanges changes; wine_tsx11_lock(); changes.x = data->whole_rect.left - virtual_screen_rect.left; changes.y = data->whole_rect.top - virtual_screen_rect.top; XReconfigureWMWindow( display, data->whole_window, DefaultScreen(display), mask, &changes ); wine_tsx11_unlock(); } if (hwnd == GetForegroundWindow()) clip_fullscreen_window( hwnd, TRUE ); return TRUE; }
//! [capture-multi-threaded mainFunction] int main(int argc, const char* argv[]) { int opt_device = 0; // Command line options for (int i=0; i<argc; i++) { if (std::string(argv[i]) == "--device") opt_device = atoi(argv[i+1]); else if (std::string(argv[i]) == "--help") { std::cout << "Usage: " << argv[0] << " [--device <camera device>] [--help]" << std::endl; return 0; } } // Instanciate the capture cv::VideoCapture cap; cap.open(opt_device); // Start the threads vpThread thread_capture((vpThread::Fn)captureFunction, (vpThread::Args)&cap); vpThread thread_display((vpThread::Fn)displayFunction); // Wait until thread ends up thread_capture.join(); thread_display.join(); return 0; }
/********************************************************************** * set_focus */ static void set_focus( HWND hwnd, Time time ) { HWND focus; Window win; TRACE( "setting foreground window to %p\n", hwnd ); SetForegroundWindow( hwnd ); focus = GetFocus(); if (focus) focus = GetAncestor( focus, GA_ROOT ); win = X11DRV_get_whole_window(focus); if (win) { TRACE( "setting focus to %p (%lx) time=%ld\n", focus, win, time ); wine_tsx11_lock(); XSetInputFocus( thread_display(), win, RevertToParent, time ); wine_tsx11_unlock(); } }
void X11DRV_SetupXIM(void) { wine_tsx11_lock(); XRegisterIMInstantiateCallback(thread_display(), NULL, NULL, NULL, X11DRV_OpenIM, NULL); wine_tsx11_unlock(); }