Запускать на Start.sh
Приложение показывает на Linux сколько времени было потрачено впустую на открытые окна.
Мило.
Вот только выдаёт:
java.lang.NullPointerException
15:31:31 null
Посмотрел исходники, проблема в "xprop -root | grep \"_NET_ACTIVE_WINDOW(WINDOW)\"|cut -d ' ' -f 5"
А именно, xprop не всегда установлен.
После установки xorg-utils, выдало ошибку:
java.io.FileNotFoundException: logs/20160305_153821.txt (No such file or directory)
С последующим Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
Оказалось, что в ProcrastinometrFrame.java catch ошибки от открытия файла просто выводит сообщение об ошибке, и оно продолжает работать как будто бы ошибки не было.
После исправления всего этого оно работает как часы.
Вообще неожиданное решение, я думал что надо было как-то лезть иксам в душу, а не с башем дружбу заводить. :)
Artlav
> После исправления всего этого оно работает как часы.
чего именно?
Что ты именно сделал?
Давай я напишу в нульпосте
и P. S. авторство под линукс хотел бы оставить за собой, я так понял ты уже полностью реверс инжинирнг сделал.
Zheka_Dnepr
> Что ты именно сделал?
Обработку ошибок только.
> Давай я напишу в нульпосте
Стоит написать список используемых команд, чтоб народ не гадал почему падает: xprop, xwininfo, awk, sed
> и P. S. авторство под линукс хотел бы оставить за собой, я так понял ты уже полностью реверс инжинирнг сделал.
Не вопрос, просто ява открытоисходниковая по определению.
Говоря об авторстве, ты не против если я поставлю ссылку сюда на своей странице?
Artlav
> Вообще неожиданное решение, я думал что надо было как-то лезть иксам в душу, а
> не с башем дружбу заводить. :)
Влезание в иксы там на пару строк. Собственно в том же xprop можно посмотреть как делать. Требовать установленный xprop - это костыль, конечно же.
Собственно вот код для получения класса окна и его заголовка:
bool GetActiveWindowClassAndTitle(QString& windowClass,QString& windowTitle) { Display *display = XOpenDisplay( NULL); if ( !display) return false; Window root = DefaultRootWindow( display); Atom active = XInternAtom( display, "_NET_ACTIVE_WINDOW", False); XTextProperty text; char **name = NULL; int param; Atom type_ret; int format_ret; unsigned long items_ret; unsigned long after_ret; unsigned char *prop_data = 0; bool success = false; if( XGetWindowProperty( display, root, active, 0, 0x7fffffff, False, XA_WINDOW, &type_ret, &format_ret, &items_ret, &after_ret, &prop_data) == Success) { Window *active_window = ( Window *)prop_data; Atom wm_state = XInternAtom( display, "WM_CLASS", False); XGetTextProperty( display, *active_window, &text, wm_state); Xutf8TextPropertyToTextList( display, &text, &name, ¶m); if ( name!=NULL){ success = true; windowClass = *name; XFree( name); XTextProperty title; char **Tname = NULL; XGetTextProperty( display, *active_window, &title, XA_WM_NAME); Xutf8TextPropertyToTextList( display, &title, &Tname, ¶m); if ( Tname!=NULL){ windowTitle=*Tname; XFree( Tname); } } }; XCloseDisplay( display); return success; }
Artlav
нет, не против
Тема в архиве.