Sobrescreve o título da janela para uma janela arbitrária no KDE e define um título de janela personalizado

13

Usando o KDE aqui, mas pode haver uma solução que funcione com outros ambientes de desktops também. Muitas vezes estou lidando com muitas janelas. A maioria das janelas contém muitas guias (por exemplo, uma janela do Dolphin com muitas guias ou o Firefox, o Konsole, etc.). O título da janela será alterado com base na minha guia atual (que na maioria das vezes é útil na maioria das vezes), mas ao trabalhar com tantas janelas eu gostaria de organizá-las um pouco e ser capaz de manualmente nomeie a janela, substituindo o título da janela que o aplicativo fornece . Eu poderia nomear uma janela do Firefox "Research" e outra janela do Firefox "Documentation" para ser capaz de distinguir facilmente entre as janelas que usei para organizar e agrupar diferentes guias de acordo.

Idealmente, eu seria capaz de clicar em uma barra de título da janela e facilmente dar a ela um nome personalizado, mas eu preferiria uma solução um pouco mais complicada, desde que funcione.

Eu tentei wmctrl -r :SELECT: -T "Research" , mas isso só funciona temporariamente (o título é revertido quando o aplicativo o altera, por exemplo, ao alternar as guias).

    
por Sean Madsen 13.10.2011 / 18:03

4 respostas

3

Eu tive exatamente esse mesmo problema.

Então eu escrevi um script de shell que liguei a uma tecla de atalho.

Quando eu clico na tecla de atalho, ele obtém o ID da janela da janela atualmente ativa (aquela que tem foco).

Em seguida, ele fornece uma caixa de diálogo pop-up onde você insere o título que deseja que a janela tenha.

Em seguida, toda vez que a janela mudar de nome, ela será alterada novamente para o título desejado.

Para usar o script, você precisa:

  • o shell fish
    (Eu escrevi em peixe em vez de bater porque bash me dá uma dor de cabeça)

  • kdialog

  • alguma maneira de ligar o script a uma tecla de atalho
    (Eu uso xbindkeys , pq tudo que eu tive que fazer para que funcionasse foi adicionar:

"[PATH TO SCRIPT]/[NAME OF SCRIPT]" Mod4 + t

(isto é, tecla da janela + t)
para meu /home/o1/.xbindkeysrc )

Graças a esse cara , que me deu a informação sobre as coisas mágicas do xprop.

(Como, um ano atrás, e então eu nunca cheguei a escrever o roteiro até hoje. xD)

P.S. Se algum novato encontrar essa resposta e não souber como usá-la, basta perguntar-me e eu irei te guiar por ela. ^^

EDIT: Eu atualizei para que você possa usá-lo a partir da linha de comando com as opções -t para title_i_want e -w para window_id .

Aqui está o script:

#!/usr/local/bin/fish

# this block is so you can use it from the command line with -t and -w
if test "$argv" != "" -a (math (count $argv)%2 == 0)
    for i in (seq 1 (count $argv))
        if test $argv[$i] = '-t'
            set title_i_want $argv[(math 1 + $i)]
        else if test $argv[$i] = '-w'
            set window_id $argv[(math 1 + $i)]
        end
    end
    if not test $window_id
        echo "YOU DIDN'T ENTER A 'window_id' WITH '-w',
SO MAKE SURE THE WINDOW YOU WANT HAS FOCUS
TWO SECONDS FROM NOW!"
        sleep 2
    end
end

# get the id of the currently focused window
if not test $window_id
    set window_id (xprop -root _NET_ACTIVE_WINDOW | grep -P -o "0x\w+")
end

# get the title to force on that window

