can resize now too. compress motion events.
This commit is contained in:
parent
732bfd191d
commit
38f8155bf5
3 changed files with 49 additions and 7 deletions
|
@ -42,7 +42,10 @@ void OBActions::insertPress(const XButtonEvent &e)
|
||||||
_posqueue[i] = _posqueue[--i];
|
_posqueue[i] = _posqueue[--i];
|
||||||
_posqueue[0] = a;
|
_posqueue[0] = a;
|
||||||
a->button = e.button;
|
a->button = e.button;
|
||||||
a->pos.setPoint(e.x, e.y);
|
a->pos.setPoint(e.x_root, e.y_root);
|
||||||
|
|
||||||
|
OBClient *c = Openbox::instance->findClient(e.window);
|
||||||
|
a->clientarea = c->area();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OBActions::removePress(const XButtonEvent &e)
|
void OBActions::removePress(const XButtonEvent &e)
|
||||||
|
@ -169,20 +172,52 @@ void OBActions::motionHandler(const XMotionEvent &e)
|
||||||
{
|
{
|
||||||
if (!e.same_screen) return; // this just gets stupid
|
if (!e.same_screen) return; // this just gets stupid
|
||||||
|
|
||||||
|
int x_root = e.x_root, y_root = e.y_root;
|
||||||
|
|
||||||
|
// compress changes to a window into a single change
|
||||||
|
XEvent ce;
|
||||||
|
while (XCheckTypedEvent(otk::OBDisplay::display, e.type, &ce)) {
|
||||||
|
if (ce.xmotion.window != e.window) {
|
||||||
|
XPutBackEvent(otk::OBDisplay::display, &ce);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
x_root = e.x_root;
|
||||||
|
y_root = e.y_root;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
OBWidget *w = dynamic_cast<OBWidget*>
|
OBWidget *w = dynamic_cast<OBWidget*>
|
||||||
(Openbox::instance->findHandler(e.window));
|
(Openbox::instance->findHandler(e.window));
|
||||||
|
|
||||||
_dx = e.x - _posqueue[0]->pos.x();
|
_dx = x_root - _posqueue[0]->pos.x();
|
||||||
_dy = e.y - _posqueue[0]->pos.y();
|
_dy = y_root - _posqueue[0]->pos.y();
|
||||||
|
|
||||||
// XXX: i can envision all sorts of crazy shit with this.. gestures, etc
|
// XXX: i can envision all sorts of crazy shit with this.. gestures, etc
|
||||||
printf("GUILE: MOTION: win %lx type %d modifiers %u x %d y %d\n",
|
printf("GUILE: MOTION: win %lx type %d modifiers %u x %d y %d\n",
|
||||||
(long)e.window, (w ? w->type():-1), e.state, _dx, _dy);
|
(long)e.window, (w ? w->type():-1), e.state, _dx, _dy);
|
||||||
|
|
||||||
if (w && (w->type() == OBWidget::Type_Titlebar ||
|
OBClient *c = Openbox::instance->findClient(e.window);
|
||||||
w->type() == OBWidget::Type_Label)) {
|
if (w && c) {
|
||||||
OBClient *c = Openbox::instance->findClient(e.window);
|
switch (w->type()) {
|
||||||
if (c) c->move(c->area().x() + _dx, c->area().y() + _dy);
|
case OBWidget::Type_Titlebar:
|
||||||
|
case OBWidget::Type_Label:
|
||||||
|
c->move(_posqueue[0]->clientarea.x() + _dx,
|
||||||
|
_posqueue[0]->clientarea.y() + _dy);
|
||||||
|
break;
|
||||||
|
case OBWidget::Type_LeftGrip:
|
||||||
|
c->resize(OBClient::TopRight,
|
||||||
|
_posqueue[0]->clientarea.width() - _dx,
|
||||||
|
_posqueue[0]->clientarea.height() + _dy);
|
||||||
|
break;
|
||||||
|
case OBWidget::Type_RightGrip:
|
||||||
|
c->resize(OBClient::TopLeft,
|
||||||
|
_posqueue[0]->clientarea.width() + _dx,
|
||||||
|
_posqueue[0]->clientarea.height() + _dy);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "otk/point.hh"
|
#include "otk/point.hh"
|
||||||
|
#include "otk/rect.hh"
|
||||||
#include "otk/eventhandler.hh"
|
#include "otk/eventhandler.hh"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -32,6 +33,7 @@ public:
|
||||||
struct ButtonPressAction {
|
struct ButtonPressAction {
|
||||||
unsigned int button;
|
unsigned int button;
|
||||||
otk::Point pos;
|
otk::Point pos;
|
||||||
|
otk::Rect clientarea;
|
||||||
ButtonPressAction() { button = 0; }
|
ButtonPressAction() { button = 0; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -778,6 +778,11 @@ void OBClient::resize(Corner anchor, int w, int h)
|
||||||
w -= _base_size.x();
|
w -= _base_size.x();
|
||||||
h -= _base_size.y();
|
h -= _base_size.y();
|
||||||
|
|
||||||
|
// for interactive resizing. have to move half an increment in each
|
||||||
|
// direction.
|
||||||
|
w += _size_inc.x() / 2;
|
||||||
|
h += _size_inc.y() / 2;
|
||||||
|
|
||||||
// is the window resizable? if it is not, then don't check its sizes, the
|
// is the window resizable? if it is not, then don't check its sizes, the
|
||||||
// client can do what it wants and the user can't change it anyhow
|
// client can do what it wants and the user can't change it anyhow
|
||||||
if (_min_size.x() <= _max_size.x() && _min_size.y() <= _max_size.y()) {
|
if (_min_size.x() <= _max_size.x() && _min_size.y() <= _max_size.y()) {
|
||||||
|
|
Loading…
Reference in a new issue