Трудности создания GUI на bash ;) (just for fun)

Модератор: Модераторы разделов

Ответить
Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Трудности создания GUI на bash ;)

Сообщение rl0ad »

*Без Gtkdialog это было бы невозможно*

"Контекстное меню" пользователя.

Код: Выделить всё

#! /bin/bash
### Define menu actions ###
run () {
    case "$1" in
    TODO*) ~/bin/export-todo-in-one-string.sh;;
    Подключить*) ~/bin/open-dir-GTK3.sh ;;
    Редактировать*) emacsclient -c $0 ;;
    Выделение_перевести) ~/tools/popup-translate.sh ;;
    Подключить_USB) ~/bin/open-dir-GTK3.sh ;;
    esac
}
c=0  # set event counter

### Get active window ###
win="$(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") | awk '/WM_CLASS/{print $4}')"  # LOL!

### Define menu items ###
N='<item>Menu</item>'
I1='<item>TODO-лист</item>'
I2='<item>Выделение_записать</item>'
I3='<item>Подключить_USB</item>'
I4='<item>Выделение_перевести</item>'
I5=
I6=
I7=
I8=
I9=
I10='<item>Редактировать это меню >></item>'

### Build list menu items ###
# h - menu wihdow height
case "$win" in
    \"Xfdesktop\") I0=$N$I1$I10
           h=100;;
    \"Midori\") I0=$N$I2$I4$I10
        h=200;;
    \"XTerm\") I0=$N$I4$I10
           h=100;;
    \"ROX-Filer\") I0=$N$I3$I10
           h=100;;
    *) I0=$N$I1$I10
       h=100;;
esac

### Build menu UI & execute ###
echo '<window window_position="2" title="U-menu">
<vbox>
<tree>
<label>""</label>
'"$I0"'
<width>200</width>
<height>'$h'</height>
<variable>ITEM</variable>
<action signal="changed">echo $ITEM</action>
<action signal="focus-out-event">exit:EXIT</action>
</tree>
</vbox>
</window>' | gtkdialog -s | while read item
do
    let c=$c+1
    if ((c>1))
    then run $item
    fi
done
exit 0


Ну а вопрос- на чем/как это можно сделать адекватно?

UPD
Автоматический расчет высоты окна меню (вместо констант в "### Build list menu items ###") :

Код: Выделить всё

 ### Calculate window height ###
ni=$(echo $I0 | grep -o '<item>' | wc -w)
h=$((($ni-1)*23+50))  # customize!
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1144
Статус: Slacker!
ОС: Slackware64-current

Re: Трудности создания GUI на bash ;)

Сообщение yars »

Теоретически, можно отделить от скрипта GUI, оставив только вызов GtkBuilder, а сам GUI писать на Glade.
Или echo заменить на cat <<< EOF... Но ведь есть готовые биндинги, например, для Python, так разве нет чего-то подобного для шелла?
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
-------------
Registered Linux User #557010
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Трудности создания GUI на bash ;)

Сообщение SLEDopit »

rl0ad писал(а):
06.06.2016 20:11
Ну а вопрос- на чем/как это можно сделать адекватно?
вам принципиально именно GUI или псевдо GUI сойдёт?
если сойдёт, то whiptail / dialog (они практически идентичны, на глаз лишь небольшие различия во внешнем виде, а под капотом там всё кардинально разное: один на ncurses основан, а другой на newt и slang).

В этих ваших интернетах валяются тонны инструкций (раз, два, возможно и на русском что-то есть).
Зато на выходе получается чистый красивый консольный интерфейс без всяких gtkdialog'ов.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Re: Трудности создания GUI на bash ;)

Сообщение rl0ad »

вам принципиально именно GUI или псевдо GUI сойдёт?

GTK3! Пусть уж все будет в одном стиле, и не вырвиглазно (ага, эстет недобитый).

yars, тут другой Gtkdialog: http://wiki.puppyrus.org/programming/gtkdialog2 (только gtkdialog3, но это практически одно и то же).
Значит Питон говорите.. мне этот язык не нравится.
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1144
Статус: Slacker!
ОС: Slackware64-current

Re: Трудности создания GUI на bash ;)

Сообщение yars »

