!! Implementation of System tray !!
This commit is contained in:
148
src/event.c
148
src/event.c
@@ -162,6 +162,7 @@ void
|
||||
clientmessageevent(XClientMessageEvent *ev)
|
||||
{
|
||||
Client *c;
|
||||
Systray *sy;
|
||||
int s, i, mess_t = 0;
|
||||
Atom rt;
|
||||
int rf;
|
||||
@@ -195,8 +196,28 @@ clientmessageevent(XClientMessageEvent *ev)
|
||||
|
||||
/* Manage _NET_ACTIVE_WINDOW */
|
||||
else if(mess_t == net_active_window)
|
||||
{
|
||||
if((c = client_gb_win(ev->window)))
|
||||
client_focus(c);
|
||||
else if((sy = systray_find(ev->data.l[0])))
|
||||
XSetInputFocus(dpy, sy->win, RevertToNone, CurrentTime);
|
||||
}
|
||||
}
|
||||
else if(ev->window == traywin)
|
||||
{
|
||||
/* Manage _NET_WM_SYSTEM_TRAY_OPCODE */
|
||||
if(mess_t == net_wm_system_tray_opcode)
|
||||
{
|
||||
if(ev->data.l[1] == XEMBED_EMBEDDED_NOTIFY)
|
||||
{
|
||||
systray_add(ev->data.l[2]);
|
||||
systray_update();
|
||||
}
|
||||
else if(ev->data.l[1] == XEMBED_REQUEST_FOCUS)
|
||||
if((sy = systray_find(ev->data.l[2])))
|
||||
ewmh_send_message(sy->win, sy->win, "_XEMBED",
|
||||
XEMBED_FOCUS_IN, XEMBED_FOCUS_CURRENT, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Manage _NET_WM_STATE */
|
||||
@@ -214,6 +235,7 @@ clientmessageevent(XClientMessageEvent *ev)
|
||||
if((c = client_gb_win(ev->window)))
|
||||
tag_transfert(c, ev->data.l[0]);
|
||||
|
||||
|
||||
/* Manage _WMFS_STATUSTEXT_x */
|
||||
if(mess_t >= wmfs_statustext && ev->data.l[4] == True)
|
||||
{
|
||||
@@ -262,8 +284,8 @@ clientmessageevent(XClientMessageEvent *ev)
|
||||
return;
|
||||
}
|
||||
|
||||
/** ConfigureRequest & ConfigureNotify handle events
|
||||
* \param ev XEvent pointer
|
||||
/** ConfigureRequesthandle events
|
||||
* \param ev XConfigureRequestEvent pointer
|
||||
*/
|
||||
void
|
||||
configureevent(XConfigureRequestEvent *ev)
|
||||
@@ -318,12 +340,19 @@ void
|
||||
destroynotify(XDestroyWindowEvent *ev)
|
||||
{
|
||||
Client *c;
|
||||
Systray *s;
|
||||
|
||||
if((c = client_gb_win(ev->window)))
|
||||
{
|
||||
client_unmanage(c);
|
||||
XSetErrorHandler(errorhandler);
|
||||
}
|
||||
else if((s = systray_find(ev->window)))
|
||||
{
|
||||
setwinstate(s->win, WithdrawnState);
|
||||
systray_del(s->win);
|
||||
systray_update();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -335,6 +364,7 @@ void
|
||||
enternotify(XCrossingEvent *ev)
|
||||
{
|
||||
Client *c;
|
||||
Systray *s;
|
||||
int n;
|
||||
|
||||
if((ev->mode != NotifyNormal
|
||||
@@ -342,6 +372,9 @@ enternotify(XCrossingEvent *ev)
|
||||
&& ev->window != ROOT)
|
||||
return;
|
||||
|
||||
if((s = systray_find(ev->window)))
|
||||
XSetInputFocus(dpy, s->win, RevertToNone, CurrentTime);
|
||||
|
||||
if(conf.focus_fmouse)
|
||||
{
|
||||
if((c = client_gb_win(ev->window))
|
||||
@@ -441,17 +474,49 @@ keypress(XKeyPressedEvent *ev)
|
||||
return;
|
||||
}
|
||||
|
||||
/** MapNotify handle event
|
||||
/** MappingNotify handle event
|
||||
* \param ev XMappingEvent pointer
|
||||
*/
|
||||
void
|
||||
mappingnotify(XMappingEvent *ev)
|
||||
{
|
||||
Systray *s;
|
||||
|
||||
XRefreshKeyboardMapping(ev);
|
||||
|
||||
if(ev->request == MappingKeyboard)
|
||||
grabkeys();
|
||||
|
||||
if(!(s = systray_find(ev->window)))
|
||||
{
|
||||
setwinstate(s->win, NormalState);
|
||||
ewmh_send_message(s->win, s->win, "_XEMBED", CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/** MapNotify handle event
|
||||
* \param ev XMapEvent pointer
|
||||
*/
|
||||
void
|
||||
mapnotify(XMapEvent *ev)
|
||||
{
|
||||
Client *c;
|
||||
Systray *s;
|
||||
|
||||
if(ev->window != ev->event && !ev->send_event)
|
||||
return;
|
||||
|
||||
if((c = client_gb_win(ev->window)))
|
||||
setwinstate(c->win, NormalState);
|
||||
else if((s = systray_find(ev->window)))
|
||||
{
|
||||
setwinstate(s->win, NormalState);
|
||||
ewmh_send_message(s->win, s->win, "_XEMBED", CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, 0, 0);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -480,12 +545,27 @@ void
|
||||
propertynotify(XPropertyEvent *ev)
|
||||
{
|
||||
Client *c;
|
||||
Systray *s;
|
||||
Window trans;
|
||||
XWMHints *h;
|
||||
|
||||
if(ev->state == PropertyDelete)
|
||||
return;
|
||||
|
||||
if((s = systray_find(ev->window)))
|
||||
{
|
||||
if(ev->atom == XA_WM_NORMAL_HINTS)
|
||||
{
|
||||
systray_configure(s);
|
||||
systray_update();
|
||||
}
|
||||
else if(ev->atom == net_atom[xembedinfo])
|
||||
{
|
||||
systray_state(s);
|
||||
systray_update();
|
||||
}
|
||||
}
|
||||
|
||||
if((c = client_gb_win(ev->window)))
|
||||
{
|
||||
switch(ev->atom)
|
||||
@@ -524,6 +604,33 @@ propertynotify(XPropertyEvent *ev)
|
||||
return;
|
||||
}
|
||||
|
||||
/** XReparentEvent handle event
|
||||
* \param ev XReparentEvent pointer
|
||||
*/
|
||||
void
|
||||
reparentnotify(XReparentEvent *ev)
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/** SelectionClearEvent handle event
|
||||
* \param ev XSelectionClearEvent pointer
|
||||
*/
|
||||
void
|
||||
selectionclearevent(XSelectionClearEvent *ev)
|
||||
{
|
||||
/* Getting selection if lost it */
|
||||
if(ev->window == traywin)
|
||||
systray_acquire();
|
||||
|
||||
systray_update();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/** UnmapNotify handle event
|
||||
* \param ev XUnmapEvent pointer
|
||||
*/
|
||||
@@ -531,6 +638,7 @@ void
|
||||
unmapnotify(XUnmapEvent *ev)
|
||||
{
|
||||
Client *c;
|
||||
Systray *s;
|
||||
|
||||
if((c = client_gb_win(ev->window))
|
||||
&& ev->send_event
|
||||
@@ -540,6 +648,13 @@ unmapnotify(XUnmapEvent *ev)
|
||||
XSetErrorHandler(errorhandler);
|
||||
}
|
||||
|
||||
if((s = systray_find(ev->window)))
|
||||
{
|
||||
setwinstate(s->win, WithdrawnState);
|
||||
systray_del(s->win);
|
||||
systray_update();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -579,18 +694,21 @@ getevent(XEvent ev)
|
||||
|
||||
switch(ev.type)
|
||||
{
|
||||
case ButtonPress: buttonpress(&ev.xbutton); break;
|
||||
case ClientMessage: clientmessageevent(&ev.xclient); break;
|
||||
case ConfigureRequest: configureevent(&ev.xconfigurerequest); break;
|
||||
case DestroyNotify: destroynotify(&ev.xdestroywindow); break;
|
||||
case EnterNotify: enternotify(&ev.xcrossing); break;
|
||||
case Expose: expose(&ev.xexpose); break;
|
||||
case FocusIn: focusin(&ev.xfocus); break;
|
||||
case KeyPress: keypress(&ev.xkey); break;
|
||||
case MapRequest: maprequest(&ev.xmaprequest); break;
|
||||
case MappingNotify: mappingnotify(&ev.xmapping); break;
|
||||
case PropertyNotify: propertynotify(&ev.xproperty); break;
|
||||
case UnmapNotify: unmapnotify(&ev.xunmap); break;
|
||||
case ButtonPress: buttonpress(&ev.xbutton); break;
|
||||
case ClientMessage: clientmessageevent(&ev.xclient); break;
|
||||
case ConfigureRequest: configureevent(&ev.xconfigurerequest); break;
|
||||
case DestroyNotify: destroynotify(&ev.xdestroywindow); break;
|
||||
case EnterNotify: enternotify(&ev.xcrossing); break;
|
||||
case Expose: expose(&ev.xexpose); break;
|
||||
case FocusIn: focusin(&ev.xfocus); break;
|
||||
case KeyPress: keypress(&ev.xkey); break;
|
||||
case MapNotify: mapnotify(&ev.xmap); break;
|
||||
case MapRequest: maprequest(&ev.xmaprequest); break;
|
||||
case MappingNotify: mappingnotify(&ev.xmapping); break;
|
||||
case PropertyNotify: propertynotify(&ev.xproperty); break;
|
||||
case ReparentNotify: reparentnotify(&ev.xreparent); break;
|
||||
case SelectionClear: selectionclearevent(&ev.xselectionclear); break;
|
||||
case UnmapNotify: unmapnotify(&ev.xunmap); break;
|
||||
default:
|
||||
|
||||
#ifdef HAVE_XRANDR
|
||||
|
||||
Reference in New Issue
Block a user