if not test $title_i_want
    set title_i_want (kdialog --title "entitled" --inputbox "type the title you want and hit enter.
to stop renaming,
just enter nothing and hit esc")
end

# this bit is needed for a kludge that allows window renaming
set has_renamed_before "FALSE"
set interrupt_message "WAIT WAIT I WANT A TURN BLOO BLOO BLEE BLUH BLOO" # hopefully i never want to actually use that as a title xD
xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME $interrupt_message -id $window_id

# take the output of xprop
# pipe it into a while loop
# everytime it outputs a new line
# stuff it into a variable named "current_title"
xprop -spy _NET_WM_NAME -id $window_id | while read current_title

    # cut off extraneous not-the-title bits of that string
    set current_title (echo $current_title | grep -P -o '(?<=_NET_WM_NAME\(UTF8_STRING\) = ").*(?="\z)')

    # if the current title is the interrupt message
    # AND
    # this script has renamed the window at least once before
    # then we wanna let the new name take over
    if test $current_title = $interrupt_message -a $has_renamed_before = "TRUE"
        exit
    # if title_i_want is an empty string, exit
    else if test $title_i_want = ""
        xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME "WIDNOW WILL START RENAMING ITSELF AS NORMAL" -id $window_id
        exit
    # otherwise just change the title to what i want
    else if test $current_title != $title_i_want
        xprop -f _NET_WM_NAME 8u -set _NET_WM_NAME "$title_i_want" -id $window_id
        set has_renamed_before "TRUE"
    end
end

EDIT: Eu realmente não uso mais esse script Fish; Eu reescrevi em Ruby:

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'trollop'
opts = Trollop.options do
                        opt :title_i_want,  "title_i_want",     default: ""
                        opt :bluh,          "write to bluh",    default: nil
                        opt :copy_title,    "copy_title",       default: nil
# TODO - AUTO OPTION                                            
                        opt :auto,          "auto",             default: nil
end

title_i_want    = opts[:title_i_want]


def get_current_wid
    'xprop -root _NET_ACTIVE_WINDOW'[/0x\w+/]
end

def with_current_title wid, &block
    IO.popen("xprop -spy _NET_WM_NAME _NET_WM_ICON_NAME -id #{wid}") do |io|
        loop do
            line = io.gets
            exit if line.nil?
            line = line.strip
            # cut off extraneous not-the-title bits of that string
            current_title = line[/(?:_NET_WM_(?:ICON_)?NAME\(UTF8_STRING\) = ")(.*)("$)/, 1]

            block.call current_title unless current_title.nil?
        end
    end
end
def get_current_title wid
    IO.popen("xprop _NET_WM_NAME _NET_WM_ICON_NAME -id #{wid}") do |io|
            line = io.gets.strip
            # cut off extraneous not-the-title bits of that string
            current_title = line[/(?:_NET_WM_(?:ICON_)?NAME\(UTF8_STRING\) = ")(.*)("$)/, 1]

            return current_title unless current_title.nil?
    end
end

if opts[:copy_title]
    # require "muflax"
    p 1
    wid = get_current_wid
    'echo -n '#{get_current_title wid}(WID: #{wid})'|xclip -selection c'
    exit
end
if opts[:bluh]
    require "muflax"
    loop do
        # p 1   #db
        wid = get_current_wid
        # p 2   #db
        File.open "bluh", "a+" do |f| f.puts get_current_title wid end
        while wid == get_current_wid
            # puts "..."    #db
            sleep 1
        end
    end
    exit
end

#> 1A - from terminal - give title_i_want
if not title_i_want.empty?
#> 1A.1 - get current wid - assume it's the terminal_wid
    terminal_wid = get_current_wid
#> 1A.2 - wait for wid to change
    while get_current_wid == terminal_wid
        puts "focus the window you want to title «#{title_i_want}»..."
        sleep 1
    end
#> 1A.3 - set new wid to target TWID
    TWID = get_current_wid

#> 1B - from hotkey (or just sleeping) - no give title_i_want
else
#> 1B.1 - set current wid to target TWID
    TWID = get_current_wid
#> 1B.2 - get title_i_want (with kdialog)
#> 1B.2.1 - default to current title
    with_current_title TWID do |current_title|
        # v :current_title  #db
        default_title = current_title

        sublime_match = /
            (?<beginning>.*?)                                   # beginning might be...
                                                                #           path
                                                                #           untitled, find results, other useless junk
                                                                #                                               
por 12.06.2015 / 23:40
2

O que você está procurando parece um recurso de janela de marcação . Eu duvido que o KDE tenha suporte para isso, outros WMs (como o XMonad ou o DWM etc) fazem isso.

Assim, uma possibilidade para alcançar esse aumento de produtividade seria trocar kwin para XMonad e configure o XMonad para fazer tagging . O mecanismo de marcação do XMonad, conforme descrito no segundo link, seria vincular uma combinação de teclas para abrir um prompt que permite marcar a janela focalizada. (A configuração do XMonad é na verdade um programa do Haskell, então não hesite em pedir ajuda no #xmonad.

Editar: Enquanto eu aconselho a todos que ao menos tentem um WM lado a lado algum tempo, esqueci de apontar que enquanto o XMonad é comumente chamado de WM lado a lado, existe um "simples float "-mode. Certamente existem outros WMs que suportam layouts de marcação e não-mosaicos, mas eu não sei sobre sua interoperabilidade com o KDE.

    
por 19.10.2011 / 13:54
1

Como não há como definir o título da janela para proteção contra gravação, não haverá solução para esse problema, já que muitos programas redefinem seu título em ações diferentes, como você já descobriu.

Mas talvez uma boa sugestão para as pessoas do KDE e do Gnome; -)

    
por 14.10.2011 / 11:15
0

Eu estava procurando a mesma coisa e pelo mesmo motivo. Acabou passando muito tempo nisso, com esse script de 70 linhas.

Como funciona?

  • inicie o script
  • clique na janela em que você deseja definir um título
  • e insira o título desejado

Em seguida, iniciará um loop em segundo plano, verificará a cada 3 segundos e definirá o título se ele mudar.

Atenção: não corra duas vezes na mesma janela, o script não é perfeito.

nome do script de exemplo: sticky-title

#!/bin/bash


# stop all instance of this script if "killall" provided as first argument
if [ "$1" == "killall" ]; then
  scriptname=$(basename "$0")
  pattern="[0-9]* /bin/bash .*$scriptname$"
  pids=$(ps ax -o pid,cmd | grep -P "$pattern" | sed 's/^ *//;s/ *$//' | grep -Pv ' grep|killall$' | cut -d" " -f1)
  if [ "$pids" != "" ]; then
    kill -TERM $pids
    echo "$(echo '$pids' | wc -l) instances stopped"
  else
    echo "None found to stop"
  fi
  exit 0
fi

# ask for window
echo -en "\nClick the window you want to set its title "
id=$(printf %i $(xwininfo | grep 'Window id' | cut -d" " -f4))

# fail if no window id
if [ "$id" == "" ]; then
  echo 'Error: Window id not found'
  exit 1
else
  echo "- Got it"
fi

# ask for title
read -e -p "Enter target title: " title

# fail if no title
if [ "$title" == "" ]; then
  echo "Error: No title to set"
  exit 1
fi

# define loop as a function, so we can run it in background
windowByIdSetStickyTitle() {
  local id title curr_title
  id="$1"
  title="$2"

  while true; do
    # get current title
    curr_title="$(xdotool getwindowname $id 2>/dev/null)"

    # exit if we can't find window anymore
    if [ $? -ne 0 ]; then
      echo "Window id does not exist anymore"
      break
    fi

    # update title if changed
    if [ "$curr_title" != "$title" ]; then
      xdotool set_window --name "$title" $id
    fi

    # needed else you will eat up a significant amount of cpu
    sleep 3
  done
}

# infinite loop
windowByIdSetStickyTitle $id "$title" &


# done
echo "Sticky title set"
exit 0
    
por 10.07.2015 / 02:11