|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2006
Città: Borgosesia (VC)
Messaggi: 509
|
[C e GTK+] Shortcuts "a doppio livello", tipo Emacs
Credo che mi possiate dare una mano. Ho una finestra GTK+ entro cui vorrei catturare delle shortcuts da tastiera "a doppio livello", sulla falsariga di quelle di Emacs. Esempi: "Ctrl-X Ctrl-C" oppure "Ctrl-X S", ecc.
Il primo livello (Ctrl-X negli esempi sopra) non mi dà problemi, lo intercetto con una routine di questo tipo, collegata al segnale di keystroke dell'oggetto GTK+. Codice:
gboolean combinazione_tasti(GtkWidget *vista, GdkEventKey *evento) { if((evento->keyval == (GDK_k) || evento->keyval == (GDK_K)) && evento->state & GDK_CONTROL_MASK) { block_and_save(vista, evento); return TRUE; } else return FALSE; } Any ideas? Gracias, Lorenzo |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Feb 2008
Messaggi: 269
|
Non ho mai usato né C né le GTK+, ma se ho capito quello che vuoi fare, un modo potrebbe essere questo:
__________________
CPU: AMD Athlon X2 7750BE 3.15Ghz@vcore 1.3750 / NorthBridge: 2250Mhz@1.3125v RAM: Mushkin XP2 Radioactive 4GB 900Mhz@4-4-4-12-1T / HyperTransport: 2025Mhz VGA: Club3D Radeon HD4850 / HDD: Western Digital Caviar RE3 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jun 2006
Città: Borgosesia (VC)
Messaggi: 509
|
Anzitutto grazie per il suggerimento, che non ho applicato alla lettera (non me ne vorrai...
![]() Codice:
gboolean combinazione_tasti(GtkWidget *vista, GdkEventKey *evento) { if((evento->keyval == (GDK_k) || evento->keyval == (GDK_K)) && evento->state & GDK_CONTROL_MASK) { comando_attivo = TRUE; return TRUE; } else if(comando_attivo == TRUE) { if(evento->keyval == (GDK_t) || evento->keyval == (GDK_T)) { salva_file((gpointer) "file.save"); comando_attivo = FALSE; return TRUE; } } return FALSE; } |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Feb 2008
Messaggi: 269
|
Ci mancherebbe, è giusto che prendi i suggerimenti e fai le cose alla tua maniera
![]() Comunque più che una funzione di timeout, il mio suggerimento era di affiancare alla variabile boolean anche una long, dove salvare un timestamp quando viene premuta la prima combinazione. in questo modo, quando viene premuta la seconda combinazione puoi controllare che la precedente pressione non sia troppo vecchia, confrontando il timestamp attuale, con quello salvato. Questo però ti serve solo se una combinazione può essere usata (con funzioni diverse) sia singolarmente che come (ultima) parte di una doppia combinazione. per quanto riguarda la tua seconda domanda, il listener della tastiera dev'essere uno solo (vado per logica, non conosco GTK+ quindi magari prevede altri meccanismi ma non penso), per snellire la funzione puoi includere solo la parte di riconoscimento degli shortcut, per poi delegare la creazione di ogni menu a una funzione dedicata.
__________________
CPU: AMD Athlon X2 7750BE 3.15Ghz@vcore 1.3750 / NorthBridge: 2250Mhz@1.3125v RAM: Mushkin XP2 Radioactive 4GB 900Mhz@4-4-4-12-1T / HyperTransport: 2025Mhz VGA: Club3D Radeon HD4850 / HDD: Western Digital Caviar RE3 |
![]() |
![]() |
![]() |
#5 | ||
Senior Member
Iscritto dal: Jun 2006
Città: Borgosesia (VC)
Messaggi: 509
|
Quote:
Quote:
Grazie delle "dritte" comunque... Non è che io sia molto esperto in fatto di programmazione, anzi! ![]() Lo' |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:31.