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[0] = a;
|
||||
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)
|
||||
|
@ -169,20 +172,52 @@ void OBActions::motionHandler(const XMotionEvent &e)
|
|||
{
|
||||
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*>
|
||||
(Openbox::instance->findHandler(e.window));
|
||||
|
||||
_dx = e.x - _posqueue[0]->pos.x();
|
||||
_dy = e.y - _posqueue[0]->pos.y();
|
||||
_dx = x_root - _posqueue[0]->pos.x();
|
||||
_dy = y_root - _posqueue[0]->pos.y();
|
||||
|
||||
// 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",
|
||||
(long)e.window, (w ? w->type():-1), e.state, _dx, _dy);
|
||||
|
||||
if (w && (w->type() == OBWidget::Type_Titlebar ||
|
||||
w->type() == OBWidget::Type_Label)) {
|
||||
OBClient *c = Openbox::instance->findClient(e.window);
|
||||
if (c) c->move(c->area().x() + _dx, c->area().y() + _dy);
|
||||
OBClient *c = Openbox::instance->findClient(e.window);
|
||||
if (w && c) {
|
||||
switch (w->type()) {
|
||||
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/rect.hh"
|
||||
#include "otk/eventhandler.hh"
|
||||
|
||||
extern "C" {
|
||||
|
@ -32,6 +33,7 @@ public:
|
|||
struct ButtonPressAction {
|
||||
unsigned int button;
|
||||
otk::Point pos;
|
||||
otk::Rect clientarea;
|
||||
ButtonPressAction() { button = 0; }
|
||||
};
|
||||
|
||||
|
|
|
@ -778,6 +778,11 @@ void OBClient::resize(Corner anchor, int w, int h)
|
|||
w -= _base_size.x();
|
||||
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
|
||||
// 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()) {
|
||||
|
|
Loading…
Reference in a new issue