Форум проекта PuppyRus Linux

Разработки проекта PuppyRus => Программирование и компиляция => Тема начата: DdShurick от 02 Февраль 2016, 15:19:49

Название: Построитель меню JWM на C
Отправлено: DdShurick от 02 Февраль 2016, 15:19:49
Очень упрощённый аналог ls, вводит список файлов *.desktop
Код
#include <stdio.h>
#include <dirent.h>
#include <string.h>

int main() {
    DIR *dir;
    struct dirent *entry;

    dir = opendir("/usr/share/applications");
    if (!dir) {
        perror("diropen");
    }

    while ((entry = readdir(dir)) != NULL) {
if ( strstr(entry->d_name, ".desktop")!=0 ) {
         printf(entry->d_name);
         printf("\n");
}
    }

    closedir(dir);
}
Думаю приспособить для fixmenus.
Название: Построитель меню JWM
Отправлено: sfs от 02 Февраль 2016, 15:29:53
На выходе получается ускорение по сравнению с sh ? Смысл в этом?
Название: Построитель меню JWM
Отправлено: DdShurick от 02 Февраль 2016, 17:53:08
На выходе получается ускорение по сравнению с sh ?
Должно
Смысл в этом?
Расти над самим собой.
Название: Построитель меню JWM
Отправлено: dim-kut от 02 Февраль 2016, 18:02:00
На выходе получается ускорение по сравнению с sh ?
Должно
Должно, но на современных компах мы можем этого не заметить.
Смысл в этом?
Расти над самим собой.
+1
Название: Построитель меню JWM
Отправлено: DdShurick от 03 Февраль 2016, 10:20:57
 Научил lsapplications понимать Categories:
Код
# ./lsapplications1 
Категория?
# ./lsapplications1 Network
Linux-Firewall.desktop
Pure_FTPd-FTP-server.desktop
gpptp.desktop
mtr-traceroute.desktop
pnethood.desktop
tsclient.desktop
wifi.desktop
CMake.desktop
Осталось сделать вывод в нужном формате.
Название: Построитель меню JWM
Отправлено: DdShurick от 04 Февраль 2016, 18:23:26
 Я забуксовал. Этот вариант:
Код
#include <stdio.h>
#include <dirent.h>
#include <string.h>

DIR *dir;
FILE *fp;
char buf[64], str[1024];
char *name, *icon, *exec;
char *appdir="/usr/share/applications/";

struct dirent *entry;

int main(int argc, char *argv[]) {
if (argc<2) {
printf("Категория? %s","\n");
return 0;
}
    dir = opendir(appdir);
    if (!dir) {
        perror("diropen");
    }
printf("<JWM>%s","\n");
    while ((entry = readdir(dir))!=0) {
if (strstr(entry->d_name,".desktop")!=0 ) {
buf[0]=0;
strcat(buf,appdir);
strcat(buf,entry->d_name);
        fp=fopen(buf,"r");
        while (fgets(str,sizeof(str),fp)!=0) {
if (strstr(str,argv[1])!=0) {
while (fgets(str,sizeof(str),fp)!=0) {
name=strstr(str,"Name");
// *strchr(strchr(name, '=') + 1, '\n') = 0;
// name=("%s\n", strchr(name, '=') + 1);
}
while (fgets(str,sizeof(str),fp)!=0) {
icon=strstr(str,"Icon");
}
while (fgets(str,sizeof(str),fp)!=0) {
exec=strstr(str,"Exec");
}
printf("\t<Program %s%s%s %s%s%s%s%s%s","label=\"",name,"\"","icon\"",icon,"\">",exec,"</Program>","\n");
}

}
        fclose(fp);
}

    }
    closedir(dir);
    printf("<JWM>%s","\n");
}
генерирует подменю заданной категории но не полностью, без icon и exec. Не желает брать переменные.
Код
<JWM>
<Program label="Name=Partview view partition sizes
" icon"(null)">(null)</Program>
<Program label="Name=Xfdiff-cut
" icon"(null)">(null)</Program>
<Program label="Name=gFnRename
" icon"(null)">(null)</Program>
<Program label="Name=Gcolor2
" icon"(null)">(null)</Program>
<Program label="Name=Сохранить настройки в sfs
" icon"(null)">(null)</Program>
<Program label="ies=GTK;GNOME;Application;Utility;
" icon"(null)">(null)</Program>
<Program label="Name=PTM Timer
" icon"(null)">(null)</Program>
<Program label="Name=puppyPDF convert file to PDF
" icon"(null)">(null)</Program>
<Program label="(null)" icon"(null)">(null)</Program>
<Program label="Name=ePDFView PDF viewer
" icon"(null)">(null)</Program>
<Program label="Name=mtPaint-snapshot screen capture
" icon"(null)">(null)</Program>
<JWM>
Закомментированный код убирает "Name=" но вызывает сегментацию. Что делать  ???
Название: Построитель меню JWM
Отправлено: ander от 04 Февраль 2016, 23:15:40
Код
*strchr(strchr(name, '=') + 1, '\n') = 0;
Еще скобок не хватает:
Код
*(strchr(strchr(name, '=') + 1, '\n')) = 0;
без них эта конструкция пытается записать ноль даже сразу и не соображу куда, но явно не по возвращаемому функцией указателю, скорее по адресу самой функции, где она в памяти располагается.

А конструкция
Код
name=("%s\n", strchr(name, '=') + 1);
вообще непонятная.  Может тут sprintf предполагался?

А переменные равны null, все правильно.
Смотрите, что получается.  Начался while (fgets(str,sizeof(str),fp)!=0) {}, он же переберет все строки, для каждой выполняя name=strstr(str,"Name");.  Тут, видимо, повезло и "Name" нашлось в последней строке, поэтому name установлен. А последующие while не выполняются вовсе, поскольку fgets() читать больше нечего, файл-то уже кончился.  Вот icon и exec никуда и не указывают.
Название: Построитель меню JWM
Отправлено: DdShurick от 05 Февраль 2016, 09:25:45
Код
*strchr(strchr(name, '=') + 1, '\n') = 0;
Еще скобок не хватает:
Код
*(strchr(strchr(name, '=') + 1, '\n')) = 0;
без них эта конструкция пытается записать ноль даже сразу и не соображу куда, но явно не по возвращаемому функцией указателю, скорее по адресу самой функции, где она в памяти располагается.
А конструкция
Код
name=("%s\n", strchr(name, '=') + 1);
вообще непонятная.  Может тут sprintf предполагался?
Эту конструкцию я "честно стырил" на одном из форумов. В первоисточнике было printf. Можно сделать
Код
name=strchr(name, '=') + 1;
но тогда строка "ломается" и всё равно "ошибка сегментации".
А последующие while не выполняются вовсе, поскольку fgets() читать больше нечего, файл-то уже кончился.  Вот icon и exec никуда и не указывают.
Это понятно, но как заставить fgets перечитать файл?
Название: Построитель меню JWM
Отправлено: ander от 05 Февраль 2016, 11:35:42
Перечитать можно сделав rewind или fseek, но логичнее было бы все поиски делать в одном цикле.  И тут еще один прикол - все эти name - это просто указатели на ячейку памяти, строк они не содержат.  Если они указывают куда-то, где располагается массив str и в этом массиве действительно есть строка по этому адресу, то все нормально, можно прочитать эту строку через name.  Но ведь на следующем проходе цикла while массив str будет содержать уже другие данные, а name указывает на прежнее место, то есть напечатав его значение, вы увидите совсем не то, что на предыдущем проходе, хотя сам name и не изменялся.
В C вообще часто нужно четко представлять, как байты в памяти располагаются и указатели на них указывают.
Название: Построитель меню JWM
Отправлено: k0l0p0k от 05 Февраль 2016, 11:43:15
Цитата
Это понятно, но как заставить fgets перечитать файл?

1)см выше :) . rewind или fseek
2)костыльнее - закрыть файл, открыть заново
3)считать строки в массив и  работать уже с массивом
ну или файл в память считать, массив все равно нужен будет - указатели на строки хранить.
...
Название: Построитель меню JWM
Отправлено: ander от 05 Февраль 2016, 13:52:34
примерно так.  Не оптимально, повторения в функцию надо вынести, но работает.
Код
#include <stdio.h>
#include <dirent.h>
#include <string.h>

DIR *dir;
FILE *fp;
char buf[64], str[1024], namestr[64], iconstr[64], execstr[64];
char *tpoint, *lf;
int category_found;
char *appdir="/usr/share/applications/";
        
struct dirent *entry;

int main(int argc, char *argv[]) {
        if (argc<2) {
                printf("Категория?\n");
                return 0;
        }
    dir = opendir(appdir);
    if (!dir) {
        perror("diropen");
    }
    namestr[64]=iconstr[64]=execstr[64]=0; /* чтоб в любом случае в конце строки был */
        printf("<JWM>\n");
    while ((entry = readdir(dir))!=0) {
                if (strstr(entry->d_name,".desktop")!=0 ) {
                        buf[0]=0;
                        strcat(buf,appdir);
                        strcat(buf,entry->d_name);
                fp=fopen(buf,"r");
                category_found=0;
                while (fgets(str,sizeof(str),fp)!=0) {
                                if ( (lf=strchr(str, '\n'))!=0 ) *lf=0;  /* убрали перевод строки, чтобы не болтался*/
                                if (strstr(str,argv[1])!=0) category_found=1;
                                else if ((tpoint=strstr(str,"Name="))!=0) strncpy(namestr, strchr(tpoint, '=')+1, sizeof(namestr)-1); /* найденную строку сохранили */
                                else if ((tpoint=strstr(str,"Icon"))!=0) strncpy(iconstr, strchr(tpoint, '=')+1, sizeof(iconstr)-1);
                                else if ((tpoint=strstr(str,"Exec"))!=0) strncpy(execstr, strchr(tpoint, '=')+1, sizeof(execstr)-1);
                        }
                        if (category_found) printf("\t<Program label=\"%s\" icon\"%s\">%s</Program>\n", namestr, iconstr, execstr);
                        fclose(fp);
                }
    }
    closedir(dir);
    printf("<JWM>\n");
    return 0;
}
Чего-то отступы при вставке сбиваются, с табуляцией видимо проблемы.  Но принцип в общем то понятен, я думаю.
Название: Построитель меню JWM
Отправлено: DdShurick от 05 Февраль 2016, 14:02:05
 Благодарю! Сейчас буду допиливать.
Название: Построитель меню JWM
Отправлено: k0l0p0k от 05 Февраль 2016, 14:56:38
не возникнет ли проблем если длинна найденных строк превысит 64 ?
Название: Построитель меню JWM
Отправлено: DdShurick от 05 Февраль 2016, 15:05:11
не возникнет ли проблем если длинна найденных строк превысит 64 ?
Обрежет строку, но серьёзных проблем не будет, длинные строки могут быть label= и icon=, в exec - нет.
Название: Построитель меню JWM
Отправлено: DdShurick от 06 Февраль 2016, 09:58:01
 Возникли проблемы. Например, при обработке файла Alsamixer-sound-mixer.desktop
Код
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=AlsaMixer -  аудио-микшер
Exec=xterm -e alsamixer

Icon=mini-sound.xpm
Categories=AudioVideo;