А вообще, не вижу причин не использовать gtkdialog, если грамотно разнести все по разным файлам, можно получать нормально читаемые скрипты. Вот тут кое-что на эту тему есть, думаю, как отправнвя точка сойдет.
P.S. Oops, пока писал сообщение, опередили.
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
-------------
Registered Linux User #557010
Спасибо сказали:
Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Re: Трудности создания GUI на bash ;)

Сообщение rl0ad »

yars писал(а):
06.06.2016 21:07
А вообще, не вижу причин не использовать gtkdialog, если грамотно разнести все по разным файлам, можно получать нормально читаемые скрипты. Вот тут кое-что на эту тему есть, думаю, как отправнвя точка сойдет.


Я уже этот линк указал)) Но там простите для дубов. И с Gtkdialog все-таки слишком много костылей: чтобы использовать локальные переменные непосредственно в UI приходится писать так, как в моем примере. И это только цветочки, что-то более серьезное, чем всплывающая менюшка, будет выглядеть действительно монструозно.
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX
Контактная информация:

Re: Трудности создания GUI на bash ;)

Сообщение Olej »

rl0ad писал(а):
06.06.2016 21:07
Значит Питон говорите.. мне этот язык не нравится.

Ну так вы ему не нравитесь ещё больше... :laugh:

Трудности создания GUI на bash

Оу!
Мсье знает истинный вкус в утончённых извращениях! :drinks:
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1144
Статус: Slacker!
ОС: Slackware64-current

Re: Трудности создания GUI на bash ;)

Сообщение yars »

Ну, не знаю, буду дома, поковыряю. Хотя, и скрипты с консольным dialog не отличаются компактностью. А за примерами лучше обратиться к документации.
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
-------------
Registered Linux User #557010
Спасибо сказали:
Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Re: Трудности создания GUI на bash ;)

Сообщение rl0ad »

yars писал(а):
06.06.2016 21:26
А за примерами лучше обратиться к документации.

Давно уже прочитано ;)

Olej писал(а):
06.06.2016 21:17
rl0ad писал(а):
06.06.2016 21:07
Значит Питон говорите.. мне этот язык не нравится.

Ну так вы ему не нравитесь ещё больше... :laugh:

Эээ, вопрос: скрипт на Питоне будет компактнее, чем этот на bash - или может быть еще строк на 100 длиннее?
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX
Контактная информация:

Re: Трудности создания GUI на bash ;)

Сообщение Olej »

rl0ad писал(а):
06.06.2016 21:28
Olej писал(а):
06.06.2016 21:17

rl0ad писал(а):
06.06.2016 21:07
Значит Питон говорите.. мне этот язык не нравится.

Ну так вы ему не нравитесь ещё больше... :laugh:

Эээ, вопрос: скрипт на Питоне будет компактнее, чем этот на bash - или может быть еще строк на 100 длиннее?

Эээ, ответ :drinks: : я думаю, вы просто ещё не научились понимать разницу между "не нравится" и "не знаю". :laugh:
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1144
Статус: Slacker!
ОС: Slackware64-current

Re: Трудности создания GUI на bash ;)

Сообщение yars »

Если писать так, как в вашем примере -- разница будет небольшая, но костылей поменьше будет точно.
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
-------------
Registered Linux User #557010
Спасибо сказали:
Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Re: Трудности создания GUI на bash ;)

Сообщение rl0ad »

yars писал(а):
06.06.2016 21:44
Если писать так, как в вашем примере -- разница будет небольшая, но костылей поменьше будет точно.

А нельзя ли какой-нибудь простейший пример или ссылку? Да, я знаю про гугл, но с примерами кода там не очень..
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1144
Статус: Slacker!
ОС: Slackware64-current

Re: Трудности создания GUI на bash ;)

Сообщение yars »

Ну, для начала - https://docs.python.org/3/tutorial хватит. Параллельно с этим придется заглядывать в документацию по GTK3, а точнее, в документацию PyGObject..
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
-------------
Registered Linux User #557010
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Трудности создания GUI на bash ;)

Сообщение Bizdelnick »

Код: Выделить всё

#!/bin/sh
I1='item 1'
I2='item 2'
I3='item 3'
ITEM=`echo "$I1
$I2
$I3" | zenity --list --column='Menu'`
case "$ITEM" in
    "$I1") echo 'do action 1' ;;
    "$I2") echo 'do action 2' ;;
    "$I3") echo 'do action 3' ;;
    *) echo 'error' >&2 ; exit 1 ;;
