동일한 프로파일에서 여러 개의 Firefox`WM_CLASS`를 사용하십시오.


1

주소 및 탭 표시 줄을 숨기는 데 사용되는 몇 가지 확장자로 "app"라는 Firefox 프로필을 만들었습니다. 내 목표는 Chrome의 '데스크톱에 추가'기능을 모방 한 Google받은 편지함, 캘린더 등의 .desktop 파일을 얻는 것입니다. 현재 .desktop 파일이 있습니다.

#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Terminal=false
Type=Application
Name=Google Inbox (Firefox)
Exec=firefox -P app -new-window --class googleinbox inbox.google.com
Icon=email
StartupWMClass=googleinbox

그러나이 중 둘 이상이 있으면 모든 창은 첫 번째 아이콘 아래에 그룹화 된 실행기를 갖습니다. xprop WM_CLASS각 창에서 사용할 때 , 나는 그들이 실제로 처음 열었던 WM_CLASS를 가지고 있음을 발견했습니다.

Firefox가 -class프로파일이 아닌 창마다 플래그 를 처리하도록하려면 어떻게해야합니까?

편집 : 이제 /usr/bin/firefox -P "PROFILE NAME" --class=WMCLASS아래에 게시 한 janky 스크립트 대신 사용 하고 있으며 각 웹 응용 프로그램에 대해 새 프로필을 작성해야합니다. 또한 이 userChrome.css 를 사용 하여 주소 및 탭 막대 크롬을 제거합니다.

답변:


1

Firefox 관련 답변이있는 사람이 아무도 없기 때문에 ( -classman 페이지에 설명되어 있지 않은 플래그가 제대로 작동하지 않기 때문에) 추악한 해킹을 솔루션으로 게시합니다. 누군가가 실질적으로 그것을 개선 할 수 있다면 대신 답변 크레딧을 줄 것입니다.

firefoxApp.sh라는 다음 스크립트를 작성하여 ~ / bin /에 넣었습니다. 그것은 끔찍한 해킹이며 부끄럽습니다. 또한 자랑 스럽습니다. 별도의 Firefox 프로파일을 버리고 대신 wmctrl, grep 및 xprop를 사용하여 WM_CLASS지연 후 새로 작성된 창의 변경을 변경했습니다 (창이 나타나고 제목을 지정하는 데 상당한 시간이 걸리기 때문에). 누군가가 나에게 다시 분류 할 창을 찾는보다 정확하고 신뢰할 수있는 방법을 말해 줄 수 있다면 타이밍 / 레이스 조건에 시달리지 않습니다.이 스크립트는 크게 향상 될 것입니다. 시작된 프로세스의 PID로 시도하지 못했습니다 (아마도 전체 Firefox 프로파일에 하나의 루트 PID가 있기 때문에). 더 이상 사용할 수 없으므로 여기에 해당 시도에 대한 코드를 게시하지 않습니다.

#!/bin/sh
targetclass=$1
url=$2
titlegrep=$3
if [ "$#" -ne 3 ]
then
    echo "USAGE: $0 TARGETCLASS URL TITLEGREP" 1>&2
    exit 1
fi

firefox -P default -new-window "$url" &

sleep 10

# Ensure only newlines split items in the upcoming for loop:
IFS='
'

for wid in `wmctrl -l -x | grep $titlegrep | awk '{ print \$1 }'`
do
    xprop -id $wid -f WM_CLASS 8s -set WM_CLASS $targetclass
done

이 스크립트는 ~ / .local / share / applications에서 다음과 같은 .desktop 파일을 사용하여 호출합니다.

#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Terminal=false
Type=Application
Name=Calendar (Firefox)
Exec=firefoxApp.sh googlecalendar calendar.google.com Calendar
Icon=calendar
StartupWMClass=googlecalendar

원하는 경우와 같은보다 구체적인 아이콘 이름을 사용하고 ~ / .local / share / icons에 google-calendar-firefox-app이름이 지정된 파일을 놓을 수 있습니다 google-calendar-firefox-app.svg.


나는 이것이 X11에만 해당되는 순수한 Wayland에서 상당히 효과가있을 것이라고 지적 wmctrl하고 xprop있다. 그러나 XWayland를 계속 실행하는 한이 방법이 여전히 효과적이라고 생각합니다.
마크 스 토스 버그

0

나는 이것이 여기에도 적합하다고 생각한다 : 나는이 혐오를 생각해 냈다. (개인 의견 ... 나는 sh와 함께 일하고 싶다 :) 더 많은 창을 지정할 수도 있지만 "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 아이콘을 너무 빨리 클릭하면 (사용자 정의 클래스를 설정하기 전에?) 새 창이 열립니다.

(quite) 때때로 Chromium이 너무 빠르거나 (~ <3s), 이전에 열린 창의 클래스가 chromium-browser.chromium-browser로 재설정되는 경우가 있습니다. 그러면 아이콘이 바뀌거나 다른 예상치 못한 동작이 발생할 수 있습니다. .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.