!! Implementation of System tray !!

This commit is contained in:
Martin Duquesnoy
2010-07-22 20:12:27 +02:00
parent d32ee3295e
commit 908978cca1
7 changed files with 455 additions and 16 deletions

View File

@@ -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