Made correctly working selection box

This commit is contained in:
Sanel Zukan 2007-05-22 16:27:33 +00:00
parent 0c8e41bd37
commit 9c4fb55bc7
4 changed files with 86 additions and 44 deletions

View File

@ -22,6 +22,11 @@ Atom NET_NUMBER_OF_DESKTOPS = 0;
Atom NET_CURRENT_DESKTOP = 0;
Atom NET_DESKTOP_NAMES = 0;
int overlay_x = 0;
int overlay_y = 0;
int overlay_w = 0;
int overlay_h = 0;
bool net_get_workarea(int& x, int& y, int& w, int &h) {
Atom real;
@ -173,3 +178,51 @@ int net_get_workspace_names(char** names) {
return alloc;
}
#endif
void draw_overlay_rect(void) {
if(overlay_w <= 0 || overlay_h <= 0)
return;
XSetFunction(fltk::xdisplay, fltk::gc, GXxor);
XSetForeground(fltk::xdisplay, fltk::gc, 0xffffffff);
XDrawRectangle(fltk::xdisplay, fltk::xwindow, fltk::gc, overlay_x, overlay_y, overlay_w-1, overlay_h-1);
XSetFunction(fltk::xdisplay, fltk::gc, GXcopy);
}
void draw_xoverlay(int x, int y, int w, int h) {
if(w < 0) {
x += w;
w = -w;
} else if(!w)
w = 1;
if(h < 0) {
y += h;
h = -h;
} else if(!h)
h = 1;
//if(overlay_w <= 0 || overlay_h <= 0) {
if(overlay_w > 0) {
if(x == overlay_x && y == overlay_y && w == overlay_w && h == overlay_h)
return;
draw_overlay_rect();
}
overlay_x = x;
overlay_y = y;
overlay_w = w;
overlay_h = h;
draw_overlay_rect();
}
void clear_xoverlay(void) {
if(overlay_w > 0) {
draw_overlay_rect();
overlay_w = 0;
}
/*
overlay_x = overlay_y = overlay_w = overlay_h = 0;
draw_overlay_rect();
*/
}

View File

@ -21,4 +21,7 @@ bool net_get_workarea(int& x, int& y, int& w, int &h);
void net_make_me_desktop(fltk::Window* w);
int net_get_workspace_names(char**& names);
void draw_xoverlay(int x, int y, int w, int h);
void clear_xoverlay(void);
#endif

View File

@ -99,9 +99,9 @@ Desktop::Desktop() : fltk::Window(0, 0, 100, 100, "")
{
moving = false;
selection_box_x_start = selection_box_y_start = 0;
selection_box_x = selection_box_y = 0;
selection_box_show = false;
selbox = new SelectionOverlay;
selbox->x = selbox->y = selbox->w = selbox->h = 0;
selbox->show = false;
// fallback if update_workarea() fails
int dw, dh;
@ -143,6 +143,9 @@ Desktop::~Desktop()
{
EDEBUG(ESTRLOC ": Desktop::~Desktop()\n");
if(selbox)
delete selbox;
/*
* icons member deleting is not needed, since add_icon will
* append to icons and to fltk::Group array. Desktop at the end
@ -159,6 +162,7 @@ void Desktop::update_workarea(void) {
int X,Y,W,H;
if(net_get_workarea(X, Y, W, H))
resize(X,Y,W,H);
EDEBUG(ESTRLOC ": area: %i %i %i %i\n", X,Y,W,H);
}
void Desktop::read_config(void) {
@ -453,36 +457,14 @@ void Desktop::select_only(DesktopIcon* ic) {
}
void Desktop::draw(void) {
if(damage() & fltk::DAMAGE_ALL) {
if(damage() & fltk::DAMAGE_ALL)
fltk::Window::draw();
fltk::overlay_clear();
}
if(damage() & (fltk::DAMAGE_ALL|fltk::DAMAGE_VALUE)) {
if(selection_box_show) {
fltk::Rectangle selrect(selection_box_x_start, selection_box_y_start, selection_box_x, selection_box_y);
fltk::overlay_rect(selrect.x(), selrect.y(), selrect.w(), selrect.h());
clear_xoverlay();
/*dd
fltk::line_style(fltk::DOT);
fltk::push_matrix();
fltk::setcolor(gisett.label_foreground);
fltk::addvertex(selrect.x(),selrect.y());
fltk::addvertex(selrect.x() + selrect.w(), selrect.y());
//fltk::addvertex(X+lwidth,Y+lheight);
fltk::addvertex(selrect.x() + selrect.w(), selrect.y() + selrect.h());
fltk::addvertex(selrect.x(), selrect.y() + selrect.h());
fltk::addvertex(selection_box_x_start,selection_box_y_start);
fltk::addvertex(selrect.x(),selrect.y());
fltk::strokepath();
fltk::pop_matrix();
// revert to default line style
fltk::line_style(0);
*/
}
if(selbox->show)
draw_xoverlay(selbox->x, selbox->y, selbox->w, selbox->h);
}
}
@ -509,9 +491,10 @@ int Desktop::handle(int event) {
// track position so moving can be deduced
if(fltk::event_button() == 1) {
selection_box_x_start = fltk::event_x_root();
selection_box_y_start = fltk::event_y_root();
selbox->x = fltk::event_x();
selbox->y = fltk::event_y();
}
EDEBUG("overlay: %i %i %i %i\n", selbox->x, selbox->y, selbox->w, selbox->h);
return 1;
}
@ -560,12 +543,13 @@ int Desktop::handle(int event) {
} else {
EDEBUG(ESTRLOC ": DRAG from desktop\n");
selection_box_x = fltk::event_x_root() - selection_box_x_start;
selection_box_y = fltk::event_y_root() - selection_box_y_start;
// moving is started
if(selection_box_x != 0 || selection_box_y != 0) {
selection_box_show = true;
if(selbox->x != 0 || selbox->y != 0) {
selbox->w = fltk::event_x() - selbox->x;
selbox->h = fltk::event_y() - selbox->y;
selbox->show = true;
redraw(fltk::DAMAGE_VALUE);
}
}
@ -576,10 +560,11 @@ int Desktop::handle(int event) {
EDEBUG(ESTRLOC ": RELEASE from desktop\n");
EDEBUG(ESTRLOC ": clicks: %i\n", fltk::event_is_click());
if(selection_box_show) {
selection_box_show = false;
selection_box_x = selection_box_y = selection_box_x_start = selection_box_y_start = 0;
redraw(fltk::DAMAGE_ALL);
if(selbox->show) {
EDEBUG("overlay: %i %i %i %i\n", selbox->x, selbox->y, selbox->w, selbox->h);
selbox->w = selbox->h = 0;
selbox->show = false;
redraw(fltk::DAMAGE_VALUE);
return 1;
}

View File

@ -52,6 +52,11 @@ struct IconSettings {
edelib::String desktop_name; // name used as key when storing positions
};
// selection overlay
struct SelectionOverlay {
int x, y, w, h;
bool show;
};
class DesktopIcon;
@ -65,11 +70,7 @@ class Desktop : public fltk::Window {
int selection_x;
int selection_y;
int selection_box_x_start;
int selection_box_y_start;
int selection_box_x;
int selection_box_y;
bool selection_box_show;
SelectionOverlay* selbox;
//DesktopSettings* dsett;