#MimeType=
Terminal=false
#GenericName=
#Comment=
#NoDisplay=
#Hidden=
#OnlyShowIn=
#NotShowIn=
#TryExec=
#Path=
#StartupNotify=true
#StartupWMClass=
В нём есть закомментированные строки с непрописанными параметрами в которых встречаются "Exec" и "Name". Программа запоминает последнее, пустое, значение. В результате получаем
Код
<JWM>
<Program label="" icon="mini-sound.xpm"></Program>
</JWM>
Если в цикл добавить строку
Код
while (fgets(str,sizeof(str),fp)!=0) {
if (str[1]=='#') continue;
она вырежет все закомментированные строки, но проблема "последнего значения" остаётся. Например GenericName, Name, Name[ru], Name[de] получим последнее, немецкое название, а надо Name[ru], которое никак не вставляется в код.
Название: Построитель меню JWM
Отправлено: ander от 06 Февраль 2016, 11:36:32
Ну, с комментариями и вообще встречающимися не на месте словами можно примерно так:
Код
else if ((tpoint=strstr(str,"Exec"))!=0 && tpoint==str ) strncpy(execstr, strchr(tpoint, '=')+1, sizeof(execstr)-1);
То есть добавилось дополнительное условие, если указатели tpoint и str равны - значит ключевое слово начинается прямо с начала
строки.  А не с начала - ничего отсюда не берем, это либо под комментарием либо что-то вообще другое.
Споткнуться может, если встретит какой-нибудь Execute с начала строки, но вроде бы такого не встречалось.  Можно попробовать
"Exec=" искать.

С последним значением можно так.
Сначала, там где в строки нули вписываются, добавим еще ноль в начало:
Код
namestr[64]=iconstr[64]=execstr[64]=0; /* чтоб в любом случае в конце был, даже если строка длиннее окажется */
namestr[0]=0; /* а здесь и в начале тоже - будем проверять на пустое значение */
А поиск "Name" обставим дополнительными условиями:
Код
else if ((tpoint=strstr(str,"Name"))!=0 && tpoint==str && ( namestr[0]==0 || strncmp(tpoint+5, "[ru]", 4)==0 )) 
strncpy(namestr, strchr(tpoint, '=')+1, sizeof(namestr)-1); /* найденную строку сохранили */
То есть из строчки с "Name" строку сохраняем либо если в namestr еще вообще ничего нет, либо если сразу за "Name" идет "[ru]"
Тут может споткнуться, если Name[ru] нет вообще, а первым идет какой-нибудь Name[jp].  Не знаю, встречается ли такое.
Название: Построитель меню JWM
Отправлено: DdShurick от 06 Февраль 2016, 15:40:28
namestr[0]=0; не катит, запоминает самое первое имя, в данном случае Alsamixer, и лепит его ко всем подряд.
Название: Построитель меню JWM
Отправлено: ander от 06 Февраль 2016, 17:18:09
А, ну да, надо его перед чтением каждого файла сбрасывать:
Код
namestr[0]=0;
while (fgets(str,sizeof(str),fp)!=0) {
...
Название: Построитель меню JWM
Отправлено: DdShurick от 06 Февраль 2016, 18:04:24
 Вот этот вариант почему-то стал работать корректно и даже по русски
Код
while (fgets(str,sizeof(str),fp)!=0) {
if ((lf=strchr(str, '\n'))!=0 ) *lf=0;
if ((tpoint=strstr(str,"Name"))!=0) strncpy(namestr,strchr(tpoint,'=')+1,sizeof(namestr)-1);
else if ((tpoint=strstr(str,"Icon"))!=0) strncpy(iconstr,strchr(tpoint,'=')+1,sizeof(iconstr)-1);
else if ((tpoint=strstr(str,"Exec"))!=0) strncpy(execstr,strchr(tpoint,'=')+1,sizeof(execstr)-1);
else if (strstr(str,argv[1])!=0) printf("\t<Program label=\"%s\" icon=\"%s\">%s</Program>\n",namestr,iconstr,execstr);
}
но остаётся ощущение какого-то скрытого подвоха.
Название: Построитель меню JWM
Отправлено: ander от 06 Февраль 2016, 21:56:07
Все зависит от *.desktop файлов.  Если строка категорий идет после Name Icon и Exec, если нет закомментированых некорректных ключевых слов, если ключевые слова не встретятся где-то в составе слова, то это отработает нормально.  Если Name[ru] будет последним Name, то даже по русски.  Попадется файл этим условиям не удовлетворяющий - пойдет лажа.

Мой вариант не смотрели?  Он хоть к комментариям и изменению порядка строк должен быть устойчив.  И к турецким Name, которые, если встретятся, будут после русских.
Название: Построитель меню JWM
Отправлено: DdShurick от 07 Февраль 2016, 09:34:45
Все зависит от *.desktop файлов.  Если строка категорий идет после Name Icon и Exec, если нет закомментированых некорректных ключевых слов, если ключевые слова не встретятся где-то в составе слова, то это отработает нормально.  Если Name[ru] будет последним Name, то даже по русски.  Попадется файл этим условиям не удовлетворяющий - пойдет лажа.
Да, я это уже сам понял.
Мой вариант не смотрели?  Он хоть к комментариям и изменению порядка строк должен быть устойчив.  И к турецким Name, которые, если встретятся, будут после русских.
Да, посмотрел и проверил в реальной работе. В отличие от моего варианта, работает без ошибок. Пора выкладывать на github, если вы не против.
Название: Построитель меню JWM
Отправлено: sfs от 07 Февраль 2016, 09:43:37
Код
char *appdir="/usr/share/applications/";
хорошо бы /usr/local/share/applications/ добавить и еще из /home/live/.local/share/applications/
Название: Построитель меню JWM
Отправлено: DdShurick от 07 Февраль 2016, 10:31:26
хорошо бы /usr/local/share/applications/ добавить и еще из /home/live/.local/share/applications/
Хорошо бы, чтоб их вообще не было, ибо незачем плодить сущности. Теоретически это сделать можно, но это увеличит время развёртывания меню, а оно нам надо? Проще все *.desktop загнать в одну "резервацию".
Название: Построитель меню JWM
Отправлено: sfs от 07 Февраль 2016, 10:39:56
Хорошо бы, чтоб их вообще не было, ибо незачем плодить сущности. Теоретически это сделать можно, но это увеличит время развёртывания меню, а оно нам надо? Проще все *.desktop загнать в одну "резервацию".
Тут 2 пути:
1. сделать попроще
2. соблюсти стандарт http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html
Название: Построитель меню JWM
Отправлено: ander от 07 Февраль 2016, 12:25:42
А в чем конечная задача?  Не настраивал jwm, поэтому не понял толком, чего пытаетесь добиться.
Зачем все это надо генерить на C?  Если время критично, то почему нельзя все эти <jwm>...</jwm> сгенерировать заранее?  Состав *.desktop ведь не меняется постоянно, только если новый модуль подключить.
И почему программа выбирает только одну категорию?  Ведь если все же необходимо генерировать на ходу, не логичнее ли создать файлы сразу для нескольких категорий за один проход по *.desktop файлам?
Название: Построитель меню JWM
Отправлено: sfs от 07 Февраль 2016, 12:39:55
А в чем конечная задача? 
Превзойти
http://forum.puppyrus.org/index.php/topic,14750.0.html
http://www.murga-linux.com/puppy/viewtopic.php?t=79056&sid=afeb257fc28ef1483cd83b8575e84667 (http://www.murga-linux.com/puppy/viewtopic.php?t=79056&sid=afeb257fc28ef1483cd83b8575e84667)
http://www.murga-linux.com/puppy//viewtopic.php?mode=attach&id=27459&sid=551f82aab7a27f39e9a124433f0e9e24 (http://www.murga-linux.com/puppy//viewtopic.php?mode=attach&id=27459&sid=551f82aab7a27f39e9a124433f0e9e24)
Название: Построитель меню JWM
Отправлено: DdShurick от 07 Февраль 2016, 13:11:07
А в чем конечная задача?
Научиться. Чтоб не зависеть от чужого дяди.
Название: Построитель меню JWM
Отправлено: DdShurick от 07 Февраль 2016, 13:56:09
Вот нашёл решение, как обрезать путь (basename)
Код
//взято из libbb/get_last_path_component.c, подпилено
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
const char *cp = strrchr(argv[1], '/')+1;
if (cp)
printf("%s\n",cp);
/* return cp; #В первоисточнике*/
}
Работает:
Код
bash-4.3# ./name /usr/share/applications/cups.desktop 
cups.desktop
Название: Построитель меню JWM
Отправлено: k0l0p0k от 07 Февраль 2016, 14:00:25
все правильно
strrchr ищет первый справа слэш
Название: Построитель меню JWM
Отправлено: ander от 07 Февраль 2016, 15:15:10
Не все правильно.  Если слеша не найдется вовсе, то strrchr(argv[1], '/') вернет, как и положено, null (ноль, попросту говоря), а потом к нему добавится единица, условие под if всегда выполнится и выведется полная чушь - все, что лежит по адресу 1 до первого попавшегося нуля.
А return там изначально потому, что это была раньше не main(), которая int возвращать должна, а какая-то функция, возвращающая указатель.
Название: Построитель меню JWM
Отправлено: DdShurick от 07 Февраль 2016, 15:26:22
Не все правильно.  Если слеша не найдется вовсе
Будет ошибка сегментации. Уже исправил
Код
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
char *cp = strrchr(argv[1], '/');
if (cp) printf("%s\n",cp+1);
else printf("%s\n",argv[1]);
}
А return там изначально потому, что это была раньше не main(), которая int возвращать должна, а какая-то функция, возвращающая указатель.
Я на это и намекнул.
Название: Построитель меню JWM
Отправлено: ander от 07 Февраль 2016, 15:31:18
А в чем конечная задача?
Научиться. Чтоб не зависеть от чужого дяди.
Я не о том.

"Программа запускается <оттуда-то> <с такими-то параметрами> должна на выходе выдавать <то-то>, информацию беря при этом из /usr/share/applications/*.desktop".  Примерно так.

sfs, конечно, дал ссылки на форумы, но чтобы что-то там понять, это надо сначала jwm изучить.
Название: Построитель меню JWM
Отправлено: DdShurick от 07 Февраль 2016, 17:41:23
 Запуск программы прописан в ~/.jwmrc
Код
...........
<Dynamic label="Рабочий стол" icon="x48">exec:jwm-dynmenu.bin DesktopSettings</Dynamic>
<Dynamic label="Система" icon="pc48">exec:jwm-dynmenu.bin System</Dynamic>
<Dynamic label="Настройки" icon="configuration48">exec:jwm-dynmenu.bin Settings</Dynamic>
.............
Вывод на стандартный вывод такого вида
Код
<JWM>
<Program label="Partview view partition sizes" icon="mini-hdisk.xpm">partview</Program>
<Program label="Xfdiff-cut" icon="xfdiff.png">xfdiff-cut</Program>
<Program label="gFnRename" icon="gfnrename.png">gfnrename</Program>
<Program label="Gcolor2" icon="gcolor2.png">gcolor2</Program>
<Program label="Сохранить настройки в sfs" icon="mini-ray.xpm">loginroot mksavesfs</Program>
<Program label="Менеджер буфера обмена" icon="parcellite.png">parcellite</Program>
<Program label="PTM Timer" icon="mini-clock.xpm">ptmtimer</Program>
<Program label="puppyPDF convert file to PDF" icon="mini-pdf.xpm">puppypdf</Program>
<Program label="Xdelta - менеджер различий файлов" icon="/usr/share/icons/so.xpm">xdelta_gui</Program>
<Program label="ePDFView PDF viewer" icon="epdfview24.png">epdfview</Program>
<Program label="mtPaint-snapshot screen capture" icon="mini-camera.xpm">mtpaintsnapshot.sh</Program>
</JWM>
Название: Построитель меню JWM
Отправлено: k0l0p0k от 07 Февраль 2016, 19:20:20
я бы добавил в начало проверку наличия аргументов
if (argc<2) return 1;
без аргуметов ошибка сегментирования - нехорошо

