Acnezine PA Hire London Bali Real Estate

Tips para Empathy: Como cerrar la ventana con Esc y cambiar el Shortcut de cambio de ventanas

May 18

Tips para Empathy: Como cerrar la ventana con Esc y cambiar el Shortcut de cambio de ventanas

El otro dia decidi borrar Pidgin de mi Ubuntu 11.04 e instalarme Empathy debido a su gran integracion.
Apenas me puse a probar la aplicacion le encontre 2 grandes problemas.

  1. No puedo cambiar entre las ventanas con Ctrl + Tab
  2. No puedo cerrar la ventana existente con Esc o Escape

Segun los creadores de Empathy estos no son bugs, sino que GNome dice que Escape = Cancelar y Ctrl + Tab = cambiar foco entre elementos de texto. Es por esto que para ser consistentes con GNome no quieren poner en su codigo estas opciones.

Luego de averiguar durante un largo rato encontre la soluciona a este problema.

Hay un archivo en el file system donde estan configuradas todas las acciones que se pueden realizar sobre nuestra ventana de GTK. Dichas acciones tienen lo que se llama “Accelerators” que son shortcuts de teclado.

Primero vamos a ir al archivo: /usr/share/empathy/empathy-chat-window.ui

Vamos a editarlo como sudo ( sudo gedit /usr/share/empathy/empathy-chat-window.ui).

Una vez abierto veran que es un XML comun y corriente con diversas acciones.

Primero que nada van a buscar la siguiente linea:

1
<object class="GtkAction" id="menu_conv_close">
<object class="GtkAction" id="menu_conv_close">

Van a ver que abajo de esta linea habra alguna parecida a:

1
<accelerator key="q" modifiers="GDK_CONTROL_MASK"/>
<accelerator key="q" modifiers="GDK_CONTROL_MASK"/>

Esto lo que dice es que para poder cerrar la conversacion se debe tocar Ctrl + K. Nosotros queremos cambiarlo por Escape, entonces cambiamos la linea anterior por:

1
<accelerator key="Escape"/>
<accelerator key="Escape"/>

y listo :) .

Yendo al segunda problema de cambiar las ventanas con Ctrl + Tab es un poco mas complicado. Por defecto, GNome no nos deja cambiar las ventanas con Ctrl + Tab y a su vez, no deja a ninguna aplicacion GTK bindear un shortcut a la tecla Tab. Si quisieramos hacer esto, deberiamos tocar el codigo de Empathy y cambiar un FLAG para que nos deje pisar lo que GNome nos dice. Como esto iba a ser mucho trabajo, decidi cambiar Ctrl + Tab y Ctrl + Shift + Tab por Ctrl + A en este caso, lo cual es bastante parecido.

Entonces buscaremos ahora en el mismo archivo las siguientes 2 lineas

1
<object class="GtkAction" id="menu_tabs_prev">
<object class="GtkAction" id="menu_tabs_prev">
1
<object class="GtkAction" id="menu_tabs_next">
<object class="GtkAction" id="menu_tabs_next">

Y cambiaremos sus dos accelerators. Los shortcuts actuales dicen que para cambiar de tab hay que usar Ctrl + PageDown, lo cual implica que para ese shortcut tengo que usar 3 manos aproximadamente :P . Entonces los cambie por los siguientes respectivamente:

1
<accelerator key="a" modifiers="GDK_CONTROL_MASK|GDK_SHIFT_MASK"/>
<accelerator key="a" modifiers="GDK_CONTROL_MASK|GDK_SHIFT_MASK"/>
1
<accelerator key="a" modifiers="GDK_CONTROL_MASK"/>
<accelerator key="a" modifiers="GDK_CONTROL_MASK"/>

Luego de esto, reiniciamos Empathy y voila!

Les dejo mi archivo de configuracion por deciden pisarlo directamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
<?xml version="1.0"?>
<!--*- mode: xml -*-->
<interface>
  <object class="GtkUIManager" id="ui_manager">
    <child>
      <object class="GtkActionGroup" id="actiongroup1">
        <child>
          <object class="GtkAction" id="menu_conv">
