forked from AuroraMiddleware/gtk
wayland: Add an implementation for GdkAtom
This implementation is based on a hash table. The hard coded GtkSelection atoms are preloaded into the hash table at the correct values. User generated atoms start after the last preloaded atom.
This commit is contained in:
parent
b165c1bac8
commit
55b2286c3e
@ -47,6 +47,9 @@ struct _GdkWaylandDisplayManager
|
|||||||
|
|
||||||
GdkDisplay *default_display;
|
GdkDisplay *default_display;
|
||||||
GSList *displays;
|
GSList *displays;
|
||||||
|
|
||||||
|
GHashTable *name_to_atoms;
|
||||||
|
guint next_atom;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GdkWaylandDisplayManagerClass
|
struct _GdkWaylandDisplayManagerClass
|
||||||
@ -92,18 +95,51 @@ gdk_wayland_display_manager_get_default_display (GdkDisplayManager *manager)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static GdkAtom
|
static GdkAtom
|
||||||
gdk_wayland_display_manager_atom_intern (GdkDisplayManager *manager,
|
gdk_wayland_display_manager_atom_intern (GdkDisplayManager *manager_in,
|
||||||
const gchar *atom_name,
|
const gchar *atom_name,
|
||||||
gboolean dup)
|
gboolean dup)
|
||||||
{
|
{
|
||||||
return 0;
|
GdkWaylandDisplayManager *manager = GDK_WAYLAND_DISPLAY_MANAGER (manager_in);
|
||||||
|
GdkAtom atom;
|
||||||
|
gpointer data;
|
||||||
|
const gchar *atom_name_intern;
|
||||||
|
|
||||||
|
atom_name_intern = g_intern_string (atom_name);
|
||||||
|
data = g_hash_table_lookup (manager->name_to_atoms, atom_name_intern);
|
||||||
|
|
||||||
|
if (data)
|
||||||
|
{
|
||||||
|
atom = GDK_POINTER_TO_ATOM (data);
|
||||||
|
return atom;
|
||||||
|
}
|
||||||
|
|
||||||
|
atom = _GDK_MAKE_ATOM (manager->next_atom);
|
||||||
|
|
||||||
|
g_hash_table_insert (manager->name_to_atoms,
|
||||||
|
(gchar *)atom_name_intern,
|
||||||
|
GDK_ATOM_TO_POINTER (atom));
|
||||||
|
manager->next_atom++;
|
||||||
|
|
||||||
|
return atom;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gchar *
|
static gchar *
|
||||||
gdk_wayland_display_manager_get_atom_name (GdkDisplayManager *manager,
|
gdk_wayland_display_manager_get_atom_name (GdkDisplayManager *manager_in,
|
||||||
GdkAtom atom)
|
GdkAtom atom)
|
||||||
{
|
{
|
||||||
return 0;
|
GdkWaylandDisplayManager *manager = GDK_WAYLAND_DISPLAY_MANAGER (manager_in);
|
||||||
|
GHashTableIter iter;
|
||||||
|
gpointer key, value;
|
||||||
|
|
||||||
|
g_hash_table_iter_init (&iter, manager->name_to_atoms);
|
||||||
|
|
||||||
|
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||||
|
{
|
||||||
|
if (GDK_POINTER_TO_ATOM (key) == atom)
|
||||||
|
return g_strdup (value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static guint
|
static guint
|
||||||
@ -156,9 +192,44 @@ gdk_wayland_display_manager_class_init (GdkWaylandDisplayManagerClass *class)
|
|||||||
manager_class->get_keyval_name = gdk_wayland_display_manager_get_keyval_name;
|
manager_class->get_keyval_name = gdk_wayland_display_manager_get_keyval_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct {
|
||||||
|
const gchar *name;
|
||||||
|
guint atom_id;
|
||||||
|
} predefined_atoms[] = {
|
||||||
|
{ "NONE", 0 },
|
||||||
|
{ "PRIMARY", 1 },
|
||||||
|
{ "SECONDARY", 2 },
|
||||||
|
{ "ATOM", 4 },
|
||||||
|
{ "BITMAP", 5 },
|
||||||
|
{ "COLORMAP", 7 },
|
||||||
|
{ "DRAWABLE", 17 },
|
||||||
|
{ "INTEGER", 19 },
|
||||||
|
{ "PIXMAP", 20 },
|
||||||
|
{ "STRING", 31 },
|
||||||
|
{ "WINDOW", 33 },
|
||||||
|
{ "CLIPBOARD", 69 },
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gdk_wayland_display_manager_init (GdkWaylandDisplayManager *manager)
|
gdk_wayland_display_manager_init (GdkWaylandDisplayManager *manager)
|
||||||
{
|
{
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
manager->name_to_atoms = g_hash_table_new (NULL, NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (predefined_atoms); i++)
|
||||||
|
{
|
||||||
|
GdkAtom atom;
|
||||||
|
const gchar *atom_name = predefined_atoms[i].name;
|
||||||
|
|
||||||
|
atom = _GDK_MAKE_ATOM (predefined_atoms[i].atom_id);
|
||||||
|
g_hash_table_insert (manager->name_to_atoms,
|
||||||
|
(gchar *)g_intern_static_string (atom_name),
|
||||||
|
GDK_ATOM_TO_POINTER (atom));
|
||||||
|
}
|
||||||
|
|
||||||
|
manager->next_atom =
|
||||||
|
predefined_atoms[G_N_ELEMENTS (predefined_atoms) - 1].atom_id + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user