Код
#include <stdio.h>
#include <string.h>
//аналог basename
int main(int argc, char *argv[]) {
        if (argc<2) return 1;
char *cp = strrchr(argv[1], '/');
if (cp) printf("%s\n",cp+1);
else printf("%s\n",argv[1]);
}
Название: Построитель меню JWM
Отправлено: ander от 07 Февраль 2016, 21:02:42
Запуск программы прописан в ~/.jwmrc
Код
...........
<Dynamic label="Рабочий стол" icon="x48">exec:jwm-dynmenu.bin DesktopSettings</Dynamic>
Вывод на стандартный вывод такого вида
Код
<JWM>
<Program label="Partview view partition sizes" icon="mini-hdisk.xpm">partview</Program>
</JWM>

Мне не очень понятно, почему нельзя <JWM><Program label=......</JWM> записать в файл, а в <Dynamic label="Рабочий стол" icon="x48">exec:jwm-dynmenu.bin DesktopSettings</Dynamic> просто выплевывать этот файл.  Тогда скорость создания становится не такой критичной, пересоздаваться эти файлы должны только при загрузке или подключении/отключении модуля с *.desktop файлами.
И нагрузка снижается - не надо при каждом открытии подменю обращаться к файловой системе, перебирать кучу файлов.
А сгенерировать все эти временные файлы для всех категорий можно вообще за один проход по *.desktop, просто в зависимости от найденной категории отправлять вывод в соответствующий файл.
Название: Построитель меню JWM
Отправлено: sfs от 07 Февраль 2016, 21:21:17
почему нельзя <JWM><Program label=......</JWM> записать в файл, а в <Dynamic label="Рабочий стол" icon="x48">exec:jwm-dynmenu.bin DesktopSettings</Dynamic> просто выплевывать этот файл. 
Примерно так и было в jwm2.2.. Делал это fixmenus. В jwm2.3 появилась эта фишка и иллюзия избавиться от fixmenus
Думаю - если избавляться - смотреть в сторону переделки openbox-menu (работает через menu-cached) под jwm
Без кэша и демона быстро вряд ли будет
Название: Построитель меню JWM
Отправлено: DdShurick от 08 Февраль 2016, 09:34:54
Мне не очень понятно, почему нельзя
Можно. Я тоже думал об этом и пришёл к такому же выводу, лучше записывать в файл. Вместо <Dynamic> использовать <Include>, как это было раньше. В каталоге $HOME/.jwm/ создавать файлы категорий, тогда всё можно будет записать за один проход.
Название: Построитель меню JWM
Отправлено: neobht от 08 Февраль 2016, 16:01:13
Если бы не интерес научиться писать на С, то я бы вам рекомендовал эти штуки писать реализацию на Python.
Название: Построитель меню JWM
Отправлено: ander от 08 Февраль 2016, 17:20:03
Да и питон в pra, к примеру, обычно не подключен. К тому же разбор не такой уж сложный и тащить ради него немалых размеров питоновские библиотеки просто нерационально.  
Название: Построитель меню JWM
Отправлено: k0l0p0k от 08 Февраль 2016, 17:25:24
у меня подключен  :) .Постоянно.
проще на Питоне писать - соответственно ошибок меньше, исходники проще читаются.
готовых рецептов море.
гуи легко пишется.
один минус - лишние 5-10 Мб (очень несущественный уже сейчас)
тем не менее Си знать надо  :)
кстати модули на Си легко к питоновским программам подключаются если скорость нужна
Название: Построитель меню JWM
Отправлено: DdShurick от 11 Февраль 2016, 09:17:19
 Очередная корявая попытка: jwm-incmenu. Должен быть каталог ~/.jwm. Запускается командой jwm-incmenu, аналогично с fixmenus. Работает мгновенно.
Название: Построитель меню JWM
Отправлено: k0l0p0k от 11 Февраль 2016, 10:16:09
из мелких придирок : строки 70-96( if else if)  длинные - читать тяжело  :(
если не ошибаюсь Си позволяет разбивать логические строки на сколько угодно физических.
например:
Код
else if (strstr(categorystr,"Office") || strstr(categorystr,"Document") ||\
         strstr(categorystr,"WordProcessor") || strstr(categorystr,"WebDevelopment") ||\
         strstr(categorystr,"TextEditor") || strstr(categorystr,"Dictionary"))
      categorystr="Office";
и условие сразу все видно и действие
Название: Построитель меню JWM
Отправлено: dim-kut от 11 Февраль 2016, 10:18:49
Может есть какая-нибудь библиотека популярная для обработки строк в С ?
Обработка строк - это явно не конёк С в чистом его виде. Сам когда-то возился.
Название: Построитель меню JWM
Отправлено: k0l0p0k от 11 Февраль 2016, 10:22:04
это точно :)
скорее всего придумано - поискать просто надо готовые рецепты
Название: Построитель меню JWM
Отправлено: ander от 11 Февраль 2016, 12:40:34
Да тут не настолько сложный разбор, чтобы требовались какие-нибудь библиотеки типа поиска по регулярным выражениям.
Алгорим причесать и будет нормально.
Тут надо сначала продумать структуру данных, тогда страшные условия выделятся в функцию и все будет красиво.
Например, меня удивило, что вы выходные файлы открываете/закрываете многократно.  Я бы открыл их сразу все, сложил файловые указатели в массив и по индексу к ним обращался, когда понадобилось в ту или иную категорию записать.
Или можно вообще завести массив структур.  Каждая структура отвечает за свой выходной файл:
Код
	int catIndex, wordIndex;
char *keyword;
char *keywords_Desktop[5]={"Desktop", "Screensaver", "Accessibility", NULL}; //массив из 5 указателей на строки, 3 указывают, четвертый нулевой,
// 5 пофиг, дальше зануленного не пойдем.
struct outfile {
   char *filename;
   FILE *fp;
   char **keyword;  // указатель на массив строк
};                             //создали тип структуры

struct outfile outfiles[10];    // завели массив из 10 таких структур

outfiles[0].filename="/home/live/.jwm/Desktop";
outfiles[0].keyword=keywords_Desktop; // записали адрес массива строк
// ...
outfiles[7].filename=NULL;  // не весь массив использовали

for(catIndex=0; catIndex<10; catIndex++){       // по всем категориям
if( outfiles[catIndex].filename == NULL ) break;   // если пусто, категории кончились
outfiles[catIndex].fp = fopen(outfiles[catIndex].filename, "w");
} // пооткрывали сразу все файлы, потом в конце таким же циклом надо закрыть

// Тут цикл перебора *.desktop
// здесь ищем name и exec
for(catIndex=0; catIndex<10; catIndex++){
if( outfiles[catIndex].filename == NULL ) break;
for(wordIndex=0; wordIndex<5; wordIndex++){     // по всем ключевым словам категории
keyword=outfiles[catIndex].keyword[wordIndex];  // слово, которое будем в строке категорий искать
if(keyword == NULL) break;         // ключевые слова закончились, выходим из их перебора
if (strstr(categorystr, keyword)){
fprintf(outfiles[catIndex].fp, "......."); // если категория нашлась, вывели в соответствующий файл
break; // и дальше слова можно не перебирать
}
}
}


UPD.  Лучше даже будет filename отдельным полем структуры не держать, а вписать в массив слов первым словом, вся инициализация будет в одном месте.
Тогда при открытии файла делаем outfiles[catIndex].fp = fopen(outfiles[catIndex].keyword[0], "w");,
а цикл по словам начинаем не с нуля, а с единицы:for(wordIndex=1; wordIndex<5; wordIndex++)
Название: Построитель меню JWM
Отправлено: ander от 12 Февраль 2016, 11:53:43
Вот, сделал скелет программы.  Она работает, только надо дописать все ключевые слова категорий по образцу, который там есть.
Пока там только Desktop и System, остальное дописывается точно так же.

Структура данных такая: заводятся два массива указателей, в одном файловые указатели на открытые выходные файлы,
а второй массив двумерный, в каждой строке содержит указатели на ключевые слова для отдельной категории, причем первым элементом в строке идет не ключевое слово, а имя выходного файла.  Размеры массива задаются константами CAT_MAX и KW_MAX,
если ключевых слов в строке меньше, последний элемент должен быть NULL, а если строк меньше CAT_MAX, первый элемент очередной строки равен NULL.  В образце это видно.  Получается аккуратная табличка.

В массивах лежат только указатели, так что даже при большой размерности много места они не займут ( длина указателя соответствует разрядности системы, 4 байта на 32-х разрядной) поэтому динамически отводить под них память смысла нет, можно константы выставить с запасом.

Выходные файлы все сразу открываются в начале и закрываются в конце, запись в соответствующий файл идет, когда в строке
Categories= очередного файла находится ключевое слово соответствующей категории.
Комментарии везде писал, так что разобраться, думаю, не сложно будет.
Название: Построитель меню JWM
Отправлено: DdShurick от 12 Февраль 2016, 20:48:25
Код
# /home/C/tst
Ошибка сегментирования
# ls -l ~/.jwm/
total 0
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Calculate
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Desktop
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Filesystem
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Game
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Graphic
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Internet
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Multimedia
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Network
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Office
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Personal
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Setup
-rw-rw-r--    1 live     live             0 Feb 12 19:46 System
-rw-rw-r--    1 live     live             0 Feb 12 19:46 Utility
Создаёт пустышки
Название: Построитель меню JWM
Отправлено: ander от 12 Февраль 2016, 22:04:51
Скелет столько не насоздавал бы.  Показывайте, как заполнили, где-то видимо NULL пропустили, иначе бы за пределы сегмента не вышло.
Название: Построитель меню JWM
Отправлено: DdShurick от 13 Февраль 2016, 09:19:53
Скелет столько не насоздавал бы.
 Скелет создавал два пустых файла и сегфолтился, так что ничего не изменилось.
Показывайте, как заполнили, где-то видимо NULL пропустили, иначе бы за пределы сегмента не вышло.
Код
#define CAT_MAX 15		// максимум категорий
#define KW_MAX 15 // максимум ключевых слов, включая имя файла, в категории
#define VLEN_MAX 96 // максимальная длина строки

int stringsearch(const char *buf, const char *str, char *savestr); // ищет в начале buf подстроку str, если есть, то все после '=' копирует в savestr

