diff --git a/gdk/gdkdisplaymanagerprivate.h b/gdk/gdkdisplaymanagerprivate.h
index 70afd7df59..a1d19ecc28 100644
--- a/gdk/gdkdisplaymanagerprivate.h
+++ b/gdk/gdkdisplaymanagerprivate.h
@@ -39,11 +39,21 @@ struct _GdkDisplayManagerClass
GdkDisplay *display);
GdkDisplay * (*open_display) (GdkDisplayManager *manager,
const gchar *name);
+
+ /* FIXME the following should really be frontend-only, not vfuncs */
GdkAtom (*atom_intern) (GdkDisplayManager *manager,
const gchar *atom_name,
gboolean copy_name);
gchar * (*get_atom_name) (GdkDisplayManager *manager,
GdkAtom atom);
+ guint (*lookup_keyval) (GdkDisplayManager *manager,
+ const gchar *name);
+ gchar * (*get_keyval_name) (GdkDisplayManager *manager,
+ guint keyval);
+ void (*keyval_convert_case) (GdkDisplayManager *manager,
+ guint keyval,
+ guint *lower,
+ guint *upper);
/* signals */
void (*display_opened) (GdkDisplayManager *manager,
diff --git a/gdk/gdkkeys.c b/gdk/gdkkeys.c
index 75ef078ced..5b7ea78e5f 100644
--- a/gdk/gdkkeys.c
+++ b/gdk/gdkkeys.c
@@ -28,6 +28,7 @@
#include "gdkkeysprivate.h"
#include "gdkdisplay.h"
+#include "gdkdisplaymanagerprivate.h"
/**
@@ -182,12 +183,6 @@ gdk_keymap_init (GdkKeymap *keymap)
/* Other key-handling stuff
*/
-#ifndef HAVE_XCONVERTCASE
-#include "gdkkeysyms.h"
-
-/* compatibility function from X11R6.3, since XConvertCase is not
- * supplied by X11R5.
- */
/**
* gdk_keyval_convert_case:
* @symbol: a keyval
@@ -196,133 +191,16 @@ gdk_keymap_init (GdkKeymap *keymap)
*
* Obtains the upper- and lower-case versions of the keyval @symbol.
* Examples of keyvals are #GDK_KEY_a, #GDK_KEY_Enter, #GDK_KEY_F1, etc.
- *
- **/
+ */
void
gdk_keyval_convert_case (guint symbol,
- guint *lower,
- guint *upper)
+ guint *lower,
+ guint *upper)
{
- guint xlower = symbol;
- guint xupper = symbol;
+ GdkDisplayManager *manager = gdk_display_manager_get ();
- /* Check for directly encoded 24-bit UCS characters: */
- if ((symbol & 0xff000000) == 0x01000000)
- {
- if (lower)
- *lower = gdk_unicode_to_keyval (g_unichar_tolower (symbol & 0x00ffffff));
- if (upper)
- *upper = gdk_unicode_to_keyval (g_unichar_toupper (symbol & 0x00ffffff));
- return;
- }
-
- switch (symbol >> 8)
- {
- case 0: /* Latin 1 */
- if ((symbol >= GDK_KEY_A) && (symbol <= GDK_KEY_Z))
- xlower += (GDK_KEY_a - GDK_KEY_A);
- else if ((symbol >= GDK_KEY_a) && (symbol <= GDK_KEY_z))
- xupper -= (GDK_KEY_a - GDK_KEY_A);
- else if ((symbol >= GDK_KEY_Agrave) && (symbol <= GDK_KEY_Odiaeresis))
- xlower += (GDK_KEY_agrave - GDK_KEY_Agrave);
- else if ((symbol >= GDK_KEY_agrave) && (symbol <= GDK_KEY_odiaeresis))
- xupper -= (GDK_KEY_agrave - GDK_KEY_Agrave);
- else if ((symbol >= GDK_KEY_Ooblique) && (symbol <= GDK_KEY_Thorn))
- xlower += (GDK_KEY_oslash - GDK_KEY_Ooblique);
- else if ((symbol >= GDK_KEY_oslash) && (symbol <= GDK_KEY_thorn))
- xupper -= (GDK_KEY_oslash - GDK_KEY_Ooblique);
- break;
-
- case 1: /* Latin 2 */
- /* Assume the KeySym is a legal value (ignore discontinuities) */
- if (symbol == GDK_KEY_Aogonek)
- xlower = GDK_KEY_aogonek;
- else if (symbol >= GDK_KEY_Lstroke && symbol <= GDK_KEY_Sacute)
- xlower += (GDK_KEY_lstroke - GDK_KEY_Lstroke);
- else if (symbol >= GDK_KEY_Scaron && symbol <= GDK_KEY_Zacute)
- xlower += (GDK_KEY_scaron - GDK_KEY_Scaron);
- else if (symbol >= GDK_KEY_Zcaron && symbol <= GDK_KEY_Zabovedot)
- xlower += (GDK_KEY_zcaron - GDK_KEY_Zcaron);
- else if (symbol == GDK_KEY_aogonek)
- xupper = GDK_KEY_Aogonek;
- else if (symbol >= GDK_KEY_lstroke && symbol <= GDK_KEY_sacute)
- xupper -= (GDK_KEY_lstroke - GDK_KEY_Lstroke);
- else if (symbol >= GDK_KEY_scaron && symbol <= GDK_KEY_zacute)
- xupper -= (GDK_KEY_scaron - GDK_KEY_Scaron);
- else if (symbol >= GDK_KEY_zcaron && symbol <= GDK_KEY_zabovedot)
- xupper -= (GDK_KEY_zcaron - GDK_KEY_Zcaron);
- else if (symbol >= GDK_KEY_Racute && symbol <= GDK_KEY_Tcedilla)
- xlower += (GDK_KEY_racute - GDK_KEY_Racute);
- else if (symbol >= GDK_KEY_racute && symbol <= GDK_KEY_tcedilla)
- xupper -= (GDK_KEY_racute - GDK_KEY_Racute);
- break;
-
- case 2: /* Latin 3 */
- /* Assume the KeySym is a legal value (ignore discontinuities) */
- if (symbol >= GDK_KEY_Hstroke && symbol <= GDK_KEY_Hcircumflex)
- xlower += (GDK_KEY_hstroke - GDK_KEY_Hstroke);
- else if (symbol >= GDK_KEY_Gbreve && symbol <= GDK_KEY_Jcircumflex)
- xlower += (GDK_KEY_gbreve - GDK_KEY_Gbreve);
- else if (symbol >= GDK_KEY_hstroke && symbol <= GDK_KEY_hcircumflex)
- xupper -= (GDK_KEY_hstroke - GDK_KEY_Hstroke);
- else if (symbol >= GDK_KEY_gbreve && symbol <= GDK_KEY_jcircumflex)
- xupper -= (GDK_KEY_gbreve - GDK_KEY_Gbreve);
- else if (symbol >= GDK_KEY_Cabovedot && symbol <= GDK_KEY_Scircumflex)
- xlower += (GDK_KEY_cabovedot - GDK_KEY_Cabovedot);
- else if (symbol >= GDK_KEY_cabovedot && symbol <= GDK_KEY_scircumflex)
- xupper -= (GDK_KEY_cabovedot - GDK_KEY_Cabovedot);
- break;
-
- case 3: /* Latin 4 */
- /* Assume the KeySym is a legal value (ignore discontinuities) */
- if (symbol >= GDK_KEY_Rcedilla && symbol <= GDK_KEY_Tslash)
- xlower += (GDK_KEY_rcedilla - GDK_KEY_Rcedilla);
- else if (symbol >= GDK_KEY_rcedilla && symbol <= GDK_KEY_tslash)
- xupper -= (GDK_KEY_rcedilla - GDK_KEY_Rcedilla);
- else if (symbol == GDK_KEY_ENG)
- xlower = GDK_KEY_eng;
- else if (symbol == GDK_KEY_eng)
- xupper = GDK_KEY_ENG;
- else if (symbol >= GDK_KEY_Amacron && symbol <= GDK_KEY_Umacron)
- xlower += (GDK_KEY_amacron - GDK_KEY_Amacron);
- else if (symbol >= GDK_KEY_amacron && symbol <= GDK_KEY_umacron)
- xupper -= (GDK_KEY_amacron - GDK_KEY_Amacron);
- break;
-
- case 6: /* Cyrillic */
- /* Assume the KeySym is a legal value (ignore discontinuities) */
- if (symbol >= GDK_KEY_Serbian_DJE && symbol <= GDK_KEY_Serbian_DZE)
- xlower -= (GDK_KEY_Serbian_DJE - GDK_KEY_Serbian_dje);
- else if (symbol >= GDK_KEY_Serbian_dje && symbol <= GDK_KEY_Serbian_dze)
- xupper += (GDK_KEY_Serbian_DJE - GDK_KEY_Serbian_dje);
- else if (symbol >= GDK_KEY_Cyrillic_YU && symbol <= GDK_KEY_Cyrillic_HARDSIGN)
- xlower -= (GDK_KEY_Cyrillic_YU - GDK_KEY_Cyrillic_yu);
- else if (symbol >= GDK_KEY_Cyrillic_yu && symbol <= GDK_KEY_Cyrillic_hardsign)
- xupper += (GDK_KEY_Cyrillic_YU - GDK_KEY_Cyrillic_yu);
- break;
-
- case 7: /* Greek */
- /* Assume the KeySym is a legal value (ignore discontinuities) */
- if (symbol >= GDK_KEY_Greek_ALPHAaccent && symbol <= GDK_KEY_Greek_OMEGAaccent)
- xlower += (GDK_KEY_Greek_alphaaccent - GDK_KEY_Greek_ALPHAaccent);
- else if (symbol >= GDK_KEY_Greek_alphaaccent && symbol <= GDK_KEY_Greek_omegaaccent &&
- symbol != GDK_KEY_Greek_iotaaccentdieresis &&
- symbol != GDK_KEY_Greek_upsilonaccentdieresis)
- xupper -= (GDK_KEY_Greek_alphaaccent - GDK_KEY_Greek_ALPHAaccent);
- else if (symbol >= GDK_KEY_Greek_ALPHA && symbol <= GDK_KEY_Greek_OMEGA)
- xlower += (GDK_KEY_Greek_alpha - GDK_KEY_Greek_ALPHA);
- else if (symbol >= GDK_KEY_Greek_alpha && symbol <= GDK_KEY_Greek_omega &&
- symbol != GDK_KEY_Greek_finalsmallsigma)
- xupper -= (GDK_KEY_Greek_alpha - GDK_KEY_Greek_ALPHA);
- break;
- }
-
- if (lower)
- *lower = xlower;
- if (upper)
- *upper = xupper;
+ GDK_DISPLAY_MANAGER_GET_CLASS (manager)->keyval_convert_case (manager, symbol, lower, upper);
}
-#endif
/**
* gdk_keyval_to_upper:
@@ -699,3 +577,32 @@ gdk_keymap_map_virtual_modifiers (GdkKeymap *keymap,
{
return GDK_KEYMAP_GET_CLASS(keymap)->map_virtual_modifiers (keymap, state);
}
+
+/**
+ * gdk_keyval_name:
+ * @keyval: a key value.
+ *
+ * Converts a key value into a symbolic name.
+ * The names are the same as those in the
+ * <gdk/gdkkeysyms.h> header file
+ * but without the leading "GDK_KEY_".
+ *
+ * Return value: (transfer none): a string containing the name of the key,
+ * or %NULL if @keyval is not a valid key. The string should not be
+ * modified.
+ */
+gchar*
+gdk_keyval_name (guint keyval)
+{
+ GdkDisplayManager *manager = gdk_display_manager_get ();
+
+ return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->get_keyval_name (manager, keyval);
+}
+
+guint
+gdk_keyval_from_name (const gchar *keyval_name)
+{
+ GdkDisplayManager *manager = gdk_display_manager_get ();
+
+ return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->lookup_keyval (manager, keyval_name);
+}
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index d949e8ba1b..4a1049be14 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -10813,3 +10813,122 @@ gdk_test_simulate_button (GdkWindow *window,
return GDK_WINDOW_IMPL_GET_CLASS (window->impl)
->simulate_button (window, x, y, button, modifiers, button_pressrelease);
}
+
+/**
+ * gdk_property_get:
+ * @window: a #GdkWindow.
+ * @property: the property to retrieve.
+ * @type: the desired property type, or %GDK_NONE, if any type of data
+ * is acceptable. If this does not match the actual
+ * type, then @actual_format and @actual_length will
+ * be filled in, a warning will be printed to stderr
+ * and no data will be returned.
+ * @offset: the offset into the property at which to begin
+ * retrieving data, in 4 byte units.
+ * @length: the length of the data to retrieve in bytes. Data is
+ * considered to be retrieved in 4 byte chunks, so @length
+ * will be rounded up to the next highest 4 byte boundary
+ * (so be careful not to pass a value that might overflow
+ * when rounded up).
+ * @pdelete: if %TRUE, delete the property after retrieving the
+ * data.
+ * @actual_property_type: location to store the actual type of
+* the property.
+ * @actual_format: location to store the actual return format of the
+ * data; either 8, 16 or 32 bits.
+ * @actual_length: location to store the length of the retrieved data, in
+ * bytes. Data returned in the 32 bit format is stored
+ * in a long variable, so the actual number of 32 bit
+ * elements should be be calculated via
+ * @actual_length / sizeof(glong) to ensure portability to
+ * 64 bit systems.
+ * @data: location to store a pointer to the data. The retrieved
+ * data should be freed with g_free() when you are finished
+ * using it.
+ *
+ * Retrieves a portion of the contents of a property. If the
+ * property does not exist, then the function returns %FALSE,
+ * and %GDK_NONE will be stored in @actual_property_type.
+ *
+ *
+ *
+ * The XGetWindowProperty() function that gdk_property_get()
+ * uses has a very confusing and complicated set of semantics.
+ * uses has a very confusing and complicated set of semantics.
+ * Unfortunately, gdk_property_get() makes the situation
+ * worse instead of better (the semantics should be considered
+ * undefined), and also prints warnings to stderr in cases where it
+ * should return a useful error to the program. You are advised to use
+ * XGetWindowProperty() directly until a replacement function for
+ * gdk_property_get()
+ * is provided.
+ *
+ *
+ *
+ * Returns: %TRUE if data was successfully received and stored
+ * in @data, otherwise %FALSE.
+ */
+gboolean
+gdk_property_get (GdkWindow *window,
+ GdkAtom property,
+ GdkAtom type,
+ gulong offset,
+ gulong length,
+ gint pdelete,
+ GdkAtom *actual_property_type,
+ gint *actual_format_type,
+ gint *actual_length,
+ guchar **data)
+{
+ return GDK_WINDOW_IMPL_GET_CLASS (window->impl)
+ ->get_property (window, property, type, offset, length, pdelete,
+ actual_property_type, actual_format_type,
+ actual_length, data);
+}
+
+/**
+ * gdk_property_change:
+ * @window: a #GdkWindow.
+ * @property: the property to change.
+ * @type: the new type for the property. If @mode is
+ * %GDK_PROP_MODE_PREPEND or %GDK_PROP_MODE_APPEND, then this
+ * must match the existing type or an error will occur.
+ * @format: the new format for the property. If @mode is
+ * %GDK_PROP_MODE_PREPEND or %GDK_PROP_MODE_APPEND, then this
+ * must match the existing format or an error will occur.
+ * @mode: a value describing how the new data is to be combined
+ * with the current data.
+ * @data: the data (a guchar *
+ * gushort *, or gulong *,
+ * depending on @format), cast to a guchar *.
+ * @nelements: the number of elements of size determined by the format,
+ * contained in @data.
+ *
+ * Changes the contents of a property on a window.
+ */
+void
+gdk_property_change (GdkWindow *window,
+ GdkAtom property,
+ GdkAtom type,
+ gint format,
+ GdkPropMode mode,
+ const guchar *data,
+ gint nelements)
+{
+ GDK_WINDOW_IMPL_GET_CLASS (window->impl)
+ ->change_property (window, property, type, format, mode, data, nelements);
+}
+
+/**
+ * gdk_property_delete:
+ * @window: a #GdkWindow.
+ * @property: the property to delete.
+ *
+ * Deletes a property from a window.
+ */
+void
+gdk_property_delete (GdkWindow *window,
+ GdkAtom property)
+{
+ GDK_WINDOW_IMPL_GET_CLASS (window->impl)->delete_property (window, property);
+}
diff --git a/gdk/gdkwindowimpl.h b/gdk/gdkwindowimpl.h
index 0b7695e692..fd9add2de0 100644
--- a/gdk/gdkwindowimpl.h
+++ b/gdk/gdkwindowimpl.h
@@ -28,6 +28,7 @@
#define __GDK_WINDOW_IMPL_H__
#include
+#include
G_BEGIN_DECLS
@@ -268,6 +269,26 @@ struct _GdkWindowImplClass
guint button,
GdkModifierType modifiers,
GdkEventType event_type);
+
+ gboolean (*get_property) (GdkWindow *window,
+ GdkAtom property,
+ GdkAtom type,
+ gulong offset,
+ gulong length,
+ gint pdelete,
+ GdkAtom *actual_type,
+ gint *actual_format,
+ gint *actual_length,
+ guchar **data);
+ void (*change_property) (GdkWindow *window,
+ GdkAtom property,
+ GdkAtom type,
+ gint format,
+ GdkPropMode mode,
+ const guchar *data,
+ gint n_elements);
+ void (*delete_property) (GdkWindow *window,
+ GdkAtom property);
};
/* Interface Functions */
diff --git a/gdk/x11/gdkdisplaymanager-x11.c b/gdk/x11/gdkdisplaymanager-x11.c
index aef1a6dc3c..d073c3c727 100644
--- a/gdk/x11/gdkdisplaymanager-x11.c
+++ b/gdk/x11/gdkdisplaymanager-x11.c
@@ -104,6 +104,9 @@ gdk_display_manager_x11_class_init (GdkDisplayManagerX11Class *class)
manager_class->get_default_display = gdk_display_manager_x11_get_default_display;
manager_class->atom_intern = _gdk_x11_display_manager_atom_intern;
manager_class->get_atom_name = _gdk_x11_display_manager_get_atom_name;
+ manager_class->lookup_keyval = _gdk_x11_display_manager_lookup_keyval;
+ manager_class->get_keyval_name = _gdk_x11_display_manager_get_keyval_name;
+ manager_class->keyval_convert_case = _gdk_x11_display_manager_keyval_convert_case;
}
void
diff --git a/gdk/x11/gdkkeys-x11.c b/gdk/x11/gdkkeys-x11.c
index c18aac1fe9..1b1e9427a4 100644
--- a/gdk/x11/gdkkeys-x11.c
+++ b/gdk/x11/gdkkeys-x11.c
@@ -1406,22 +1406,10 @@ gdk_x11_keymap_translate_keyboard_state (GdkKeymap *keymap,
return tmp_keyval != NoSymbol;
}
-
/* Key handling not part of the keymap */
-/**
- * gdk_keyval_name:
- * @keyval: a key value.
- *
- * Converts a key value into a symbolic name.
- * The names are the same as those in the
- * <gdk/gdkkeysyms.h> header file
- * but without the leading "GDK_KEY_".
- *
- * Return value: (transfer none): a string containing the name of the key, or
- * %NULL if @keyval is not a valid key. The string should not be modified.
- **/
gchar*
-gdk_keyval_name (guint keyval)
+_gdk_x11_display_manager_get_keyval_name (GdkDisplayManager *manager,
+ guint keyval)
{
switch (keyval)
{
@@ -1439,7 +1427,8 @@ gdk_keyval_name (guint keyval)
}
guint
-gdk_keyval_from_name (const gchar *keyval_name)
+_gdk_x11_display_manager_lookup_keyval (GdkDisplayManager *manager,
+ const gchar *keyval_name)
{
g_return_val_if_fail (keyval_name != NULL, 0);
@@ -1448,9 +1437,10 @@ gdk_keyval_from_name (const gchar *keyval_name)
#ifdef HAVE_XCONVERTCASE
void
-gdk_keyval_convert_case (guint symbol,
- guint *lower,
- guint *upper)
+_gdk_x11_display_manager_keyval_convert_case (GdkDisplayManager *manager,
+ guint symbol,
+ guint *lower,
+ guint *upper)
{
KeySym xlower = 0;
KeySym xupper = 0;
@@ -1473,7 +1463,133 @@ gdk_keyval_convert_case (guint symbol,
if (upper)
*upper = xupper;
}
-#endif /* HAVE_XCONVERTCASE */
+#else /* !HAVE_XCONVERTCASE */
+void
+_gdk_x11_display_manager_keyval_convert_case (GdkDisplayManager *manager,
+ guint symbol,
+ guint *lower,
+ guint *upper)
+{
+ guint xlower = symbol;
+ guint xupper = symbol;
+
+ /* Check for directly encoded 24-bit UCS characters: */
+ if ((symbol & 0xff000000) == 0x01000000)
+ {
+ if (lower)
+ *lower = gdk_unicode_to_keyval (g_unichar_tolower (symbol & 0x00ffffff));
+ if (upper)
+ *upper = gdk_unicode_to_keyval (g_unichar_toupper (symbol & 0x00ffffff));
+ return;
+ }
+
+ switch (symbol >> 8)
+ {
+ case 0: /* Latin 1 */
+ if ((symbol >= GDK_KEY_A) && (symbol <= GDK_KEY_Z))
+ xlower += (GDK_KEY_a - GDK_KEY_A);
+ else if ((symbol >= GDK_KEY_a) && (symbol <= GDK_KEY_z))
+ xupper -= (GDK_KEY_a - GDK_KEY_A);
+ else if ((symbol >= GDK_KEY_Agrave) && (symbol <= GDK_KEY_Odiaeresis))
+ xlower += (GDK_KEY_agrave - GDK_KEY_Agrave);
+ else if ((symbol >= GDK_KEY_agrave) && (symbol <= GDK_KEY_odiaeresis))
+ xupper -= (GDK_KEY_agrave - GDK_KEY_Agrave);
+ else if ((symbol >= GDK_KEY_Ooblique) && (symbol <= GDK_KEY_Thorn))
+ xlower += (GDK_KEY_oslash - GDK_KEY_Ooblique);
+ else if ((symbol >= GDK_KEY_oslash) && (symbol <= GDK_KEY_thorn))
+ xupper -= (GDK_KEY_oslash - GDK_KEY_Ooblique);
+ break;
+
+ case 1: /* Latin 2 */
+ /* Assume the KeySym is a legal value (ignore discontinuities) */
+ if (symbol == GDK_KEY_Aogonek)
+ xlower = GDK_KEY_aogonek;
+ else if (symbol >= GDK_KEY_Lstroke && symbol <= GDK_KEY_Sacute)
+ xlower += (GDK_KEY_lstroke - GDK_KEY_Lstroke);
+ else if (symbol >= GDK_KEY_Scaron && symbol <= GDK_KEY_Zacute)
+ xlower += (GDK_KEY_scaron - GDK_KEY_Scaron);
+ else if (symbol >= GDK_KEY_Zcaron && symbol <= GDK_KEY_Zabovedot)
+ xlower += (GDK_KEY_zcaron - GDK_KEY_Zcaron);
+ else if (symbol == GDK_KEY_aogonek)
+ xupper = GDK_KEY_Aogonek;
+ else if (symbol >= GDK_KEY_lstroke && symbol <= GDK_KEY_sacute)
+ xupper -= (GDK_KEY_lstroke - GDK_KEY_Lstroke);
+ else if (symbol >= GDK_KEY_scaron && symbol <= GDK_KEY_zacute)
+ xupper -= (GDK_KEY_scaron - GDK_KEY_Scaron);
+ else if (symbol >= GDK_KEY_zcaron && symbol <= GDK_KEY_zabovedot)
+ xupper -= (GDK_KEY_zcaron - GDK_KEY_Zcaron);
+ else if (symbol >= GDK_KEY_Racute && symbol <= GDK_KEY_Tcedilla)
+ xlower += (GDK_KEY_racute - GDK_KEY_Racute);
+ else if (symbol >= GDK_KEY_racute && symbol <= GDK_KEY_tcedilla)
+ xupper -= (GDK_KEY_racute - GDK_KEY_Racute);
+ break;
+
+ case 2: /* Latin 3 */
+ /* Assume the KeySym is a legal value (ignore discontinuities) */
+ if (symbol >= GDK_KEY_Hstroke && symbol <= GDK_KEY_Hcircumflex)
+ xlower += (GDK_KEY_hstroke - GDK_KEY_Hstroke);
+ else if (symbol >= GDK_KEY_Gbreve && symbol <= GDK_KEY_Jcircumflex)
+ xlower += (GDK_KEY_gbreve - GDK_KEY_Gbreve);
+ else if (symbol >= GDK_KEY_hstroke && symbol <= GDK_KEY_hcircumflex)
+ xupper -= (GDK_KEY_hstroke - GDK_KEY_Hstroke);
+ else if (symbol >= GDK_KEY_gbreve && symbol <= GDK_KEY_jcircumflex)
+ xupper -= (GDK_KEY_gbreve - GDK_KEY_Gbreve);
+ else if (symbol >= GDK_KEY_Cabovedot && symbol <= GDK_KEY_Scircumflex)
+ xlower += (GDK_KEY_cabovedot - GDK_KEY_Cabovedot);
+ else if (symbol >= GDK_KEY_cabovedot && symbol <= GDK_KEY_scircumflex)
+ xupper -= (GDK_KEY_cabovedot - GDK_KEY_Cabovedot);
+ break;
+
+ case 3: /* Latin 4 */
+ /* Assume the KeySym is a legal value (ignore discontinuities) */
+ if (symbol >= GDK_KEY_Rcedilla && symbol <= GDK_KEY_Tslash)
+ xlower += (GDK_KEY_rcedilla - GDK_KEY_Rcedilla);
+ else if (symbol >= GDK_KEY_rcedilla && symbol <= GDK_KEY_tslash)
+ xupper -= (GDK_KEY_rcedilla - GDK_KEY_Rcedilla);
+ else if (symbol == GDK_KEY_ENG)
+ xlower = GDK_KEY_eng;
+ else if (symbol == GDK_KEY_eng)
+ xupper = GDK_KEY_ENG;
+ else if (symbol >= GDK_KEY_Amacron && symbol <= GDK_KEY_Umacron)
+ xlower += (GDK_KEY_amacron - GDK_KEY_Amacron);
+ else if (symbol >= GDK_KEY_amacron && symbol <= GDK_KEY_umacron)
+ xupper -= (GDK_KEY_amacron - GDK_KEY_Amacron);
+ break;
+
+ case 6: /* Cyrillic */
+ /* Assume the KeySym is a legal value (ignore discontinuities) */
+ if (symbol >= GDK_KEY_Serbian_DJE && symbol <= GDK_KEY_Serbian_DZE)
+ xlower -= (GDK_KEY_Serbian_DJE - GDK_KEY_Serbian_dje);
+ else if (symbol >= GDK_KEY_Serbian_dje && symbol <= GDK_KEY_Serbian_dze)
+ xupper += (GDK_KEY_Serbian_DJE - GDK_KEY_Serbian_dje);
+ else if (symbol >= GDK_KEY_Cyrillic_YU && symbol <= GDK_KEY_Cyrillic_HARDSIGN)
+ xlower -= (GDK_KEY_Cyrillic_YU - GDK_KEY_Cyrillic_yu);
+ else if (symbol >= GDK_KEY_Cyrillic_yu && symbol <= GDK_KEY_Cyrillic_hardsign)
+ xupper += (GDK_KEY_Cyrillic_YU - GDK_KEY_Cyrillic_yu);
+ break;
+
+ case 7: /* Greek */
+ /* Assume the KeySym is a legal value (ignore discontinuities) */
+ if (symbol >= GDK_KEY_Greek_ALPHAaccent && symbol <= GDK_KEY_Greek_OMEGAaccent)
+ xlower += (GDK_KEY_Greek_alphaaccent - GDK_KEY_Greek_ALPHAaccent);
+ else if (symbol >= GDK_KEY_Greek_alphaaccent && symbol <= GDK_KEY_Greek_omegaaccent &&
+ symbol != GDK_KEY_Greek_iotaaccentdieresis &&
+ symbol != GDK_KEY_Greek_upsilonaccentdieresis)
+ xupper -= (GDK_KEY_Greek_alphaaccent - GDK_KEY_Greek_ALPHAaccent);
+ else if (symbol >= GDK_KEY_Greek_ALPHA && symbol <= GDK_KEY_Greek_OMEGA)
+ xlower += (GDK_KEY_Greek_alpha - GDK_KEY_Greek_ALPHA);
+ else if (symbol >= GDK_KEY_Greek_alpha && symbol <= GDK_KEY_Greek_omega &&
+ symbol != GDK_KEY_Greek_finalsmallsigma)
+ xupper -= (GDK_KEY_Greek_alpha - GDK_KEY_Greek_ALPHA);
+ break;
+ }
+
+ if (lower)
+ *lower = xlower;
+ if (upper)
+ *upper = xupper;
+}
+#endif
gint
_gdk_x11_get_group_for_state (GdkDisplay *display,
diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h
index 4dc341c346..70cffc7310 100644
--- a/gdk/x11/gdkprivate-x11.h
+++ b/gdk/x11/gdkprivate-x11.h
@@ -112,6 +112,25 @@ gboolean _gdk_x11_window_simulate_button (GdkWindow *window,
guint button,
GdkModifierType modifiers,
GdkEventType button_pressrelease);
+gboolean _gdk_x11_window_get_property (GdkWindow *window,
+ GdkAtom property,
+ GdkAtom type,
+ gulong offset,
+ gulong length,
+ gint pdelete,
+ GdkAtom *actual_property_type,
+ gint *actual_format_type,
+ gint *actual_length,
+ guchar **data);
+void _gdk_x11_window_change_property (GdkWindow *window,
+ GdkAtom property,
+ GdkAtom type,
+ gint format,
+ GdkPropMode mode,
+ const guchar *data,
+ gint nelements);
+void _gdk_x11_window_delete_property (GdkWindow *window,
+ GdkAtom property);
gboolean _gdk_x11_window_queue_antiexpose (GdkWindow *window,
cairo_region_t *area);
@@ -182,6 +201,14 @@ GdkAtom _gdk_x11_display_manager_atom_intern (GdkDisplayManager *manager,
gboolean copy_name);
gchar * _gdk_x11_display_manager_get_atom_name (GdkDisplayManager *manager,
GdkAtom atom);
+guint _gdk_x11_display_manager_lookup_keyval (GdkDisplayManager *manager,
+ const gchar *name);
+gchar * _gdk_x11_display_manager_get_keyval_name (GdkDisplayManager *manager,
+ guint keyval);
+void _gdk_x11_display_manager_keyval_convert_case (GdkDisplayManager *manager,
+ guint symbol,
+ guint *lower,
+ guint *upper);
GdkCursor *_gdk_x11_display_get_cursor_for_type (GdkDisplay *display,
GdkCursorType type);
diff --git a/gdk/x11/gdkproperty-x11.c b/gdk/x11/gdkproperty-x11.c
index d0ec2d701f..1b57860413 100644
--- a/gdk/x11/gdkproperty-x11.c
+++ b/gdk/x11/gdkproperty-x11.c
@@ -531,70 +531,17 @@ gdk_x11_get_xatom_name (Atom xatom)
return get_atom_name (gdk_x11_xatom_to_atom (xatom));
}
-/**
- * gdk_property_get:
- * @window: a #GdkWindow.
- * @property: the property to retrieve.
- * @type: the desired property type, or %GDK_NONE, if any type of data
- * is acceptable. If this does not match the actual
- * type, then @actual_format and @actual_length will
- * be filled in, a warning will be printed to stderr
- * and no data will be returned.
- * @offset: the offset into the property at which to begin
- * retrieving data, in 4 byte units.
- * @length: the length of the data to retrieve in bytes. Data is
- * considered to be retrieved in 4 byte chunks, so @length
- * will be rounded up to the next highest 4 byte boundary
- * (so be careful not to pass a value that might overflow
- * when rounded up).
- * @pdelete: if %TRUE, delete the property after retrieving the
- * data.
- * @actual_property_type: location to store the actual type of
- * the property.
- * @actual_format: location to store the actual return format of the
- * data; either 8, 16 or 32 bits.
- * @actual_length: location to store the length of the retrieved data, in
- * bytes. Data returned in the 32 bit format is stored
- * in a long variable, so the actual number of 32 bit
- * elements should be be calculated via
- * @actual_length / sizeof(glong) to ensure portability to
- * 64 bit systems.
- * @data: location to store a pointer to the data. The retrieved
- * data should be freed with g_free() when you are finished
- * using it.
- *
- * Retrieves a portion of the contents of a property. If the
- * property does not exist, then the function returns %FALSE,
- * and %GDK_NONE will be stored in @actual_property_type.
- *
- *
- *
- * The XGetWindowProperty() function that gdk_property_get()
- * uses has a very confusing and complicated set of semantics.
- * Unfortunately, gdk_property_get() makes the situation
- * worse instead of better (the semantics should be considered
- * undefined), and also prints warnings to stderr in cases where it
- * should return a useful error to the program. You are advised to use
- * XGetWindowProperty() directly until a replacement function for
- * gdk_property_get()
- * is provided.
- *
- *
- *
- * Returns: %TRUE if data was successfully received and stored
- * in @data, otherwise %FALSE.
- */
gboolean
-gdk_property_get (GdkWindow *window,
- GdkAtom property,
- GdkAtom type,
- gulong offset,
- gulong length,
- gint pdelete,
- GdkAtom *actual_property_type,
- gint *actual_format_type,
- gint *actual_length,
- guchar **data)
+_gdk_x11_window_get_property (GdkWindow *window,
+ GdkAtom property,
+ GdkAtom type,
+ gulong offset,
+ gulong length,
+ gint pdelete,
+ GdkAtom *actual_property_type,
+ gint *actual_format_type,
+ gint *actual_length,
+ guchar **data)
{
GdkDisplay *display;
Atom ret_prop_type;
@@ -730,34 +677,14 @@ gdk_property_get (GdkWindow *window,
return TRUE;
}
-/**
- * gdk_property_change:
- * @window: a #GdkWindow.
- * @property: the property to change.
- * @type: the new type for the property. If @mode is
- * %GDK_PROP_MODE_PREPEND or %GDK_PROP_MODE_APPEND, then this
- * must match the existing type or an error will occur.
- * @format: the new format for the property. If @mode is
- * %GDK_PROP_MODE_PREPEND or %GDK_PROP_MODE_APPEND, then this
- * must match the existing format or an error will occur.
- * @mode: a value describing how the new data is to be combined
- * with the current data.
- * @data: the data (a guchar *
- * gushort *, or gulong *,
- * depending on @format), cast to a guchar *.
- * @nelements: the number of elements of size determined by the format,
- * contained in @data.
- *
- * Changes the contents of a property on a window.
- */
void
-gdk_property_change (GdkWindow *window,
- GdkAtom property,
- GdkAtom type,
- gint format,
- GdkPropMode mode,
- const guchar *data,
- gint nelements)
+_gdk_x11_window_change_property (GdkWindow *window,
+ GdkAtom property,
+ GdkAtom type,
+ gint format,
+ GdkPropMode mode,
+ const guchar *data,
+ gint nelements)
{
GdkDisplay *display;
Window xwindow;
@@ -813,16 +740,9 @@ gdk_property_change (GdkWindow *window,
xtype, format, mode, (guchar *)data, nelements);
}
-/**
- * gdk_property_delete:
- * @window: a #GdkWindow.
- * @property: the property to delete.
- *
- * Deletes a property from a window.
- */
void
-gdk_property_delete (GdkWindow *window,
- GdkAtom property)
+_gdk_x11_window_delete_property (GdkWindow *window,
+ GdkAtom property)
{
g_return_if_fail (!window || GDK_WINDOW_IS_X11 (window));
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index 07746d0112..2fd5fa5167 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -4762,4 +4762,7 @@ gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass)
impl_class->sync_rendering = _gdk_x11_window_sync_rendering;
impl_class->simulate_key = _gdk_x11_window_simulate_key;
impl_class->simulate_button = _gdk_x11_window_simulate_button;
+ impl_class->get_property = _gdk_x11_window_get_property;
+ impl_class->change_property = _gdk_x11_window_change_property;
+ impl_class->delete_property = _gdk_x11_window_delete_property;
}