ultimatepp/uppsrc/CtrlCore/GtkCapture.cpp
cxl d2a72cc325 CtrlCore: New mouse related Ctrl methods NoIgnoreMouse, GetCaptureCtrl
git-svn-id: svn://ultimatepp.org/upp/trunk@6141 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2013-06-10 18:23:48 +00:00

88 lines
1.8 KiB
C++

#include <CtrlCore/CtrlCore.h>
#ifdef GUI_GTK
NAMESPACE_UPP
#define LLOG(x) // DLOG(x)
Ptr<Ctrl> Ctrl::grabwindow;
Ptr<Ctrl> Ctrl::grabpopup;
void Ctrl::StopGrabPopup()
{
if(grabpopup && gdk_pointer_is_grabbed()) {
gdk_pointer_ungrab(CurrentTime);
grabpopup = NULL;
}
}
void Ctrl::StartGrabPopup()
{
if(activePopup.GetCount() && !grabpopup) {
Ctrl *w = activePopup[0];
if(w) {
ReleaseWndCapture0();
if(gdk_pointer_grab(w->gdk(), FALSE,
GdkEventMask(GDK_BUTTON_RELEASE_MASK|GDK_BUTTON_PRESS_MASK|GDK_POINTER_MOTION_MASK),
NULL, NULL, CurrentTime) == GDK_GRAB_SUCCESS)
grabpopup = w;
}
}
}
bool Ctrl::SetWndCapture()
{
GuiLock __;
ASSERT(IsMainThread());
LLOG("SetWndCapture " << Name());
StopGrabPopup();
ReleaseWndCapture();
if(gdk_pointer_grab(gdk(), FALSE,
GdkEventMask(GDK_BUTTON_RELEASE_MASK|GDK_BUTTON_PRESS_MASK|GDK_POINTER_MOTION_MASK),
NULL, NULL, CurrentTime) == GDK_GRAB_SUCCESS) {
grabwindow = this;
return true;
}
return false;
}
bool Ctrl::ReleaseWndCapture0()
{
GuiLock __;
ASSERT(IsMainThread());
LLOG("ReleaseWndCapture");
if(grabwindow) {
gdk_pointer_ungrab(CurrentTime);
grabwindow = NULL;
StartGrabPopup();
return true;
}
return false;
}
bool Ctrl::ReleaseWndCapture()
{
return ReleaseWndCapture0();
}
bool Ctrl::HasWndCapture() const
{
GuiLock __;
return this == grabwindow && gdk_pointer_is_grabbed();
}
void Ctrl::CaptureSync()
{
if(grabwindow && !gdk_pointer_is_grabbed()) {
if(gdk_pointer_grab(grabwindow->gdk(), FALSE,
GdkEventMask(GDK_BUTTON_RELEASE_MASK|GDK_BUTTON_PRESS_MASK|GDK_POINTER_MOTION_MASK),
NULL, NULL, CurrentTime) != GDK_GRAB_SUCCESS) {
grabwindow = NULL;
}
}
}
END_UPP_NAMESPACE
#endif