<property name="name">menu_conv</property>
<property name="label" translatable="yes">_Conversation</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_conv_clear">
<property name="stock_id">gtk-clear</property>
<property name="name">menu_conv_clear</property>
<property name="label" translatable="yes">C_lear</property>
          </object>
          <accelerator key="L" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_conv_insert_smiley">
<property name="icon-name">face-smile</property>
<property name="name">menu_conv_insert_smiley</property>
<property name="label" translatable="yes">Insert _Smiley</property>
          </object>
        </child>
        <child>
          <object class="GtkToggleAction" id="menu_conv_favorite">
<property name="name">menu_conv_favorite</property>
<property name="label" translatable="yes">_Favorite Chat Room</property>
          </object>
        </child>
        <child>
          <object class="GtkToggleAction" id="menu_conv_always_urgent">
<property name="name">menu_conv_always_urgent</property>
<property name="label" translatable="yes">Notify for All Messages</property>
          </object>
        </child>
        <child>
          <object class="GtkToggleAction" id="menu_conv_toggle_contacts">
<property name="name">menu_conv_toggle_contacts</property>
<property name="active">TRUE</property>
<property name="label" translatable="yes">_Show Contact List</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_conv_invite_participant">
<property name="name">menu_conv_invite_participant</property>
<property name="label" translatable="yes">Invite _Participant…</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_conv_close">
<property name="stock_id">gtk-close</property>
<property name="name">menu_conv_close</property>
          </object>
          <accelerator key="Escape"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_contact">
<property name="name">menu_contact</property>
<property name="label" translatable="yes">C_ontact</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_edit">
<property name="name">menu_edit</property>
<property name="label" translatable="yes">_Edit</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_edit_cut">
<property name="stock_id">gtk-cut</property>
<property name="name">menu_edit_cut</property>
          </object>
          <accelerator key="X" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_edit_copy">
<property name="stock_id">gtk-copy</property>
<property name="name">menu_edit_copy</property>
          </object>
          <accelerator key="C" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_edit_paste">
<property name="stock_id">gtk-paste</property>
<property name="name">menu_edit_paste</property>
          </object>
          <accelerator key="V" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_edit_find">
<property name="stock_id">gtk-find</property>
<property name="name">menu_edit_find</property>
          </object>
          <accelerator key="F" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs">
<property name="name">menu_tabs</property>
<property name="label" translatable="yes">_Tabs</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_prev">
<property name="name">menu_tabs_prev</property>
<property name="label" translatable="yes">_Previous Tab</property>
          </object>
          <accelerator key="a" modifiers="GDK_CONTROL_MASK|GDK_SHIFT_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_next">
<property name="name">menu_tabs_next</property>
<property name="label" translatable="yes">_Next Tab</property>
          </object>
          <accelerator key="a" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_undo_close_tab">
<property name="name">menu_tabs_undo_close_tab</property>
<property name="label" translatable="yes">_Undo Close Tab</property>
          </object>
          <accelerator key="t" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_left">
<property name="name">menu_tabs_left</property>
<property name="label" translatable="yes">Move Tab _Left</property>
          </object>
          <accelerator key="Page_Up" modifiers="GDK_CONTROL_MASK|GDK_SHIFT_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_right">
<property name="name">menu_tabs_right</property>
<property name="label" translatable="yes">Move Tab _Right</property>
          </object>
          <accelerator key="Page_Down" modifiers="GDK_CONTROL_MASK|GDK_SHIFT_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_detach">
<property name="name">menu_tabs_detach</property>
<property name="label" translatable="yes">_Detach Tab</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_help">
<property name="name">menu_help</property>
<property name="label" translatable="yes">_Help</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_help_contents">
<property name="stock_id">gtk-help</property>
<property name="name">menu_help_contents</property>
<property name="label" translatable="yes">_Contents</property>
          </object>
          <accelerator key="F1" modifiers=""/>
        </child>
        <child>
          <object class="GtkAction" id="menu_help_about">
<property name="stock_id">gtk-about</property>
<property name="name">menu_help_about</property>
          </object>
        </child>
      </object>
    </child>
    <ui>