int main(int argc, char **argv)
{
int catIndex, wordIndex;

char *categorykw[CAT_MAX][KW_MAX] = {
{"/home/live/.jwm/Desktop", "Desktop", "Screensaver", "Accessibility", NULL},
{"/home/live/.jwm/System", "System","Monitor","Security","HardwareSettings","Core", NULL},
{"/home/live/.jwm/Setup","Setup","PackageManager", NULL},
{"/home/live/.jwm/Utility","Utility","Viewer","Development","Building","Debugger","IDE","Profiling","Translation","GUIDesigner","Archiving","TerminalEmulator","Shell", NULL},
{"/home/live/.jwm/Filesystem","File", NULL},
{"/home/live/.jwm/Graphic","Graphic","Photography","Presentation","Chart", NULL},
{"/home/live/.jwm/Office","Office","Document","WordProcessor","WebDevelopment","TextEditor","Dictionary", NULL},
{"/home/live/.jwm/Calculate","Calculat","Finance","Spreadsheet","ProjectManagement", NULL},
{"/home/live/.jwm/Personal","Personal","Calendar","ContactManagement", NULL},
{"/home/live/.jwm/Network","Network","Dialup","HamRadio","RemoteAccess", NULL},
{"/home/live/.jwm/Internet","Internet","WebBrowser","Email","News","InstantMessaging","Telephony","IRCClient","FileTransfer","P2P", NULL},
{"/home/live/.jwm/Multimedia","Video","Player","Music","Audio","Midi","Mixer","Sequencer","Tuner","TV","DiskBurning", NULL},
{"/home/live/.jwm/Game","Game","Amusement","RolePlaying","Simulation", NULL},
{ NULL }
};  // массив имен файлов категорий и ключевых слов к ним
Название: Построитель меню JWM
Отправлено: ander от 13 Февраль 2016, 11:17:37
Хм.  А у меня работает хоть скелетом, хоть заполненной.  Сейчас посмотрю, может где не учел возможной глючности входных файлов.

UPD.  Может быть, натыкается на файлы с очень длинными строками?
Пробуем в функции stringsearch() в конце заменить
Код
strncpy(savestr, strchr(buf, '=')+1, VLEN_MAX);
на
Код
 strncpy(savestr, strchr(buf, '=')+1, VLEN_MAX-1);
 savestr[VLEN_MAX]=0;
чтобы ноль в конце гарантированно был.

И еще после fp=fopen(buf,"r"); дописать if( fp == NULL ){ printf("%s not open\n", buf); continue; }
А то возможно какой-то файл открыть не может.
Название: Построитель меню JWM
Отправлено: DdShurick от 13 Февраль 2016, 12:40:49
 Не помогло.
Название: Построитель меню JWM
Отправлено: ander от 13 Февраль 2016, 14:02:30
Ну даже не знаю...  Вот, скомпилируйте этот файлик, я там вставил вывод текущего desktop, посмотрим, на котором упадет.
У меня-то работает, собака.
Название: Построитель меню JWM
Отправлено: k0l0p0k от 13 Февраль 2016, 14:11:31
что если набросать какую нибудь простенькую функцию отладочную или просто printf("debug001..002..003..к примеру") и в каждый if else . или еще лучше чтоб в лог файл выводило.потом убрать их несложно будет.
Название: Построитель меню JWM
Отправлено: k0l0p0k от 13 Февраль 2016, 14:14:01
добавить к примеру параметр --debug - если его нет - отладочная функция просто напросто ничего не выводит
Название: Построитель меню JWM
Отправлено: DdShurick от 13 Февраль 2016, 14:17:41
Код
# /home/C/tst
---Out files opened
---Read /usr/share/applications/Alsamixer-sound-mixer.desktop
---Read /usr/share/applications/BootManager-configure-bootup.desktop
---Read /usr/share/applications/Burniso2cd-burn-iso-file-to-CD-DVD.desktop
---Read /usr/share/applications/Desktop-drive-icons.desktop
Ошибка сегментирования
На выходе - пустышки.
Название: Построитель меню JWM
Отправлено: ander от 13 Февраль 2016, 14:20:09
На Desktop-drive-icons.desktop стало быть, упал.
Что там в нем, приаттачить можете?

А пустышки скорее всего потому, что до корректного закрытия не дошло и буфера в файлы не сбросились.
Название: Построитель меню JWM
Отправлено: DdShurick от 13 Февраль 2016, 14:34:46
Код
[Desktop Entry]
Encoding=UTF-8
Name=Менеджер значков дисков
Icon=mini-hdisk.xpm
Comment=Менеджер значков дисков рабочего стола
Exec=eventmanager desktop
Terminal=false
Type=Application
Categories=X-Desktop
GenericName=eventmanager
Название: Построитель меню JWM
Отправлено: ander от 13 Февраль 2016, 15:07:43
Не падает на таком.  Что у вас может отличаться-то еще?  :-\
после комментария //разобрали *.desktop файл вставьте строчку
fprintf(stderr, "---Read complete\nname=\"%s\", icon=\"%s\", exec=\"%s\", categories=\"%s\"\n", namestr, iconstr, execstr, categorystr);      /* debug */
Будем постепенно уточнять, на чем падает.

Еще можно попробовать функцию чуть изменить:
Код
int stringsearch(const char *buf, const char *str, char *savestr){	// ищет в начале buf подстроку str, если есть, то все после '=' копирует в savestr
char *tp;
if( strncmp( buf, str, strlen(str) ) == 0 && (tp=strchr(buf, '='))){
strncpy(savestr, tp+1, VLEN_MAX-1);
savestr[VLEN_MAX-1]=0;
return 1;
}
return 0;
}
В таком виде корректно отработает, если вдруг напорется на строчку без '='
Название: Построитель меню JWM
Отправлено: DdShurick от 13 Февраль 2016, 16:39:20
Код
# /home/C/tst
---Out files opened
---Read /usr/share/applications/Alsamixer-sound-mixer.desktop
---Read complete
name="AlsaMixer -  аудио-микшер", icon="mini-sound.xpm", exec="xterm -e alsamixer", categories="AudioVideo;"
---Read /usr/share/applications/BootManager-configure-bootup.desktop
---Read complete
name="BootManager - настройка загрузки модулей ", icon="so.xpm", exec="bootmanager", categories="X-SystemSchedule"
---Read /usr/share/applications/Burniso2cd-burn-iso-file-to-CD-DVD.desktop
---Read complete
name="Burniso2cd - запись iso-файлов на CD", icon="mini-cd.xpm", exec="burniso2cd", categories="DiskBurning;"
---Read /usr/share/applications/Desktop-drive-icons.desktop
---Read complete
name="Менеджер значков дисков", icon="mini-hdisk.xpm", exec="eventmanager desktop", categories="X-Desktop"
Ошибка сегментирования
Название: Построитель меню JWM
Отправлено: ander от 13 Февраль 2016, 19:11:03
Что-то сайт глючил, не давал ответ добавить.
Очередная идея.  buf имеет размер 64 байта, а может у вас длиннее имена встречаются.
Надо: проверить, что за файл идет следующим без сортировки:

ls -1U /usr/share/applications/

размер buf добавить, да и заполнять его лучше так:
Код
	buf[0]=0;                                               
strncat(buf, appdir, sizeof(buf)-1);                                    
strncat(buf,entry->d_name, sizeof(buf)-sizeof(appdir)-1);                              
fp=fopen(buf,"r");

Прикрепляю пока с отладочнми сообщениями, потом уберем.
Название: Построитель меню JWM
Отправлено: ander от 14 Февраль 2016, 11:40:14
Хватит уже с sfs собачиться, мне ж интересно, в buf дело было или нет. :)
Название: Построитель меню JWM
Отправлено: DdShurick от 14 Февраль 2016, 12:04:26
Хватит уже с sfs собачиться
А пусть не лезет не в своё дело.
мне ж интересно, в buf дело было или нет. :)
Последний вариант всё ok!
Код
# ./tst                      
---Out files opened
---Read /usr/share/applications/Alsamixer-sound-mixer.desktop
---name="AlsaMixer -  аудио-микшер", icon="mini-sound.xpm", exec="xterm -e alsamixer", categories="AudioVideo;"
---Read /usr/share/applications/BootManager-configure-bootup.desktop
---name="BootManager - настройка загрузки модулей ", icon="so.xpm", exec="bootmanager", categories="X-SystemSchedule"
.........................
---name="Интернет телефон uTox", icon="/usr/share/icons/utox.jpg", exec="utox set=hide-window", categories="InstantMessaging"
# ls -l ../.jwm/
total 60
-rw-rw-r--    1 live     live           168 Feb 14 10:56 Calculate
-rw-rw-r--    1 live     live           812 Feb 14 10:56 Desktop
-rw-rw-r--    1 live     live           583 Feb 13 19:51 FileSystem
-rw-rw-r--    1 live     live           705 Feb 14 10:56 Filesystem
-rw-rw-r--    1 live     live            13 Feb 14 10:56 Game
-rw-rw-r--    1 live     live           611 Feb 14 10:56 Graphic
-rw-rw-r--    1 live     live           377 Feb 13 19:51 Graphics
-rw-rw-r--    1 live     live           772 Feb 14 10:56 Internet
-rw-rw-r--    1 live     live           363 Feb 14 10:56 Multimedia
-rw-rw-r--    1 live     live          1148 Feb 14 10:56 Network
-rw-rw-r--    1 live     live           740 Feb 14 10:56 Office
-rw-rw-r--    1 live     live           212 Feb 14 10:56 Personal
-rw-rw-r--    1 live     live           568 Feb 14 10:56 Setup
-rw-rw-r--    1 live     live          1597 Feb 14 10:56 System
-rw-rw-r--    1 live     live          1943 Feb 14 10:56 Utility
Хорошо бы ваш вариант приспособить к динамическому меню.
Название: Построитель меню JWM
Отправлено: ander от 14 Февраль 2016, 12:52:29
Понять бы еще, для чего оно вообще нужно динамическим...

А что-то мешает, имея файлы в ~/.jwm/ написать так:
<Dynamic label="Система" icon="pc48">exec:cat ~/.jwm/System</Dynamic>?

Вот только чем это лучше Include?
Название: Построитель меню JWM
Отправлено: sfs от 14 Февраль 2016, 13:01:53
Понять бы еще, для чего оно вообще нужно динамическим...
Чтобы перестраивалось в момент обращения к нему и не надо было бы заморачиваться перестройкой меню после подкл\откл модуля
Раз для openbox и lxpanel взрослые программисты юзают menu-cached - без демона будут тормоза и костыли. Соответственно надо для динам. меню смотреть в сторону п.5 (http://forum.puppyrus.org/index.php/topic,14750.0.html)
Название: Построитель меню JWM
Отправлено: DdShurick от 14 Февраль 2016, 13:44:39
А что-то мешает, имея файлы в ~/.jwm/ написать так:
<Dynamic label="Система" icon="pc48">exec:cat ~/.jwm/System</Dynamic>?
Ничего не мешает, но будет тормоз, даже jwm-dynmenu.bin отрабатывает почти за секунду, а это "на ощупь" чувствительно.
Вот только чем это лучше Include?
Не будут болтаться лишние файлы, да и сама программа получится проще.
Название: Построитель меню JWM
Отправлено: ander от 14 Февраль 2016, 15:02:30
Понять бы еще, для чего оно вообще нужно динамическим...
Чтобы перестраивалось в момент обращения к нему и не надо было бы заморачиваться перестройкой меню после подкл\откл модуля

Вот этого я и не могу понять.   ???
Зачем перестраивать меню при каждом обращении к нему, если можно перестроить только после подкл\откл модуля.
Ведь к меню обращаются все же чаще, чем модули подключают, соответственно второй вариант заведомо менее ресурсозатратен.
Название: Построитель меню JWM
Отправлено: sfs от 14 Февраль 2016, 16:38:18
А если это не подключение модуля, а установка ПМ или распаковка. Демон-обновлялка   универсальнее
Название: Построитель меню JWM
Отправлено: paulus от 14 Февраль 2016, 17:13:00
Не будут болтаться лишние файлы, да и сама программа получится проще.
Чем не аргумент, сделаете для С-тренировки? ;)

tst: Почему бы  Calculate, Personal не засунуть в Office? Сейчас в меню 9 категорий, а у вас на 13 разбито. И все эти файлы среди настроек jwm валяются, лучше все же их в один каталог сложить: ~/.jwm/menu/*. imho
Название: Построитель меню JWM
Отправлено: k0l0p0k от 14 Февраль 2016, 17:35:47
соглашусь с ander'ом.
перестраивание меню при каждом обращении к нему - замедляет(пусть чуть чуть) работу.(с другой стороны если на Си, если файлы в озу - задержки микросекундные - практически незаметно)
А если это не подключение модуля, а установка ПМ или распаковка. Демон-обновлялка   универсальнее
сделать прямо в меню кнопку - "обновится принудительно", демон опять же пусть чуть чуть но отъедает память.
Название: Построитель меню JWM
Отправлено: DdShurick от 14 Февраль 2016, 18:50:49
лучше все же их в один каталог сложить: ~/.jwm/menu/*. imho
Вообще то jwm понимает только ~/.jwmrc, от этого никуда не денешься, а в него можно написать что угодно. Dynmenu - способ уйти от кучи дополнительных файлов, но за всё надо платить.
Название: Построитель меню JWM
Отправлено: ander от 15 Февраль 2016, 00:38:16
немного изменил тестовую программу.  desktop файлы ищет в { /usr, /usr/local, /home/live/.local } /share/applications
Результаты складывает в .jwm/menu/ (надо создать, программа пока совсем тупая)

У меня отрабатывает чуть меньше, чем за 0.1 секунды.  То есть, пока она весь вывод генерит за один проход по файлам, задержки нет.
А вот если ее заставить генерить каждую категорию отдельно и вызвать при создании меню десять раз - задержка уже будет существенной.
Название: Построитель меню JWM
Отправлено: ander от 16 Февраль 2016, 10:37:43
Переписал тестовую программу, сделал сортировку имен программ по алфавиту (до этого в каком порядке попадались desktop файлы, в том и выводилось).
Для этого пришлось сначала информацию из desktop файлов набирать в память, потом там уже отсортировать и отсортированную раскидывать по файлам категорий.

Структура данных такая:  большой массив структур, по структуре на desktop файл.  В каждой структуре по 4 указателя на строки: name, icon,exec, categories, извлеченные из desktop файлов.  Сами строки создаются в динамической памяти посредством strndup(), поэтому потом их нужно освобождать вызовом free().
После того, как прошлись по всем файлам и извлекли данные в массив, массив сортируется стандартной функцией qsort, а уже потом данные раскидываются в файлы категорий.

Наличие директории .jwm/menu/ теперь проверяется, при отсутствии она создается (ну или ругается, если и создать не вышло, например, там уже файл с таким именем лежит).

Сишник из меня довольно фиговый, программа получилась - указатель на указателе, но как данные попроще структурировать, пока не придумал.
Название: Построитель меню JWM
Отправлено: ander от 16 Февраль 2016, 21:30:30
Попробовал скомпилировать tst.c под pra64.  Просто захотелось посмотреть, скорость работы будет та же, или изменится.
Сильно удивился.  Я, конечно, допускал, что под 64 может быть ускорение, все таки если процессор 64 разрядный, то 64 разрядная система может полнее использовать его возможности, но ускорения в пять раз не ожидал.  :o
Название: Построитель меню JWM
Отправлено: ander от 16 Февраль 2016, 21:48:11
tst: Почему бы  Calculate, Personal не засунуть в Office? Сейчас в меню 9 категорий, а у вас на 13 разбито.

Потому что тест он и есть тест.  Как ДядяШурик разбил, так оно там и сделано.
Напишите табличку вида:

file1, word1, word2, ..., wordN
file2, word1, word2, ...
...
fileN, word1, ...

word - слова, наличие которых проверяется в строчке Categories= в desktop файле.  Если слово найдено - Name, Icon и Exec из этого файла будут записаны в file из первой колонки таблицы.

Если в исходник заглядывали, то видели, что там такая же таблица.  Напишете какую вам надо, вставить в исходник минутное дело.
Название: Построитель меню JWM
Отправлено: paulus от 20 Февраль 2016, 20:05:23
Напишете какую вам надо, вставить в исходник минутное дело.
Вообще-то мне надо маленькую и шуструю утилиту (без зависимостей на гномолибы), которая будет создавать динамическое меню. А по вашему варианту многое мне не нравится, а ДядяШурик слишком упертый. ;)

1. Хотя бы надо файлы меню складывать в ~/.jwm/menu/ и разбить их на категории как сейчас используется.
2. Это добавит проверку в заданных каталогах или нет?
char *appdir="/usr/share/applications/","/usr/local/share/applications/","/home/live/.local/share/applications/";

devx надо установить, чтобы скомпилировать tst?

p.s. ander, можешь jwm-xdgmenu2 скомпилировать для пра64?
Название: Построитель меню JWM
Отправлено: k0l0p0k от 20 Февраль 2016, 20:41:02
2. не добавит

Цитата
devx надо установить, чтобы скомпилировать tst?
да,
хотя нет - вру - можно один gcc установить.
Название: Построитель меню JWM
Отправлено: ander от 20 Февраль 2016, 23:23:14
Напишете какую вам надо, вставить в исходник минутное дело.
Вообще-то мне надо маленькую и шуструю утилиту (без зависимостей на гномолибы), которая будет создавать динамическое меню. А по вашему варианту многое мне не нравится, а ДядяШурик слишком упертый. ;)
Ну, попробуйте описать,что вам надо, только без отсылок типа "сделать, как в jwm-xdgmenu" - потому что это потребует его досконального изучения, а мне лень. :)
Опишите в терминах: на входе имеем...  на выходе должно быть...

1. Хотя бы надо файлы меню складывать в ~/.jwm/menu/ и разбить их на категории как сейчас используется.
2. Это добавит проверку в заданных каталогах или нет?
char *appdir="/usr/share/applications/","/usr/local/share/applications/","/home/live/.local/share/applications/";
Так в последнем варианте по всем этим трем каталогам и ищет, и складывает в .jwm/menu
И зависимостей кроме libc никаких нет.
А насчет категорий - я ж написал, табличку составьте, что куда надо, а в исходник я ее быстро вставлю.

devx надо установить, чтобы скомпилировать tst?

p.s. ander, можешь jwm-xdgmenu2 скомпилировать для пра64?
devx, разумеется, надо, компилятор же в нем находится.

A jwm-xdgmenu2 компилировать не пробовал.  Если компилируется только под 32 разряда, а под 64 не хочет - значит досконально разбираться надо, а из меня программист так себе.
Название: Построитель меню JWM
Отправлено: paulus от 21 Февраль 2016, 04:42:47
Помучал tst, не знал что вы его обновили. Если сделать так, то будет почти как сейчас в jwm (проверьте), только есть нюансы...
Код
		{"System", "System","Monitor","Security","Core", NULL },
{"Settings", "Settings","DesktopSettings","HardwareSettings","Setup","PackageManager","Desktop","Screensaver","Accessibility", NULL },
{"Utility", "Utility","Viewer","Profiling","Translation","GUIDesigner","Archiving","TerminalEmulator","Shell","File", NULL},
{"Development", "Development","Building","Debugger","IDE", NULL},
{"Graphic", "Graphic","Photography","Presentation","Chart", NULL},
{"Office", "Office","Document","WordProcessor","WebDevelopment","TextEditor","Dictionary","Calculat","Finance","Spreadsheet","ProjectManagement","Personal","Calendar","ContactManagement", NULL},
{"Internet", "Internet","WebBrowser","Email","News","InstantMessaging","Telephony","IRCClient","FileTransfer","P2P","Network","Dialup","HamRadio","RemoteAccess", NULL},
{"Multimedia", "Video","Player","Music","Audio","Midi","Mixer","Sequencer","Tuner","TV","DiskBurning", NULL},
{"Game", "Game","Amusement","RolePlaying","Simulation", NULL},

В Settings/Настройки два пункта: <Program label="Настройки дисплея" icon="screen_calibration">xrdr.sh</Program>
В System/Система два пункта: <Program label="Обновление дистрибутива" icon="gtk-refresh">dist-up -f</Program>  
Файл System редактор geany крякозяблами открывает, mcedit нормально.
На пра64 пока не проверял...

Ну, попробуйте описать,что вам надо, в терминах: на входе имеем...  на выходе должно быть...
Не уверен, как правильно описать... В меню jwm должно быть:
<Dynamic label="Приложения" icon="/usr/share/xpupsay/cow_small.png">exec:jwm_tstmenu</Dynamic>
jwm_tstmenu должно выдавать, то что сейчас делает tst, но без сохранения кучи файлов-категорий подменю. jwm сам должен подхватывать вывод tst и создавать меню. Чуть выше уже писали, что так сделать даже проще...

Можно сделать два варианта tst и tstd (dynamic), пусть пользователи выбирают, что больше нравится. Обычно в меню редко заглядывают (быстрые клавиши и куча доп. меню и панелей), так что динамическое вполне устраивает. Меньше файлов, костылей и пакет меньше на треть. С tst может еще меньше будет. Я бы tstd-menu себе и в арче64 использовал. Не морочил бы вам этим голову, если бы jwm-xdgmenu2 был и для 64bit, хочется два одинаковых пакета для пра/пра64 (сейчас разное).
Название: Построитель меню JWM
Отправлено: DdShurick от 21 Февраль 2016, 09:52:38
ДядяШурик слишком упертый. ;)
Не настолько как вы думаете. Как бы вы повели себя отстаивая своё ИМХО, когда вы правы?

Если в tst отказаться от кучи создаваемых файлов, а выводить сразу на stdout, получится очень неплохо.
Название: Построитель меню JWM
Отправлено: k0l0p0k от 21 Февраль 2016, 10:27:32
так сделать его(tst)  с параметром к примеру .
запустили без параметра - в файлы выводит
запустили с параметром - на stdout
Название: Построитель меню JWM
Отправлено: ander от 21 Февраль 2016, 21:19:52
В Settings/Настройки два пункта: <Program label="Настройки дисплея" icon="screen_calibration">xrdr.sh</Program>
В System/Система два пункта: <Program label="Обновление дистрибутива" icon="gtk-refresh">dist-up -f</Program>  

Настройки дисплея два раза, потому что два desktop файла, один в /usr/share/...  а второй в /usr/local/share/...
Обновление два раза что-то не увидел, возможно тоже два файла, но только у вас, а у меня нет.

Переписал, сделал,чтобы выплевывало на выход что-то такое:
Код
<JWM>
<Menu label="Система" icon="applications-system">
<Program label="Cfdisk - Менеджер разделов диска" icon="drive48.png">cfdisk+.sh</Program>
<Program label="Frugal установка PRA" icon="install_options">sudo install-g4d</Program>
<Program label="GParted" icon="gparted">sudo gparted.sh</Program>
<Program label="Hot Keys - горячие клавиши" icon="keyboard_shortcut">hotkeys</Program>
......
</Menu>
<Menu label="Игры" icon="applications-games">
        <Program label="AssaultCube" icon="assaultcube">assaultcube</Program>
.............
</Menu>
</JWM>

Надеюсь, это то, что нужно.  Сам-то с jwm дела не имел, поэтому форматов толком не знаю.

В прикрепленном архиве исходник и скомпилированный под 32 разряда исполняемый файл.
Таблицу распределения по категориям немного изменил, теперь первая колонка - имя категории, вторая - иконка, дальше как обычно ключевые слова.
Название: Построитель меню JWM
Отправлено: RoDoN от 22 Февраль 2016, 00:03:57
Здорово, результат почти такой же, как и с jwm-xdgmenu2, но с размером почти в 7 раз меньше и возможностью допилить исходник!!! Вот за это спасибо! +
Есть еще некоторые шероховатости со значками, некоторые пункты лишние, напр, у меня дефаултменеджер вылез, вообщем надо еще потестить и будет то что надо.
Название: Построитель меню JWM
Отправлено: DdShurick от 22 Февраль 2016, 08:34:45
 Плюсую. Вопрос к ander, у вас Github есть? Если нет, может выложить на мой?
<противный гнусавый голос в сторону> Пусть теперь sfs скажет, что у нас сишников нет  :D
Название: Построитель меню JWM
Отправлено: sfs от 22 Февраль 2016, 08:43:27
Github у ander есть
Есть измерения - насколько си быстрее работает sh (sh - в ПРА64 jwm2.2)? Т.е. правильно ли направление...
Если правильное - не останавливайтесь - делайте (если есть желание и Вас не затруднит)
1. построитель меню для openbox icewm
2. DE независимое gtk22 меню с поиском
Название: Построитель меню JWM
Отправлено: DdShurick от 22 Февраль 2016, 09:01:45
Github у ander есть
Замечательно
правильно ли направление...
Любое направление, которое приводит не в тупик и не в зависимость, правильное.
не останавливайтесь - делайте
Вы что, нам уже начальник?

Название: Построитель меню JWM
Отправлено: DdShurick от 22 Февраль 2016, 10:09:12
 Погонял jwmtst. "На ощупь" меню открывается быстрее чем в icewm. Разобраться бы ещё с иконками, но это скорее нестандартные *.desktop.
Название: Построитель меню JWM
Отправлено: RoDoN от 22 Февраль 2016, 13:41:32
ander, а можно в jwmtst сделать так, чтобы в icon="имя_значка" не было расширений, а только одно имя без пути, напр. с icon="galculator.xpm" нет значка, а если убрать расширение, то значек в меню есть.
Еще заметил, что label="имя_программы" обрезается, если превышает 35 или 36 знаков, напр., получается label="Htop - управление системными процессÐ" вместо label="Htop - управление системными процессами", а также label="Графический редактор (подключить .p" вместо label="Графический редактор (подключить .pfs)" и т.д., думаю надо бы допустимую длину имени увеличить хотя бы до 48 или 50 символов.
Задвоились пункты:
<Program label="Настройки дисплея" icon="screen_calibration">xrdr.sh</Program>
<Program label="Графический редактор (подключить .p" icon="application-pfs">defaultimageeditor</Program>
есть еще задвоенные названия пунктов меню, но там разные команды на исполнение, т.е. это уже надо десктоп-файлы смотреть и править.

Название: Построитель меню JWM
Отправлено: DdShurick от 22 Февраль 2016, 13:53:23
а только одно имя без пути
Код
//взято из libbb/get_last_path_component.c, подпилено
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
char *cp = strrchr(argv[1], '/');
if (cp) printf("%s\n",cp+1);
else printf("%s\n",argv[1]);
}
Это из исходников busybox.
Название: Построитель меню JWM
Отправлено: drill от 22 Февраль 2016, 14:35:08
обрезается, если превышает 35 или 36 знаков, напр., получается
label="Htop - управление системными процессÐ"
Тут в байтах: 64 байта (каждый кириллический символ в UTF-8 по 2 байта).
Название: Построитель меню JWM
Отправлено: RoDoN от 22 Февраль 2016, 14:58:58
Задвоение в меню из-за того, что и в /usr/share/applications, и в /usr/local/share/applications есть файлы с одинаковыми именами, напр.:
defaultimageeditor.desktop
dist-up.desktop
lxrandr.desktop
Pup-Kview.desktop
причем некоторые одинаковые, а некоторые чуть-чуть отличаются. Зачем так сделано? Вопрос наверно к sfs.

Есть еще у меня в меню два одинаковых по названию пункта:
<Program label="Эмулятор терминала" icon="utilities-terminal">exo-open --launch TerminalEmulator</Program>
<Program label="Эмулятор терминала" icon="console48">urxvt.sh</Program>
но их у меня создают  /usr/share/applications/exo-terminal-emulator.desktop (т.к. подключен модуль Thunar) и /usr/local/share/applications/Urxvt-terminal-emulator.desktop, после их просмотра вижу необходимость добавления в jwmtst фильтра, который будет дополнительно сортировать десктоп-файлы по необязательному параметру OnlyShowIn=, конечно при его наличии.
Название: Построитель меню JWM
Отправлено: ander от 22 Февраль 2016, 19:37:23
Ох, сколько успели написать  :)  А мне и сесть за компьютер весь день некогда было  :)

Исходник на гитхабе выложил: https://github.com/andreyrogojin/menu/ (https://github.com/andreyrogojin/menu/)
Последние исправления:
Добавил фильтрацию по OnlyShowIn=, если эта строчка есть, а JWM в ней нет, файл пропускается.
Длину извлекаемой строки увеличил, чтобы не обрезало.
Полные пути и расширения у иконок теперь удаляются.
Ну и прошелся по всяким возможным случаям переполнения, добавил проверки, чтобы ругалось, а не глючило.

В аттаче исходник и бинарники под 32 и 64 бита.
Под 32 типичное время выполнения примерно 0.1 секунды, под 64 в четыре раза быстрее, почему такая большая разница, не знаю.
Название: Построитель меню JWM
Отправлено: DdShurick от 22 Февраль 2016, 19:51:16
 Убрал отображение пустых категорий. (см. стр. 109, 116)
Название: Построитель меню JWM
Отправлено: sfs от 22 Февраль 2016, 19:59:34
Задвоение в меню из-за того, что и в /usr/share/applications, и в /usr/local/share/applications есть файлы с одинаковыми именами, Зачем так сделано? Вопрос наверно к sfs.
Вероятно настраивал mime. Если второй не пустой - возможно просто ошибка

OnlyShowIn=, если эта строчка есть, а JWM в ней нет, файл пропускается.
https://specifications.freedesktop.org/menu-spec/latest/apb.html
JWM там не должно быть - наверное Old
Название: Построитель меню JWM
Отправлено: ander от 22 Февраль 2016, 20:19:23
Убрал отображение пустых категорий. (см. стр. 109, 116)
Да, логично.  Добавил.

https://specifications.freedesktop.org/menu-spec/latest/apb.html
JWM там не должно быть - наверное Old
Исправил на Old, хотя в данном случае, вероятно, не принципиально, лишь бы предназначенные только для XFCE файлы отсеялись.
Название: Построитель меню JWM
Отправлено: RoDoN от 22 Февраль 2016, 23:45:27
Еще пожелания по jwmtst, т.к. сам C не знаю и могу только чуть-чуть поправить готовый исходник и то не всегда  ::)

1. Категории желательно расположить по алфавиту. У себя поправил, получился вид, как в предыдущих версиях меню. Это строки 33-41:
Код
		{"Настройки", "preferences-desktop", "Settings","DesktopSettings","HardwareSettings","Setup","PackageManager","Desktop","Screensaver","Accessibility", NULL },
{"Графика", "applications-graphics", "Graphic","Photography","Presentation","Chart", NULL},
{"Игры", "applications-games", "Game","Amusement","RolePlaying","Simulation", NULL},
{"Интернет", "applications-internet", "Internet","WebBrowser","Email","News","InstantMessaging","Telephony","IRCClient","FileTransfer","P2P","Network","Dialup","HamRadio","RemoteAccess", NULL},
{"Инструменты", "applications-accessories", "Utility","Viewer","Profiling","Translation","GUIDesigner","Archiving","TerminalEmulator","Shell","File", NULL},
{"Мультимедиа", "applications-multimedia", "Video","Player","Music","Audio","Midi","Mixer","Sequencer","Tuner","TV","DiskBurning", NULL},
{"Офис", "applications-office", "Office","Document","WordProcessor","WebDevelopment","TextEditor","Dictionary","Calculat","Finance","Spreadsheet","ProjectManagement","Personal", "Calendar","ContactManagement", NULL},
{"Разработка", "applications-development", "Development","Building","Debugger","IDE", NULL},
{"Система", "applications-system", "System","Monitor","Security","Core", NULL },

2. Есть ли возможность сделать пункт "Настройки", потом разделитель <Separator/>, а потом остальные категории по алфавиту (так было бы привычнее)? Если это сложно, то не обязательно, т.к. является только украшением.

3. Хорошо бы добавить фильтрацию десктоп-файлов по еще одному параметру NoDisplay=true, если эта строчка есть, то файл пропускается, а если ее нет или NoDisplay=false, то файл обрабатывается.
 
4. Сейчас пункты категорий меню выглядят так:
Код
<Menu label="Настройки" icon="preferences-desktop">
но в JWM можно задавать еще и высоту строк параметром height=, напр., height="18".
Можно ли добавить обработку внешнего параметра, чтобы задавать высоту пунктов меню, напр., если написать jwmtst -m 18, то чтобы получалась такая запись строки категории:  
Код
<Menu label="Настройки" icon="preferences-desktop" height="18">
Название: Re:Построитель меню JWM на C
Отправлено: sfs от 23 Февраль 2016, 07:53:44
Разделил тему. может из родительской (http://forum.puppyrus.org/index.php/topic,17901.0/topicseen.html) темы еще что-нибудь вырастет  ;)
Название: Re:Построитель меню JWM
Отправлено: DdShurick от 23 Февраль 2016, 10:01:44
4. Сейчас пункты категорий меню выглядят так:
Код
<Menu label="Настройки" icon="preferences-desktop">
но в JWM можно задавать еще и высоту строк параметром height=, напр., height="18".
Можно ли добавить обработку внешнего параметра, чтобы задавать высоту пунктов меню, напр., если написать jwmtst -m 18, то чтобы получалась такая запись строки категории:  
Код
<Menu label="Настройки" icon="preferences-desktop" height="18">
Это будет лишним, параметр height задаётся глобально в $HOME/.jwmrc
Название: Re:Построитель меню JWM на C
Отправлено: RoDoN от 23 Февраль 2016, 10:18:28
Не согласен, этот глобальный параметр действует на основное меню и пункты категорий, а на пункты программ уже нет :(
На скрине, если глобальный height="32".
Название: Re:Построитель меню JWM на C
Отправлено: k0l0p0k от 23 Февраль 2016, 10:32:25
реализуется пожелания RoDoN легко
только (имхо) стоит ли чз параметры командной строки  передавать, может лучше config файл ?
Название: Re:Построитель меню JWM на C
Отправлено: ander от 23 Февраль 2016, 11:24:57
Вставил таблицу разбора, как у Rodon.
Добавил туда еще одну колонку для параметра height.
В принципе, можно сделать и ключ командной строки, но так, мне кажется, даже удобнее - при желании можно для разных категорий разную высоту задать.
Фильтрацию по NoDisplay добавил.
В таблице разбора теперь может  присутствовать строка с именем категории из подчеркиваний, анализируется на самом деле только первый символ.  Такая категория не обрабатывается, вместо нее выводится сепаратор.
На https://github.com/andreyrogojin/menu/ (https://github.com/andreyrogojin/menu/) выложил.
Компилировать надо или сами сделаете?  Если пакет DEVX есть, там делать нечего.

реализуется пожелания RoDoN легко
только (имхо) стоит ли чз параметры командной строки  передавать, может лучше config файл ?
Если уж конфиг файл, то с него надо грузить всю таблицу разбора.  Но это еще думать надо, как сделать.  Тут придется отслеживать возможные ошибки в нем.
Название: Re:Построитель меню JWM на C
Отправлено: k0l0p0k от 23 Февраль 2016, 11:48:16
идея :) :
добавить параметр ком строки --config_file(обсуждаемо)
если есть этот параметр - с файла конфиг берется, нет - с ком строки, если нигде никаких параметров нет - все дефолтно .
ну и тогда уже дока нужна - иначе путаница.
Название: Re:Построитель меню JWM на C
Отправлено: RoDoN от 23 Февраль 2016, 11:55:00
Скомпилил, теперь классно, но высоту лучше задавать из ком.строки или из конфиг-файла, идея k0l0p0k мне нравится.

Если уж конфиг файл, то с него надо грузить всю таблицу разбора.
Хорошая мысль, тогда можно и значки у категорий менять и типы программ в категориях добавлять/удалять.

Заметил еще одну вещь, что если попадется десктоп-файл с несколькими строчками Name=, то в меню попадает последняя, пока вроде-бы есть только один такой файл deadbeef.desktop, для которого в меню вываливается название Prev из последних строк:
Код
[Desktop Action Previous]
Name=Prev
Exec=deadbeef --prev
Причем наличие в начале "Name[ru]=DeaDBeeF - Аудио плеер" не влияет.
Название: Re:Построитель меню JWM на C
Отправлено: ander от 23 Февраль 2016, 15:07:37
Обработку файлов с несколькими секциями, вроде deadbeef, поправил.
Теперь все секции кроме [Desktop Entry] игнорируются.

Насчет конфига подумаю, но это скорее всего не быстро, тут надо придумать удобный и простой для разбора формат и предусмотреть всяческие возможные ошибки.
Название: Re:Построитель меню JWM на C
Отправлено: k0l0p0k от 23 Февраль 2016, 15:40:22
..
Насчет конфига подумаю, но это скорее всего не быстро, тут надо придумать удобный и простой для разбора формат и предусмотреть всяческие возможные ошибки.
1е слово - название параметра, 2е - значение (возможно в кавычках)
следующая строчка - следующий параметр.
разделитель - пробел наверное(или '=' ??)
можно и коменты обрабатывать(напр отсекать до конца строки)
ошибочные - игнорировать
Название: Re:Построитель меню JWM на C
Отправлено: ander от 23 Февраль 2016, 18:30:34
так оттуда надо целую таблицу загрузить, а в таком виде ее расписывать неудобно.
Вот так она выглядит в исходнике:
Цитата
{  // сначала имя категории, потом иконка, высота меню, потом ключевые слова категории
{"Настройки", "preferences-desktop", "18", "Settings","DesktopSettings","HardwareSettings","Setup","PackageManager","Desktop","Screensaver","Accessibility", NULL },
{"________", },
{"Графика", "applications-graphics", "18", "Graphic","Photography","Presentation","Chart", NULL},
{"Игры", "applications-games", "18", "Game","Amusement","RolePlaying","Simulation", NULL},
{"Интернет", "applications-internet", "18", "Internet","WebBrowser","Email","News","InstantMessaging","Telephony","IRCClient","FileTransfer","P2P","Network","Dialup","HamRadio","RemoteAccess", NULL},
{"Инструменты", "applications-accessories", "18", "Utility","Viewer","Profiling","Translation","GUIDesigner","Archiving","TerminalEmulator","Shell","File", NULL},
{"Мультимедиа", "applications-multimedia", "18", "Video","Player","Music","Audio","Midi","Mixer","Sequencer","Tuner","TV","DiskBurning", NULL},
{"Офис", "applications-office", "18", "Office","Document","WordProcessor","WebDevelopment","TextEditor","Dictionary","Calculat","Finance","Spreadsheet","ProjectManagement","Personal", "Calendar","ContactManagement", NULL},
{"Разработка", "applications-development", "18", "Development","Building","Debugger","IDE", NULL},
{"Система", "applications-system", "18", "System","Monitor","Security","Core", NULL },
Попробуйте-ка расписать это по параметру на строчку - получится длинное полотенце, в котором не запутаться невозможно.

А какой-то сложный разбор - это время, конфиг ведь будет читаться при каждом запуске.  Для динамического меню нужно что-то достаточно быстрое.
Название: Re:Построитель меню JWM на C
Отправлено: k0l0p0k от 23 Февраль 2016, 20:14:44
не не
Вы меня не поняли
config файла нет - генерируется как сейчас
..есть - генерируется как сейчас плюс добавляет параметры из config'a(..ну или ком строки ..)
в config файле только дополнительные параметры
Название: Re:Построитель меню JWM на C
Отправлено: ander от 23 Февраль 2016, 23:00:10
В таком конфиге получается мало смысла, если уж его использовать, то надо грузить все, чтобы можно было менять вид меню без перекомпиляции.
Пока склоняюсь к чему-то такому:
Код
Name=Настройки
Icon=preferences-desktop
Height=18
Categories=Settings;DesktopSettings;HardwareSettings;Setup;PackageManager;Desktop;Screensaver;Accessibility;
Name=_________
Name=Графика
...
Только при подгрузке всего этого надо учитывать возможность ошибок и делать так, чтобы не падало, а хотя бы ругалось вразумительно.
Название: Re:Построитель меню JWM на C
Отправлено: DdShurick от 24 Февраль 2016, 08:23:48
 Не надо никаких "рюшечек" навешивать, теряем скорость. Последний вариант jwmtst (с height) работает заметно медленнее при первом запуске.
Название: Re:Построитель меню JWM на C
Отправлено: RoDoN от 24 Февраль 2016, 09:23:42
Интересно на каком железе и на сколько микросекунд стало медленнее работать? И при чем здесь первый запуск, чем он отличается от второго?
Название: Re:Построитель меню JWM на C
Отправлено: DdShurick от 24 Февраль 2016, 09:52:55
Интересно на каком железе
На моём моноблоке.
и на сколько микросекунд стало медленнее работать?
Не микросекунды, почти секунда.
И при чем здесь первый запуск, чем он отличается от второго?
Тормозит только первое обращение к меню.
Название: Re:Построитель меню JWM на C
Отправлено: ander от 24 Февраль 2016, 10:30:51
Сомневаюсь, что это из-за jwmtst
я каждый раз его под time проверяю, смотрю, чтобы время исполнения не увеличивалось, и при добавлении высоты время никак не изменилось.  Возможно, это сам jwm начинает подтормаживать, когда надо пересчитать высоту меню.
Название: Re:Построитель меню JWM на C
Отправлено: sfs от 24 Февраль 2016, 10:38:52
Очень интересно увидеть time для построителя на sh и С- чтобы понять целесообразность письбы подобного на С
Название: Re:Построитель меню JWM на C
Отправлено: ander от 24 Февраль 2016, 10:55:24
для jwmtst на моем железе общее время исполнения
0.095 - 0.15 секунды, это на pra32, на pra64 0.025 - 0.040 секунды
Разброс, видимо, смотря от текущей загрузки процессора, почему такая большая разница между 32 и 64, сам удивляюсь.
А какой sh построитель можно для сравнения скорости на том же железе позапускать?  А то я вообще-то под xfce  :), не знаю даже, какие они есть.
Название: Re:Построитель меню JWM на C
Отправлено: sfs от 24 Февраль 2016, 11:00:45
какой sh построитель можно для сравнения скорости на том же железе позапускать? 
http://www.puppyrus.org/~melvik/puppyrus/ftp/puppyrus/puppyrus-a64/pfs-portable/040-Jwm-2.2.2_64-s06.pfs
Название: Re:Построитель меню JWM на C
Отправлено: sfs от 24 Февраль 2016, 12:36:15
Динамического там нет
jwm_menu_create - сам построитель
jwm_menu_refresh - запускалка к нему
Название: Re:Построитель меню JWM на C
Отправлено: ander от 24 Февраль 2016, 12:59:00
jwm_menu_create
1.01 - 1.05 секунд

jwm_menu_refresh
1.15 - 1.19 секунд

jwmtst64
0.019 - 0.041 секунды

Это все под pra64 1602fat
Название: Re:Построитель меню JWM на C
Отправлено: sfs от 24 Февраль 2016, 13:25:11
Впечатляет. Но сложность написания... И правки без автора...
Название: Re:Построитель меню JWM на C
Отправлено: k0l0p0k от 24 Февраль 2016, 13:36:00
не сложнее bash'a :)
Название: Re:Построитель меню JWM на C
Отправлено: DdShurick от 24 Февраль 2016, 13:43:49
Но сложность написания...
Сложность написания чего?
И правки без автора...
Если правильно написано, то правки не требуются. Например modem-stats c 1995 года без изменений и до сих пор нормально.
Название: Re:Построитель меню JWM на C
Отправлено: sfs от 24 Февраль 2016, 13:55:16
C посложнее sh
Код
for( entryIndex = 0; entryIndex < entryIndexMax; entryIndex++ ){ // Раскидываем сортированные данные по категориям
... или непривычнее  :)
Название: Re:Построитель меню JWM на C
Отправлено: k0l0p0k от 24 Февраль 2016, 15:38:32
C посложнее sh
Код
for( entryIndex = 0; entryIndex < entryIndexMax; entryIndex++ ){ // Раскидываем сортированные данные по категориям
... или непривычнее  :)
цикл перебирает начиная с entryIndex = 0 по entryIndex = entryIndexMax-1 , с шагом 1.
обработка строк в sh есть, но как-то заумно  ??? . 
Название: Re:Построитель меню JWM на C
Отправлено: ander от 24 Февраль 2016, 17:06:13
Различия в написании цикла - ерунда.
Вот работа с указателями - это да, для других языков очень непривычно.
Название: Re:Построитель меню JWM на C
Отправлено: ander от 25 Февраль 2016, 11:05:53
Вынес таблицу распределения по категориям в отдельный конфигурационный файл.
Пока что его расположение жестко прописано в исходнике: /home/live/.jwm/jwmtst.conf
В нем сейчас записано то же самое, что раньше было в самом исходнике, так что на выходе ничего поменяться не должно.
Время выполнения тоже заметно не поменялось, Так что все то же самое, но изменить вид меню можно без перекомпиляции.
Формат файла, думаю, из примера понятен: с Name= начинается следующая категория, остальные ключевые слова относятся к ней, до следующего Name=
Неопознанные строки игнорируются, так что пустые строки и комментарии на отдельных строках писать можно.
Разбор пока самый примитивный, поэтому при ошибках в конфиге программа может падать, помаленьку доработаю в плане обработки таких ситуаций.
Выложено на https://github.com/andreyrogojin/menu (https://github.com/andreyrogojin/menu)
Название: Re:Построитель меню JWM на C
Отправлено: DdShurick от 25 Февраль 2016, 17:45:19
/home/live/.jwm/jwmtst.conf
Надо бы $HOME/.jwm/jwm_dynmenu.conf или /etc/X11/jwm/jwm_dynmenu.conf.
Название: Re:Построитель меню JWM на C
Отправлено: ander от 26 Февраль 2016, 16:20:22
/home/live/.jwm/jwmtst.conf
Надо бы $HOME/.jwm/jwm_dynmenu.conf или /etc/X11/jwm/jwm_dynmenu.conf.

Эти мелочи можно и потом, когда реально использоваться будет, одну строчку исправить недолго.

Частично переписал, совместил раскидывание по категориям с выводом.  В результате программа немного сократилась и не нужны оказались несколько вспомогательных массивов.  На гитхаб залил.
Название: Re:Построитель меню JWM на C
Отправлено: DdShurick от 26 Февраль 2016, 16:33:14
Эти мелочи можно и потом
Можно, но лучше сразу, будет универсально для всех, а не только PRA и Richy.
Код
#include <stdlib.h> //добавить
....................
char *menupath, *menudir="/.jwm";
....................
menupath = getenv("HOME");
strcat(menupath,menudir);
Название: Re:Построитель меню JWM на C
Отправлено: ander от 26 Февраль 2016, 18:44:31
menupath = getenv("HOME");
strcat(menupath,menudir);

А, вы имеете в виду к live не привязываться, это можно.
Только мне кажется надо все же в отдельный буфер копировать - getenv ведь строку не создает, а только дает указатель на то место, где она лежит.  Там дальше наверняка следующая переменная окружения и поверх нее делать strcat не стоит.
Код
strncpy( buf, getenv("HOME"), 25 );
buf[25]=0;
strcat( buf, "/.jwm/jwmtst.conf" );
Как-то так.
Название: Re:Построитель меню JWM на C
Отправлено: DdShurick от 26 Февраль 2016, 21:04:10
Я пробовал без buf, работает.
Название: Re:Построитель меню JWM на C
Отправлено: ander от 26 Февраль 2016, 22:35:48
Я пробовал без buf, работает.
Да работать-то оно будет, в некоторых случаях.  Скорее всего при этом затирается следующая переменная окружения.  Что там, HOSTNAME вроде бы.  Пока она не нужна - все будет нормально, а потом понадобится getenv("HOSTNAME") и будете гадать, чего ж оно ее не находит.

Нет, оказывается они там не по алфавиту идут.  Тест:
Код
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *a;
int i=100;
a=getenv("HOME");
while( i-- ){
if( *a ) putchar( *a );
else putchar( ' ' );
a++;
}
return 0;
}
Как видите, программа просто выводит 100 следующих байт, вместо разделяющих строки нулей выводя пробел.
Результат исполнения:
Код
/home/live SHLVL=2 XDG_SEAT=seat0 XDG_CONFIG_HOME=/home/live/.config XDG_CACHE_HOME=/home/live/.cach
То есть в вашем варианте затирается SHLVL, и хорошо еще, что она там есть! Окажись HOME последней, могла бы и ошибка сегментации выскочить.
Название: Re:Построитель меню JWM на C
Отправлено: ander от 26 Февраль 2016, 23:50:35
Кстати, насчет скорости исполнения jwmtst.
Я все удивлялся, почему под pra64 скорость раза в четыре больше, чем под pra32,
оказалось, дело в ядре.  Загрузился в pra32 c 4.4.1-2-MANJARO и скорость стала примерно как в pra64.
Видимо 3.19.2-pf2 на каких-то операциях подтормаживает.
Название: Re:Построитель меню JWM на C
Отправлено: DdShurick от 27 Февраль 2016, 09:15:11
Кстати, насчет скорости исполнения jwmtst.
Код
# time jwm_dynmenu
..............
real 0m0.017s
user 0m0.004s
sys 0m0.010s
# uname -r
4.0.4
Название: Re: Построитель меню JWM на C
Отправлено: ander от 04 Март 2016, 11:49:01
Сделал Icon и Height в конфиге необязательными.  Может просто не быть таких строк, могут быть закомментированы
(программа выбирает только строки, начинающиеся с "Name=", "Icon=", "Height=", "Categories=", а все остальное
просто игнорирует, так что закомментировать можно чем угодно)

Скорость jwmtst от наличия иконок практически не зависит, что там, несколько символов вывести на фоне перебора полутора сотен desktop файлов.  Разве только сам jwm без них быстрее перерисовывать будет.
Название: Re: Построитель меню JWM на C
Отправлено: paulus от 08 Март 2016, 17:22:16
В jwmtst.conf нет данной категории в Offce, но flash-player-properties.desktop туда попадает из-за X-GNOME-PersonalSettings :( А должен быть только в категории Settings. Можно как-то избавится (опция игнор?) или только правкой *.desktop (как-то не очень удобно)?
Название: Re: Построитель меню JWM на C
Отправлено: DdShurick от 08 Март 2016, 17:42:56
В jwmtst.conf добавьте пробел после Personal в категории Office.
Код
Categories=Office;Document;WordProcessor;WebDevelopment;TextEditor;Dictionary;Calculat;Finance;Spreadsheet;ProjectManagement;Personal ;Calendar;ContactManagement;
Название: Re: Построитель меню JWM на C
Отправлено: RoDoN от 17 Март 2016, 09:54:23
Надо либо использовать только один параметр "NoDisplay=", либо просить ander-а добавить в jwmtst еще и фильтрацию по Hidden.
Могу поменять, но т.к. оба параметра стандартные - лучше оба и фильтровать
Просьба к ander добавить фильтрацию десктопных файлов, чтобы если есть параметр "Hidden=true", то файл в меню не попадал.
Название: Re: Построитель меню JWM на C
Отправлено: ander от 17 Март 2016, 14:26:39
Сделал.
Теперь если в файле присутствует строчка Hidden и она не равна false, файл игнорируется.
Название: Re: Построитель меню JWM на C
Отправлено: RoDoN от 09 Октябрь 2016, 18:47:01
Грустно, что ander пропал и давно на форуме не появляется, просить внести исправления в jwmtst стало не кого, поэтому решил кое-что исправить сам. Дело в том, что JWM не корректно обрабатывает записи из десктоп-файлов, в которых есть %f, %F или %U, напр., pcmanfm %U не запускается и выкидывает ошибку. Десктоп-файлы переделывать надоело и наконец-то переделал jwmtst (во вложении).
Название: Re: Построитель меню JWM на C
Отправлено: paulus от 23 Ноябрь 2016, 00:53:01
* jwmtst_2016-10-09.tar.gz
Там для 32? Можете сделать архив для 32/64? И спасибо за улучшения :)
Название: Re: Построитель меню JWM на C
Отправлено: sfs от 23 Ноябрь 2016, 09:11:26
Судя по теме про webp он не умеет NoDisplay=true ?
Название: Re: Построитель меню JWM на C
Отправлено: RoDoN от 23 Ноябрь 2016, 10:00:43
Там для 32?
Да. Сборками x64 практически не пользуюсь, ставлю только на посмотреть, но постараюсь скомпилить.

он не умеет NoDisplay=true ?
C чего такой вывод?
Выложенный мной вариант умеет, так же, как и последний от ander.
Исходники здесь https://github.com/rodonx/menu - форк версии ander с моими изменениями.

Название: Re: Построитель меню JWM на C
Отправлено: sfs от 23 Ноябрь 2016, 10:13:46
C чего такой вывод?
В меню ярлык не должен появиться. Там NoDisplay=true
Название: Re: Построитель меню JWM на C
Отправлено: RoDoN от 23 Ноябрь 2016, 10:22:02
Если в ярлыке NoDisplay=true, то ярлык в меню JWM не появляется!
Название: Re: Построитель меню JWM на C
Отправлено: paulus от 23 Ноябрь 2016, 12:38:14
В jwmtst.conf уже не надо делать пробел после "Personal ;" (категории Офис)? Уже не помню, что там мешало (http://forum.puppyrus.org/index.php?topic=18231.msg116258#msg116258)...
Название: Re: Построитель меню JWM на C
Отправлено: RoDoN от 23 Ноябрь 2016, 12:59:24
jwmtst.conf не трогал, пробел никогда не добавлял, для себя там только высоту строк менял
Название: Re: Построитель меню JWM на C
Отправлено: RoDoN от 26 Ноябрь 2016, 20:29:19
Можете сделать архив для 32/64?
Скомпилил в pra6407-1610light2.
Название: Re: Построитель меню JWM на C
Отправлено: paulus от 27 Ноябрь 2016, 01:07:22
Скомпилил в pra6407-1610light2.
Спасибо :)
lxappearance, aumix в меню без иконок - это проблема *.desktop или tst?
Название: Re: Построитель меню JWM на C
Отправлено: RoDoN от 27 Ноябрь 2016, 01:52:17
Для aumix я себе сделал в /usr/share/icons ссылку на /usr/share/aumix/aumix.xpm и значек появился, а для lxappearance, да и для многих других ярлыков я сделал в файле .jwmrc  блок отвечающий за поиск иконок таким:
Код
	<!-- <Icons> -->
<IconPath>$HOME/.icons</IconPath>
<IconPath>/usr/share/icons</IconPath>
<IconPath>/usr/share/pixmaps</IconPath>
<IconPath>/usr/local/share/pixmaps</IconPath>
<IconPath>/usr/share/icons/PRA/apps/48</IconPath>
<IconPath>/usr/share/icons/PRA/actions/48</IconPath>
<IconPath>/usr/share/icons/PRA/devices/48</IconPath>
<IconPath>/usr/share/icons/PRA/mimes/48</IconPath>
<IconPath>/usr/share/icons/hicolor/48x48/apps</IconPath>
<IconPath>/usr/share/icons/hicolor/32x32/apps</IconPath>
<IconPath>/usr/share/icons/hicolor/24x24/apps</IconPath>
<IconPath>/usr/share/icons/hicolor/22x22/stock/image</IconPath>
<IconPath>/usr/share/icons/hicolor/scalable/apps</IconPath>
<IconPath>/usr/share/icons/hicolor/48x48/mimetypes</IconPath>
<!-- </Icons> -->
И теперь в меню практически нет пунктов с  потерянными значками.

Еще у Pburn значек потерян, поэтому в /usr/share/icons кинул симлинк на /opt/pburn/pburn/pburn20.png
Название: Re: Построитель меню JWM на C
Отправлено: sfs от 08 Февраль 2018, 09:19:15
Openbox у меня нет, какие там *.conf?
Посмотрел. Там нужно указывать полный путь до иконки
Это проблема?
Название: Re: Построитель меню JWM на C
Отправлено: DdShurick от 08 Февраль 2018, 09:22:02
Это проблема?
Думаю,что нет.
Название: Re: Построитель меню JWM на C
Отправлено: sfs от 08 Февраль 2018, 09:36:58
Вывод openbox-menu (он сам не устраивает тем, что тянет по зависимостям демон menu-cached и имеет gtk2 зависимости). Альтернатива - openbox-xdgmenu (без gtk2 не будет иконок)
Название: Re: Построитель меню JWM на C
Отправлено: sfs от 09 Февраль 2018, 10:32:20
Есть надежда на результат?
Название: Re: Построитель меню JWM на C
Отправлено: DdShurick от 09 Февраль 2018, 12:16:24
Есть надежда на результат?
Вчера сделал "выхлоп" под openbox, сейчас думаю, как быть с путями иконок.
Название: Re: Построитель меню JWM на C
Отправлено: DdShurick от 12 Февраль 2018, 09:13:24
как быть с путями иконок.
Получается, что поиск иконок более трудоёмок, чем построение меню, поэтому лично я отказался бы от иконок в меню ввиду их практической бесполезности.
(Сейчас sfs завоет - "неосилятор", но очень не хочется плодить уродцев)
Компромиссный вариант, поместить все иконки, необходимые для меню в /usr/share/pixmaps на манер IceWM, думаю, для мэнтейнеров это не будет непосильной нагрузкой.
Чтобы было понятно, на bash:
Код
LABEL=`find /usr/share/pixmaps /usr/share/icons -type f | grep $Icon | grep $Height`
и так для каждой иконки. (Icon и Height берутся из menu.conf)
Название: Re: Построитель меню JWM на C
Отправлено: sfs от 12 Февраль 2018, 09:48:58
поиск иконок более трудоёмок, чем построение меню,
Поэтому я и начал с этого вопроса. Без иконок и под gtk2 все есть. Похоже там как-то заюзывают доп. либы, а не прямым поиском
Сейчас sfs завоет - "неосилятор",
Нет. Если знаний на задействование дополнительных либ для решения этого вопроса нет - уродцев не надо. Тем более в gtk2 и так все ок, а с gtk3 без gtk2 пока упирается в yad gtkdialog
Спасибо за попытку +