void XCompcapMain::tick(float seconds)
{
	UNUSED_PARAMETER(seconds);

	PLock lock(&p->lock, true);

	if (!lock.isLocked())
		return;

	XCompcap::processEvents();

	if (XCompcap::windowWasReconfigured(p->win))
		updateSettings(0);

	if (!p->tex || !p->gltex)
		return;

	gs_entercontext(obs_graphics());

	if (p->lockX) {
		XLockDisplay(xdisp);
		XSync(xdisp, 0);
	}

	gs_copy_texture_region(p->tex, 0, 0, p->gltex, p->cur_cut_left,
			p->cur_cut_top, width(), height());

	if (p->lockX)
		XUnlockDisplay(xdisp);

	gs_leavecontext();
}
void XCompcapMain::tick(float seconds)
{
	UNUSED_PARAMETER(seconds);

	PLock lock(&p->lock, true);

	if (!lock.isLocked())
		return;

	XCompcap::processEvents();

	if (XCompcap::windowWasReconfigured(p->win))
		updateSettings(0);

	if (!p->tex || !p->gltex)
		return;

	obs_enter_graphics();

	if (p->lockX) {
		XLockDisplay(xdisp);
		XSync(xdisp, 0);
	}

	gs_copy_texture_region(p->tex, 0, 0, p->gltex, p->cur_cut_left,
			p->cur_cut_top, width(), height());

	if (p->cursor && p->show_cursor) {
		xcursor_tick(p->cursor);

		p->cursor_outside =
			p->cursor->x < p->cur_cut_left                   ||
			p->cursor->y < p->cur_cut_top                    ||
			p->cursor->x > int(p->width  - p->cur_cut_right) ||
			p->cursor->y > int(p->height - p->cur_cut_bot);
	}

	if (p->lockX)
		XUnlockDisplay(xdisp);

	obs_leave_graphics();
}
void BrowserSource::Impl::Listener::OnDraw( BrowserSurfaceHandle surfaceHandle,
		int width, int height)
{
	UNUSED_PARAMETER(width);
	UNUSED_PARAMETER(height);

	if (textureSet.count(surfaceHandle) > 0) {

		obs_enter_graphics();
		if (browserSource->GetParent()->TryLockTexture()) {
			if (popupSurface != nullptr)
				gs_copy_texture_region(surfaceHandle, popupX, popupY, popupSurface, 0, 0, gs_texture_get_width(popupSurface), gs_texture_get_height(popupSurface));
			browserSource->SetActiveTexture(surfaceHandle);
			browserSource->GetParent()->UnlockTexture();
		}
		obs_leave_graphics();

	}
	else {
		blog(LOG_ERROR, "Asked to draw unknown surface with handle"
			"%d", surfaceHandle);
	}
}
void XCompcapMain::tick(float seconds)
{
	if (!obs_source_showing(p->source))
		return;

	PLock lock(&p->lock, true);

	if (!lock.isLocked())
		return;

	XCompcap::processEvents();

	if (p->win && XCompcap::windowWasReconfigured(p->win)) {
		p->window_check_time = FIND_WINDOW_INTERVAL;
		p->win = 0;
	}

	XDisplayLock xlock;
	XWindowAttributes attr;

	if (!p->win || !XGetWindowAttributes(xdisp, p->win, &attr)) {
		p->window_check_time += (double)seconds;

		if (p->window_check_time < FIND_WINDOW_INTERVAL)
			return;

		Window newWin = getWindowFromString(p->windowName);

		p->window_check_time = 0.0;

		if (newWin && XGetWindowAttributes(xdisp, newWin, &attr)) {
			p->win = newWin;
			updateSettings(0);
		} else {
			return;
		}
	}

	if (!p->tex || !p->gltex)
		return;

	obs_enter_graphics();

	if (p->lockX) {
		XLockDisplay(xdisp);
		XSync(xdisp, 0);
	}

	if (p->include_border) {
		gs_copy_texture_region(
				p->tex, 0, 0,
				p->gltex,
				p->cur_cut_left,
				p->cur_cut_top,
				width(), height());
	} else {
		gs_copy_texture_region(
				p->tex, 0, 0,
				p->gltex,
				p->cur_cut_left + p->border,
				p->cur_cut_top + p->border,
				width(), height());
	}

	if (p->cursor && p->show_cursor) {
		xcursor_tick(p->cursor);

		p->cursor_outside =
			p->cursor->x < p->cur_cut_left                   ||
			p->cursor->y < p->cur_cut_top                    ||
			p->cursor->x > int(p->width  - p->cur_cut_right) ||
			p->cursor->y > int(p->height - p->cur_cut_bot);
	}

	if (p->lockX)
		XUnlockDisplay(xdisp);

	obs_leave_graphics();
}
void XCompcapMain::tick(float seconds)
{
	UNUSED_PARAMETER(seconds);

	if (!obs_source_showing(p->source))
		return;

	PLock lock(&p->lock, true);

	if (!lock.isLocked())
		return;

	XCompcap::processEvents();

	if (XCompcap::windowWasReconfigured(p->win))
		updateSettings(0);

	XErrorLock xlock;
	xlock.resetError();
	XWindowAttributes attr;

	if (!XGetWindowAttributes(xdisp, p->win, &attr)) {
		Window newWin = getWindowFromString(p->windowName);

		if (XGetWindowAttributes(xdisp, newWin, &attr)) {
			p->win = newWin;
			updateSettings(0);
		}
		return;
	}

	if (!p->tex || !p->gltex)
		return;

	obs_enter_graphics();

	if (p->lockX) {
		XLockDisplay(xdisp);
		XSync(xdisp, 0);
	}

	if (p->include_border) {
		gs_copy_texture_region(
				p->tex, 0, 0,
				p->gltex,
				p->cur_cut_left,
				p->cur_cut_top,
				width(), height());
	} else {
		gs_copy_texture_region(
				p->tex, 0, 0,
				p->gltex,
				p->cur_cut_left + p->border,
				p->cur_cut_top + p->border,
				width(), height());
	}

	if (p->cursor && p->show_cursor) {
		xcursor_tick(p->cursor);

		p->cursor_outside =
			p->cursor->x < p->cur_cut_left                   ||
			p->cursor->y < p->cur_cut_top                    ||
			p->cursor->x > int(p->width  - p->cur_cut_right) ||
			p->cursor->y > int(p->height - p->cur_cut_bot);
	}

	if (p->lockX)
		XUnlockDisplay(xdisp);

	obs_leave_graphics();
}