РЕДАКТИРОВАТЬ 2014-04-19:
Чтобы добавить немного дополнительного контекста к моему вопросу, это оригинальные инструкции, которым я следовал http://ricardofeliciano.me/how-to-create- а-единство-пусковое-значок-для-каждый-chromechromium-профиля-в-убунт / . Я получил его для работы с Ubuntu 14.04 LTS за несколько недель до официальной даты релиза. После обновления 17 апреля я больше не могу заставить его работать:
ОРИГИНАЛЬНЫЙ ПОЧТ:
Я установил Ubuntu 14.04 LTS за несколько недель до официального выпуска и настроил несколько профилей Google Chromium. Используя «StartupWMClass», мне удалось получить для каждого профиля отдельную версию значка хрома в средстве запуска Unity (тот же значок, отдельный вид в модуле запуска). После официального выпуска 14.04 я обновил все пакеты (включая хром), и с тех пор мои дополнительные профили хрома больше не получают свое собственное расположение значка на панели запуска, а группируются вместе с основным значком хрома.
Вот что я считаю основами моей установки:
~/.local/share/applications/
у меня есть файлы * .desktop, содержащие, среди прочего, строки Exec=chromium-browser --user-data-dir=/home/<mydir>/.config/chromium/Profiles/<profile-name> --class=<profile-class-name> %U
StartupWMClass=<profile-class-name>
/usr/share/applications/
у меня есть файл chromium-browser.desktop по умолчанию, созданный при установке хрома, содержащий, среди прочего, строки Exec=chromium-browser --class=Chromium-browser %U
StartupWMClass=Chromium-browser
Добавление --class=Chromium-browser
в строку Exec = установочного файла .desktop по умолчанию, используемого для выполнения этой задачи, так что каждый профиль, включая профиль по умолчанию, будет связан со своим собственным значком на панели запуска. После обновления я больше не могу заставить это работать.
Я попытался:
Я попытался перезапустить compiz, выйти из системы и даже перезагрузить компьютер.
Какие-нибудь советы о том, чего мне не хватает?
с. Одна вещь, которая смущает меня, - то, что средство запуска, которое я создал для Календаря Google с File -> Create application shortcuts...
, работает как ожидалось (использует его собственный, другой значок), и даже не использует аргумент --class=<profile>
, который я считал необходимым ... [тысяча сто тридцать одна]
Я придумал это отвращение (личное мнение... Я был бы, точно так же, как, чтобы это работало с sh :)) Это имеет несколько приемов, но довольно устойчиво для двух Windows.. Вы могли указать дальнейшие окна также, но они должны быть вручную добавлены путем добавления больше "specificprofile1"
наряду с соответствующей функцией.. Возможно, кто-то мог заставить его иметь больше.. логика!
#!/bin/bash
# chromium-start.sh $1
# e.g. put:
# chrome-start.sh "Profile 1" to .desktop Exec=
# wmctrl -o 1366,0 ; chromium-browser %U --profile-directory=Profile\ 2 & sleep 3; wmctrl -o 0,0
# $1 = Profile folder name
profilename=$1
#2nd Chromium profile
specificprofile1="Profile 1"
echo "starting Chromium"
echo "args: " $1
echo "Profile name: " $profilename
echo "Specific profile: " $specificprofile1
# Just setting Chromium scaling variable, because of course Google Devs don't care about no fractional scaling on linux
scale_var=0.8
# Check if Chromium window with the specified class already exists
# Also allows using icons as "taskbar" switches (clicking icon takes to corresponding Chromium Window)
if wmctrl -l -x | grep "chromium-$profilename"
then
echo "Chromium Window exists, moving focus to it"
wmctrl -x -R chromium-"$profilename"
echo "true"
# Check if 2nd profile $specifiedprofile1 has been started yet or not. The WMCLASS(es) has to have been set correctly...
elif [[ "$specificprofile1" == "$profilename" ]] && [[ ! "`wmctrl -l -x | grep chromium-"$specificprofile1"`" ]]
then
# TODO: Nesting
if [ "$specificprofile1" == "$profilename" ]
then
echo $specificprofile1 "equals" $profilename
fi
echo "#2 Chromium Window for $specificprofile1 does not exist"
# wmctrl moves to specific position of desktop (1366 means moving to the following workspace since my resolution is 1366x768)
# Be careful if using sleep timing, since the command needs to have enough time to execute to have the window in the correct workspace
wmctrl -o 1366,0
chromium-browser --profile-directory="$profilename" --force-device-scale-factor=$scale_var %U &
# https://askubuntu.com/a/626524/654028
# Set's the chromium window which was opened latest to have a custom class, since Chromium doesn't care about the --class= flag...
# It has it's limitations, but should be robust enough for most use... Has not been tested long term.. Something probably could reset the WM_CLASS again
# xprop -id "$(wmctrl -l -x| grep "chromium-browser" | tail -n 1 |awk '{ print $1 }')" -f WM_CLASS 8s -set WM_CLASS "chromium-browser.chromium-$specificprofile1"
# Alternative method for checking if a window with specified class exists
# xprop -id "$(wmctrl -l -x| grep "chromium-$profilename" | tail -n 1 |awk '{ print $1 }')" | grep -o "WM_CLASS(STRING) = ".*"" | grep -o '".*"' | tr -d '"'
# https://stackoverflow.com/a/19441380/5776626
winrep=""
while [[ ! "`echo $winrep | grep -l "Map State: IsViewable"`" ]]
do
winid="$(wmctrl -l -x| grep "chromium-$profilename" | tail -n 1 |awk '{ print $1 }')"
# print $winid
winrep="$(xwininfo -id $winid | grep -o 'Map State: IsViewable')"
# print $winrep
sleep 0.75
xprop -id "$(wmctrl -l -x| grep "chromium-browser" | tail -n 1 |awk '{ print $1 }')" -f WM_CLASS 8s -set WM_CLASS "chromium-browser.chromium-$specificprofile1"
done
# sleep 3
# Move Window directly to workspace (#2 with 1366x768 resolution x = 1366), optionally comment out wmctrl -o 1366,0
# wmctrl -v -i -r $winid -e 0,1366,0,-1,-1
# sleep 5
# Move back to workspace #1
wmctrl -o 0,0
elif ! wmctrl -l -x | grep chromium-"$profilename"
then
echo "#3 Chromium Window $profilename does not exist"
wmctrl -o 0,0
chromium-browser --profile-directory="$profilename" --force-device-scale-factor=$scale_var %U &
# https://askubuntu.com/a/626524/654028
# ....
# sleep 3
winrep=""
while [[ ! "`echo $winrep | grep -l "Map State: IsViewable"`" ]]
do
winid="$(wmctrl -l -x| grep "chromium-$profilename" | tail -n 1 |awk '{ print $1 }')"
# print $winid
winrep="$(xwininfo -id $winid | grep -o 'Map State: IsViewable')"
# print $winrep
sleep 0.75
xprop -id "$(wmctrl -l -x| grep "chromium-browser" | tail -n 1 |awk '{ print $1 }')" -f WM_CLASS 8s -set WM_CLASS "chromium-browser.chromium-$profilename"
done
wmctrl -o 0,0
# xprop -id "$(wmctrl -l -x| grep "chromium-browser" | tail -n 1 |awk '{ print $1 }')" -f WM_CLASS 8s -set WM_CLASS "chromium-browser.chromium-$profilename"
fi
Проблемы:
Печать дает ошибки (предупреждения депрекации..):
Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/%{ <-- HERE (.*?)}/ at /usr/bin/print line 528.
Для отладки Вас может использовать следующее для распечатывания ошибок при использовании фактических значков: https://askubuntu.com/a/664272/654028 (# Ручная альтернатива)
awk '/^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); exit system($0)}' chrome-ws2.desktop
ошибки цикла с условием продолжения, вероятно, из-за интервала цикличного выполнения
Error: no such file "at while function"
xwininfo: error: -id requires argument
xprop: error: Invalid window id format: .
xwininfo: error: -id requires argument
xprop: error: Invalid window id format: .
xwininfo: error: -id requires argument
xprop: error: Invalid window id format: .
Также при нажатии на соответствующий .desktop значок слишком быстро (прежде чем пользовательский класс был установлен?), новое окно будет открыто..
(вполне) Иногда при запуске с обоих Хрома слишком быстро (~ <3 с), класс ранее открытого окна сбрасывается к chromium-browser.chromium-browser.. Затем можно ожидать, что значки подкачают вокруг или другое неожиданное поведение.
KERNEL=="mmc*"
, и я попробовалnodev,noexec,x-gvfs-show
иnodev,noexec,comment=x-gvfs-show
, никакой диск в Наутилусе (Файлы). Это работает только с fstab записью и, чем сnodev,noexec,x-gvfs-show
. Извините = \ – A.B. 27 October 2015 в 07:33