2 # include "elementary_config.h"
9 #include <dlfcn.h> /* dlopen,dlclose,etc */
11 #ifdef HAVE_CRT_EXTERNS_H
12 # include <crt_externs.h>
19 #include <Elementary.h>
22 static Elm_Version _version = { VMAJ, VMIN, VMIC, VREV };
23 EAPI Elm_Version *elm_version = &_version;
28 * This group includes functions of elm_main.c
33 _elm_dangerous_call_check(const char *call)
38 snprintf(buf, sizeof(buf), "%i.%i.%i.%i", VMAJ, VMIN, VMIC, VREV);
39 eval = getenv("ELM_NO_FINGER_WAGGLING");
40 if ((eval) && (!strcmp(eval, buf)))
42 printf("ELEMENTARY FINGER WAGGLE!!!!!!!!!!\n"
45 "PLEASE see the API documentation for this function. This call\n"
46 "should almost never be used. Only in very special cases.\n"
48 "To remove this warning please set the environment variable:\n"
49 " ELM_NO_FINGER_WAGGLING\n"
50 "To the value of the Elementary version + revision number. e.g.:\n"
59 * @defgroup Start Getting Started
62 * To write an Elementary app, you can get started with the following:
65 * #include <Elementary.h>
66 * #ifndef ELM_LIB_QUICKLAUNCH
68 * elm_main(int argc, char **argv)
70 * // create window(s) here and do any application init
71 * elm_run(); // run main loop
72 * elm_shutdown(); // after mainloop finishes running, shutdown
73 * return 0; // exit 0 for exit code
79 * To take full advantage of the quicklaunch architecture for launching
80 * processes as quickly as possible (saving time at startup time like
81 * connecting to X11, loading and linking shared libraries) you may want to
82 * use the following configure.in/configure.ac and Makefile.am and autogen.sh
83 * script to generate your files. It is assumed your application uses the
84 * main.c file for its code.
86 * configure.in/configure.ac:
89 AC_INIT(myapp, 0.0.0, myname@mydomain.com)
91 AC_CONFIG_SRCDIR(configure.in)
93 AM_INIT_AUTOMAKE(1.6 dist-bzip2)
94 AM_CONFIG_HEADER(config.h)
104 define([AC_LIBTOOL_LANG_CXX_CONFIG], [:])dnl
105 define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl
108 PKG_CHECK_MODULES([ELEMENTARY], elementary)
116 AUTOMAKE_OPTIONS = 1.4 foreign
117 MAINTAINERCLEANFILES = Makefile.in
119 INCLUDES = -I$(top_srcdir) @ELEMENTARY_CFLAGS@
122 myapp_LTLIBRARIES = myapp.la
126 myapp_la_SOURCES = main.c
127 myapp_la_LIBADD = @ELEMENTARY_LIBS@
129 myapp_la_LDFLAGS = -module -avoid-version -no-undefined
131 myapp_SOURCES = main.c
132 myapp_LDADD = @ELEMENTARY_LIBS@
133 myapp_CFLAGS = -DELM_LIB_QUICKLAUNCH=1
140 rm -rf autom4te.cache
141 rm -f aclocal.m4 ltmain.sh
146 echo "Running aclocal..." ; aclocal $ACLOCAL_FLAGS -I m4 || exit 1
147 echo "Running autoheader..." ; autoheader || exit 1
148 echo "Running autoconf..." ; autoconf || exit 1
149 echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1
150 echo "Running automake..." ; automake --add-missing --copy --gnu || exit 1
152 if [ -z "$NOCONFIGURE" ]; then
157 * To gnerate all the things needed to bootstrap just run:
163 * This will generate Makefile.in's, the confgure script and everything else.
164 * After this it works like all normal autotools projects:
171 * Note sudo was assumed to get root permissions, as this would install in
172 * /usr/local which is system-owned. Ue any way you like to gain root, or
173 * specify a different prefix with configure:
176 ./confiugre --prefix=$HOME/mysoftware
179 * Also remember that autotools buys you some useful commands like:
184 * This uninstalls the software after it was installed with "make install".
185 * It is very useful to clear up what you built if you wish to clean the
192 * This firstly checks if your build tree is "clean" and ready for
193 * distribution. It also builds a tarball (myapp-0.0.0.tar.gz) that is
194 * ready to upload and distribute to the world, that contains the generated
195 * Makefile.in's and configure script. The users do not need to run
196 * autogen.sh - just configure and on. They don't need autotools installed.
197 * This tarball also builds cleanly, has all the sources it needs to build
198 * included (that is sources for your application, not libraries it depends
199 * on like Elementary). It builds cleanly in a buildroot and does not
200 * contain any files that are temporarily generated like binaries and other
201 * build-gnerated files, so the tarball is clean, and no need to worry
202 * about cleaning up your tree before packaging.
208 * This cleans up all build files (binaries, objects etc.) from the tree.
214 * This cleans out all files from the build and from configure's output too.
217 make maintainer-clean
220 * This deletes all the files autogen.sh will produce so the tree is clean
221 * to be put into a revision-control system (like CVS, SVN or GIT for example).
223 * The above will build a library - libmyapp.so and install in the target
224 * library directory (default is /usr/local/lib). You will also get a
225 * myapp.a and myapp.la - these are useless and can be deleted. Libtool likes
226 * to generate these all the time. You will also get a binary in the target
227 * binary directory (default is /usr/local/bin). This is a "debug binary".
228 * This will run and dlopen() the myapp.so and then jump to it's elm_main
229 * function. This allows for easy debugging with GDB and Valgrind. When you
230 * are ready to go to production do the following:
232 * 1. delete the myapp binary. i.e. rm /usr/local/bin/myapp
234 * 2. symlink the myapp binary to elementary_run (supplied by elementary).
235 * i.e. ln -s elmentary_run /usr/local/bin/myapp
237 * 3. run elementary_quicklaunch as part of your graphical login session and
240 * This will man elementary_quicklaunch does pre-initialization before the
241 * application needs to be run, saving the effort at the time the application
242 * is needed, thus speeding up the time it takes to appear.
244 * If you don't want to use the quicklaunch infrastructure (which is
245 * optional), you can execute the old fashioned way by just running the
246 * myapp binary loader than will load the myapp.so for you, or you can
247 * remove the split-file binary and put it into one binary as things always
248 * have been with the following configure.in/configure.ac and Makfile.am
251 * configure.in/configure.ac:
254 AC_INIT(myapp, 0.0.0, myname@mydomain.com)
256 AC_CONFIG_SRCDIR(configure.in)
258 AM_INIT_AUTOMAKE(1.6 dist-bzip2)
259 AM_CONFIG_HEADER(config.h)
268 PKG_CHECK_MODULES([ELEMENTARY], elementary)
276 AUTOMAKE_OPTIONS = 1.4 foreign
277 MAINTAINERCLEANFILES = Makefile.in
279 INCLUDES = -I$(top_srcdir) @ELEMENTARY_CFLAGS@
283 myapp_SOURCES = main.c
284 myapp_LDADD = @ELEMENTARY_LIBS@
288 * Notice that they are the same as before, just with libtool and library
289 * building sections removed. Both ways work for building elementary
290 * applications. It is up to you to decide what is best for you. If you just
291 * follow the template above, you can do it both ways and can decide at build
292 * time. The more advanced of you may suggest making it a configure option.
293 * That is perfectly valid, but has been left out here for simplicity, as our
294 * aim to have an Elementary (and EFL) tutorial, not an autoconf & automake
299 static Eina_Bool _elm_signal_exit(void *data, int ev_type, void *ev);
301 char *_elm_appname = NULL;
302 const char *_elm_data_dir = NULL;
303 const char *_elm_lib_dir = NULL;
304 int _elm_log_dom = -1;
306 EAPI int ELM_EVENT_POLICY_CHANGED = 0;
308 static int _elm_init_count = 0;
309 static int _elm_policies[ELM_POLICY_LAST];
310 static Ecore_Event_Handler *_elm_exit_handler = NULL;
313 _elm_signal_exit(void *data __UNUSED__, int ev_type __UNUSED__, void *ev __UNUSED__)
316 return ECORE_CALLBACK_PASS_ON;
322 edje_scale_set(_elm_config->scale);
326 static Eina_List *widtypes = NULL;
329 _elm_widtype_register(const char **ptr)
331 widtypes = eina_list_append(widtypes, (void *)ptr);
335 _elm_widtype_clear(void)
339 EINA_LIST_FREE(widtypes, ptr)
341 eina_stringshare_del(*ptr);
346 // This code is just for temporary usage.
353 buf = getenv("ELM_THEME");
355 theme_name = strdup(buf);
356 if (!strcmp(strtok(theme_name, ":"), "default")) {
363 setenv("ELM_MODULES", "ctxpopup_copypasteUI>entry/api", 1);
367 * @defgroup General General
372 * Inititalise Elementary
374 * This call is exported only for use by the ELM_MAIN() macro. There is no
375 * need to use this if you use this macro (which is highly advisable).
379 elm_init(int argc, char **argv)
382 if (_elm_init_count != 1) return;
384 elm_quicklaunch_init(argc, argv);
385 elm_quicklaunch_sub_init(argc, argv);
389 * Shut down Elementary
391 * This should be called at the end of your application just before it ceases
392 * to do any more processing. This will clean up any permanent resources your
393 * application may have allocated via Elementary that would otherwise persist
394 * on an exit without this call.
401 if (_elm_init_count != 0) return;
402 elm_quicklaunch_sub_shutdown();
403 elm_quicklaunch_shutdown();
407 static Eina_Bool _elm_need_e_dbus = EINA_FALSE;
410 elm_need_e_dbus(void)
413 if (_elm_need_e_dbus) return;
414 _elm_need_e_dbus = 1;
421 _elm_unneed_e_dbus(void)
424 if (_elm_need_e_dbus)
426 _elm_need_e_dbus = 0;
434 static Eina_Bool _elm_need_efreet = EINA_FALSE;
437 elm_need_efreet(void)
440 if (_elm_need_efreet) return;
441 _elm_need_efreet = 1;
449 list = efreet_icon_extra_list_get();
452 e_user_dir_concat_static(buf, "icons");
453 *list = eina_list_prepend(*list, (void *)eina_stringshare_add(buf));
454 e_prefix_data_concat_static(buf, "data/icons");
455 *list = eina_list_prepend(*list, (void *)eina_stringshare_add(buf));
463 _elm_unneed_efreet(void)
466 if (_elm_need_efreet)
468 _elm_need_efreet = 0;
469 efreet_trash_shutdown();
470 efreet_mime_shutdown();
477 elm_quicklaunch_init(int argc, char **argv)
479 char buf[PATH_MAX], *s;
482 _elm_log_dom = eina_log_domain_register("elementary", EINA_COLOR_LIGHTBLUE);
485 EINA_LOG_ERR("could not register elementary log domain.");
486 _elm_log_dom = EINA_LOG_DOMAIN_GLOBAL;
491 ecore_app_args_set(argc, (const char **)argv);
493 memset(_elm_policies, 0, sizeof(_elm_policies));
494 if (ELM_EVENT_POLICY_CHANGED == 0)
495 ELM_EVENT_POLICY_CHANGED = ecore_event_type_new();
499 _elm_exit_handler = ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, _elm_signal_exit, NULL);
501 if (argv) _elm_appname = strdup(ecore_file_file_get(argv[0]));
505 s = getenv("ELM_DATA_DIR");
506 _elm_data_dir = eina_stringshare_add(s);
510 s = getenv("ELM_PREFIX");
513 snprintf(buf, sizeof(buf), "%s/share/elementary", s);
514 _elm_data_dir = eina_stringshare_add(buf);
519 s = getenv("ELM_LIB_DIR");
520 _elm_lib_dir = eina_stringshare_add(s);
524 s = getenv("ELM_PREFIX");
527 snprintf(buf, sizeof(buf), "%s/lib", s);
528 _elm_lib_dir = eina_stringshare_add(buf);
532 if ((!_elm_data_dir) || (!_elm_lib_dir))
534 Dl_info elementary_dl;
535 // libelementary.so/../../share/elementary/
536 if (dladdr(elm_init, &elementary_dl))
540 dir = ecore_file_dir_get(elementary_dl.dli_fname);
545 if (ecore_file_is_dir(dir))
546 _elm_lib_dir = eina_stringshare_add(dir);
550 dir2 = ecore_file_dir_get(dir);
553 snprintf(buf, sizeof(buf), "%s/share/elementary", dir2);
554 if (ecore_file_is_dir(buf))
555 _elm_data_dir = eina_stringshare_add(buf);
565 _elm_data_dir = eina_stringshare_add(PACKAGE_DATA_DIR);
567 _elm_data_dir = eina_stringshare_add("/");
569 _elm_lib_dir = eina_stringshare_add(PACKAGE_LIB_DIR);
571 _elm_lib_dir = eina_stringshare_add("/");
577 elm_quicklaunch_sub_init(int argc, char **argv)
579 ecore_app_args_set(argc, (const char **)argv);
582 ecore_evas_init(); // FIXME: check errors
585 _elm_config_sub_init();
589 elm_quicklaunch_sub_shutdown(void)
592 if ((_elm_config->engine == ELM_SOFTWARE_X11) ||
593 (_elm_config->engine == ELM_SOFTWARE_16_X11) ||
594 (_elm_config->engine == ELM_XRENDER_X11) ||
595 (_elm_config->engine == ELM_OPENGL_X11) ||
596 (_elm_config->engine == ELM_SOFTWARE_SDL) ||
597 (_elm_config->engine == ELM_SOFTWARE_16_SDL) ||
598 (_elm_config->engine == ELM_OPENGL_SDL) ||
599 (_elm_config->engine == ELM_SOFTWARE_WIN32) ||
600 (_elm_config->engine == ELM_SOFTWARE_16_WINCE))
602 #ifdef HAVE_ELEMENTARY_X
603 ecore_x_disconnect();
605 evas_cserve_disconnect();
607 _elm_module_shutdown();
608 ecore_imf_shutdown();
609 ecore_evas_shutdown();
615 elm_quicklaunch_shutdown(void)
617 eina_stringshare_del(_elm_data_dir);
618 _elm_data_dir = NULL;
619 eina_stringshare_del(_elm_lib_dir);
625 _elm_config_shutdown();
627 ecore_event_handler_del(_elm_exit_handler);
628 _elm_exit_handler = NULL;
630 _elm_theme_shutdown();
631 _elm_unneed_efreet();
632 _elm_unneed_e_dbus();
633 _elm_unneed_ethumb();
634 ecore_file_shutdown();
638 if ((_elm_log_dom > -1) && (_elm_log_dom != EINA_LOG_DOMAIN_GLOBAL))
640 eina_log_domain_unregister(_elm_log_dom);
644 _elm_widtype_clear();
650 elm_quicklaunch_seed(void)
652 Evas_Object *win, *bg, *bt;
654 win = elm_win_add(NULL, "seed", ELM_WIN_BASIC);
655 bg = elm_bg_add(win);
656 elm_win_resize_object_add(win, bg);
657 evas_object_show(bg);
658 bt = elm_button_add(win);
659 elm_button_label_set(bt, " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~-_=+\\|]}[{;:'\",<.>/?");
660 elm_win_resize_object_add(win, bt);
661 ecore_main_loop_iterate();
662 evas_object_del(win);
663 ecore_main_loop_iterate();
664 if ((_elm_config->engine == ELM_SOFTWARE_X11) ||
665 (_elm_config->engine == ELM_SOFTWARE_16_X11) ||
666 (_elm_config->engine == ELM_XRENDER_X11) ||
667 (_elm_config->engine == ELM_OPENGL_X11))
669 #ifdef HAVE_ELEMENTARY_X
673 ecore_main_loop_iterate();
676 static void *qr_handle = NULL;
677 static int (*qr_main) (int argc, char **argv) = NULL;
680 elm_quicklaunch_prepare(int argc __UNUSED__, char **argv)
683 char *exe = elm_quicklaunch_exe_path_get(argv[0]);
686 ERR("requested quicklaunch binary '%s' does not exist\n", argv[0]);
694 exe2 = malloc(strlen(exe) + 1 + 10);
696 p = strrchr(exe2, '/');
699 exename = alloca(strlen(p) + 1);
702 strcat(p, "../lib/");
705 if (access(exe2, R_OK | X_OK) == 0)
713 qr_handle = dlopen(exe, RTLD_NOW | RTLD_GLOBAL);
716 fprintf(stderr, "dlerr: %s\n", dlerror());
717 WRN("dlopen('%s') failed: %s", exe, dlerror());
721 INF("dlopen('%s') = %p", exe, qr_handle);
723 qr_main = dlsym(qr_handle, "elm_main");
724 INF("dlsym(%p, 'elm_main') = %p", qr_handle, qr_main);
727 WRN("not quicklauncher capable: no elm_main in '%s'", exe);
743 extern char **environ;
748 for (i = 0, size = 0; environ[i]; i++)
749 size += strlen(environ[i]) + 1;
751 p = malloc((i + 1) * sizeof(char *));
756 for (i = 0; oldenv[i]; i++)
757 environ[i] = strdup(oldenv[i]);
763 elm_quicklaunch_fork(int argc, char **argv, char *cwd, void (postfork_func) (void *data), void *postfork_data)
772 // need to accept current environment from elementary_run
779 if (child > 0) return EINA_TRUE;
782 perror("could not fork");
787 perror("could not chdir");
788 args = alloca((argc + 1) * sizeof(char *));
789 for (i = 0; i < argc; i++) args[i] = argv[i];
791 WRN("%s not quicklaunch capable, fallback...", argv[0]);
792 execvp(argv[0], args);
793 ERR("failed to execute '%s': %s", argv[0], strerror(errno));
797 if (child > 0) return EINA_TRUE;
800 perror("could not fork");
803 if (postfork_func) postfork_func(postfork_data);
807 perror("could not chdir");
808 // FIXME: this is very linux specific. it changes argv[0] of the process
809 // so ps etc. report what you'd expect. for other unixes and os's this
816 ecore_app_args_get(&real_argc, &real_argv);
817 lastarg = real_argv[real_argc - 1] + strlen(real_argv[real_argc - 1]);
818 for (p = real_argv[0]; p < lastarg; p++) *p = 0;
819 strcpy(real_argv[0], argv[0]);
821 ecore_app_args_set(argc, (const char **)argv);
822 ret = qr_main(argc, argv);
831 elm_quicklaunch_cleanup(void)
844 elm_quicklaunch_fallback(int argc, char **argv)
847 elm_quicklaunch_init(argc, argv);
848 elm_quicklaunch_sub_init(argc, argv);
849 elm_quicklaunch_prepare(argc, argv);
850 ret = qr_main(argc, argv);
856 elm_quicklaunch_exe_path_get(const char *exe)
858 static char *path = NULL;
859 static Eina_List *pathlist = NULL;
863 if (exe[0] == '/') return strdup(exe);
864 if ((exe[0] == '.') && (exe[1] == '/')) return strdup(exe);
865 if ((exe[0] == '.') && (exe[1] == '.') && (exe[2] == '/')) return strdup(exe);
870 path = getenv("PATH");
871 buf2 = alloca(strlen(path) + 1);
876 if ((*p == ':') || (*p == 0))
881 strncpy(buf2, pp, len);
883 pathlist = eina_list_append(pathlist, eina_stringshare_add(buf2));
895 EINA_LIST_FOREACH(pathlist, l, pathitr)
897 snprintf(buf, sizeof(buf), "%s/%s", pathitr, exe);
898 if (access(buf, R_OK | X_OK) == 0) return strdup(buf);
906 * This call should be called just after all initialization is complete. This
907 * function will not return until elm_exit() is called. It will keep looping
908 * running the main event/processing loop for Elementary.
914 ecore_main_loop_begin();
920 * If this call is called, it will flag the main loop to cease processing and
921 * return back to its parent function.
927 ecore_main_loop_quit();
932 * Set new policy value.
934 * This will emit the ecore event ELM_EVENT_POLICY_CHANGED in the main
935 * loop giving the event information Elm_Event_Policy_Changed with
936 * policy identifier, new and old values.
938 * @param policy policy identifier as in Elm_Policy.
939 * @param value policy value, depends on identifiers, usually there is
940 * an enumeration with the same prefix as the policy name, for
941 * example: ELM_POLICY_QUIT and Elm_Policy_Quit
942 * (ELM_POLICY_QUIT_NONE, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED).
944 * @return @c EINA_TRUE on success or @c EINA_FALSE on error (right
945 * now just invalid policy identifier, but in future policy
946 * value might be enforced).
949 elm_policy_set(unsigned int policy, int value)
951 Elm_Event_Policy_Changed *ev;
953 if (policy >= ELM_POLICY_LAST)
956 if (value == _elm_policies[policy])
959 /* TODO: validade policy? */
961 ev = malloc(sizeof(*ev));
963 ev->new_value = value;
964 ev->old_value = _elm_policies[policy];
966 _elm_policies[policy] = value;
968 ecore_event_add(ELM_EVENT_POLICY_CHANGED, ev, NULL, NULL);
974 * Gets the policy value set for given identifier.
976 * @param policy policy identifier as in Elm_Policy.
978 * @return policy value. Will be 0 if policy identifier is invalid.
981 elm_policy_get(unsigned int policy)
983 if (policy >= ELM_POLICY_LAST)
985 return _elm_policies[policy];
989 * Flush all caches & dump all data that can be to lean down to use less memory
997 EINA_LIST_FOREACH(_elm_win_list, l, obj)
999 Evas *e = evas_object_evas_get(obj);
1000 edje_file_cache_flush();
1001 edje_collection_cache_flush();
1002 evas_image_cache_flush(e);
1003 evas_font_cache_flush(e);
1004 evas_render_dump(e);
1009 * @defgroup Scaling Selective Widget Scaling
1012 * Different widgets can be scaled independently. These functions allow you to
1013 * manipulate this scaling on a per-widget basis. The object and all its
1014 * children get their scaling factors multiplied by the scale factor set.
1015 * This is multiplicative, in that if a child also has a scale size set it is
1016 * in turn multiplied by its parent's scale size. 1.0 means “don't scale”,
1017 * 2.0 is double size, 0.5 is half etc.
1021 * Set the scaling factor
1023 * @param obj The object
1024 * @param scale Scale factor (from 0.0 up, with 1.0 == no scaling)
1028 elm_object_scale_set(Evas_Object *obj, double scale)
1030 elm_widget_scale_set(obj, scale);
1034 * Get the scaling factor
1036 * @param obj The object
1037 * @return The scaling factor set by elm_object_scale_set()
1041 elm_object_scale_get(const Evas_Object *obj)
1043 return elm_widget_scale_get(obj);
1047 * @defgroup Styles Styles
1050 * Widgets can have different styles of look. These generic API's set
1051 * styles of widgets, if they support them (and if the theme(s) do).
1057 * This sets the name of the style
1058 * @param obj The object
1059 * @param style The style name to use
1063 elm_object_style_set(Evas_Object *obj, const char *style)
1065 elm_widget_style_set(obj, style);
1071 * This gets the style being used for that widget. Note that the string
1072 * pointer is only valid as longas the object is valid and the style doesn't
1075 * @param obj The object
1076 * @return The style name
1080 elm_object_style_get(const Evas_Object *obj)
1082 return elm_widget_style_get(obj);
1086 * Set the disable state
1088 * This sets the disable state for the widget.
1090 * @param obj The object
1091 * @param disabled The state
1095 elm_object_disabled_set(Evas_Object *obj, Eina_Bool disabled)
1097 elm_widget_disabled_set(obj, disabled);
1101 * Get the disable state
1103 * This gets the disable state for the widget.
1105 * @param obj The object
1106 * @return True, if the widget is disabled
1110 elm_object_disabled_get(const Evas_Object *obj)
1112 return elm_widget_disabled_get(obj);
1116 * Get the global scaling factor
1118 * This gets the globally configured scaling factor that is applied to all
1121 * @return The scaling factor
1127 return _elm_config->scale;
1131 * Set the global scaling factor
1133 * This sets the globally configured scaling factor that is applied to all
1136 * @param scale The scaling factor to set
1140 elm_scale_set(double scale)
1142 if (_elm_config->scale == scale) return;
1143 _elm_config->scale = scale;
1148 * Set the global scaling factor for all applications on the display
1150 * This sets the globally configured scaling factor that is applied to all
1151 * objects for all applications.
1152 * @param scale The scaling factor to set
1156 elm_scale_all_set(double scale)
1158 #ifdef HAVE_ELEMENTARY_X
1159 static Ecore_X_Atom atom = 0;
1160 unsigned int scale_i = (unsigned int)(scale * 1000.0);
1162 if (!atom) atom = ecore_x_atom_get("ENLIGHTENMENT_SCALE");
1163 ecore_x_window_prop_card32_set(ecore_x_window_root_first_get(),
1169 * @defgroup Fingers Fingers
1172 * Elementary is designed to be finger-friendly for touchscreens, and so in
1173 * addition to scaling for display resolution, it can also scale based on
1174 * finger "resolution" (or size).
1178 * Get the configured finger size
1180 * This gets the globally configured finger size in pixels
1182 * @return The finger size
1186 elm_finger_size_get(void)
1188 return _elm_config->finger_size;
1192 * Set the configured finger size
1194 * This sets the globally configured finger size in pixels
1196 * @param size The finger size
1200 elm_finger_size_set(Evas_Coord size)
1202 if (_elm_config->finger_size == size) return;
1203 _elm_config->finger_size = size;
1208 * Set the configured finger size for all applications on the display
1210 * This sets the globally configured finger size in pixels for all applications
1213 * @param size The finger size
1217 elm_finger_size_all_set(Evas_Coord size)
1219 #ifdef HAVE_ELEMENTARY_X
1220 static Ecore_X_Atom atom = 0;
1221 unsigned int size_i = (unsigned int)size;
1223 if (!atom) atom = ecore_x_atom_get("ENLIGHTENMENT_FINGER_SIZE");
1224 ecore_x_window_prop_card32_set(ecore_x_window_root_first_get(),
1230 * Adjust size of an element for finger usage
1232 * This takes width and height sizes (in pixels) as input and a size multiple
1233 * (which is how many fingers you want to place within the area), and adjusts
1234 * the size tobe large enough to accomodate finger. On return the w and h
1235 * sizes poiner do by these parameters will be modified.
1237 * @param times_w How many fingers should fit horizontally
1238 * @param w Pointer to the width size to adjust
1239 * @param times_h How many fingers should fit vertically
1240 * @param h Pointer to the height size to adjust
1244 elm_coords_finger_size_adjust(int times_w, Evas_Coord *w, int times_h, Evas_Coord *h)
1246 if ((w) && (*w < (_elm_config->finger_size * times_w)))
1247 *w = _elm_config->finger_size * times_w;
1248 if ((h) && (*h < (_elm_config->finger_size * times_h)))
1249 *h = _elm_config->finger_size * times_h;
1253 * @defgroup Focus Focus
1256 * Objects have focus. This is what determines where the keyboard input goes to
1257 * within the application window.
1261 * Get the focus of the object
1263 * This gets the focused property of the object.
1265 * @param obj The object
1266 * @return 1 if the object is focused, 0 if not.
1270 elm_object_focus_get(Evas_Object *obj)
1272 return elm_widget_focus_get(obj);
1276 * Set the focus to the object
1278 * This sets the focus target for keyboard input to be the object indicated.
1280 * @param obj The object
1284 elm_object_focus(Evas_Object *obj)
1286 if (!elm_widget_can_focus_get(obj)) return;
1287 elm_widget_focus_steal(obj);
1291 * Remove the focus from the object
1293 * This removes the focus target for keyboard input from be the object
1296 * @param obj The object
1300 elm_object_unfocus(Evas_Object *obj)
1302 if (!elm_widget_can_focus_get(obj)) return;
1303 elm_widget_focused_object_clear(obj);
1307 * Set the ability for the object to focus
1309 * This sets the ability for the object to be able to get keyboard focus or
1310 * not. By default all objects are able to be focused.
1312 * @param obj The object
1313 * @param enable 1 if the object can be focused, 0 if not
1317 elm_object_focus_allow_set(Evas_Object *obj, Eina_Bool enable)
1319 elm_widget_can_focus_set(obj, enable);
1323 * Get the ability for the object to focus
1325 * This gets the ability for the object to be able to get keyboard focus or
1326 * not. By default all objects are able to be focused.
1328 * @param obj The object
1329 * @return 1 if the object is allowed to be focused, 0 if not.
1333 elm_object_focus_allow_get(const Evas_Object *obj)
1335 return elm_widget_can_focus_get(obj);
1339 * @defgroup Scrollhints Scrollhints
1342 * Objects when inside a scroller can scroll, but this may not always be
1343 * desireable in certain situations. This allows an object to hint to itself
1344 * and parents to "not scroll" in one of 2 ways.
1346 * 1. To hold on scrolling. This means just flicking and dragging may no
1347 * longer scroll, but pressing/dragging near an edge of the scroller will
1348 * still scroll. This is automastically used by the entry object when
1350 * 2. To totally freeze scrolling. This means it stops. until popped/released.
1354 * Push the scroll hold by 1
1356 * This increments the scroll hold count by one. If it is more than 0 it will
1357 * take effect on the parents of the indicated object.
1359 * @param obj The object
1360 * @ingroup Scrollhints
1363 elm_object_scroll_hold_push(Evas_Object *obj)
1365 elm_widget_scroll_hold_push(obj);
1369 * Pop the scroll hold by 1
1371 * This decrements the scroll hold count by one. If it is more than 0 it will
1372 * take effect on the parents of the indicated object.
1374 * @param obj The object
1375 * @ingroup Scrollhints
1378 elm_object_scroll_hold_pop(Evas_Object *obj)
1380 elm_widget_scroll_hold_pop(obj);
1384 * Push the scroll freeze by 1
1386 * This increments the scroll freeze count by one. If it is more than 0 it will
1387 * take effect on the parents of the indicated object.
1389 * @param obj The object
1390 * @ingroup Scrollhints
1393 elm_object_scroll_freeze_push(Evas_Object *obj)
1395 elm_widget_scroll_freeze_push(obj);
1399 * Lock the scrolling of the given widget (and thus all parents)
1401 * This locks the given object from scrolling in the X axis (and implicitly
1402 * also locks all parent scrollers too from doing the same).
1404 * @param obj The object
1405 * @param lock The lock state (1 == locked, 0 == unlocked)
1406 * @ingroup Scrollhints
1409 elm_object_scroll_lock_x_set(Evas_Object *obj, Eina_Bool lock)
1411 elm_widget_drag_lock_x_set(obj, lock);
1415 * Lock the scrolling of the given widget (and thus all parents)
1417 * This locks the given object from scrolling in the Y axis (and implicitly
1418 * also locks all parent scrollers too from doing the same).
1420 * @param obj The object
1421 * @param lock The lock state (1 == locked, 0 == unlocked)
1422 * @ingroup Scrollhints
1425 elm_object_scroll_lock_y_set(Evas_Object *obj, Eina_Bool lock)
1427 elm_widget_drag_lock_y_set(obj, lock);
1431 * Get the scrolling lock of the given widget
1433 * This gets the lock for X axis scrolling.
1435 * @param obj The object
1436 * @ingroup Scrollhints
1439 elm_object_scroll_lock_x_get(const Evas_Object *obj)
1441 return elm_widget_drag_lock_x_get(obj);
1445 * Get the scrolling lock of the given widget
1447 * This gets the lock for X axis scrolling.
1449 * @param obj The object
1450 * @ingroup Scrollhints
1453 elm_object_scroll_lock_y_get(const Evas_Object *obj)
1455 return elm_widget_drag_lock_y_get(obj);
1459 * Pop the scroll freeze by 1
1461 * This decrements the scroll freeze count by one. If it is more than 0 it will
1462 * take effect on the parents of the indicated object.
1464 * @param obj The object
1465 * @ingroup Scrollhints
1468 elm_object_scroll_freeze_pop(Evas_Object *obj)
1470 elm_widget_scroll_freeze_pop(obj);
1475 * Check if the given Evas Object is an Elementary widget.
1477 * @param obj the object to query.
1478 * @return @c EINA_TRUE if it is an elementary widget variant,
1479 * @c EINA_FALSE otherwise
1482 elm_object_widget_check(const Evas_Object *obj)
1484 return elm_widget_is(obj);
1488 * Get the first parent of the given object that is an Elementary widget.
1490 * @param obj the object to query.
1491 * @return the parent object that is an Elementary widget, or @c NULL
1492 * if no parent is, or no parents at all.
1495 elm_object_parent_widget_get(const Evas_Object *obj)
1497 return elm_widget_parent_widget_get(obj);
1501 * Get the top level parent of an Elementary widget.
1503 * @param obj The object to query.
1504 * @return The top level Elementary widget, or @c NULL if parent cannot be
1508 elm_object_top_widget_get(const Evas_Object *obj)
1510 return elm_widget_top_get(obj);
1514 * Get the string that represents this Elementary widget.
1516 * @note Elementary is weird and exposes itself as a single
1517 * Evas_Object_Smart_Class of type "elm_widget", so
1518 * evas_object_type_get() always return that, making debug and
1519 * language bindings hard. This function tries to mitigate this
1520 * problem, but the solution is to change Elementary to use
1521 * proper inheritance.
1523 * @param obj the object to query.
1524 * @return Elementary widget name, or @c NULL if not a valid widget.
1527 elm_object_widget_type_get(const Evas_Object *obj)
1529 return elm_widget_type_get(obj);
1533 * Send a signal to the widget edje object.
1535 * This function sends a signal to the edje object of the obj. An edje program
1536 * can respond to a signal by specifying matching 'signal' and
1539 * @param obj The object
1540 * @param emission The signal's name.
1541 * @param source The signal's source.
1544 EAPI void elm_object_signal_emit(Evas_Object *obj, const char *emission, const char *source)
1546 elm_widget_signal_emit(obj, emission, source);
1550 * Add a callback for a signal emitted by widget edje object.
1552 * This function connects a callback function to a signal emitted by the
1553 * edje object of the obj.
1554 * Globs can occur in either the emission or source name.
1556 * @param obj The object
1557 * @param emission The signal's name.
1558 * @param source The signal's source.
1559 * @param func The callback function to be executed when the signal is
1561 * @param data A pointer to data to pass in to the callback function.
1564 EAPI void elm_object_signal_callback_add(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
1566 elm_widget_signal_callback_add(obj, emission, source, func, data);
1570 * Remove a signal-triggered callback from an widget edje object.
1572 * This function removes a callback, previoulsy attached to a signal emitted
1573 * by the edje object of the obj.
1574 * The parameters emission, source and func must match exactly those passed to
1575 * a previous call to elm_object_signal_callback_add(). The data pointer that
1576 * was passed to this call will be returned.
1578 * @param obj The object
1579 * @param emission The signal's name.
1580 * @param source The signal's source.
1581 * @param func The callback function to be executed when the signal is
1583 * @return The data pointer
1586 EAPI void *elm_object_signal_callback_del(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source))
1588 return elm_widget_signal_callback_del(obj, emission, source, func);