efl/src/lib/evas/canvas/evas_device.c

260 lines
5.8 KiB
C

#include "evas_common.h"
#include "evas_private.h"
EAPI Evas_Device *
evas_device_new(Evas *eo_e)
{
Evas_Device *dev;
MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
dev = calloc(1, sizeof(Evas_Device));
if (!dev) return NULL;
dev->magic = MAGIC_DEV;
dev->evas = eo_e;
dev->ref = 1;
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
e->devices = eina_list_append(e->devices, dev);
evas_event_callback_call(eo_e, EVAS_CALLBACK_DEVICE_CHANGED, dev);
return dev;
}
EAPI void
evas_device_free(Evas_Device *dev)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return;
MAGIC_CHECK_END();
if (dev->ref == 1)
{
Evas_Device *dev2;
EINA_LIST_FREE(dev->children, dev2)
{
dev2->parent = NULL;
evas_device_free(dev2);
}
if (dev->src)
{
_evas_device_unref(dev->src);
dev->src = NULL;
}
dev->parent = NULL;
}
_evas_device_unref(dev);
}
EAPI void
evas_device_push(Evas *eo_e, Evas_Device *dev)
{
MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return;
MAGIC_CHECK_END();
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
if (!e->cur_device)
{
e->cur_device = eina_array_new(4);
if (!e->cur_device) return;
}
dev->ref++;
eina_array_push(e->cur_device, dev);
}
EAPI void
evas_device_pop(Evas *eo_e)
{
Evas_Device *dev;
MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
dev = eina_array_pop(e->cur_device);
if (dev) _evas_device_unref(dev);
}
EAPI const Eina_List *
evas_device_list(Evas *eo_e, const Evas_Device *dev)
{
MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
if (dev)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return NULL;
MAGIC_CHECK_END();
}
if (dev) return dev->children;
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
return e->devices;
}
EAPI void
evas_device_name_set(Evas_Device *dev, const char *name)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return;
MAGIC_CHECK_END();
eina_stringshare_replace(&(dev->name), name);
evas_event_callback_call(dev->evas, EVAS_CALLBACK_DEVICE_CHANGED, dev);
}
EAPI const char *
evas_device_name_get(const Evas_Device *dev)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return NULL;
MAGIC_CHECK_END();
return dev->name;
}
EAPI void
evas_device_description_set(Evas_Device *dev, const char *desc)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return;
MAGIC_CHECK_END();
eina_stringshare_replace(&(dev->desc), desc);
evas_event_callback_call(dev->evas, EVAS_CALLBACK_DEVICE_CHANGED, dev);
}
EAPI const char *
evas_device_description_get(const Evas_Device *dev)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return NULL;
MAGIC_CHECK_END();
return dev->desc;
}
EAPI void
evas_device_parent_set(Evas_Device *dev, Evas_Device *parent)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return;
MAGIC_CHECK_END();
if (parent)
{
MAGIC_CHECK(parent, Evas_Device, MAGIC_DEV);
return;
MAGIC_CHECK_END();
}
if (dev->parent == parent) return;
if (dev->parent)
dev->parent->children = eina_list_remove(dev->parent->children, dev);
dev->parent = parent;
if (parent)
parent->children = eina_list_append(parent->children, dev);
evas_event_callback_call(dev->evas, EVAS_CALLBACK_DEVICE_CHANGED, dev);
}
EAPI const Evas_Device *
evas_device_parent_get(const Evas_Device *dev)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return NULL;
MAGIC_CHECK_END();
return dev->parent;
}
EAPI void
evas_device_class_set(Evas_Device *dev, Evas_Device_Class clas)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return;
MAGIC_CHECK_END();
dev->clas = clas;
evas_event_callback_call(dev->evas, EVAS_CALLBACK_DEVICE_CHANGED, dev);
}
EAPI Evas_Device_Class
evas_device_class_get(const Evas_Device *dev)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return EVAS_DEVICE_CLASS_NONE;
MAGIC_CHECK_END();
return dev->clas;
}
EAPI void
evas_device_emulation_source_set(Evas_Device *dev, Evas_Device *src)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return;
MAGIC_CHECK_END();
if (src)
{
MAGIC_CHECK(src, Evas_Device, MAGIC_DEV);
return;
MAGIC_CHECK_END();
}
if (dev->src == src) return;
if (dev->src) _evas_device_unref(dev->src);
dev->src = src;
if (dev->src) dev->src->ref++;
evas_event_callback_call(dev->evas, EVAS_CALLBACK_DEVICE_CHANGED, dev);
}
EAPI const Evas_Device *
evas_device_emulation_source_get(const Evas_Device *dev)
{
MAGIC_CHECK(dev, Evas_Device, MAGIC_DEV);
return NULL;
MAGIC_CHECK_END();
return dev->src;
}
void
_evas_device_cleanup(Evas *eo_e)
{
Evas_Device *dev;
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
if (e->cur_device)
{
while ((dev = eina_array_pop(e->cur_device)))
_evas_device_unref(dev);
eina_array_free(e->cur_device);
e->cur_device = NULL;
}
EINA_LIST_FREE(e->devices, dev)
{
evas_device_free(dev);
}
}
Evas_Device *
_evas_device_top_get(const Evas *eo_e)
{
int num;
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
if (!e->cur_device) return NULL;
num = eina_array_count(e->cur_device);
if (num < 1) return NULL;
return eina_array_data_get(e->cur_device, num - 1);
}
void
_evas_device_ref(Evas_Device *dev)
{
dev->ref++;
}
void
_evas_device_unref(Evas_Device *dev)
{
dev->ref--;
if (dev->ref > 0) return;
if (dev->name) eina_stringshare_del(dev->name);
if (dev->desc) eina_stringshare_del(dev->desc);
dev->magic = 0;
free(dev);
}