esac
Не?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Re: Трудности создания GUI на bash ;)

Сообщение rl0ad »

Bizdelnick, не :) Это Контекстное меню: оно показывает только те пункты, которые имеют отношение к текущему активному окну, т. е. меню собирается динамически.

А zenity ТУПОЕ:
- не умеет распологать окно под курсором,
- не умеет окно без кнопок,
- не понимает события типа потери фокуса,
...
и еще тыщапицот пунктов, лень перечислять - разве гномеры способны создавать адекватное ПО?)))
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Трудности создания GUI на bash ;)

Сообщение Bizdelnick »

rl0ad писал(а):
07.06.2016 00:08
Это Контекстное меню: оно показывает только те пункты, которые имеют отношение к текущему активному окну, т. е. меню собирается динамически.

Это я понял, динамическое формирование меню добавить не проблема. Просто мне лень разбираться в Вашем нечитаемом скрипте и писать полный аналог.

rl0ad писал(а):
07.06.2016 00:08
zenity ТУПОЕ

Не без этого, но и задачка выглядит не шибко интеллектуальной.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Re: Трудности создания GUI на bash ;)

Сообщение rl0ad »

Bizdelnick писал(а):
07.06.2016 00:16
Просто мне лень разбираться в Вашем нечитаемом скрипте и писать полный аналог.

С zenity никогда и не получится)) Оно создано чтобы каждый тупица за 5 минут мог сляпать окно с двумя кнопками, а мне (чисто по приколу) хотелось сделать что-то похожее на стандартное контекстное меню, которое по правому клику в любом приложении.

Тут бы еще как-то избавится от декораций окон, но этого даже Gtkdialog не умеет.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Трудности создания GUI на bash ;)

Сообщение Bizdelnick »

rl0ad писал(а):
07.06.2016 00:30
С zenity никогда и не получится

Почему это? Точно так же как в Вашем примере всё делается, даже проще, потому что XML не нужен.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Re: Трудности создания GUI на bash ;)

Сообщение rl0ad »

Bizdelnick писал(а):
07.06.2016 00:40
.. даже проще, потому что XML не нужен.

#15
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Трудности создания GUI на bash ;)

Сообщение Bizdelnick »

Чё?
Ладно, поясню, если непонятно: запихиваете нужные пункты в переменную, делаете echo "$VAR" | zenity --list --column=<name>, парсите вывод. Точно так же, как Вы делали, но без XML. Problem?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
rl0ad
Сообщения: 123
ОС: Leap 42.1

Re: Трудности создания GUI на bash ;)

Сообщение rl0ad »

Bizdelnick, это ты мне чтоле? Не, я уже говорил куда идти таким вот советчикам (zenity)?

Сраные кнопочки. не нужны. вообще никак. Не лезь куда не нужно, осел.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Трудности создания GUI на bash ;)

Сообщение serzh-z »

rl0ad писал(а):
09.06.2016 00:58
Сраные кнопочки. не нужны. вообще никак. Не лезь куда не нужно, осел.
Он не осёл, а биздельник. См. Tcl/Tk и menuconfig. )
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX
Контактная информация:

Re: Трудности создания GUI на bash ;)

Сообщение Olej »

serzh-z писал(а):
09.06.2016 01:48
rl0ad писал(а):
09.06.2016 00:58
Сраные кнопочки. не нужны. вообще никак. Не лезь куда не нужно, осел.
Он не осёл, а биздельник. См. Tcl/Tk и menuconfig. )

Вот как нужно посылать изящно! :drinks:
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Трудности создания GUI на bash ;)

Сообщение Bizdelnick »

rl0ad писал(а):
09.06.2016 00:58
я уже говорил куда идти таким вот советчикам (zenity)?

Нет, не говорили. И не советую, а то рискуете сами отправиться в баню.
Ответ же мой надлежит расценивать не как совет, а как указание на допущенную Вами ошибку в оценке zenity: реализовать какую-то мудрёную логику оно не мешает, потому что логика реализуется вне его. Но нарисовать имитацию контекстного меню оно действительно не может.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить