Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
319
Src/Wasabi/api/wnd/wndclass/clickwnd.cpp
Normal file
319
Src/Wasabi/api/wnd/wndclass/clickwnd.cpp
Normal file
|
@ -0,0 +1,319 @@
|
|||
#include "precomp.h"
|
||||
#include <api/wnd/api_wnd.h>
|
||||
|
||||
#include "clickwnd.h"
|
||||
#include <api/wnd/notifmsg.h>
|
||||
#include <api/wnd/wndclass/guiobjwnd.h>
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
CLICKWND_LBUTTONDOWN = 0,
|
||||
CLICKWND_LBUTTONUP,
|
||||
CLICKWND_RBUTTONDOWN,
|
||||
CLICKWND_RBUTTONUP,
|
||||
};
|
||||
|
||||
ClickWnd::ClickWnd()
|
||||
{
|
||||
handleRight = TRUE;
|
||||
button = -1;
|
||||
mousedown = 0;
|
||||
mcaptured = 0;
|
||||
hilite = 0;
|
||||
down = 0;
|
||||
areacheck = 0;
|
||||
}
|
||||
|
||||
ClickWnd::~ClickWnd()
|
||||
{
|
||||
BaseWnd::hintDestroying(); // so basewnd doesn't call onCancelCapture
|
||||
if (getCapture()) endCapture();
|
||||
}
|
||||
|
||||
void ClickWnd::setHandleRightClick(int tf)
|
||||
{
|
||||
handleRight=tf;
|
||||
}
|
||||
|
||||
int ClickWnd::getHandleRightClick()
|
||||
{
|
||||
return handleRight;
|
||||
}
|
||||
|
||||
int ClickWnd::onLeftButtonDown(int x, int y)
|
||||
{
|
||||
notifyParent(ChildNotify::CLICKWND_LEFTDOWN, x, y);
|
||||
CLICKWND_PARENT::onLeftButtonDown(x, y);
|
||||
abortTip();
|
||||
#ifdef _WIN32
|
||||
ifc_window *dp = getDesktopParent();
|
||||
if (dp != NULL)
|
||||
{
|
||||
if (dp->wantActivation())
|
||||
{
|
||||
SetActiveWindow(getRootParent()->gethWnd());
|
||||
SetFocus(getRootParent()->gethWnd());
|
||||
}
|
||||
else
|
||||
{
|
||||
HWND w = dp->gethWnd();
|
||||
HWND owner = GetWindow(w, GW_OWNER);
|
||||
if (owner != NULL) {
|
||||
SetActiveWindow(owner);
|
||||
SetFocus(owner);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SetActiveWindow(getRootParent()->gethWnd());
|
||||
}
|
||||
#else
|
||||
#warning port me or remove me
|
||||
#endif
|
||||
if (ptInRegion(x, y))
|
||||
return onButtonDown(CLICKWND_LBUTTONDOWN, x, y);
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClickWnd::onRightButtonDown(int x, int y)
|
||||
{
|
||||
notifyParent(ChildNotify::CLICKWND_RIGHTDOWN, x, y);
|
||||
CLICKWND_PARENT::onRightButtonDown(x, y);
|
||||
abortTip();
|
||||
if (!handleRight) return 1;
|
||||
if (ptInRegion(x, y))
|
||||
return onButtonDown(CLICKWND_RBUTTONDOWN, x, y);
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClickWnd::onLeftButtonUp(int x, int y)
|
||||
{
|
||||
notifyParent(ChildNotify::CLICKWND_LEFTUP, x, y);
|
||||
CLICKWND_PARENT::onLeftButtonUp(x, y);
|
||||
//jf
|
||||
// if (ptInRegion())
|
||||
return onButtonUp(CLICKWND_LBUTTONUP, x, y);
|
||||
// else
|
||||
// return 1;
|
||||
}
|
||||
|
||||
int ClickWnd::onRightButtonUp(int x, int y)
|
||||
{
|
||||
notifyParent(ChildNotify::CLICKWND_RIGHTUP, x, y);
|
||||
CLICKWND_PARENT::onRightButtonUp(x, y);
|
||||
//jf
|
||||
//if (ptInRegion())
|
||||
if (!handleRight) {
|
||||
onRightPush(x, y);
|
||||
return 1;
|
||||
}
|
||||
return onButtonUp(CLICKWND_RBUTTONUP, x, y);
|
||||
// else
|
||||
// return 1;
|
||||
}
|
||||
|
||||
int ClickWnd::onMouseMove(int x, int y)
|
||||
{
|
||||
POINT pos, rpos={x,y};
|
||||
int mouseover;
|
||||
|
||||
CLICKWND_PARENT::onMouseMove(x, y);
|
||||
|
||||
pos=rpos;
|
||||
clientToScreen(&pos);
|
||||
|
||||
int lasthilite = hilite;
|
||||
|
||||
mouseover = (WASABI_API_WND->rootWndFromPoint(&pos) == static_cast<ifc_window *>(this) && ptInRegion(x, y));
|
||||
if (!mouseover && (!mousedown
|
||||
#ifdef _WIN32
|
||||
|| !Std::keyDown(button?MK_RBUTTON:MK_LBUTTON)
|
||||
#else
|
||||
#warning port me
|
||||
#endif
|
||||
)) {
|
||||
if (mcaptured || getCapture()) {
|
||||
endCapture();
|
||||
mcaptured = 0;
|
||||
}
|
||||
mousedown = 0;
|
||||
down = 0;
|
||||
if (wantClickWndAutoInvalidate()) invalidate();
|
||||
if (hilite) _onLeaveArea();
|
||||
hilite = 0;
|
||||
return 1;
|
||||
} else if (!mouseover && hilite) {
|
||||
hilite = 0;
|
||||
_onLeaveArea();
|
||||
} else if (mouseover && !hilite) {
|
||||
hilite = 1;
|
||||
_onEnterArea();
|
||||
}
|
||||
|
||||
if (!getCapture() && mouseover) { // capture to see when leave
|
||||
_enterCapture();
|
||||
}
|
||||
|
||||
int lastdown = down;
|
||||
hilite = mouseover;
|
||||
#ifdef WASABI_COMPILE_WNDMGR
|
||||
int m = getGuiObject() ? getGuiObject()->guiobject_getMover() : 0;
|
||||
#else
|
||||
int m = 0;
|
||||
#endif
|
||||
if (!m) {
|
||||
down = userDown() || (mouseover && mousedown);
|
||||
} else
|
||||
down = userDown() || mousedown;
|
||||
|
||||
// FG> note to self now that i finally fixed this... :
|
||||
// there is a potential bottleneck here, if for some reason this test is always true when moving the windows around like crazy.
|
||||
if (down != lastdown || (hilite != lasthilite && !m)) {
|
||||
if (wantClickWndAutoInvalidate()) invalidate();
|
||||
}
|
||||
|
||||
//invalidate();
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ClickWnd::_enterCapture()
|
||||
{
|
||||
//gee!! if (!hilite) _onEnterArea();
|
||||
if (!getCapture()) beginCapture();
|
||||
mcaptured = 1;
|
||||
}
|
||||
|
||||
int ClickWnd::onButtonDown(int which, int x, int y)
|
||||
{
|
||||
if (!wantClicks()) return 1;
|
||||
|
||||
if (!getCapture()) {
|
||||
_enterCapture();
|
||||
}
|
||||
mousedown = 1;
|
||||
down = 1;
|
||||
button = -1;
|
||||
if (which == CLICKWND_LBUTTONDOWN) button = 0;
|
||||
else if (which == CLICKWND_RBUTTONDOWN) button = 1;
|
||||
if (wantClickWndAutoInvalidate()) invalidate();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClickWnd::onButtonUp(int which, int x, int y)
|
||||
{
|
||||
// make sure same button
|
||||
if (button == 0 && which == CLICKWND_RBUTTONUP) return 1;
|
||||
if (button == 1 && which == CLICKWND_LBUTTONUP) return 1;
|
||||
|
||||
if (!down) {
|
||||
if (mcaptured) {
|
||||
endCapture();
|
||||
mcaptured = 0;
|
||||
}
|
||||
if (hilite) _onLeaveArea();
|
||||
hilite = 0;
|
||||
mousedown = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
POINT pos={x,y};
|
||||
clientToScreen(&pos);
|
||||
|
||||
int mouseover = (WASABI_API_WND->rootWndFromPoint(&pos) == (ifc_window *)this && ptInRegion(x, y));
|
||||
if (!mouseover) {
|
||||
if (mcaptured) {
|
||||
endCapture();
|
||||
mcaptured = 0;
|
||||
}
|
||||
if (hilite) _onLeaveArea();
|
||||
hilite = 0;
|
||||
}
|
||||
|
||||
// it was down, process the event
|
||||
int a = down;
|
||||
down = 0;
|
||||
mousedown = 0;
|
||||
if (wantClickWndAutoInvalidate()) invalidate();
|
||||
|
||||
if (a) {
|
||||
if (button == 0) onLeftPush(x, y);
|
||||
else if (button == 1) onRightPush(x, y);
|
||||
}
|
||||
|
||||
// we need to do this again (and get the new mouse pos) because onLeft/RightPush may have called a
|
||||
// message loop and let the mouse leave without us being aware of it
|
||||
Wasabi::Std::getMousePos(&x, &y);
|
||||
pos.x = x;
|
||||
pos.y = y;
|
||||
screenToClient(&x, &y);
|
||||
mouseover = (WASABI_API_WND->rootWndFromPoint(&pos) == (ifc_window *)this && ptInRegion(x, y));
|
||||
if (!mouseover && hilite) _onLeaveArea();
|
||||
else if (mouseover && !hilite) _onEnterArea();
|
||||
hilite = mouseover;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ClickWnd::onSetVisible( int show )
|
||||
{
|
||||
CLICKWND_PARENT::onSetVisible( show );
|
||||
if ( !show )
|
||||
{
|
||||
if ( getCapture() )
|
||||
{
|
||||
mcaptured = 0;
|
||||
endCapture();
|
||||
}
|
||||
down = 0;
|
||||
mousedown = 0;
|
||||
|
||||
if ( hilite )
|
||||
_onLeaveArea();
|
||||
|
||||
hilite = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void ClickWnd::_onEnterArea()
|
||||
{
|
||||
if (areacheck == 0) {
|
||||
areacheck++;
|
||||
onEnterArea();
|
||||
} else
|
||||
DebugString("onEnterArea check failed %08X \n", this);
|
||||
}
|
||||
|
||||
void ClickWnd::_onLeaveArea()
|
||||
{
|
||||
if (areacheck == 1) {
|
||||
areacheck--;
|
||||
onLeaveArea();
|
||||
} else
|
||||
DebugString("onLeaveArea check failed %08X\n", this);
|
||||
}
|
||||
|
||||
void ClickWnd::onEnterArea()
|
||||
{
|
||||
// DebugString("onEnterArea %08X\n", this);
|
||||
}
|
||||
|
||||
void ClickWnd::onLeaveArea()
|
||||
{
|
||||
// DebugString("onLeaveArea %08X\n", this);
|
||||
}
|
||||
|
||||
void ClickWnd::onCancelCapture()
|
||||
{
|
||||
CLICKWND_PARENT::onCancelCapture();
|
||||
mcaptured=0;
|
||||
down = 0;
|
||||
mousedown = 0;
|
||||
if (hilite) _onLeaveArea();
|
||||
hilite = 0;
|
||||
}
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue