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

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

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

Оффлайн k0l0p0k

  • Ветеран
  • *****
  • Сообщений: 1332
  • Репутация: +20/-1
Re:Построитель меню JWM на C
« Ответ #120 : 24 Февраль 2016, 15:38:32 »
C посложнее sh
Код
for( entryIndex = 0; entryIndex < entryIndexMax; entryIndex++ ){ // Раскидываем сортированные данные по категориям
... или непривычнее  :)
цикл перебирает начиная с entryIndex = 0 по entryIndex = entryIndexMax-1 , с шагом 1.
обработка строк в sh есть, но как-то заумно  ???
« Последнее редактирование: 24 Февраль 2016, 15:40:39 от k0l0p0k »
1.нетбук  Samsung N145 (оси: Debian+OLS, ddr01)
2.стационары(пеньки,2-8Gb,Radeon RX460,HD7850 ubuntu+openBox+LXPanel, PRA, ddr01)

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:Построитель меню JWM на C
« Ответ #121 : 24 Февраль 2016, 17:06:13 »
Различия в написании цикла - ерунда.
Вот работа с указателями - это да, для других языков очень непривычно.

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:Построитель меню JWM на C
« Ответ #122 : 25 Февраль 2016, 11:05:53 »
Вынес таблицу распределения по категориям в отдельный конфигурационный файл.
Пока что его расположение жестко прописано в исходнике: /home/live/.jwm/jwmtst.conf
В нем сейчас записано то же самое, что раньше было в самом исходнике, так что на выходе ничего поменяться не должно.
Время выполнения тоже заметно не поменялось, Так что все то же самое, но изменить вид меню можно без перекомпиляции.
Формат файла, думаю, из примера понятен: с Name= начинается следующая категория, остальные ключевые слова относятся к ней, до следующего Name=
Неопознанные строки игнорируются, так что пустые строки и комментарии на отдельных строках писать можно.
Разбор пока самый примитивный, поэтому при ошибках в конфиге программа может падать, помаленьку доработаю в плане обработки таких ситуаций.
Выложено на https://github.com/andreyrogojin/menu

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 7181
  • Репутация: +167/-2
  • Старый чайник
Re:Построитель меню JWM на C
« Ответ #123 : 25 Февраль 2016, 17:45:19 »
/home/live/.jwm/jwmtst.conf
Надо бы $HOME/.jwm/jwm_dynmenu.conf или /etc/X11/jwm/jwm_dynmenu.conf.
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150)
Netbook Acer 722 c6ckk (AMD C-50 Ontario, Radeon HD 6250)
Nettop Asus Eee Box PC B202 (Intel Atom N270, intel GMA 950)
Nettop Asus Eee Box PC EB1007 (Intel Atom D425, Intel GMA 3150)
Вопросы: DdShurick@jabber.ru

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:Построитель меню JWM на C
« Ответ #124 : 26 Февраль 2016, 16:20:22 »
/home/live/.jwm/jwmtst.conf
Надо бы $HOME/.jwm/jwm_dynmenu.conf или /etc/X11/jwm/jwm_dynmenu.conf.

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

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

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 7181
  • Репутация: +167/-2
  • Старый чайник
Re:Построитель меню JWM на C
« Ответ #125 : 26 Февраль 2016, 16:33:14 »
Эти мелочи можно и потом
Можно, но лучше сразу, будет универсально для всех, а не только PRA и Richy.
Код
#include <stdlib.h> //добавить
....................
char *menupath, *menudir="/.jwm";
....................
menupath = getenv("HOME");
strcat(menupath,menudir);
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150)
Netbook Acer 722 c6ckk (AMD C-50 Ontario, Radeon HD 6250)
Nettop Asus Eee Box PC B202 (Intel Atom N270, intel GMA 950)
Nettop Asus Eee Box PC EB1007 (Intel Atom D425, Intel GMA 3150)
Вопросы: DdShurick@jabber.ru

Оффлайн ander

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

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 7181
  • Репутация: +167/-2
  • Старый чайник
