Tips para Empathy: Como cerrar la ventana con Esc y cambiar el Shortcut de cambio de ventanas
May 18
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.
- No puedo cambiar entre las ventanas con Ctrl + Tab
- 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
. 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>














