mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
Adding support for taskbuttons drag & drop. Also fixing child size check bug.
This commit is contained in:
parent
0d0cc8d8b1
commit
002bd6b2e7
@ -503,6 +503,12 @@ int Panel::handle(int e) {
|
|||||||
/* are moving the panel; only vertical moving is supported */
|
/* are moving the panel; only vertical moving is supported */
|
||||||
cursor(FL_CURSOR_MOVE);
|
cursor(FL_CURSOR_MOVE);
|
||||||
|
|
||||||
|
/* send drag events to children and do not drag panel in the mean time */
|
||||||
|
if(clicked && clicked != this) {
|
||||||
|
clicked->handle(e);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* snap it to the top or bottom, depending on pressed mouse location */
|
/* snap it to the top or bottom, depending on pressed mouse location */
|
||||||
if(Fl::event_y_root() <= screen_h_half && y() > screen_h_half) {
|
if(Fl::event_y_root() <= screen_h_half && y() > screen_h_half) {
|
||||||
position(x(), screen_y);
|
position(x(), screen_y);
|
||||||
@ -549,6 +555,7 @@ void Panel::load_applets(const char *applets) {
|
|||||||
* (similar string is expected from configuration), fallback is plain string.
|
* (similar string is expected from configuration), fallback is plain string.
|
||||||
*/
|
*/
|
||||||
static const char *fallback =
|
static const char *fallback =
|
||||||
|
#ifndef EDE_PANEL_LOCAL_APPLETS
|
||||||
"start_menu,"
|
"start_menu,"
|
||||||
"quick_launch,"
|
"quick_launch,"
|
||||||
"pager,"
|
"pager,"
|
||||||
@ -557,10 +564,25 @@ void Panel::load_applets(const char *applets) {
|
|||||||
"keyboard_layout,"
|
"keyboard_layout,"
|
||||||
"battery_monitor,"
|
"battery_monitor,"
|
||||||
"cpu_monitor,"
|
"cpu_monitor,"
|
||||||
#ifdef __linux__
|
# ifdef __linux__
|
||||||
"mem_monitor,"
|
"mem_monitor,"
|
||||||
#endif
|
# endif
|
||||||
"system_tray";
|
"system_tray"
|
||||||
|
#else /* EDE_PANEL_LOCAL_APPLETS */
|
||||||
|
"./applets/start-menu/start_menu,"
|
||||||
|
"./applets/quick-launch/quick_launch,"
|
||||||
|
"./applets/pager/pager,"
|
||||||
|
"./applets/clock/clock,"
|
||||||
|
"./applets/taskbar/taskbar,"
|
||||||
|
"./applets/keyboard-layout/keyboard_layout,"
|
||||||
|
"./applets/battery-monitor/battery_monitor,"
|
||||||
|
"./applets/cpu-monitor/cpu_monitor,"
|
||||||
|
# ifdef __linux__
|
||||||
|
"./applets/mem-monitor/mem_monitor,"
|
||||||
|
# endif
|
||||||
|
"./applets/system-tray/system_tray"
|
||||||
|
#endif /* EDE_PANEL_LOCAL_APPLETS */
|
||||||
|
;
|
||||||
|
|
||||||
String dir = Resource::find_data("panel-applets");
|
String dir = Resource::find_data("panel-applets");
|
||||||
E_RETURN_IF_FAIL(!dir.empty());
|
E_RETURN_IF_FAIL(!dir.empty());
|
||||||
@ -576,7 +598,7 @@ void Panel::load_applets(const char *applets) {
|
|||||||
snprintf(path, sizeof(path), "%s" E_DIR_SEPARATOR_STR "%s" APPLET_EXTENSION, dir.c_str(), tok);
|
snprintf(path, sizeof(path), "%s" E_DIR_SEPARATOR_STR "%s" APPLET_EXTENSION, dir.c_str(), tok);
|
||||||
#else
|
#else
|
||||||
/* only for testing, so path separator is hardcoded */
|
/* only for testing, so path separator is hardcoded */
|
||||||
snprintf(path, sizeof(path), "./applets/%s/%s" APPLET_EXTENSION, dir.c_str(), tok);
|
snprintf(path, sizeof(path), "%s" APPLET_EXTENSION, tok);
|
||||||
#endif
|
#endif
|
||||||
mgr.load(path);
|
mgr.load(path);
|
||||||
}
|
}
|
||||||
|
@ -104,9 +104,10 @@ static void maximize_cb(Fl_Widget*, void *b) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TaskButton::TaskButton(int X, int Y, int W, int H, const char *l) : Fl_Button(X, Y, W, H, l),
|
TaskButton::TaskButton(int X, int Y, int W, int H, const char *l) : Fl_Button(X, Y, W, H, l),
|
||||||
xid(0), wspace(0), image_alloc(false), net_wm_icon(0)
|
xid(0), wspace(0), old_value(0), image_alloc(false), dragged(false), net_wm_icon(0)
|
||||||
{
|
{
|
||||||
box(FL_UP_BOX);
|
box(FL_UP_BOX);
|
||||||
|
|
||||||
align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT | FL_ALIGN_CLIP);
|
align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT | FL_ALIGN_CLIP);
|
||||||
|
|
||||||
if(IconLoader::inited()) {
|
if(IconLoader::inited()) {
|
||||||
@ -226,3 +227,30 @@ void TaskButton::update_image_from_xid(void) {
|
|||||||
image(img);
|
image(img);
|
||||||
image_alloc = true;
|
image_alloc = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int TaskButton::handle(int e) {
|
||||||
|
switch(e) {
|
||||||
|
case FL_PUSH:
|
||||||
|
/*
|
||||||
|
* Remember old value, as value() result affect will box be drawn as FL_UP_BOX or FL_DOWN_BOX.
|
||||||
|
* This trick should return box to the old state in case of dragging.
|
||||||
|
*/
|
||||||
|
old_value = value();
|
||||||
|
return Fl_Button::handle(e);
|
||||||
|
case FL_DRAG:
|
||||||
|
dragged = true;
|
||||||
|
return 1;
|
||||||
|
case FL_RELEASE:
|
||||||
|
if(dragged) {
|
||||||
|
Taskbar *taskbar = (Taskbar*)parent();
|
||||||
|
taskbar->try_dnd(this, Fl::event_x(), Fl::event_y());
|
||||||
|
dragged = false;
|
||||||
|
|
||||||
|
value(old_value);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* fallthrough */
|
||||||
|
}
|
||||||
|
|
||||||
|
return Fl_Button::handle(e);
|
||||||
|
}
|
||||||
|
@ -29,7 +29,9 @@ private:
|
|||||||
/* window ID this button handles */
|
/* window ID this button handles */
|
||||||
Window xid;
|
Window xid;
|
||||||
int wspace;
|
int wspace;
|
||||||
|
char old_value; /* for storing value() as it affects boxtype */
|
||||||
bool image_alloc;
|
bool image_alloc;
|
||||||
|
bool dragged;
|
||||||
Atom net_wm_icon;
|
Atom net_wm_icon;
|
||||||
|
|
||||||
void clear_image(void);
|
void clear_image(void);
|
||||||
@ -48,6 +50,8 @@ public:
|
|||||||
|
|
||||||
void set_workspace(int s) { wspace = s; }
|
void set_workspace(int s) { wspace = s; }
|
||||||
int get_workspace(void) { return wspace; }
|
int get_workspace(void) { return wspace; }
|
||||||
|
|
||||||
|
int handle(int e);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -360,7 +360,7 @@ void Taskbar::update_child_icon(Window xid) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Taskbar::update_child_workspace(Window xid) {
|
void Taskbar::update_child_workspace(Window xid) {
|
||||||
if(children() < 0) return;
|
if(!children()) return;
|
||||||
|
|
||||||
TaskButton *o;
|
TaskButton *o;
|
||||||
for(int i = 0; i < children(); i++) {
|
for(int i = 0; i < children(); i++) {
|
||||||
@ -382,6 +382,49 @@ void Taskbar::panel_redraw(void) {
|
|||||||
parent()->redraw();
|
parent()->redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Taskbar::try_dnd(TaskButton *b, int xpos, int ypos) {
|
||||||
|
if(!children()) return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* try to find position of incoming child, as the child, when is moved
|
||||||
|
* forward, has to go on 'target_pos + 1' instead only 'target_pos'
|
||||||
|
*/
|
||||||
|
int child_pos = find(b);
|
||||||
|
E_RETURN_IF_FAIL(child_pos != children());
|
||||||
|
|
||||||
|
TaskButton *o;
|
||||||
|
for(int i = 0; i < children(); i++) {
|
||||||
|
o = (TaskButton*)child(i);
|
||||||
|
if(o == b) continue;
|
||||||
|
|
||||||
|
if((xpos > b->x() && xpos < b->x() + b->w()) &&
|
||||||
|
(ypos > b->y() && ypos < b->y() + b->h()))
|
||||||
|
{
|
||||||
|
/* not moved outside child range */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((xpos > o->x() && xpos < o->x() + o->w()) &&
|
||||||
|
(ypos > o->y() && ypos < o->y() + o->h()))
|
||||||
|
{
|
||||||
|
/* Try to find widget position in array. Widgets in array are not sorted in any order. */
|
||||||
|
int pos = find(o);
|
||||||
|
if(pos == children()) {
|
||||||
|
/* not found, proceed with the search */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* increase just in case target position is in front */
|
||||||
|
pos += (pos > child_pos) ? 1 : 0;
|
||||||
|
insert(*b, pos);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
layout_children();
|
||||||
|
redraw();
|
||||||
|
}
|
||||||
|
|
||||||
EDE_PANEL_APPLET_EXPORT (
|
EDE_PANEL_APPLET_EXPORT (
|
||||||
Taskbar,
|
Taskbar,
|
||||||
EDE_PANEL_APPLET_OPTION_ALIGN_LEFT | EDE_PANEL_APPLET_OPTION_RESIZABLE_H,
|
EDE_PANEL_APPLET_OPTION_ALIGN_LEFT | EDE_PANEL_APPLET_OPTION_RESIZABLE_H,
|
||||||
|
@ -58,6 +58,9 @@ public:
|
|||||||
void update_child_workspace(Window xid);
|
void update_child_workspace(Window xid);
|
||||||
|
|
||||||
void panel_redraw(void);
|
void panel_redraw(void);
|
||||||
|
|
||||||
|
/* try to move child on place of other child, but only if it falls within x,y range */
|
||||||
|
void try_dnd(TaskButton *b, int x, int y);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user