diff --git a/configure.ac b/configure.ac index 2d4e048065..c202d0d32b 100644 --- a/configure.ac +++ b/configure.ac @@ -969,6 +969,7 @@ case "$host_os" in [ have_socket="yes" requirement_socket="-lsocket" + requirement_nsl="-lnsl" ], [have_socket="no"]) ;; @@ -3119,7 +3120,7 @@ fi AM_CONDITIONAL([EFL_NET_CONTROL_BACKEND_CONNMAN], [test "${EFL_NET_CONTROL_BACKEND}" = "connman"]) AM_CONDITIONAL([EFL_NET_CONTROL_BACKEND_NONE], [test "${EFL_NET_CONTROL_BACKEND}" = "none"]) -EFL_ADD_LIBS([ECORE_CON], [-lm]) +EFL_ADD_LIBS([ECORE_CON], [${requirement_nsl} -lm]) EFL_OPTIONAL_DEPEND_PKG([ECORE_CON], [${want_systemd}], [SYSTEMD], [libsystemd]) diff --git a/src/lib/eina/eina_value.c b/src/lib/eina/eina_value.c index 22b3f506e0..1fa84de231 100644 --- a/src/lib/eina/eina_value.c +++ b/src/lib/eina/eina_value.c @@ -36,6 +36,7 @@ #include "eina_mempool.h" #include "eina_lock.h" #include "eina_file.h" +#include "eina_rectangle.h" /* undefs EINA_ARG_NONULL() so NULL checks are not compiled out! */ #include "eina_safety_checks.h" @@ -4782,6 +4783,122 @@ EAPI const Eina_Value_Type _EINA_VALUE_TYPE_FILE = { _eina_value_type_file_pget }; +static Eina_Bool +_eina_value_type_rectangle_setup(const Eina_Value_Type *type EINA_UNUSED, void *mem) +{ + memset(mem, 0, sizeof(Eina_Rectangle)); + return EINA_TRUE; +} + +static Eina_Bool +_eina_value_type_rectangle_flush(const Eina_Value_Type *type EINA_UNUSED, + void *mem EINA_UNUSED) +{ + return EINA_TRUE; +} + +static Eina_Bool +_eina_value_type_rectangle_copy(const Eina_Value_Type *type EINA_UNUSED, const void *src, void *dst) +{ + memcpy(dst, src, sizeof (Eina_Rectangle)); + + return EINA_TRUE; +} + +static int +_eina_value_type_rectangle_compare(const Eina_Value_Type *type EINA_UNUSED, const void *a, const void *b) +{ + const Eina_Rectangle *ra = a; + const Eina_Rectangle *rb = b; + + if (eina_rectangle_equal(ra, rb)) return 0; + return -1; +} + +static Eina_Bool +_eina_value_type_rectangle_convert_to(const Eina_Value_Type *type EINA_UNUSED, const Eina_Value_Type *convert, const void *type_mem, void *convert_mem) +{ + const Eina_Rectangle *tr = type_mem; + Eina_Bool ret = EINA_FALSE; + + if ((convert == EINA_VALUE_TYPE_STRING) || + (convert == EINA_VALUE_TYPE_STRINGSHARE)) + { + Eina_Strbuf *buf; + const char *str; + + buf = eina_strbuf_new(); + eina_strbuf_append_printf(buf, "[ %i, %i, %i, %i ]", + tr->x, tr->y, tr->w, tr->h); + str = eina_strbuf_string_get(buf); + ret = eina_value_type_pset(convert, convert_mem, &str); + } + + return ret; +} + +static Eina_Bool +_eina_value_type_rectangle_convert_from(const Eina_Value_Type *type EINA_UNUSED, const Eina_Value_Type *convert, void *type_mem, const void *convert_mem) +{ + Eina_Rectangle *r = type_mem; + + if ((convert == EINA_VALUE_TYPE_STRING) || + (convert == EINA_VALUE_TYPE_STRINGSHARE)) + { + const char *buf = *(const char **)convert_mem; + int ret; + + ret = sscanf(buf, "[ %i, %i, %i, %i ]", + &r->x, &r->y, &r->w, &r->h); + + if (ret <= 0) return EINA_FALSE; + return EINA_TRUE; + } + + return EINA_FALSE; +} + +static Eina_Bool +_eina_value_type_rectangle_pset(const Eina_Value_Type *type EINA_UNUSED, void *mem, const void *ptr) +{ + const Eina_Rectangle *r = ptr; + Eina_Rectangle *tr = mem; + + *tr = *r; + return EINA_TRUE; +} + +static Eina_Bool +_eina_value_type_rectangle_vset(const Eina_Value_Type *type, void *mem, va_list args) +{ + const Eina_Rectangle *r = va_arg(args, Eina_Rectangle *); + return _eina_value_type_rectangle_pset(type, mem, r); +} + +static Eina_Bool +_eina_value_type_rectangle_pget(const Eina_Value_Type *type EINA_UNUSED, const void *mem, void *ptr) +{ + const Eina_Rectangle *tr = mem; + + memcpy(ptr, &tr, sizeof (void*)); + return EINA_TRUE; +} + +EAPI const Eina_Value_Type _EINA_VALUE_TYPE_RECTANGLE = { + EINA_VALUE_TYPE_VERSION, + sizeof (Eina_Rectangle), + "Eina_Value_Rectangle", + _eina_value_type_rectangle_setup, + _eina_value_type_rectangle_flush, + _eina_value_type_rectangle_copy, + _eina_value_type_rectangle_compare, + _eina_value_type_rectangle_convert_to, + _eina_value_type_rectangle_convert_from, + _eina_value_type_rectangle_vset, + _eina_value_type_rectangle_pset, + _eina_value_type_rectangle_pget +}; + /* keep all basic types inlined in an array so we can compare if it's * a basic type using pointer arithmetic. * @@ -5236,6 +5353,7 @@ eina_value_init(void) EINA_VALUE_TYPE_OPTIONAL = &_EINA_VALUE_TYPE_OPTIONAL; EINA_VALUE_TYPE_FILE = &_EINA_VALUE_TYPE_FILE; + EINA_VALUE_TYPE_RECTANGLE = &_EINA_VALUE_TYPE_RECTANGLE; EINA_VALUE_BLOB_OPERATIONS_MALLOC = &_EINA_VALUE_BLOB_OPERATIONS_MALLOC; @@ -5325,6 +5443,7 @@ EAPI const Eina_Value_Type *EINA_VALUE_TYPE_BLOB = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_STRUCT = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_OPTIONAL = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_FILE = NULL; +EAPI const Eina_Value_Type *EINA_VALUE_TYPE_RECTANGLE = NULL; EAPI const Eina_Value_Blob_Operations *EINA_VALUE_BLOB_OPERATIONS_MALLOC = NULL; diff --git a/src/lib/eina/eina_value.h b/src/lib/eina/eina_value.h index c1b6deec79..d698043463 100644 --- a/src/lib/eina/eina_value.h +++ b/src/lib/eina/eina_value.h @@ -26,6 +26,7 @@ #include "eina_inarray.h" #include "eina_list.h" #include "eina_hash.h" +#include "eina_rectangle.h" /** * @page eina_value_example_01_page Eina_Value usage @@ -3676,6 +3677,14 @@ static inline const Eina_Value_Type *eina_value_optional_type_get(Eina_Value *va */ EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_FILE; +/** + * @var EINA_VALUE_TYPE_RECTANGLE + * manages optional type. + * + * @since 1.21 + */ +EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_RECTANGLE; + /** * @} */