Войти
ПроектыФорумОцените

Прокрастинометр на Linux

#0
14:48, 5 мар 2016

Запускать на Start.sh

https://yadi.sk/d/xlZxPT84pvnkE

Выделение_002 | Прокрастинометр на Linux

Приложение показывает на Linux сколько времени было потрачено впустую на открытые окна.

#1
15:48, 5 мар 2016

Мило.
Вот только выдаёт:
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 ошибки от открытия файла просто выводит сообщение об ошибке, и оно продолжает работать как будто бы ошибки не было.

После исправления всего этого оно работает как часы.
Вообще неожиданное решение, я думал что надо было как-то лезть иксам в душу, а не с башем дружбу заводить. :)

#2
15:52, 5 мар 2016

Artlav
> После исправления всего этого оно работает как часы.
чего именно?

Что ты именно сделал?

Давай я напишу в нульпосте

и P. S. авторство под линукс хотел бы оставить за собой, я так понял ты уже полностью реверс инжинирнг сделал.

#3
16:05, 5 мар 2016

Zheka_Dnepr
> Что ты именно сделал?
Обработку ошибок только.

> Давай я напишу в нульпосте
Стоит написать список используемых команд, чтоб народ не гадал почему падает: xprop, xwininfo, awk, sed

> и P. S. авторство под линукс хотел бы оставить за собой, я так понял ты уже полностью реверс инжинирнг сделал.
Не вопрос, просто ява открытоисходниковая по определению.

Говоря об авторстве, ты не против если я поставлю ссылку сюда на своей странице?

#4
16:06, 5 мар 2016

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, &param);        
        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, &param);
            if (Tname!=NULL){
                windowTitle=*Tname;
                XFree(Tname);
            }
        }

    };
    XCloseDisplay(display);

    return success;
}

https://github.com/Allexin/TrackYourTime/blob/master/TrackYourTim… ls/os_api.cpp

#5
17:35, 5 мар 2016

Artlav
нет, не против

#6
18:31, 5 мар 2016
Выделение_003 | Прокрастинометр на Linux
ПроектыФорумОцените

Тема в архиве.