fix identification of event targets in event manager
This commit is contained in:
parent
c583251e18
commit
f89532c0cb
4 changed files with 79 additions and 8 deletions
|
@ -1,5 +1,11 @@
|
|||
(Format: Year/Month/Day)
|
||||
Changes for 0.9.6:
|
||||
*03/10/15:
|
||||
* Fix event manager target window (Simon)
|
||||
-> Some events don't have the main window as xany.window
|
||||
(e.g. XConfigureRequestEvent has the parent there)
|
||||
-> Fixes missing configurerequest events for e.g. galeon
|
||||
EventManager.hh/cc fluxbox.cc
|
||||
*03/10/14:
|
||||
* Bug fix in NextWindow/PrevWindow Command (Henrik)
|
||||
it was only executed when last event = keyevent
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// $Id: EventManager.cc,v 1.9 2003/10/02 16:14:41 rathnor Exp $
|
||||
// $Id: EventManager.cc,v 1.10 2003/10/14 16:23:16 rathnor Exp $
|
||||
|
||||
#include "EventManager.hh"
|
||||
#include "FbWindow.hh"
|
||||
|
@ -57,6 +57,58 @@ void EventManager::remove(const FbWindow &win) {
|
|||
unregisterEventHandler(win.window());
|
||||
}
|
||||
|
||||
Window EventManager::getEventWindow(XEvent &ev) {
|
||||
// we only have cases for events that differ from xany
|
||||
switch (ev.type) {
|
||||
case CreateNotify:
|
||||
// XCreateWindowEvent
|
||||
return ev.xcreatewindow.window;
|
||||
break;
|
||||
case DestroyNotify:
|
||||
// XDestroyWindowEvent
|
||||
return ev.xdestroywindow.window;
|
||||
break;
|
||||
case UnmapNotify:
|
||||
// XUnmapEvent
|
||||
return ev.xunmap.window;
|
||||
break;
|
||||
case MapNotify:
|
||||
// XMapEvent
|
||||
return ev.xmap.window;
|
||||
break;
|
||||
case MapRequest:
|
||||
// XMapRequestEvent
|
||||
return ev.xmaprequest.window;
|
||||
break;
|
||||
case ReparentNotify:
|
||||
// XReparentEvent
|
||||
return ev.xreparent.window;
|
||||
break;
|
||||
case ConfigureNotify:
|
||||
// XConfigureNotify
|
||||
return ev.xconfigure.window;
|
||||
break;
|
||||
case GravityNotify:
|
||||
// XGravityNotify
|
||||
return ev.xgravity.window;
|
||||
break;
|
||||
case ConfigureRequest:
|
||||
// XConfigureRequestEvent
|
||||
return ev.xconfigurerequest.window;
|
||||
break;
|
||||
case CirculateNotify:
|
||||
// XCirculateEvent
|
||||
return ev.xcirculate.window;
|
||||
break;
|
||||
case CirculateRequest:
|
||||
// XCirculateRequestEvent
|
||||
return ev.xcirculaterequest.window;
|
||||
break;
|
||||
default:
|
||||
return ev.xany.window;
|
||||
}
|
||||
}
|
||||
|
||||
void EventManager::registerEventHandler(EventHandler &ev, Window win) {
|
||||
if (win != None)
|
||||
m_eventhandlers[win] = &ev;
|
||||
|
@ -73,8 +125,10 @@ void EventManager::dispatch(Window win, XEvent &ev, bool parent) {
|
|||
EventHandler *evhand = 0;
|
||||
if (parent)
|
||||
evhand = m_parent[win];
|
||||
else
|
||||
else {
|
||||
win = getEventWindow(ev);
|
||||
evhand = m_eventhandlers[win];
|
||||
}
|
||||
|
||||
if (evhand == 0)
|
||||
return;
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// $Id: EventManager.hh,v 1.5 2003/08/23 15:44:06 fluxgen Exp $
|
||||
// $Id: EventManager.hh,v 1.6 2003/10/14 16:23:16 rathnor Exp $
|
||||
|
||||
#include "EventHandler.hh"
|
||||
#include <map>
|
||||
|
@ -42,6 +42,11 @@ public:
|
|||
void remove(const FbWindow &win);
|
||||
void add(EventHandler &ev, Window win) { registerEventHandler(ev, win); }
|
||||
void remove(Window win) { unregisterEventHandler(win); }
|
||||
|
||||
// Some events have the parent window as the xany.window
|
||||
// This function always returns the actual window member of the event structure
|
||||
static Window getEventWindow(XEvent &ev);
|
||||
|
||||
void registerEventHandler(EventHandler &ev, Window win);
|
||||
void unregisterEventHandler(Window win);
|
||||
private:
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// $Id: fluxbox.cc,v 1.199 2003/10/13 19:31:04 fluxgen Exp $
|
||||
// $Id: fluxbox.cc,v 1.200 2003/10/14 16:23:15 rathnor Exp $
|
||||
|
||||
#include "fluxbox.hh"
|
||||
|
||||
|
@ -1091,8 +1091,15 @@ void Fluxbox::handleUnmapNotify(XUnmapEvent &ue) {
|
|||
*/
|
||||
void Fluxbox::handleClientMessage(XClientMessageEvent &ce) {
|
||||
#ifdef DEBUG
|
||||
const char * atom = "nothing";
|
||||
if (ce.message_type)
|
||||
atom = XGetAtomName(FbTk::App::instance()->display(), ce.message_type);
|
||||
|
||||
cerr<<__FILE__<<"("<<__LINE__<<"): ClientMessage. data.l[0]=0x"<<hex<<ce.data.l[0]<<
|
||||
" message_type=0x"<<ce.message_type<<dec<<endl;
|
||||
" message_type=0x"<<ce.message_type<<dec<<" = \""<<atom<<"\""<<endl;
|
||||
|
||||
if (ce.message_type && atom) XFree((char *) atom);
|
||||
|
||||
#endif // DEBUG
|
||||
|
||||
if (ce.format != 32)
|
||||
|
@ -1366,7 +1373,6 @@ void Fluxbox::update(FbTk::Subject *changedsub) {
|
|||
if (m_focused_window == &client)
|
||||
revertFocus(screen);
|
||||
|
||||
removeWindowSearch(client.window());
|
||||
// failed to revert focus?
|
||||
if (m_focused_window == &client)
|
||||
m_focused_window = 0;
|
||||
|
@ -1423,9 +1429,9 @@ void Fluxbox::removeAtomHandler(AtomHandler *atomh) {
|
|||
|
||||
WinClient *Fluxbox::searchWindow(Window window) {
|
||||
std::map<Window, WinClient *>::iterator it = m_window_search.find(window);
|
||||
if (it != m_window_search.end())
|
||||
if (it != m_window_search.end())
|
||||
return it->second;
|
||||
|
||||
|
||||
std::map<Window, FluxboxWindow *>::iterator git = m_window_search_group.find(window);
|
||||
return git == m_window_search_group.end() ? 0 : &git->second->winClient();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue