Сайт | Скачать | Видео | Wiki

Автор Тема: Построитель меню JWM на C  (Прочитано 29708 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Построитель меню JWM
« Ответ #60 : 14 Февраль 2016, 11:40:14 »
Хватит уже с sfs собачиться, мне ж интересно, в buf дело было или нет. :)

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Автор темы
  • Старый чайник
Построитель меню JWM
« Ответ #61 : 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
Хорошо бы ваш вариант приспособить к динамическому меню.
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Построитель меню JWM
« Ответ #62 : 14 Февраль 2016, 12:52:29 »
Понять бы еще, для чего оно вообще нужно динамическим...

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

Вот только чем это лучше Include?

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33966
  • Репутация: +231/-0
    • PuppyRus-A
Построитель меню JWM
« Ответ #63 : 14 Февраль 2016, 13:01:53 »
Понять бы еще, для чего оно вообще нужно динамическим...
Чтобы перестраивалось в момент обращения к нему и не надо было бы заморачиваться перестройкой меню после подкл\откл модуля
Раз для openbox и lxpanel взрослые программисты юзают menu-cached - без демона будут тормоза и костыли. Соответственно надо для динам. меню смотреть в сторону п.5

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Автор темы
  • Старый чайник
Построитель меню JWM
« Ответ #64 : 14 Февраль 2016, 13:44:39 »
А что-то мешает, имея файлы в ~/.jwm/ написать так:
<Dynamic label="Система" icon="pc48">exec:cat ~/.jwm/System</Dynamic>?
Ничего не мешает, но будет тормоз, даже jwm-dynmenu.bin отрабатывает почти за секунду, а это "на ощупь" чувствительно.
Вот только чем это лучше Include?
Не будут болтаться лишние файлы, да и сама программа получится проще.
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Построитель меню JWM
« Ответ #65 : 14 Февраль 2016, 15:02:30 »
Понять бы еще, для чего оно вообще нужно динамическим...
Чтобы перестраивалось в момент обращения к нему и не надо было бы заморачиваться перестройкой меню после подкл\откл модуля

Вот этого я и не могу понять.   ???
Зачем перестраивать меню при каждом обращении к нему, если можно перестроить только после подкл\откл модуля.
Ведь к меню обращаются все же чаще, чем модули подключают, соответственно второй вариант заведомо менее ресурсозатратен.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33966
  • Репутация: +231/-0
    • PuppyRus-A
Построитель меню JWM
« Ответ #66 : 14 Февраль 2016, 16:38:18 »
А если это не подключение модуля, а установка ПМ или распаковка. Демон-обновлялка   универсальнее

Оффлайн paulus

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 1732
  • Репутация: +24/-0
Построитель меню JWM
« Ответ #67 : 14 Февраль 2016, 17:13:00 »
Не будут болтаться лишние файлы, да и сама программа получится проще.
Чем не аргумент, сделаете для С-тренировки? ;)

tst: Почему бы  Calculate, Personal не засунуть в Office? Сейчас в меню 9 категорий, а у вас на 13 разбито. И все эти файлы среди настроек jwm валяются, лучше все же их в один каталог сложить: ~/.jwm/menu/*. imho
« Последнее редактирование: 14 Февраль 2016, 17:18:56 от paulus »

Оффлайн k0l0p0k

  • Ветеран
  • *****
  • Сообщений: 1611
  • Репутация: +27/-1
Построитель меню JWM
« Ответ #68 : 14 Февраль 2016, 17:35:47 »
соглашусь с ander'ом.
перестраивание меню при каждом обращении к нему - замедляет(пусть чуть чуть) работу.(с другой стороны если на Си, если файлы в озу - задержки микросекундные - практически незаметно)
А если это не подключение модуля, а установка ПМ или распаковка. Демон-обновлялка   универсальнее
сделать прямо в меню кнопку - "обновится принудительно", демон опять же пусть чуть чуть но отъедает память.
« Последнее редактирование: 14 Февраль 2016, 17:38:21 от k0l0p0k »
1.пень G2020,8Gb,Radeon RX460 (Debian+openBox+LXPanel)
2.нетбук  Samsung N145 (Debian+openBox+LXPanel, ddr01)

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Автор темы
  • Старый чайник
Построитель меню JWM
« Ответ #69 : 14 Февраль 2016, 18:50:49 »
лучше все же их в один каталог сложить: ~/.jwm/menu/*. imho
Вообще то jwm понимает только ~/.jwmrc, от этого никуда не денешься, а в него можно написать что угодно. Dynmenu - способ уйти от кучи дополнительных файлов, но за всё надо платить.
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Построитель меню JWM
« Ответ #70 : 15 Февраль 2016, 00:38:16 »
немного изменил тестовую программу.  desktop файлы ищет в { /usr, /usr/local, /home/live/.local } /share/applications
Результаты складывает в .jwm/menu/ (надо создать, программа пока совсем тупая)

У меня отрабатывает чуть меньше, чем за 0.1 секунды.  То есть, пока она весь вывод генерит за один проход по файлам, задержки нет.
А вот если ее заставить генерить каждую категорию отдельно и вызвать при создании меню десять раз - задержка уже будет существенной.

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Построитель меню JWM
« Ответ #71 : 16 Февраль 2016, 10:37:43 »
Переписал тестовую программу, сделал сортировку имен программ по алфавиту (до этого в каком порядке попадались desktop файлы, в том и выводилось).
Для этого пришлось сначала информацию из desktop файлов набирать в память, потом там уже отсортировать и отсортированную раскидывать по файлам категорий.

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

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

Сишник из меня довольно фиговый, программа получилась - указатель на указателе, но как данные попроще структурировать, пока не придумал.

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Построитель меню JWM
« Ответ #72 : 16 Февраль 2016, 21:30:30 »
Попробовал скомпилировать tst.c под pra64.  Просто захотелось посмотреть, скорость работы будет та же, или изменится.
Сильно удивился.  Я, конечно, допускал, что под 64 может быть ускорение, все таки если процессор 64 разрядный, то 64 разрядная система может полнее использовать его возможности, но ускорения в пять раз не ожидал.  :o

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Построитель меню JWM
« Ответ #73 : 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 из первой колонки таблицы.

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

Оффлайн paulus

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 1732
  • Репутация: +24/-0
Построитель меню JWM
« Ответ #74 : 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?