forked from AuroraMiddleware/gtk
shortcuttrigger: Add hash(), equal(), and compare() functions
Those are useful for putting triggers in hash tables or getting sorted output.
This commit is contained in:
parent
0c81698911
commit
673a0463e0
@ -6009,6 +6009,9 @@ gtk_shortcut_trigger_unref
|
|||||||
GtkShortcutTriggerType
|
GtkShortcutTriggerType
|
||||||
gtk_shortcut_trigger_get_trigger_type
|
gtk_shortcut_trigger_get_trigger_type
|
||||||
gtk_shortcut_trigger_trigger
|
gtk_shortcut_trigger_trigger
|
||||||
|
gtk_shortcut_trigger_hash
|
||||||
|
gtk_shortcut_trigger_equal
|
||||||
|
gtk_shortcut_trigger_compare
|
||||||
gtk_shortcut_trigger_to_string
|
gtk_shortcut_trigger_to_string
|
||||||
gtk_shortcut_trigger_print
|
gtk_shortcut_trigger_print
|
||||||
gtk_shortcut_trigger_to_label
|
gtk_shortcut_trigger_to_label
|
||||||
|
@ -62,6 +62,9 @@ struct _GtkShortcutTriggerClass
|
|||||||
gboolean (* trigger) (GtkShortcutTrigger *trigger,
|
gboolean (* trigger) (GtkShortcutTrigger *trigger,
|
||||||
GdkEvent *event,
|
GdkEvent *event,
|
||||||
gboolean enable_mnemonics);
|
gboolean enable_mnemonics);
|
||||||
|
guint (* hash) (GtkShortcutTrigger *trigger);
|
||||||
|
int (* compare) (GtkShortcutTrigger *trigger1,
|
||||||
|
GtkShortcutTrigger *trigger2);
|
||||||
void (* print) (GtkShortcutTrigger *trigger,
|
void (* print) (GtkShortcutTrigger *trigger,
|
||||||
GString *string);
|
GString *string);
|
||||||
gboolean (* print_label) (GtkShortcutTrigger *trigger,
|
gboolean (* print_label) (GtkShortcutTrigger *trigger,
|
||||||
@ -287,6 +290,80 @@ gtk_shortcut_trigger_print_label (GtkShortcutTrigger *self,
|
|||||||
return self->trigger_class->print_label (self, display, string);
|
return self->trigger_class->print_label (self, display, string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gtk_shortcut_trigger_hash:
|
||||||
|
* @trigger: (type GtkShortcutTrigger): a #GtkShortcutTrigger
|
||||||
|
*
|
||||||
|
* Generates a hash value for a #GtkShortcutTrigger.
|
||||||
|
*
|
||||||
|
* The output of this function is guaranteed to be the same for a given
|
||||||
|
* value only per-process. It may change between different processor
|
||||||
|
* architectures or even different versions of GTK. Do not use this
|
||||||
|
* function as a basis for building protocols or file formats.
|
||||||
|
*
|
||||||
|
* The types of @trigger is #gconstpointer only to allow use of this
|
||||||
|
* function with #GHashTable. They must each be a #GtkShortcutTrigger.
|
||||||
|
*
|
||||||
|
* Returns: a hash value corresponding to @trigger
|
||||||
|
**/
|
||||||
|
guint
|
||||||
|
gtk_shortcut_trigger_hash (gconstpointer trigger)
|
||||||
|
{
|
||||||
|
GtkShortcutTrigger *t = (GtkShortcutTrigger *) trigger;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (trigger), 0);
|
||||||
|
|
||||||
|
return t->trigger_class->hash (t);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gtk_shortcut_trigger_equal:
|
||||||
|
* @trigger1: (type GtkShortcutTrigger): a #GtkShortcutTrigger
|
||||||
|
* @trigger2: (type GtkShortcutTrigger): a #GtkShortcutTrigger
|
||||||
|
*
|
||||||
|
* Checks if @trigger1 and @trigger2 trigger under the same conditions.
|
||||||
|
*
|
||||||
|
* The types of @one and @two are #gconstpointer only to allow use of this
|
||||||
|
* function with #GHashTable. They must each be a #GtkShortcutTrigger.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if @trigger1 and @trigger2 are equal
|
||||||
|
**/
|
||||||
|
gboolean
|
||||||
|
gtk_shortcut_trigger_equal (gconstpointer trigger1,
|
||||||
|
gconstpointer trigger2)
|
||||||
|
{
|
||||||
|
return gtk_shortcut_trigger_compare (trigger1, trigger2) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gtk_shortcut_trigger_compare:
|
||||||
|
* @trigger1: (type GtkShortcutTrigger): a #GtkShortcutTrigger
|
||||||
|
* @trigger2: (type GtkShortcutTrigger): a #GtkShortcutTrigger
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* The types of @one and @two are #gconstpointer only to allow use of this
|
||||||
|
* function as a #GCompareFunc. They must each be a #GtkShortcutTrigger.
|
||||||
|
*
|
||||||
|
* Returns: An integer less than, equal to, or greater than zero if
|
||||||
|
* @trigger1 is found, respectively, to be less than, to match,
|
||||||
|
* or be greater than @trigger2.
|
||||||
|
**/
|
||||||
|
gint
|
||||||
|
gtk_shortcut_trigger_compare (gconstpointer trigger1,
|
||||||
|
gconstpointer trigger2)
|
||||||
|
{
|
||||||
|
GtkShortcutTrigger *t1 = (GtkShortcutTrigger *) trigger1;
|
||||||
|
GtkShortcutTrigger *t2 = (GtkShortcutTrigger *) trigger2;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (trigger1), -1);
|
||||||
|
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (trigger2), 1);
|
||||||
|
|
||||||
|
if (t1->trigger_class != t2->trigger_class)
|
||||||
|
return t1->trigger_class->trigger_type - t2->trigger_class->trigger_type;
|
||||||
|
|
||||||
|
return t1->trigger_class->compare (t1, t2);
|
||||||
|
}
|
||||||
|
|
||||||
/*** GTK_SHORTCUT_TRIGGER_NEVER ***/
|
/*** GTK_SHORTCUT_TRIGGER_NEVER ***/
|
||||||
|
|
||||||
typedef struct _GtkNeverTrigger GtkNeverTrigger;
|
typedef struct _GtkNeverTrigger GtkNeverTrigger;
|
||||||
@ -313,6 +390,19 @@ gtk_never_trigger_trigger (GtkShortcutTrigger *trigger,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
gtk_never_trigger_hash (GtkShortcutTrigger *trigger)
|
||||||
|
{
|
||||||
|
return GTK_SHORTCUT_TRIGGER_NEVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
gtk_never_trigger_compare (GtkShortcutTrigger *trigger1,
|
||||||
|
GtkShortcutTrigger *trigger2)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_never_trigger_print (GtkShortcutTrigger *trigger,
|
gtk_never_trigger_print (GtkShortcutTrigger *trigger,
|
||||||
GString *string)
|
GString *string)
|
||||||
@ -335,6 +425,8 @@ static const GtkShortcutTriggerClass GTK_NEVER_TRIGGER_CLASS = {
|
|||||||
"GtkNeverTrigger",
|
"GtkNeverTrigger",
|
||||||
gtk_never_trigger_finalize,
|
gtk_never_trigger_finalize,
|
||||||
gtk_never_trigger_trigger,
|
gtk_never_trigger_trigger,
|
||||||
|
gtk_never_trigger_hash,
|
||||||
|
gtk_never_trigger_compare,
|
||||||
gtk_never_trigger_print,
|
gtk_never_trigger_print,
|
||||||
gtk_never_trigger_print_label
|
gtk_never_trigger_print_label
|
||||||
};
|
};
|
||||||
@ -397,6 +489,30 @@ gtk_keyval_trigger_trigger (GtkShortcutTrigger *trigger,
|
|||||||
return keyval == self->keyval && modifiers == self->modifiers;
|
return keyval == self->keyval && modifiers == self->modifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
gtk_keyval_trigger_hash (GtkShortcutTrigger *trigger)
|
||||||
|
{
|
||||||
|
GtkKeyvalTrigger *self = (GtkKeyvalTrigger *) trigger;
|
||||||
|
|
||||||
|
return (self->modifiers << 24)
|
||||||
|
| (self->modifiers >> 8)
|
||||||
|
| (self->keyval << 16)
|
||||||
|
| GTK_SHORTCUT_TRIGGER_KEYVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
gtk_keyval_trigger_compare (GtkShortcutTrigger *trigger1,
|
||||||
|
GtkShortcutTrigger *trigger2)
|
||||||
|
{
|
||||||
|
GtkKeyvalTrigger *self1 = (GtkKeyvalTrigger *) trigger1;
|
||||||
|
GtkKeyvalTrigger *self2 = (GtkKeyvalTrigger *) trigger2;
|
||||||
|
|
||||||
|
if (self1->modifiers != self2->modifiers)
|
||||||
|
return self2->modifiers - self1->modifiers;
|
||||||
|
|
||||||
|
return self1->keyval - self2->keyval;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_keyval_trigger_print (GtkShortcutTrigger *trigger,
|
gtk_keyval_trigger_print (GtkShortcutTrigger *trigger,
|
||||||
GString *string)
|
GString *string)
|
||||||
@ -428,6 +544,8 @@ static const GtkShortcutTriggerClass GTK_KEYVAL_TRIGGER_CLASS = {
|
|||||||
"GtkKeyvalTrigger",
|
"GtkKeyvalTrigger",
|
||||||
gtk_keyval_trigger_finalize,
|
gtk_keyval_trigger_finalize,
|
||||||
gtk_keyval_trigger_trigger,
|
gtk_keyval_trigger_trigger,
|
||||||
|
gtk_keyval_trigger_hash,
|
||||||
|
gtk_keyval_trigger_compare,
|
||||||
gtk_keyval_trigger_print,
|
gtk_keyval_trigger_print,
|
||||||
gtk_keyval_trigger_print_label
|
gtk_keyval_trigger_print_label
|
||||||
};
|
};
|
||||||
@ -539,6 +657,25 @@ gtk_mnemonic_trigger_trigger (GtkShortcutTrigger *trigger,
|
|||||||
return keyval == self->keyval;
|
return keyval == self->keyval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
gtk_mnemonic_trigger_hash (GtkShortcutTrigger *trigger)
|
||||||
|
{
|
||||||
|
GtkMnemonicTrigger *self = (GtkMnemonicTrigger *) trigger;
|
||||||
|
|
||||||
|
return (self->keyval << 8)
|
||||||
|
| GTK_SHORTCUT_TRIGGER_MNEMONIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
gtk_mnemonic_trigger_compare (GtkShortcutTrigger *trigger1,
|
||||||
|
GtkShortcutTrigger *trigger2)
|
||||||
|
{
|
||||||
|
GtkMnemonicTrigger *self1 = (GtkMnemonicTrigger *) trigger1;
|
||||||
|
GtkMnemonicTrigger *self2 = (GtkMnemonicTrigger *) trigger2;
|
||||||
|
|
||||||
|
return self1->keyval - self2->keyval;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_mnemonic_trigger_print (GtkShortcutTrigger *trigger,
|
gtk_mnemonic_trigger_print (GtkShortcutTrigger *trigger,
|
||||||
GString *string)
|
GString *string)
|
||||||
@ -576,6 +713,8 @@ static const GtkShortcutTriggerClass GTK_MNEMONIC_TRIGGER_CLASS = {
|
|||||||
"GtkMnemonicTrigger",
|
"GtkMnemonicTrigger",
|
||||||
gtk_mnemonic_trigger_finalize,
|
gtk_mnemonic_trigger_finalize,
|
||||||
gtk_mnemonic_trigger_trigger,
|
gtk_mnemonic_trigger_trigger,
|
||||||
|
gtk_mnemonic_trigger_hash,
|
||||||
|
gtk_mnemonic_trigger_compare,
|
||||||
gtk_mnemonic_trigger_print,
|
gtk_mnemonic_trigger_print,
|
||||||
gtk_mnemonic_trigger_print_label
|
gtk_mnemonic_trigger_print_label
|
||||||
};
|
};
|
||||||
@ -663,6 +802,36 @@ gtk_alternative_trigger_trigger (GtkShortcutTrigger *trigger,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
gtk_alternative_trigger_hash (GtkShortcutTrigger *trigger)
|
||||||
|
{
|
||||||
|
GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
|
||||||
|
guint result;
|
||||||
|
|
||||||
|
result = gtk_shortcut_trigger_hash (self->first);
|
||||||
|
result <<= 5;
|
||||||
|
|
||||||
|
result |= gtk_shortcut_trigger_hash (self->second);
|
||||||
|
result <<= 5;
|
||||||
|
|
||||||
|
return result | GTK_SHORTCUT_TRIGGER_ALTERNATIVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
gtk_alternative_trigger_compare (GtkShortcutTrigger *trigger1,
|
||||||
|
GtkShortcutTrigger *trigger2)
|
||||||
|
{
|
||||||
|
GtkAlternativeTrigger *self1 = (GtkAlternativeTrigger *) trigger1;
|
||||||
|
GtkAlternativeTrigger *self2 = (GtkAlternativeTrigger *) trigger2;
|
||||||
|
int cmp;
|
||||||
|
|
||||||
|
cmp = gtk_shortcut_trigger_compare (self1->first, self2->first);
|
||||||
|
if (cmp != 0)
|
||||||
|
return cmp;
|
||||||
|
|
||||||
|
return gtk_shortcut_trigger_compare (self1->second, self2->second);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_alternative_trigger_print (GtkShortcutTrigger *trigger,
|
gtk_alternative_trigger_print (GtkShortcutTrigger *trigger,
|
||||||
GString *string)
|
GString *string)
|
||||||
@ -700,6 +869,8 @@ static const GtkShortcutTriggerClass GTK_ALTERNATIVE_TRIGGER_CLASS = {
|
|||||||
"GtkAlternativeTrigger",
|
"GtkAlternativeTrigger",
|
||||||
gtk_alternative_trigger_finalize,
|
gtk_alternative_trigger_finalize,
|
||||||
gtk_alternative_trigger_trigger,
|
gtk_alternative_trigger_trigger,
|
||||||
|
gtk_alternative_trigger_hash,
|
||||||
|
gtk_alternative_trigger_compare,
|
||||||
gtk_alternative_trigger_print,
|
gtk_alternative_trigger_print,
|
||||||
gtk_alternative_trigger_print_label
|
gtk_alternative_trigger_print_label
|
||||||
};
|
};
|
||||||
|
@ -75,6 +75,15 @@ gboolean gtk_shortcut_trigger_print_label (GtkShortcutTrig
|
|||||||
GdkDisplay *display,
|
GdkDisplay *display,
|
||||||
GString *string);
|
GString *string);
|
||||||
|
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
guint gtk_shortcut_trigger_hash (gconstpointer trigger);
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
gboolean gtk_shortcut_trigger_equal (gconstpointer trigger1,
|
||||||
|
gconstpointer trigger2);
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
gint gtk_shortcut_trigger_compare (gconstpointer trigger1,
|
||||||
|
gconstpointer trigger2);
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_ALL
|
GDK_AVAILABLE_IN_ALL
|
||||||
gboolean gtk_shortcut_trigger_trigger (GtkShortcutTrigger *self,
|
gboolean gtk_shortcut_trigger_trigger (GtkShortcutTrigger *self,
|
||||||
GdkEvent *event,
|
GdkEvent *event,
|
||||||
|
Loading…
Reference in New Issue
Block a user