<menubar name="chats_menubar">
<menu action="menu_conv">
<menuitem action="menu_conv_clear"/>
<menuitem action="menu_conv_insert_smiley"/>
<menuitem action="menu_conv_favorite"/>
<menuitem action="menu_conv_always_urgent"/>
<menuitem action="menu_conv_toggle_contacts"/>
<menuitem action="menu_conv_invite_participant"/>
          <separator/>
<menuitem action="menu_conv_close"/>
        </menu>
<menu action="menu_contact" />
<menu action="menu_edit">
<menuitem action="menu_edit_cut"/>
<menuitem action="menu_edit_copy"/>
<menuitem action="menu_edit_paste"/>
          <separator/>
<menuitem action="menu_edit_find"/>
        </menu>
<menu action="menu_tabs">
<menuitem action="menu_tabs_prev"/>
<menuitem action="menu_tabs_next"/>
<menuitem action="menu_tabs_undo_close_tab"/>
          <separator/>
<menuitem action="menu_tabs_left"/>
<menuitem action="menu_tabs_right"/>
<menuitem action="menu_tabs_detach"/>
        </menu>
<menu action="menu_help">
<menuitem action="menu_help_contents"/>
<placeholder name="LaunchpadItems"/>
<menuitem action="menu_help_about"/>
        </menu>
</menubar>
    </ui>
  </object>
  <object class="GtkWindow" id="chat_window">
<property name="title" translatable="yes">Chat</property>
<property name="role">chat</property>
<property name="default_width">580</property>
<property name="default_height">480</property>
    <child>
      <object class="GtkVBox" id="chat_vbox">
<property name="visible">True</property>
        <child>
          <object class="GtkMenuBar" constructor="ui_manager" id="chats_menubar">
<property name="visible">True</property>
          </object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
          </packing>
        </child>
        <child>
<placeholder/>
        </child>
      </object>
    </child>
  </object>
</interface>
<?xml version="1.0"?>
<!--*- mode: xml -*-->
<interface>
  <object class="GtkUIManager" id="ui_manager">
    <child>
      <object class="GtkActionGroup" id="actiongroup1">
        <child>
          <object class="GtkAction" id="menu_conv">
<property name="name">menu_conv</property>
<property name="label" translatable="yes">_Conversation</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_conv_clear">
<property name="stock_id">gtk-clear</property>
<property name="name">menu_conv_clear</property>
<property name="label" translatable="yes">C_lear</property>
          </object>
          <accelerator key="L" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_conv_insert_smiley">
<property name="icon-name">face-smile</property>
<property name="name">menu_conv_insert_smiley</property>
<property name="label" translatable="yes">Insert _Smiley</property>
          </object>
        </child>
        <child>
          <object class="GtkToggleAction" id="menu_conv_favorite">
<property name="name">menu_conv_favorite</property>
<property name="label" translatable="yes">_Favorite Chat Room</property>
          </object>
        </child>
        <child>
          <object class="GtkToggleAction" id="menu_conv_always_urgent">
<property name="name">menu_conv_always_urgent</property>
<property name="label" translatable="yes">Notify for All Messages</property>
          </object>
        </child>
        <child>
          <object class="GtkToggleAction" id="menu_conv_toggle_contacts">
<property name="name">menu_conv_toggle_contacts</property>
<property name="active">TRUE</property>
<property name="label" translatable="yes">_Show Contact List</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_conv_invite_participant">
<property name="name">menu_conv_invite_participant</property>
<property name="label" translatable="yes">Invite _Participant…</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_conv_close">
<property name="stock_id">gtk-close</property>
<property name="name">menu_conv_close</property>
          </object>
          <accelerator key="Escape"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_contact">
<property name="name">menu_contact</property>
<property name="label" translatable="yes">C_ontact</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_edit">
<property name="name">menu_edit</property>
<property name="label" translatable="yes">_Edit</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_edit_cut">
<property name="stock_id">gtk-cut</property>
<property name="name">menu_edit_cut</property>
          </object>
          <accelerator key="X" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_edit_copy">
<property name="stock_id">gtk-copy</property>
<property name="name">menu_edit_copy</property>
          </object>
          <accelerator key="C" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_edit_paste">