Re:Построитель меню JWM на C
« Ответ #127 : 26 Февраль 2016, 21:04:10 »
Я пробовал без buf, работает.
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150)
Netbook Acer 722 c6ckk (AMD C-50 Ontario, Radeon HD 6250)
Nettop Asus Eee Box PC B202 (Intel Atom N270, intel GMA 950)
Nettop Asus Eee Box PC EB1007 (Intel Atom D425, Intel GMA 3150)
Вопросы: DdShurick@jabber.ru

Оффлайн ander

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

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:Построитель меню JWM на C
« Ответ #129 : 26 Февраль 2016, 23:50:35 »
Кстати, насчет скорости исполнения jwmtst.
Я все удивлялся, почему под pra64 скорость раза в четыре больше, чем под pra32,
оказалось, дело в ядре.  Загрузился в pra32 c 4.4.1-2-MANJARO и скорость стала примерно как в pra64.
Видимо 3.19.2-pf2 на каких-то операциях подтормаживает.

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 7181
  • Репутация: +167/-2
  • Старый чайник
Re:Построитель меню JWM на C
« Ответ #130 : 27 Февраль 2016, 09:15:11 »
Кстати, насчет скорости исполнения jwmtst.
Код
# time jwm_dynmenu
..............
real 0m0.017s
user 0m0.004s
sys 0m0.010s
# uname -r
4.0.4
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150)
Netbook Acer 722 c6ckk (AMD C-50 Ontario, Radeon HD 6250)
Nettop Asus Eee Box PC B202 (Intel Atom N270, intel GMA 950)
Nettop Asus Eee Box PC EB1007 (Intel Atom D425, Intel GMA 3150)
Вопросы: DdShurick@jabber.ru

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re: Построитель меню JWM на C
« Ответ #131 : 04 Март 2016, 11:49:01 »
Сделал Icon и Height в конфиге необязательными.  Может просто не быть таких строк, могут быть закомментированы
(программа выбирает только строки, начинающиеся с "Name=", "Icon=", "Height=", "Categories=", а все остальное
просто игнорирует, так что закомментировать можно чем угодно)

Скорость jwmtst от наличия иконок практически не зависит, что там, несколько символов вывести на фоне перебора полутора сотен desktop файлов.  Разве только сам jwm без них быстрее перерисовывать будет.

Оффлайн paulus

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 1637
  • Репутация: +24/-0
Re: Построитель меню JWM на C
« Ответ #132 : 08 Март 2016, 17:22:16 »
В jwmtst.conf нет данной категории в Offce, но flash-player-properties.desktop туда попадает из-за X-GNOME-PersonalSettings :( А должен быть только в категории Settings. Можно как-то избавится (опция игнор?) или только правкой *.desktop (как-то не очень удобно)?
« Последнее редактирование: 08 Март 2016, 17:24:09 от paulus »

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 7181
  • Репутация: +167/-2
  • Старый чайник
Re: Построитель меню JWM на C
« Ответ #133 : 08 Март 2016, 17:42:56 »
В jwmtst.conf добавьте пробел после Personal в категории Office.
Код
Categories=Office;Document;WordProcessor;WebDevelopment;TextEditor;Dictionary;Calculat;Finance;Spreadsheet;ProjectManagement;Personal ;Calendar;ContactManagement;
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150)
Netbook Acer 722 c6ckk (AMD C-50 Ontario, Radeon HD 6250)
Nettop Asus Eee Box PC B202 (Intel Atom N270, intel GMA 950)
Nettop Asus Eee Box PC EB1007 (Intel Atom D425, Intel GMA 3150)
Вопросы: DdShurick@jabber.ru

Оффлайн RoDoN

  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 5741
  • Репутация: +126/-0
    • RoDoN
Re: Построитель меню JWM на C
« Ответ #134 : 17 Март 2016, 09:54:23 »
Надо либо использовать только один параметр "NoDisplay=", либо просить ander-а добавить в jwmtst еще и фильтрацию по Hidden.
Могу поменять, но т.к. оба параметра стандартные - лучше оба и фильтровать
Просьба к ander добавить фильтрацию десктопных файлов, чтобы если есть параметр "Hidden=true", то файл в меню не попадал.

Acer Aspire One AO751h (Atom Z520, Intel GMA500)
Acer Extensa 5620Z (T7500, Intel 965GM)
PuppyRus-JWM-13.12, PRA, Upup Precise, Tahr Puppy, Runtu 16.04 XFCE.