3
* Compiz title bar information extension plugin
7
* Copyright : (C) 2009 by Danny Baumann
8
* E-mail : maniac@compiz.org
10
* Ported to Compiz 0.9 by:
11
* Copyright : (C) 2009 Sam Spilsbury
12
* E-mail : smspillaz@gmail.com
14
* This program is free software; you can redistribute it and/or
15
* modify it under the terms of the GNU General Public License
16
* as published by the Free Software Foundation; either version 2
17
* of the License, or (at your option) any later version.
19
* This program is distributed in the hope that it will be useful,
20
* but WITHOUT ANY WARRANTY; without even the implied warranty of
21
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
* GNU General Public License for more details.
26
#include "titleinfo.h"
29
COMPIZ_PLUGIN_20090315 (titleinfo, TitleinfoPluginVTable);
32
TitleinfoWindow::updateVisibleName ()
34
CompString text, f_machine;
35
CompString root, f_title;
37
TITLEINFO_SCREEN (screen);
39
f_title = title.size () ? title : "";
41
if (ts->optionGetShowRoot () && owner == 0)
44
if (ts->optionGetShowRemoteMachine () && remoteMachine.size ())
48
if (gethostname (hostname, 256) || strcmp (hostname, remoteMachine.c_str ()))
49
f_machine = remoteMachine;
52
if (f_machine.size ())
53
text = root + f_title + "(@" + f_machine + ")";
54
else if (root.size ())
55
text = root + f_title;
59
XChangeProperty (screen->dpy (), window->id (), ts->visibleNameAtom,
60
Atoms::utf8String, 8, PropModeReplace,
61
(unsigned char *) text.c_str (), text.size ());
66
XDeleteProperty (screen->dpy (), window->id (), ts->visibleNameAtom);
71
TitleinfoWindow::updatePid ()
76
unsigned long nItems, bytesAfter;
77
unsigned char *propVal;
79
TITLEINFO_SCREEN (screen);
83
result = XGetWindowProperty (screen->dpy (), window->id (), ts->wmPidAtom,
84
0L, 1L, False, XA_CARDINAL, &type,
85
&format, &nItems, &bytesAfter, &propVal);
87
if (result == Success && propVal)
93
memcpy (&value, propVal, sizeof (unsigned long));
103
struct stat fileStat;
105
snprintf (path, 512, "/proc/%d", pid);
106
if (!lstat (path, &fileStat))
107
owner = fileStat.st_uid;
110
if (ts->optionGetShowRoot ())
111
updateVisibleName ();
115
TitleinfoScreen::getUtf8Property (Window id,
120
unsigned long nItems, bytesAfter;
121
char *val = NULL, *retval_c = NULL;
124
result = XGetWindowProperty (screen->dpy (), id, atom, 0L, 65536, False,
125
Atoms::utf8String, &type, &format, &nItems,
126
&bytesAfter, (unsigned char **) &val);
128
if (result != Success)
131
if (type == Atoms::utf8String && format == 8 && val && nItems > 0)
133
retval_c = (char *) malloc (sizeof (char) * (nItems + 1));
136
strncpy (retval_c, val, nItems);
137
retval_c[nItems] = 0;
142
retval = CompString (retval_c);
151
TitleinfoScreen::getTextProperty (Window id,
155
char *retval_c = NULL;
159
if (XGetTextProperty (screen->dpy (), id, &text, atom))
163
retval_c = (char *) malloc (sizeof (char) * (text.nitems + 1));
166
strncpy (retval_c, (char *) text.value, text.nitems);
167
retval_c[text.nitems] = 0;
175
retval = CompString (retval_c);
181
TitleinfoWindow::updateTitle ()
185
TITLEINFO_SCREEN (screen);
187
f_title = ts->getUtf8Property (window->id (), Atoms::wmName);
189
if (f_title.empty ())
190
title = ts->getTextProperty (window->id (), XA_WM_NAME);\
193
updateVisibleName ();
198
TitleinfoWindow::updateMachine ()
200
TITLEINFO_SCREEN (screen);
202
if (remoteMachine.size ())
203
remoteMachine.clear ();
205
remoteMachine = ts->getTextProperty (window->id (),
206
XA_WM_CLIENT_MACHINE);
208
if (ts->optionGetShowRemoteMachine ())
209
updateVisibleName ();
213
TitleinfoScreen::addSupportedAtoms (std::vector<Atom> &atoms)
215
screen->addSupportedAtoms (atoms);
217
atoms.push_back (visibleNameAtom);
218
atoms.push_back (wmPidAtom);
222
TitleinfoScreen::handleEvent (XEvent *event)
225
screen->handleEvent (event);
227
if (event->type == PropertyNotify)
231
if (event->xproperty.atom == XA_WM_CLIENT_MACHINE)
233
w = screen->findWindow (event->xproperty.window);
236
TITLEINFO_WINDOW (w);
237
tw->updateMachine ();
240
else if (event->xproperty.atom == wmPidAtom)
242
w = screen->findWindow (event->xproperty.window);
245
TITLEINFO_WINDOW (w);
249
else if (event->xproperty.atom == Atoms::wmName ||
250
event->xproperty.atom == XA_WM_NAME)
252
w = screen->findWindow (event->xproperty.window);
255
TITLEINFO_WINDOW (w);
262
TitleinfoScreen::TitleinfoScreen (CompScreen *screen) :
263
PluginClassHandler <TitleinfoScreen, CompScreen> (screen),
264
visibleNameAtom (XInternAtom (screen->dpy (), "_NET_WM_VISIBLE_NAME", 0)),
265
wmPidAtom (XInternAtom (screen->dpy (), "_NET_WM_PID", 0))
267
ScreenInterface::setHandler (screen);
269
screen->updateSupportedWmHints ();
272
TitleinfoScreen::~TitleinfoScreen ()
274
screen->addSupportedAtomsSetEnabled (this, false);
276
screen->updateSupportedWmHints ();
279
TitleinfoWindow::TitleinfoWindow (CompWindow *window) :
280
PluginClassHandler <TitleinfoWindow, CompWindow> (window),
287
updateVisibleName ();
291
TitleinfoPluginVTable::init ()
293
if (!CompPlugin::checkPluginABI ("core", CORE_ABIVERSION))