5

EDIT 2014-04-19:
To add a little extra context to my question, these are the original instructions I followed http://ricardofeliciano.me/how-to-create-a-unity-launcher-icon-for-each-chromechromium-profile-in-ubuntu/. I got it to work with Ubuntu 14.04 LTS a few weeks before the official release date. After updating on April 17th I can no longer get it to work:

ORIGINAL POST:
I installed Ubuntu 14.04 LTS a few weeks before the official release and set up multiple google chromium profiles. Using "StartupWMClass", I managed to get each profile to have a separate version of the chromium icon in the unity launcher (same icon, separate appearance in the launcher). After the official release of 14.04 I updated all packages (including chromium) and ever since my additional chromium profiles no longer get their own icon location on the launcher, but group together with the main chromium icon.

here's what I believe to be the essentials of my setup:

  • Under ~/.local/share/applications/ I have my *.desktop files, containing among others the lines
    • Exec=chromium-browser --user-data-dir=/home/<mydir>/.config/chromium/Profiles/<profile-name> --class=<profile-class-name> %U
    • StartupWMClass=<profile-class-name>
  • Under /usr/share/applications/ I have the default chromium-browser.desktop file created upon installing chromium, containing among others the lines
    • Exec=chromium-browser --class=Chromium-browser %U
    • StartupWMClass=Chromium-browser

Adding --class=Chromium-browser to the Exec= line of the default installation .desktop file used to do the trick so that each profile including the default profile would be associated with their own icon on the launcher. After the update I am no longer able to get this to work.

I tried:

  • closing all chromium windows,
  • unlocking from launcher any remaining chromium icons,
  • using the unity search to start the default Chromium Web Browser,
  • locking the appearing icon to the launcher
  • using the unity search to start an additional, custom Chromium profile
  • --> the window of the additional chromium profile is associated with the the icon started for the default chromium profile. They use the same launcher icon.

I tried restarting compiz, logging out and even restarting my computer.

Any tips on what I might be missing?

p.s. One thing that confuses me is that the launcher I created for Google Calendar with File -> Create application shortcuts... works as expected (uses it's own, different icon), and doesn't even make use of the --class=<profile> argument I thought was necessary...

  • To be honest, the whole construction seems rather fuzzy to me. Apart from the fact that I do not follow your description of the setup you made: a)you can give a desktop file multiple entries, without the complicated setup b) taking old desktop files to new versions of Ubuntu is a bad idea in general, because of possible mismatches of commands in old (local) desktop files and global ones of newer application versions that come with the new Ubuntu release. c) If you keep a local .desktop file of an application, the global one plays no role wahtsoever, not in the Unity launcher, not in Dash. – Jacob Vlijm Apr 18 '14 at 22:34
  • please let me know if there is anything I can do to clarify my problem. The original instructions I followed were ricardofeliciano.me/…. That might help put my question into context. – Student Apr 19 '14 at 9:57
  • 1
    I see, I removed my answer because I think I misunderstood your setup and what you want to achieve ;) I have to run, will look into it tonight (unless someone else solved the problem in the meantime) – Jacob Vlijm Apr 19 '14 at 10:14
  • 1
    I do not have an answer, but I simply think Unity does not accept anymore that application windows are grouped under another icon than the icon of the "native" desktop file, meaning: the desktop file with the application-command as its native command. That is actually a good thing, and I indeed noticed more consistancy and less errors in how desktop files behave in the launcher lately. However, I think your solution does not work anymore, as I tried myself. – Jacob Vlijm Apr 19 '14 at 19:44
  • 1
    This is not working anymore in Ubuntu 14.04 due to a chromium bug, caused by the switch to v34 (and aura engine). Unity has not changed anything related to this. – Treviño Apr 30 '14 at 5:00
0

I came up with this abomination (personal opinion... I'd just like for it to work with sh :) ) It has a few tricks, but is pretty robust for two Windows.. You could specify further windows too, but they have to be manually added by adding more "specificprofile1" along with the corresponding function.. Maybe someone could make it have more.. logic!

#!/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

Issues:

Printing gives errors (deprecation warnings..):

Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/%{ <-- HERE (.*?)}/ at /usr/bin/print line 528.

For debugging you can use the following to print out the errors when using actual icons: https://askubuntu.com/a/664272/654028 (# The Manual alternative)

awk '/^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); exit system($0)}' chrome-ws2.desktop

while loop bugs out, probably because of looping interval

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: .

Also when clicking a corresponding .desktop icon too fast (before the custom class has been set ?), a new window will be opened..

(quite) Sometimes when starting from both Chromium too fast (~<3s), the class of the previously opened window gets reset to chromium-browser.chromium-browser.. Then you can expect the icons to have swapped around or other unexpected behavior.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.