diff options
Diffstat (limited to 'src/gui/agroup.c')
-rw-r--r-- | src/gui/agroup.c | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/src/gui/agroup.c b/src/gui/agroup.c new file mode 100644 index 0000000..00dbaef --- /dev/null +++ b/src/gui/agroup.c @@ -0,0 +1,153 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * agroup.h - prototypes pour l'activation et la désactivation de tous les raccourcis clavier + * + * Copyright (C) 2018 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "agroup.h" + + +#include <stdbool.h> + + +#include "core/global.h" + + + +/* Détermine si un élément graphique peut être actionné. */ +static gboolean enable_accel_all_the_time(GtkWidget *, guint, gpointer); + +/* Détermine si un élément graphique peut être actionné. */ +static gboolean enable_accel_with_care(GtkWidget *, guint, gpointer); + + + +/* Suivi des autorisations suivant la zone active. */ +static bool _entry_focused = false; + + + +/****************************************************************************** +* * +* Paramètres : widget = composant graphique à analyser. * +* signal_id = identifiant de signal. * +* unused = adresse non utilisée ici. * +* * +* Description : Détermine si un élément graphique peut être actionné. * +* * +* Retour : TRUE si l'élément de menu est accessible. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gboolean enable_accel_all_the_time(GtkWidget *widget, guint signal_id, gpointer unused) +{ + gboolean result; /* Indication à retourner */ + + result = gtk_widget_is_sensitive(widget); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : widget = composant graphique à analyser. * +* signal_id = identifiant de signal. * +* unused = adresse non utilisée ici. * +* * +* Description : Détermine si un élément graphique peut être actionné. * +* * +* Retour : TRUE si l'élément de menu est accessible. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gboolean enable_accel_with_care(GtkWidget *widget, guint signal_id, gpointer unused) +{ + gboolean result; /* Indication à retourner */ + + result = !_entry_focused && enable_accel_all_the_time(widget, signal_id, unused); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : widget = composant GTK à traiter. * +* accelerator = description sous forme de chaîne de caractères.* +* group = groupe d'appartenance du raccourci. * +* * +* Description : Ajoute un accélérateur à un composant graphique. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void add_accelerator_to_widget(GtkWidget *widget, const char *accelerator) +{ + guint key; /* Touche concernée */ + GdkModifierType mods; /* Eventuels modificateurs */ + GtkAccelGroup *group; /* Groupe de raccourcis */ + + gtk_accelerator_parse(accelerator, &key, &mods); + + if (mods == 0) + g_signal_connect(widget, "can-activate-accel", G_CALLBACK(enable_accel_with_care), NULL); + else + g_signal_connect(widget, "can-activate-accel", G_CALLBACK(enable_accel_all_the_time), NULL); + + group = get_accel_group(); + + gtk_widget_add_accelerator(widget, "activate", group, + key, mods, GTK_ACCEL_VISIBLE); + +} + + +/****************************************************************************** +* * +* Paramètres : widget = composant GTK à l'origine de la procédure. * +* event = informations liées à l'événement. * +* unused = adresse non utilisée ici. * +* * +* Description : Prend note d'un changement de focus sur une zone de saisie. * +* * +* Retour : FALSE pour poursuivre la propagation de l'événement. * +* * +* Remarques : - * +* * +******************************************************************************/ + +gboolean track_focus_change_in_text_area(GtkWidget *widget, GdkEventFocus *event, gpointer unused) +{ + _entry_focused = event->in; + + return FALSE; + +} |