From: <ka...@us...> - 2009-09-28 15:36:29
|
Revision: 2842 http://ede.svn.sourceforge.net/ede/?rev=2842&view=rev Author: karijes Date: 2009-09-28 15:36:21 +0000 (Mon, 28 Sep 2009) Log Message: ----------- Work on hide/unhide Modified Paths: -------------- branches/ede-panel-new/Netwm.cpp branches/ede-panel-new/Netwm.h branches/ede-panel-new/applets/taskbar/Taskbar.cpp Modified: branches/ede-panel-new/Netwm.cpp =================================================================== --- branches/ede-panel-new/Netwm.cpp 2009-09-28 14:16:29 UTC (rev 2841) +++ branches/ede-panel-new/Netwm.cpp 2009-09-28 15:36:21 UTC (rev 2842) @@ -36,6 +36,8 @@ static Atom _XA_NET_WM_VISIBLE_NAME; static Atom _XA_NET_ACTIVE_WINDOW; +static Atom _XA_WM_STATE; + /* this macro is set in xlib when X-es provides UTF-8 extension (since XFree86 4.0.2) */ #if X_HAVE_UTF8_STRING static Atom _XA_UTF8_STRING; @@ -64,6 +66,8 @@ _XA_NET_WM_VISIBLE_NAME = XInternAtom(fl_display, "_NET_WM_VISIBLE_NAME", False); _XA_NET_ACTIVE_WINDOW = XInternAtom(fl_display, "_NET_ACTIVE_WINDOW", False); + _XA_WM_STATE = XInternAtom(fl_display, "WM_STATE", False); + #ifdef X_HAVE_UTF8_STRING _XA_UTF8_STRING = XInternAtom(fl_display, "UTF8_STRING", False); #endif @@ -449,3 +453,38 @@ SubstructureRedirectMask | SubstructureNotifyMask, &xev); XSync(fl_display, True); } + +WmStateValue wm_get_window_state(Window win) { + init_atoms_once(); + + Atom real; + int format; + unsigned long n, extra; + unsigned char* prop = 0; + + int status = XGetWindowProperty(fl_display, RootWindow(fl_display, fl_screen), + _XA_WM_STATE, 0L, sizeof(Atom), False, _XA_WM_STATE, &real, &format, &n, &extra, + (unsigned char**)&prop); + + if(status != Success || !prop) + return WM_STATE_NONE; + + WmStateValue ret = WmStateValue(*(long*)prop); + XFree(prop); + + return ret; +} + +void wm_set_window_state(Window win, WmStateValue state) { + E_RETURN_IF_FAIL((int)state > 0); + + if(state == WM_STATE_WITHDRAW) { + XWithdrawWindow(fl_display, win, fl_screen); + XSync(fl_display, True); + } else if(state == WM_STATE_ICONIC) { + XIconifyWindow(fl_display, win, fl_screen); + XSync(fl_display, True); + } + + /* nothing for WM_STATE_NORMAL */ +} Modified: branches/ede-panel-new/Netwm.h =================================================================== --- branches/ede-panel-new/Netwm.h 2009-09-28 14:16:29 UTC (rev 2841) +++ branches/ede-panel-new/Netwm.h 2009-09-28 15:36:21 UTC (rev 2842) @@ -19,6 +19,13 @@ NETWM_CHANGED_WINDOW_LIST }; +enum WmStateValue { + WM_STATE_NONE = -1, + WM_STATE_WITHDRAW = 0, + WM_STATE_NORMAL = 1, + WM_STATE_ICONIC = 3 +}; + typedef void (*NetwmCallback)(int action, Window xid, void *data); /* register callback for NETWM_* changes */ @@ -66,4 +73,8 @@ /* try to focus given window */ void netwm_set_active_window(Window win); +/* not part of NETWM, but helpers until _NET_WM_STATE_* is implemented */ +WmStateValue wm_get_window_state(Window win); +void wm_set_window_state(Window win, WmStateValue state); + #endif Modified: branches/ede-panel-new/applets/taskbar/Taskbar.cpp =================================================================== --- branches/ede-panel-new/applets/taskbar/Taskbar.cpp 2009-09-28 14:16:29 UTC (rev 2841) +++ branches/ede-panel-new/applets/taskbar/Taskbar.cpp 2009-09-28 15:36:21 UTC (rev 2842) @@ -13,6 +13,9 @@ class Taskbar : public Fl_Group { public: + TaskButton *curr_activated; + +public: Taskbar(); ~Taskbar(); @@ -54,7 +57,7 @@ } } -Taskbar::Taskbar() : Fl_Group(0, 0, 40, 25) { +Taskbar::Taskbar() : Fl_Group(0, 0, 40, 25), curr_activated(NULL) { end(); /* assure display is openned */ @@ -80,7 +83,7 @@ if(nwins) { TaskButton *b; - int curr_workspace = netwm_get_current_workspace(); + int curr_workspace = netwm_get_current_workspace(); char *title; for(int i = 0; i < nwins; i++) { @@ -169,9 +172,25 @@ void Taskbar::activate_window(TaskButton *b) { E_RETURN_IF_FAIL(b != NULL); - /* TODO: disallow activating already activated window */ - netwm_set_active_window(b->get_window_xid()); - update_active_button(b->get_window_xid()); + Window xid = b->get_window_xid(); + + /* if clicked on activated button, it will be minimized, then next one will be activated */ + if(b == curr_activated) { + if(wm_get_window_state(xid) != WM_STATE_ICONIC) { + wm_set_window_state(xid, WM_STATE_ICONIC); + update_active_button(); + } else { + netwm_set_active_window(xid); + update_active_button(xid); + } + + return; + } + + netwm_set_active_window(xid); + update_active_button(xid); + + curr_activated = b; } void Taskbar::update_child_title(Window xid) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |