mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
Better handling on workspace change and setting sticky tag for window. Implemented #217: all windows in taskbar, no matter which desktop was used.
This commit is contained in:
parent
7431373b29
commit
d09f846380
@ -103,7 +103,9 @@ static void maximize_cb(Fl_Widget*, void *b) {
|
|||||||
redraw_whole_panel(bb);
|
redraw_whole_panel(bb);
|
||||||
}
|
}
|
||||||
|
|
||||||
TaskButton::TaskButton(int X, int Y, int W, int H, const char *l) : Fl_Button(X, Y, W, H, l), xid(0), image_alloc(false) {
|
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)
|
||||||
|
{
|
||||||
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);
|
||||||
|
|
||||||
|
@ -28,11 +28,11 @@ class TaskButton : public Fl_Button {
|
|||||||
private:
|
private:
|
||||||
/* window ID this button handles */
|
/* window ID this button handles */
|
||||||
Window xid;
|
Window xid;
|
||||||
|
int wspace;
|
||||||
bool image_alloc;
|
bool image_alloc;
|
||||||
Atom net_wm_icon;
|
Atom net_wm_icon;
|
||||||
|
|
||||||
void clear_image(void);
|
void clear_image(void);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TaskButton(int X, int Y, int W, int H, const char *l = 0);
|
TaskButton(int X, int Y, int W, int H, const char *l = 0);
|
||||||
~TaskButton();
|
~TaskButton();
|
||||||
@ -45,6 +45,9 @@ public:
|
|||||||
|
|
||||||
void update_title_from_xid(void);
|
void update_title_from_xid(void);
|
||||||
void update_image_from_xid(void);
|
void update_image_from_xid(void);
|
||||||
|
|
||||||
|
void set_workspace(int s) { wspace = s; }
|
||||||
|
int get_workspace(void) { return wspace; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -45,6 +45,7 @@ EDELIB_NS_USING(NETWM_CHANGED_CURRENT_WORKSPACE)
|
|||||||
EDELIB_NS_USING(NETWM_CHANGED_WINDOW_LIST)
|
EDELIB_NS_USING(NETWM_CHANGED_WINDOW_LIST)
|
||||||
EDELIB_NS_USING(NETWM_CHANGED_WINDOW_NAME)
|
EDELIB_NS_USING(NETWM_CHANGED_WINDOW_NAME)
|
||||||
EDELIB_NS_USING(NETWM_CHANGED_WINDOW_ICON)
|
EDELIB_NS_USING(NETWM_CHANGED_WINDOW_ICON)
|
||||||
|
EDELIB_NS_USING(NETWM_CHANGED_WINDOW_DESKTOP)
|
||||||
EDELIB_NS_USING(WM_WINDOW_STATE_ICONIC)
|
EDELIB_NS_USING(WM_WINDOW_STATE_ICONIC)
|
||||||
EDELIB_NS_USING(NETWM_STATE_ACTION_TOGGLE)
|
EDELIB_NS_USING(NETWM_STATE_ACTION_TOGGLE)
|
||||||
EDELIB_NS_USING(NETWM_STATE_HIDDEN)
|
EDELIB_NS_USING(NETWM_STATE_HIDDEN)
|
||||||
@ -91,11 +92,21 @@ static void net_event_cb(int action, Window xid, void *data) {
|
|||||||
tt->update_child_icon(xid);
|
tt->update_child_icon(xid);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(action == NETWM_CHANGED_WINDOW_DESKTOP) {
|
||||||
|
Taskbar *tt = (Taskbar*)data;
|
||||||
|
tt->update_child_workspace(xid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Taskbar::Taskbar() : Fl_Group(0, 0, 40, 25), curr_active(NULL), prev_active(NULL) {
|
Taskbar::Taskbar() : Fl_Group(0, 0, 40, 25), curr_active(NULL), prev_active(NULL) {
|
||||||
end();
|
end();
|
||||||
|
|
||||||
fixed_layout = false;
|
fixed_layout = false;
|
||||||
|
ignore_workspace_value = false;
|
||||||
|
|
||||||
|
current_workspace = netwm_workspace_get_current();
|
||||||
|
|
||||||
update_task_buttons();
|
update_task_buttons();
|
||||||
netwm_callback_add(net_event_cb, this);
|
netwm_callback_add(net_event_cb, this);
|
||||||
@ -107,7 +118,7 @@ Taskbar::~Taskbar() {
|
|||||||
|
|
||||||
void Taskbar::update_task_buttons(void) {
|
void Taskbar::update_task_buttons(void) {
|
||||||
Window *wins;
|
Window *wins;
|
||||||
int nwins = netwm_window_get_all_mapped(&wins);
|
int ws, nwins = netwm_window_get_all_mapped(&wins);
|
||||||
|
|
||||||
if(nwins < 1) {
|
if(nwins < 1) {
|
||||||
if(children() > 0) clear();
|
if(children() > 0) clear();
|
||||||
@ -115,7 +126,6 @@ void Taskbar::update_task_buttons(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TaskButton *b;
|
TaskButton *b;
|
||||||
int curr_workspace = netwm_workspace_get_current();
|
|
||||||
bool need_full_redraw = false;
|
bool need_full_redraw = false;
|
||||||
|
|
||||||
for(int i = 0, found; i < children(); i++) {
|
for(int i = 0, found; i < children(); i++) {
|
||||||
@ -173,11 +183,13 @@ void Taskbar::update_task_buttons(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* create button */
|
/* create button */
|
||||||
if(curr_workspace == netwm_window_get_workspace(wins[i])) {
|
ws = netwm_window_get_workspace(wins[i]);
|
||||||
|
if(visible_on_current_workspace(ws)) {
|
||||||
b = new TaskButton(0, 0, DEFAULT_CHILD_W, 25);
|
b = new TaskButton(0, 0, DEFAULT_CHILD_W, 25);
|
||||||
b->set_window_xid(wins[i]);
|
b->set_window_xid(wins[i]);
|
||||||
b->update_title_from_xid();
|
b->update_title_from_xid();
|
||||||
b->update_image_from_xid();
|
b->update_image_from_xid();
|
||||||
|
b->set_workspace(ws);
|
||||||
|
|
||||||
/* catch the name changes */
|
/* catch the name changes */
|
||||||
XSelectInput(fl_display, wins[i], PropertyChangeMask | StructureNotifyMask);
|
XSelectInput(fl_display, wins[i], PropertyChangeMask | StructureNotifyMask);
|
||||||
@ -197,18 +209,12 @@ void Taskbar::update_task_buttons(void) {
|
|||||||
|
|
||||||
void Taskbar::update_workspace_change(void) {
|
void Taskbar::update_workspace_change(void) {
|
||||||
if(children() < 1) return;
|
if(children() < 1) return;
|
||||||
|
current_workspace = netwm_workspace_get_current();
|
||||||
|
|
||||||
TaskButton *b;
|
TaskButton *b;
|
||||||
int p, curr_workspace = netwm_workspace_get_current();
|
|
||||||
|
|
||||||
for(int i = 0; i < children(); i++) {
|
for(int i = 0; i < children(); i++) {
|
||||||
b = (TaskButton*)child(i);
|
b = (TaskButton*)child(i);
|
||||||
/*
|
visible_on_current_workspace(b->get_workspace()) ? b->show() : b->hide();
|
||||||
* get fresh value, as wm can change it without notification
|
|
||||||
* (e.g. pekwm window drag to different workspace)
|
|
||||||
*/
|
|
||||||
p = netwm_window_get_workspace(b->get_window_xid());
|
|
||||||
(p == curr_workspace) ? b->show() : b->hide();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
layout_children();
|
layout_children();
|
||||||
@ -352,6 +358,25 @@ void Taskbar::update_child_icon(Window xid) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Taskbar::update_child_workspace(Window xid) {
|
||||||
|
if(children() < 0) return;
|
||||||
|
|
||||||
|
TaskButton *o;
|
||||||
|
for(int i = 0; i < children(); i++) {
|
||||||
|
o = (TaskButton*)child(i);
|
||||||
|
|
||||||
|
if(o->get_window_xid() == xid) {
|
||||||
|
int ws = netwm_window_get_workspace(xid);
|
||||||
|
o->set_workspace(ws);
|
||||||
|
visible_on_current_workspace(ws) ? o->show() : o->hide();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
layout_children();
|
||||||
|
redraw();
|
||||||
|
}
|
||||||
|
|
||||||
void Taskbar::panel_redraw(void) {
|
void Taskbar::panel_redraw(void) {
|
||||||
parent()->redraw();
|
parent()->redraw();
|
||||||
}
|
}
|
||||||
|
@ -24,12 +24,23 @@
|
|||||||
#include <FL/Fl_Group.H>
|
#include <FL/Fl_Group.H>
|
||||||
#include "Applet.h"
|
#include "Applet.h"
|
||||||
|
|
||||||
|
/* if button should be on visible on all workspaces */
|
||||||
|
#define ALL_WORKSPACES -1
|
||||||
|
|
||||||
class TaskButton;
|
class TaskButton;
|
||||||
|
|
||||||
class Taskbar : public Fl_Group {
|
class Taskbar : public Fl_Group {
|
||||||
public:
|
public:
|
||||||
TaskButton *curr_active, *prev_active;
|
TaskButton *curr_active, *prev_active;
|
||||||
bool fixed_layout; /* fixed or streched layout of buttons */
|
bool fixed_layout; /* fixed or streched layout of buttons */
|
||||||
|
bool ignore_workspace_value; /* should all windows be shown ignoring workspace value */
|
||||||
|
|
||||||
|
int current_workspace;
|
||||||
|
|
||||||
|
bool visible_on_current_workspace(int ws) {
|
||||||
|
return ignore_workspace_value || (ws == ALL_WORKSPACES) || (ws == current_workspace);
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Taskbar();
|
Taskbar();
|
||||||
~Taskbar();
|
~Taskbar();
|
||||||
@ -44,6 +55,7 @@ public:
|
|||||||
void activate_window(TaskButton *b);
|
void activate_window(TaskButton *b);
|
||||||
void update_child_title(Window xid);
|
void update_child_title(Window xid);
|
||||||
void update_child_icon(Window xid);
|
void update_child_icon(Window xid);
|
||||||
|
void update_child_workspace(Window xid);
|
||||||
|
|
||||||
void panel_redraw(void);
|
void panel_redraw(void);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user