<property name="stock_id">gtk-paste</property>
<property name="name">menu_edit_paste</property>
          </object>
          <accelerator key="V" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_edit_find">
<property name="stock_id">gtk-find</property>
<property name="name">menu_edit_find</property>
          </object>
          <accelerator key="F" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs">
<property name="name">menu_tabs</property>
<property name="label" translatable="yes">_Tabs</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_prev">
<property name="name">menu_tabs_prev</property>
<property name="label" translatable="yes">_Previous Tab</property>
          </object>
          <accelerator key="a" modifiers="GDK_CONTROL_MASK|GDK_SHIFT_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_next">
<property name="name">menu_tabs_next</property>
<property name="label" translatable="yes">_Next Tab</property>
          </object>
          <accelerator key="a" modifiers="GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_undo_close_tab">
<property name="name">menu_tabs_undo_close_tab</property>
<property name="label" translatable="yes">_Undo Close Tab</property>
          </object>
          <accelerator key="t" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_left">
<property name="name">menu_tabs_left</property>
<property name="label" translatable="yes">Move Tab _Left</property>
          </object>
          <accelerator key="Page_Up" modifiers="GDK_CONTROL_MASK|GDK_SHIFT_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_right">
<property name="name">menu_tabs_right</property>
<property name="label" translatable="yes">Move Tab _Right</property>
          </object>
          <accelerator key="Page_Down" modifiers="GDK_CONTROL_MASK|GDK_SHIFT_MASK"/>
        </child>
        <child>
          <object class="GtkAction" id="menu_tabs_detach">
<property name="name">menu_tabs_detach</property>
<property name="label" translatable="yes">_Detach Tab</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_help">
<property name="name">menu_help</property>
<property name="label" translatable="yes">_Help</property>
          </object>
        </child>
        <child>
          <object class="GtkAction" id="menu_help_contents">
<property name="stock_id">gtk-help</property>
<property name="name">menu_help_contents</property>
<property name="label" translatable="yes">_Contents</property>
          </object>
          <accelerator key="F1" modifiers=""/>
        </child>
        <child>
          <object class="GtkAction" id="menu_help_about">
<property name="stock_id">gtk-about</property>
<property name="name">menu_help_about</property>
          </object>
        </child>
      </object>
    </child>
    <ui>
<menubar name="chats_menubar">
<menu action="menu_conv">
<menuitem action="menu_conv_clear"/>
<menuitem action="menu_conv_insert_smiley"/>
<menuitem action="menu_conv_favorite"/>
<menuitem action="menu_conv_always_urgent"/>
<menuitem action="menu_conv_toggle_contacts"/>
<menuitem action="menu_conv_invite_participant"/>
          <separator/>
<menuitem action="menu_conv_close"/>
        </menu>
<menu action="menu_contact" />
<menu action="menu_edit">
<menuitem action="menu_edit_cut"/>
<menuitem action="menu_edit_copy"/>
<menuitem action="menu_edit_paste"/>
          <separator/>
<menuitem action="menu_edit_find"/>
        </menu>
<menu action="menu_tabs">
<menuitem action="menu_tabs_prev"/>
<menuitem action="menu_tabs_next"/>
<menuitem action="menu_tabs_undo_close_tab"/>
          <separator/>
<menuitem action="menu_tabs_left"/>
<menuitem action="menu_tabs_right"/>
<menuitem action="menu_tabs_detach"/>
        </menu>
<menu action="menu_help">
<menuitem action="menu_help_contents"/>
<placeholder name="LaunchpadItems"/>
<menuitem action="menu_help_about"/>
        </menu>
</menubar>
    </ui>
  </object>
  <object class="GtkWindow" id="chat_window">
<property name="title" translatable="yes">Chat</property>
<property name="role">chat</property>
<property name="default_width">580</property>
<property name="default_height">480</property>
    <child>
      <object class="GtkVBox" id="chat_vbox">
<property name="visible">True</property>
        <child>
          <object class="GtkMenuBar" constructor="ui_manager" id="chats_menubar">
<property name="visible">True</property>
          </object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
          </packing>
        </child>
        <child>
<placeholder/>
        </child>
      </object>
    </child>
  </object>
</interface>