257 lines
7.2 KiB
C
257 lines
7.2 KiB
C
/*
|
|
* mooutils/moocompat.c
|
|
*
|
|
* Copyright (C) 2004-2006 by Yevgen Muntyan <muntyan@math.tamu.edu>
|
|
*
|
|
* This program 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 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* See COPYING file that comes with this distribution.
|
|
*/
|
|
|
|
/*
|
|
* Some functions here are taken from GTK+ and GLIB (http://gtk.org/)
|
|
*
|
|
* g_signal_accumulator_true_handled function is taken from gobject/gsignal.c;
|
|
* it's Copyright (C) 2000-2001 Red Hat, Inc.
|
|
*
|
|
* substitute_underscores, and gtk_accelerator_get_label are taken from gtk/gtkaccelgroup.c.
|
|
* it's Copyright (C) 1998, 2001 Tim Janik
|
|
*
|
|
* gtk_target_list_add_text_targets is from gtk/gtkselection.c
|
|
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
*/
|
|
|
|
|
|
#include "mooutils/moocompat.h"
|
|
#include <string.h>
|
|
|
|
|
|
#if !GLIB_CHECK_VERSION(2,4,0)
|
|
|
|
/* from gsignal.c */
|
|
gboolean
|
|
g_signal_accumulator_true_handled (GSignalInvocationHint *ihint,
|
|
GValue *return_accu,
|
|
const GValue *handler_return,
|
|
gpointer dummy)
|
|
{
|
|
gboolean continue_emission;
|
|
gboolean signal_handled;
|
|
|
|
signal_handled = g_value_get_boolean (handler_return);
|
|
g_value_set_boolean (return_accu, signal_handled);
|
|
continue_emission = !signal_handled;
|
|
|
|
return continue_emission;
|
|
}
|
|
|
|
|
|
void g_ptr_array_foreach (GPtrArray *array,
|
|
GFunc func,
|
|
gpointer data)
|
|
{
|
|
guint i;
|
|
for (i = 0; i < array->len; ++i)
|
|
(*func) (array->pdata[i], data);
|
|
}
|
|
|
|
void g_ptr_array_remove_range (GPtrArray *array,
|
|
guint index,
|
|
guint length)
|
|
{
|
|
g_return_if_fail (array);
|
|
g_return_if_fail (index < array->len);
|
|
g_return_if_fail (index + length <= array->len);
|
|
|
|
if (index + length != array->len)
|
|
g_memmove (&array->pdata[index],
|
|
&array->pdata[index + length],
|
|
(array->len - (index + length)) * sizeof (gpointer));
|
|
|
|
g_ptr_array_set_size (array, array->len - length);
|
|
}
|
|
|
|
#endif /* !GLIB_CHECK_VERSION(2,4,0) */
|
|
|
|
|
|
#if !GTK_CHECK_VERSION(2,6,0)
|
|
|
|
GtkWidget *gtk_label_new_with_markup (const char *markup)
|
|
{
|
|
GtkWidget *label = gtk_label_new ("");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
return label;
|
|
}
|
|
|
|
|
|
/* substitute_underscores from gtk/gtkaccellabel.c */
|
|
static void substitute_underscores (char *str)
|
|
{
|
|
char *p;
|
|
|
|
for (p = str; *p; p++)
|
|
if (*p == '_')
|
|
*p = ' ';
|
|
}
|
|
|
|
/* _gtk_accel_label_class_get_accelerator_label from gtk/gtkaccellabel.c */
|
|
char *gtk_accelerator_get_label (guint accelerator_key,
|
|
GdkModifierType accelerator_mods)
|
|
{
|
|
GtkAccelLabelClass *klass;
|
|
GString *gstring;
|
|
gboolean seen_mod = FALSE;
|
|
gunichar ch;
|
|
|
|
klass = g_type_class_ref (GTK_TYPE_ACCEL_LABEL);
|
|
|
|
gstring = g_string_new ("");
|
|
|
|
if (accelerator_mods & GDK_SHIFT_MASK)
|
|
{
|
|
g_string_append (gstring, klass->mod_name_shift);
|
|
seen_mod = TRUE;
|
|
}
|
|
if (accelerator_mods & GDK_CONTROL_MASK)
|
|
{
|
|
if (seen_mod)
|
|
g_string_append (gstring, klass->mod_separator);
|
|
g_string_append (gstring, klass->mod_name_control);
|
|
seen_mod = TRUE;
|
|
}
|
|
if (accelerator_mods & GDK_MOD1_MASK)
|
|
{
|
|
if (seen_mod)
|
|
g_string_append (gstring, klass->mod_separator);
|
|
g_string_append (gstring, klass->mod_name_alt);
|
|
seen_mod = TRUE;
|
|
}
|
|
if (seen_mod)
|
|
g_string_append (gstring, klass->mod_separator);
|
|
|
|
ch = gdk_keyval_to_unicode (accelerator_key);
|
|
if (ch && (g_unichar_isgraph (ch) || ch == ' ') &&
|
|
(ch < 0x80 || klass->latin1_to_char))
|
|
{
|
|
switch (ch)
|
|
{
|
|
case ' ':
|
|
g_string_append (gstring, "Space");
|
|
break;
|
|
case '\\':
|
|
g_string_append (gstring, "Backslash");
|
|
break;
|
|
default:
|
|
g_string_append_unichar (gstring, g_unichar_toupper (ch));
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
gchar *tmp;
|
|
|
|
tmp = gtk_accelerator_name (accelerator_key, 0);
|
|
if (tmp[0] != 0 && tmp[1] == 0)
|
|
tmp[0] = g_ascii_toupper (tmp[0]);
|
|
substitute_underscores (tmp);
|
|
g_string_append (gstring, tmp);
|
|
g_free (tmp);
|
|
}
|
|
|
|
g_type_class_unref (klass); /* klass is kept alive since gtk uses static types */
|
|
return g_string_free (gstring, FALSE);
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/** gtk_target_list_add_text_targets */
|
|
/** from gtk/gtkselection.c */
|
|
|
|
static GdkAtom utf8_atom;
|
|
static GdkAtom text_atom;
|
|
static GdkAtom ctext_atom;
|
|
static GdkAtom text_plain_atom;
|
|
static GdkAtom text_plain_utf8_atom;
|
|
static GdkAtom text_plain_locale_atom;
|
|
static GdkAtom text_uri_list_atom;
|
|
|
|
static void init_atoms (void)
|
|
{
|
|
gchar *tmp;
|
|
const gchar *charset;
|
|
|
|
if (!utf8_atom)
|
|
{
|
|
utf8_atom = gdk_atom_intern ("UTF8_STRING", FALSE);
|
|
text_atom = gdk_atom_intern ("TEXT", FALSE);
|
|
ctext_atom = gdk_atom_intern ("COMPOUND_TEXT", FALSE);
|
|
text_plain_atom = gdk_atom_intern ("text/plain", FALSE);
|
|
text_plain_utf8_atom = gdk_atom_intern ("text/plain;charset=utf-8", FALSE);
|
|
g_get_charset (&charset);
|
|
tmp = g_strdup_printf ("text/plain;charset=%s", charset);
|
|
text_plain_locale_atom = gdk_atom_intern (tmp, FALSE);
|
|
g_free (tmp);
|
|
|
|
text_uri_list_atom = gdk_atom_intern ("text/uri-list", FALSE);
|
|
}
|
|
}
|
|
|
|
void gtk_target_list_add_text_targets (GtkTargetList *list,
|
|
guint info)
|
|
{
|
|
g_return_if_fail (list != NULL);
|
|
|
|
init_atoms ();
|
|
|
|
/* Keep in sync with gtk_selection_data_targets_include_text()
|
|
*/
|
|
gtk_target_list_add (list, utf8_atom, 0, info);
|
|
gtk_target_list_add (list, ctext_atom, 0, info);
|
|
gtk_target_list_add (list, text_atom, 0, info);
|
|
gtk_target_list_add (list, GDK_TARGET_STRING, 0, info);
|
|
gtk_target_list_add (list, text_plain_utf8_atom, 0, info);
|
|
gtk_target_list_add (list, text_plain_locale_atom, 0, info);
|
|
gtk_target_list_add (list, text_plain_atom, 0, info);
|
|
}
|
|
|
|
#endif /* !GTK_CHECK_VERSION(2,6,0) */
|
|
|
|
|
|
#if !GTK_CHECK_VERSION(2,4,0)
|
|
|
|
void gtk_text_buffer_select_range (GtkTextBuffer *buffer,
|
|
const GtkTextIter *ins,
|
|
const GtkTextIter *bound)
|
|
{
|
|
gtk_text_buffer_place_cursor (buffer, bound);
|
|
gtk_text_buffer_move_mark (buffer,
|
|
gtk_text_buffer_get_selection_bound (buffer), ins);
|
|
}
|
|
|
|
/* TODO: need to put real function here */
|
|
/* TODO: why are they called at all? */
|
|
#ifdef gtk_button_set_focus_on_click
|
|
#undef gtk_button_set_focus_on_click
|
|
#endif
|
|
void gtk_button_set_focus_on_click (GtkWidget *wid, gboolean setting)
|
|
{
|
|
g_warning ("%s: this function should not be called", G_STRLOC);
|
|
}
|
|
|
|
#ifdef gtk_alignment_set_padding
|
|
#undef gtk_alignment_set_padding
|
|
#endif
|
|
void gtk_alignment_set_padding (GtkAlignment *alignment,
|
|
guint padding_top,
|
|
guint padding_bottom,
|
|
guint padding_left,
|
|
guint padding_right)
|
|
{
|
|
g_warning ("%s: this function should not be called", G_STRLOC);
|
|
}
|
|
|
|
#endif /* !GTK_CHECK_VERSION(2,4,0) */
|